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