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