All pastes #330585 Raw Edit

Something

public text v1 · immutable
#330585 ·published 2007-01-28 01:22 UTC
rendered paste body
// and.cpp : Defines the entry point for the DLL application.
//

#include "bzfsAPI.h"

BZ_GET_PLUGIN_VERSION

class 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 = (bz_PlayerJoinPartEventData*) eventData;
		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 = (bz_PlayerJoinPartEventData*) eventData;
		if (pped->team == eObservers) { return; }
		if (bz_getTeamCount(pped->team) == 0) {
			switchDefender(getBestTeam(eObservers));
		}
	}
	else if (eventData->eventType == bz_eCaptureEvent) {
		bz_CTFCaptureEventData *ctfed = (bz_CTFCaptureEventData*) eventData;
		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