All pastes #483853 Raw Edit

Mine

public text v1 · immutable
·published 2007-05-11 22:38 UTC
rendered paste body
// wwzones.cpp : Defines the entry point for the DLL application.

#include "bzfsAPI.h"
#include <string>
#include <vector>
#include <map>
#include <math.h>

class WWINFO
{
public:
	WWINFO()
	{
		pi = 3.14159265358979323846;
		tickTime = 0.5;
	}
	double pi;
	double tickTime;
};

WWINFO wwinfo;

BZ_GET_PLUGIN_VERSION

class WWZHandler : public bz_CustomMapObjectHandler
{
public:
	virtual bool handle ( bzApiString object, bz_CustomMapObjectInfo *data );
};

WWZHandler	wwzhandler;

class WWZEventHandler : public bz_EventHandler
{
public:
	virtual void process ( bz_EventData *eventData );
};

WWZEventHandler wwzeventHandler;

BZF_PLUGIN_CALL int bz_Load (const char* /*commandLineParameter*/){

	bz_debugMessage(4,"wwzones plugin loaded");
	bz_registerCustomMapObject("WWZONE",&wwzhandler);
	bz_registerEvent(bz_eTickEvent,&wwzeventHandler);
	return 0;
}

BZF_PLUGIN_CALL int bz_Unload (void){

	bz_removeEvent(bz_eTickEvent,&wwzeventHandler);
	bz_debugMessage(4,"wwzones plugin unloaded");
	bz_removeCustomMapObject("WWZONE");
	return 0;
}

class WWZPlyrInfo
{
public:
	WWZPlyrInfo()
	{
		wwzplyrID = -1;
		wwzPlyrInTime = 0;
	}

	int wwzplyrID;
	double wwzPlyrInTime;
};

WWZPlyrInfo wwzNewPlyr;

class WWZone
{
public:
	WWZone()
	{
		box = false;
		xMax = xMin = yMax = yMin = zMax = zMin = rad = 0;
		zoneWeapon = "";
		zoneWeaponLifetime = 0;
		zoneWeaponPosition[0] = 0;
		zoneWeaponPosition[1] = 0;
		zoneWeaponPosition[2] = 0;
		zoneWeaponTilt = 0;
		zoneWeaponDirection = 0;
		zoneWeaponShotID = 0;
		zoneWeaponDT = 0;
		zoneWeaponRepeat = false;
		zoneWeaponFired = false;
		zoneWeaponLastFired = 0;
		zoneWeaponMinFireTime = 0.5;
		zoneWeaponTimeDelay = 0;
		zoneWeaponInfoMessage = false;
		zoneWeaponSentMessage = false;
		wwzPlyrList.clear();
	}

	std::vector <WWZPlyrInfo> wwzPlyrList;
	bool box;
	float xMax,xMin,yMax,yMin,zMax,zMin;
	float rad;

	bzApiString zoneWeapon;
	float zoneWeaponLifetime, zoneWeaponPosition[3], zoneWeaponTilt, zoneWeaponDirection, zoneWeaponDT;
	double zoneWeaponMinFireTime, zoneWeaponTimeDelay, zoneWeaponLastFired;
	bool zoneWeaponRepeat, zoneWeaponInfoMessage, zoneWeaponFired, zoneWeaponSentMessage;
	int zoneWeaponShotID;

	std::string playermessage;
	std::string servermessage;

	bool pointIn ( float pos[3] )
	{
		if ( box )
		{
			if ( pos[0] > xMax || pos[0] < xMin )
				return false;

			if ( pos[1] > yMax || pos[1] < yMin )
				return false;

			if ( pos[2] > zMax || pos[2] < zMin )
				return false;
		}
		else
		{
			float vec[3];
			vec[0] = pos[0]-xMax;
			vec[1] = pos[1]-yMax;
			vec[2] = pos[2]-zMax;

			float dist = sqrt(vec[0]*vec[0]+vec[1]*vec[1]);
			if ( dist > rad)
				return false;

			if ( pos[2] > zMax || pos[2] < zMin )
				return false;
		}
		return true;
	}
};

std::vector <WWZone> zoneList;

bool WWZHandler::handle ( bzApiString object, bz_CustomMapObjectInfo *data )
{
	if (object != "WWZONE" || !data)
		return false;

	WWZone newZone;

	// parse all the chunks
	for ( unsigned int i = 0; i < data->data.size(); i++ )
	{
		std::string line = data->data.get(i).c_str();

		bzAPIStringList *nubs = bz_newStringList();
		nubs->tokenize(line.c_str()," ",0,true);
		
		if ( nubs->size() > 0)
		{
			std::string key = bz_toupper(nubs->get(0).c_str());

			if ( key == "BBOX" && nubs->size() > 6)
			{
				newZone.box = true;
				newZone.xMin = (float)atof(nubs->get(1).c_str());
				newZone.xMax = (float)atof(nubs->get(2).c_str());
				newZone.yMin = (float)atof(nubs->get(3).c_str());
				newZone.yMax = (float)atof(nubs->get(4).c_str());
				newZone.zMin = (float)atof(nubs->get(5).c_str());
				newZone.zMax = (float)atof(nubs->get(6).c_str());
			}
			else if ( key == "CYLINDER" && nubs->size() > 5)
			{
				newZone.box = false;
				newZone.rad = (float)atof(nubs->get(5).c_str());
				newZone.xMax =(float)atof(nubs->get(1).c_str());
				newZone.yMax =(float)atof(nubs->get(2).c_str());
				newZone.zMin =(float)atof(nubs->get(3).c_str());
				newZone.zMax =(float)atof(nubs->get(4).c_str());
			}
			else if ( key == "ZONEWEAPON" && nubs->size() > 9)
			{
				newZone.zoneWeapon = nubs->get(1);
				newZone.zoneWeaponLifetime = (float)atof(nubs->get(2).c_str());
				newZone.zoneWeaponPosition[0] = (float)atof(nubs->get(3).c_str());
				newZone.zoneWeaponPosition[1] = (float)atof(nubs->get(4).c_str());
				newZone.zoneWeaponPosition[2] = (float)atof(nubs->get(5).c_str());
				newZone.zoneWeaponTilt = (float)atof(nubs->get(6).c_str());
				newZone.zoneWeaponTilt = (newZone.zoneWeaponTilt / 360) * (2 * (float)wwinfo.pi);
				newZone.zoneWeaponDirection = (float)atof(nubs->get(7).c_str());
				newZone.zoneWeaponDirection = (newZone.zoneWeaponDirection / 360) * (2 * (float)wwinfo.pi);
				newZone.zoneWeaponShotID = (int)atoi(nubs->get(8).c_str());
				newZone.zoneWeaponDT = (float)atof(nubs->get(9).c_str());
			}
			else if ( key == "REPEAT" && nubs->size() == 1 )
			{
				newZone.zoneWeaponRepeat = true;
			}
			else if ( key == "REPEAT" && nubs->size() > 1 )
			{
				newZone.zoneWeaponRepeat = true;
				newZone.zoneWeaponMinFireTime = (double)atof(nubs->get(1).c_str());
				if (newZone.zoneWeaponMinFireTime < wwinfo.tickTime && newZone.zoneWeaponMinFireTime >= 0.1)
					wwinfo.tickTime = newZone.zoneWeaponMinFireTime - .05;  //tick faster than ww calls
			}
			else if ( key == "TIMEDELAY" && nubs->size() > 1 )
			{
				newZone.zoneWeaponTimeDelay = (double)atof(nubs->get(1).c_str());
				if (newZone.zoneWeaponTimeDelay < 0)
					newZone.zoneWeaponTimeDelay = 0;  
			}
			else if ( key == "PLAYERMESSAGE" && nubs->size() > 1 )
			{
				newZone.playermessage = nubs->get(1).c_str();
			}
			else if ( key == "SERVERMESSAGE" && nubs->size() > 1 )
			{
				newZone.servermessage = nubs->get(1).c_str();
			}
			else if ( key == "INFOMESSAGE" )
			{
				newZone.zoneWeaponInfoMessage = true;
			}
		}
		bz_deleteStringList(nubs);
	}
	zoneList.push_back(newZone);
	bz_setMaxWaitTime ( (float)wwinfo.tickTime );
	return true;
}

inline bool wasHere(int zoneNum, int plyrNum)
{
	for (unsigned int j = 0; j < zoneList[zoneNum].wwzPlyrList.size(); j++)
	{
		if (plyrNum == zoneList[zoneNum].wwzPlyrList[j].wwzplyrID)
			return true;
	}

	wwzNewPlyr.wwzplyrID = plyrNum;
	wwzNewPlyr.wwzPlyrInTime = bz_getCurrentTime();

	zoneList[zoneNum].wwzPlyrList.push_back(wwzNewPlyr);
	zoneList[zoneNum].zoneWeaponSentMessage = false;
	zoneList[zoneNum].zoneWeaponFired = false;

	return false;
}

inline void notHere(int zoneNum, int plyrNum)
{
	for (unsigned int j = 0; j < zoneList[zoneNum].wwzPlyrList.size(); j++)
	{
		if (plyrNum == zoneList[zoneNum].wwzPlyrList[j].wwzplyrID)
		{
			zoneList[zoneNum].wwzPlyrList.erase(zoneList[zoneNum].wwzPlyrList.begin() + j);
			zoneList[zoneNum].zoneWeaponFired = false;
			zoneList[zoneNum].zoneWeaponSentMessage = false;
			return;
		}
	}

	return;
}

inline bool OKToFire(int zoneNum, int plyrNum)
{
	for (unsigned int j = 0; j < zoneList[zoneNum].wwzPlyrList.size(); j++)
	{
		if (zoneList[zoneNum].wwzPlyrList[j].wwzplyrID == plyrNum)
		{
			if ((bz_getCurrentTime() - zoneList[zoneNum].wwzPlyrList[j].wwzPlyrInTime) > zoneList[zoneNum].zoneWeaponTimeDelay && !zoneList[zoneNum].zoneWeaponFired)
			{
				zoneList[zoneNum].wwzPlyrList[j].wwzPlyrInTime = bz_getCurrentTime();
				return true;
			}
		}
	}

	return false;
}

void WWZEventHandler::process ( bz_EventData *eventData )
{
	if (eventData->eventType != bz_eTickEvent)
		return;

	bzAPIIntList *playerList = bz_newIntList(); 
	bz_getPlayerIndexList ( playerList ); 

	for ( unsigned int h = 0; h < playerList->size(); h++ )
	{ 
    	bz_PlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](h)); 

			if (player){

				for ( unsigned int i = 0; i < zoneList.size(); i++ )
				{
					if (zoneList[i].pointIn(player->pos) && player->spawned)
					{
						if (wasHere(i, player->playerID) && OKToFire(i, player->playerID) && !zoneList[i].zoneWeaponFired)
						{
							bz_fireWorldWep (zoneList[i].zoneWeapon.c_str(),zoneList[i].zoneWeaponLifetime,BZ_SERVER,zoneList[i].zoneWeaponPosition,zoneList[i].zoneWeaponTilt,zoneList[i].zoneWeaponDirection,zoneList[i].zoneWeaponShotID,zoneList[i].zoneWeaponDT);
							zoneList[i].zoneWeaponFired = true;
							zoneList[i].zoneWeaponLastFired = bz_getCurrentTime();
						}
						else
						{
							if ((bz_getCurrentTime() - zoneList[i].zoneWeaponLastFired) > zoneList[i].zoneWeaponMinFireTime && zoneList[i].zoneWeaponRepeat)
							zoneList[i].zoneWeaponFired = false;
						}

						if (!zoneList[i].zoneWeaponSentMessage && zoneList[i].zoneWeaponFired)
						{
							if (!zoneList[i].playermessage.empty())
								bz_sendTextMessage(BZ_SERVER,player->playerID,zoneList[i].playermessage.c_str());
							if (!zoneList[i].servermessage.empty())
								bz_sendTextMessage(BZ_SERVER,BZ_ALLUSERS,zoneList[i].servermessage.c_str());
							if (zoneList[i].zoneWeaponInfoMessage)
								bz_sendTextMessagef(BZ_SERVER,BZ_ALLUSERS,"%s triggered by %s.", zoneList[i].zoneWeapon.c_str(), player->callsign.c_str());

							zoneList[i].zoneWeaponSentMessage = true;
						}
					}
					else
						notHere(i, player->playerID);
				}
			}
			bz_freePlayerRecord(player);
	}
		
	bz_deleteIntList(playerList); 
	return;
}

// Local Variables: ***
// mode:C++ ***
// tab-width: 8 ***
// c-basic-offset: 2 ***
// indent-tabs-mode: t ***
// End: ***
// ex: shiftwidth=2 tabstop=8