All pastes #330564 Raw Edit

Attack and Defend

public cpp v1 · immutable
#330564 ·published 2007-01-28 01:02 UTC
rendered paste body
// and.cpp : Defines the entry point for the DLL application.//#include "bzfsAPI.h"BZ_GET_PLUGIN_VERSIONclass AttackDefend : public bz_EventHandler{public:	virtual void	process ( bz_EventData *eventData );	virtual void	switchDefender ( bz_eTeamType switchTeam );	virtual bz_eTeamType	getBestTeam ( bz_eTeamType excludeTeam );};AttackDefend	attackDefend;int adRedCount, adGreenCount, adBlueCount, adPurpleCount, adNotices;double adHighPower, adDefendStartTime;bz_eTeamType adDefender, adHighTeam;BZF_PLUGIN_CALL int bz_Load ( const char* /*commandLine*/ ){  bz_debugMessage(4,"Attack 'n Defend plugin loaded");  bz_registerEvent(bz_eTickEvent,&attackDefend);  bz_registerEvent(bz_ePlayerJoinEvent,&attackDefend);  bz_registerEvent(bz_ePlayerPartEvent,&attackDefend);  bz_registerEvent(bz_eCaptureEvent,&attackDefend);  return 0;}BZF_PLUGIN_CALL int bz_Unload ( void ){  bz_debugMessage(4,"Attack 'n Defend plugin unloaded");  return 0;}void AttackDefend::process ( bz_EventData *eventData ){	if (eventData->eventType == bz_ePlayerJoinEvent) {		bz_PlayerJoinPartEventData *jped;		if (jped->team == eObservers) { return; }		if (adDefender != jped->team) {			if (bz_getTeamCount(eRedTeam) > 0 && jped->team != eRedTeam) {				// if there are no red players...			}			else if (bz_getTeamCount(eGreenTeam) > 0 && jped->team != eGreenTeam) {				// and no green players			}			else if (bz_getTeamCount(eBlueTeam) > 0 && jped->team != eBlueTeam) {				// and no blue players			}			else if (bz_getTeamCount(ePurpleTeam) > 0 && jped->team != ePurpleTeam) {				// and no purple players...			}			else {				// Obviously this is the only person here, so make them the defender while nobody else is around.				switchDefender(jped->team);			}		}		if (adDefender == eRedTeam) {			bz_sendTextMessage(BZ_SERVER, jped->playerID, "Red team is currently defending. Attack them!");		}		else if (adDefender == eGreenTeam) {			bz_sendTextMessage(BZ_SERVER, jped->playerID, "Green team is currently defending. Attack them!");		}		else if (adDefender == ePurpleTeam) {			bz_sendTextMessage(BZ_SERVER, jped->playerID, "Purple team is currently defending. Attack them!");		}		else if (adDefender == eBlueTeam) {			bz_sendTextMessage(BZ_SERVER, jped->playerID, "Blue team is currently defending. Attack them!");		}	}	else if (eventData->eventType == bz_ePlayerPartEvent) {		bz_PlayerJoinPartEventData *pped;		if (pped->team == eObservers) { return; }		if (bz_getTeamCount(pped->team) == 0) {			switchDefender(getBestTeam(eObservers));		}	}	else if (eventData->eventType == bz_eCaptureEvent) {		bz_CTFCaptureEventData *ctfed;		if (adDefender == eRedTeam) {			bz_sendTextMessage(BZ_SERVER, ctfed->playerCapping, "Red team has been conquered!");		}		else if (adDefender == eGreenTeam) {			bz_sendTextMessage(BZ_SERVER, ctfed->playerCapping, "Green team has been conquered!");		}		else if (adDefender == ePurpleTeam) {			bz_sendTextMessage(BZ_SERVER, ctfed->playerCapping, "Purple team has been conquered!");		}		else if (adDefender == eBlueTeam) {			bz_sendTextMessage(BZ_SERVER, ctfed->playerCapping, "Blue team has been conquered!");		}		switchDefender(ctfed->teamCapping);	}	else {		if (bz_getTeamCount(adDefender) == 0) { return; }		bzAPIIntList pl;		bz_getPlayerIndexList(&pl);		for (unsigned int i = 0; i < pl.size(); i++)		{			bz_PlayerRecord *pr;			pr = bz_getPlayerByIndex(pl.get(i));			if (pr->currentFlag != NULL)			{				if (pr->currentFlag == "Red team flag" && adDefender != eRedTeam && pr->team != eRedTeam) {					bz_removePlayerFlag(pr->playerID);					bz_sendTextMessage(BZ_SERVER, pr->playerID, "You can only take the defender's flag!");				}				else if (pr->currentFlag == "Green team flag" && adDefender != eGreenTeam && pr->team != eGreenTeam) {					bz_removePlayerFlag(pr->playerID);					bz_sendTextMessage(BZ_SERVER, pr->playerID, "You can only take the defender's flag!");				}				else if (pr->currentFlag == "Blue team flag" && adDefender != eBlueTeam && pr->team != eBlueTeam) {					bz_removePlayerFlag(pr->playerID);					bz_sendTextMessage(BZ_SERVER, pr->playerID, "You can only take the defender's flag!");				}				else if (pr->currentFlag == "Purple team flag" && adDefender != ePurpleTeam && pr->team != ePurpleTeam) {					bz_removePlayerFlag(pr->playerID);					bz_sendTextMessage(BZ_SERVER, pr->playerID, "You can only take the defender's flag!");				}			}		}		if (adNotices == 0 && adDefendStartTime > bz_getCurrentTime() + 60) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Four minutes left to capture the defender's flag!");			adNotices++;			return;		}		if (adNotices == 1 && adDefendStartTime > bz_getCurrentTime() + 120) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Three minutes left to capture the defender's flag!");			adNotices++;			return;		}		if (adNotices == 2 && adDefendStartTime > bz_getCurrentTime() + 180) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Two minutes left to capture the defender's flag!");			adNotices++;			return;		}		if (adNotices == 3 && adDefendStartTime > bz_getCurrentTime() + 240) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "One minute left to capture the defender's flag!");			adNotices++;			return;		}		if (adNotices == 4 && adDefendStartTime > bz_getCurrentTime() + 270) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "30 seconds left to capture the defender's flag!");			adNotices++;			return;		}		if (adNotices == 5 && adDefendStartTime > bz_getCurrentTime() + 285) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "15 seconds left to capture the defender's flag!");			adNotices++;			return;		}		if (bz_getCurrentTime() > adDefendStartTime + 300) {			bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Time's up! The attack failed!");			if (bz_getTeamCount(eRedTeam) > 0 && adDefender != eRedTeam) {				bz_setTeamLosses(eRedTeam, bz_getTeamLosses(eRedTeam) + 1);				bz_setTeamWins(adDefender, bz_getTeamWins(adDefender) + 1);			}			else if (bz_getTeamCount(eGreenTeam) > 0 && adDefender != eGreenTeam) {				bz_setTeamLosses(eGreenTeam, bz_getTeamLosses(eGreenTeam) + 1);				bz_setTeamWins(adDefender, bz_getTeamWins(adDefender) + 1);			}			else if (bz_getTeamCount(eBlueTeam) > 0 && adDefender != eBlueTeam) {				bz_setTeamLosses(eBlueTeam, bz_getTeamLosses(eBlueTeam) + 1);				bz_setTeamWins(adDefender, bz_getTeamWins(adDefender) + 1);			}			else if (bz_getTeamCount(ePurpleTeam) > 0 && adDefender != ePurpleTeam) {				bz_setTeamLosses(ePurpleTeam, bz_getTeamLosses(ePurpleTeam) + 1);				bz_setTeamWins(adDefender, bz_getTeamWins(adDefender) + 1);			}			switchDefender(getBestTeam(adDefender));		}	}}bz_eTeamType AttackDefend::getBestTeam( bz_eTeamType exclude ) {	adHighTeam = eObservers;	if (bz_getTeamCount(eRedTeam) > 0 && exclude != eRedTeam) {		adHighPower = bz_getTeamWins(eRedTeam) / bz_getTeamCount(eRedTeam);		adHighTeam = eRedTeam;	}	if (bz_getTeamCount(eGreenTeam) > 0 && exclude != eGreenTeam && (bz_getTeamWins(eGreenTeam) / bz_getTeamCount(eGreenTeam)) > adHighPower) {		adHighPower = bz_getTeamWins(eGreenTeam) / bz_getTeamCount(eGreenTeam);		adHighTeam = eGreenTeam;	}	if (bz_getTeamCount(eBlueTeam) > 0 && exclude != eBlueTeam && (bz_getTeamWins(eBlueTeam) / bz_getTeamCount(eBlueTeam)) > adHighPower) {		adHighPower = bz_getTeamWins(eBlueTeam) / bz_getTeamCount(eBlueTeam);		adHighTeam = eBlueTeam;	}	if (bz_getTeamCount(ePurpleTeam) > 0 && exclude != ePurpleTeam && (bz_getTeamWins(ePurpleTeam) / bz_getTeamCount(ePurpleTeam)) > adHighPower) {		adHighPower = bz_getTeamWins(ePurpleTeam) / bz_getTeamCount(ePurpleTeam);		adHighTeam = ePurpleTeam;	}	return adHighTeam;}void AttackDefend::switchDefender( bz_eTeamType switchTeam ) {	if (switchTeam != eRedTeam && switchTeam != eGreenTeam && switchTeam != eBlueTeam && switchTeam != ePurpleTeam) {		bz_debugMessage(1, "Error in switchDefender function, a bad team was specified.");		return;	}	if (switchTeam == eRedTeam) {		bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Red Team is now defending! Attack them!");		adDefender = eRedTeam;	}	else if (switchTeam == eGreenTeam) {		bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Green Team is now defending! Attack them!");		adDefender = eGreenTeam;	}	else if (switchTeam == eBlueTeam) {		bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Blue Team is now defending! Attack them!");		adDefender = eBlueTeam;	}	else {		bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Purple Team is now defending! Attack them!");		adDefender = ePurpleTeam;	}	adDefendStartTime = bz_getCurrentTime();	adNotices = 0;}// Local Variables: ***// mode:C++ ***// tab-width: 8 ***// c-basic-offset: 2 ***// indent-tabs-mode: t ***// End: ***// ex: shiftwidth=2 tabstop=8