void KeepAwayPlayerPaused( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerPausedEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; bz_PlayerPausedEventData_V1 *PauseData = (bz_PlayerPausedEventData_V1*)eventData; bz_BasePlayerRecord *player = bz_getPlayerByIndex(PauseData->playerID); if (player) { const char* flagHeld = bz_getPlayerFlag(player->playerID); if (flagHeld) { if (flagHeld == keepaway.flagToKeep) { bz_removePlayerFlag (player->playerID); bz_sendTextMessage (BZ_SERVER, PauseData->playerID, "Flag removed - cannot pause while holding flag."); keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; } } } bz_freePlayerRecord(player); return; }
void RegFlag::Event ( bz_EventData *eventData ) { bz_BasePlayerRecord *player = NULL; int playerID = -1; switch (eventData->eventType) { case bz_ePlayerUpdateEvent: playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; case bz_eShotFiredEvent: playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; default: return; } player = bz_getPlayerByIndex(playerID); if (!player) return; if (player->globalUser) { bz_freePlayerRecord(player); return; } bz_freePlayerRecord(player); const char* flagAbrev = bz_getPlayerFlag(playerID); if (!flagAbrev) return; bz_removePlayerFlag(playerID); bz_sendTextMessage(BZ_SERVER,playerID, "Flags are for registered players only"); }
void TCTFPlayerUpdates ( bz_EventData *eventData ) { if (eventData->eventType != bz_ePlayerUpdateEvent) return; // no CTF if teams not balanced, drop team flags asap: if (!tctf.fairCTF) { int playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; const char* FlagHeld = bz_getPlayerFlag(playerID); if (FlagHeld != NULL) { if (strcmp(FlagHeld, "R*") == 0 || strcmp(FlagHeld, "G*") == 0 || strcmp(FlagHeld, "B*") == 0 || strcmp(FlagHeld, "P*") == 0 ) { bz_removePlayerFlag ( playerID ); bz_sendTextMessagef (BZ_SERVER, playerID, "Capture The Flag disabled - teams are not evenly balanced."); } } } return; }
std::string getFlag() { if (keepaway.flagToKeepIndex < -1) // this should never happen, but save a crash if something goes nuts return ""; // get next flag; if not free take it from player (if forced flags) for (unsigned int h = 0; h < keepaway.flagsList.size(); h++) // check all specified flags { keepaway.flagToKeepIndex++; // get next one in line if (keepaway.flagToKeepIndex > ((int)keepaway.flagsList.size() - 1)) // go back to start if at end keepaway.flagToKeepIndex = 0; std::string flagCandidate = keepaway.flagsList[keepaway.flagToKeepIndex]; bool flagNotHeld = true; bz_APIIntList *playerList = bz_newIntList(); bz_getPlayerIndexList ( playerList ); for ( unsigned int i = 0; i < playerList->size(); i++ ) { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerList->operator[](i)); if (player) { const char* playerFlag = bz_getPlayerFlag(player->playerID); if (playerFlag) { if (playerFlag == flagCandidate && keepaway.forcedFlags) // take it, if forced flags { bz_removePlayerFlag (player->playerID); bz_sendTextMessage (BZ_SERVER, player->playerID, "Sorry, server needs your flag for Keep Away :/"); } if (playerFlag == flagCandidate && !keepaway.forcedFlags) // look for next free flag in list flagNotHeld = false; } } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); if (flagNotHeld) return flagCandidate; } if (!keepaway.flagsList.empty()) // we should never get here, but if we do keep going return keepaway.flagsList[0]; else return ""; }
void NoRogueGenocide::Event ( bz_EventData * eventData ) { std::string geno = "G"; switch (eventData->eventType) { case bz_eFlagGrabbedEvent: { bz_FlagGrabbedEventData_V1 *grabData = (bz_FlagGrabbedEventData_V1*)eventData; std::string flagType = bz_getFlagName(grabData->flagID).c_str(); // Do nothing if we are on seamless mode if (seamlessMode) return; // Do nothing if the flag isn't Genocide if (flagType != geno) return; // Do nothing if the player is not a rogue if (bz_getPlayerTeam(grabData->playerID) != eRogueTeam) return; if (!silentMode) bz_sendTextMessage(BZ_SERVER, grabData->playerID, "You can't pick up Genocide if you are a rogue!"); bz_removePlayerFlag(grabData->playerID); } break; case bz_eShotFiredEvent: { bz_ShotFiredEventData_V1 *shotData = (bz_ShotFiredEventData_V1*)eventData; std::string shotType = shotData->type.c_str(); // Do nothing if the shot doesn't originate from a geno flag if (shotType != geno) return; // Do nothing if the player is not a rogue if (bz_getPlayerTeam(shotData->playerID) != eRogueTeam) return; // Convert the shot to a regular one shotData->type = ""; shotData->changed = true; } break; default: return; } }
void fairCTF::DropTeamFlag(int playerID) { bz_BasePlayerRecord* droppr = bz_getPlayerByIndex (playerID); if (droppr != NULL) { // Are they carrying a team flag? if (droppr->currentFlag == "Red team flag" || droppr->currentFlag == "Green team flag" || droppr->currentFlag == "Blue team flag" || droppr->currentFlag == "Purple team flag") { bz_removePlayerFlag(playerID); bz_sendTextMessage (BZ_SERVER, playerID, "CTF play is currently disabled."); } bz_freePlayerRecord(droppr); } }
bool Defusal::SlashCommand(int playerID, bz_ApiString command, bz_ApiString /*message*/, bz_APIStringList *params) { bz_BasePlayerRecord *playerdata = bz_getPlayerByIndex(playerID); if (command == "bomb" && playerdata->currentFlag.c_str()=="Red team flag") { bombPlaced = true; bombPlacer = playerdata->callsign.c_str(); bombPlacementTime = bz_getCurrentTime(); bz_removePlayerFlag(playerID); //Take away the flag (bomb), it has been placed bz_getFlagPosition(0,bombLocation); //Store the location of the bomb bz_sendTextMessagef(BZ_SERVER,eBlueTeam,"'%s' has placed the bomb! You have %i minutes to find and defuse it.",bombPlacer.c_str(),detonationTime); bz_sendTextMessagef(BZ_SERVER,eRedTeam,"'%s' has placed the bomb! Defend the bomb for %i minutes.",bombPlacer.c_str(),detonationTime); bz_sendTextMessagef(BZ_SERVER,eObservers,"'%s' has placed the bomb!",bombPlacer.c_str(),detonationTime); } bz_freePlayerRecord(playerdata); }
bool KeepAwayCommands::SlashCommand ( int playerID, bz_ApiString _command, bz_ApiString _message, bz_APIStringList * /*_param*/ ) { std::string command = _command.c_str(); std::string message = _message.c_str(); const char* keepermessage = _message.c_str(); if ( command == "kas" ) { if (keepaway.id != -1) bz_sendTextMessage (playerID, keepaway.id, keepermessage); else bz_sendTextMessage(BZ_SERVER, playerID, "There is no one keeping the flag right now."); return true; } if ( command == "kaf" ) { if (keepaway.id == -1) bz_sendTextMessagef (BZ_SERVER, playerID, "The Keep Away flag is: %s", convertFlag(keepaway.flagToKeep).c_str()); else bz_sendTextMessagef (BZ_SERVER, playerID, "%s has Keep Away flag: %s", keepaway.callsign.c_str(), convertFlag(keepaway.flagToKeep).c_str()); return true; } bz_BasePlayerRecord *fromPlayer = bz_getPlayerByIndex(playerID); if (fromPlayer) { if (!fromPlayer->admin) { bz_sendTextMessage(BZ_SERVER, playerID, "You must be admin to use the keepaway commands."); bz_freePlayerRecord(fromPlayer); return true; } bz_freePlayerRecord(fromPlayer); } if ( command == "kasoundoff" ) { keepaway.soundEnabled = false; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away sounds are disabled."); return true; } if ( command == "kasoundon" ) { keepaway.soundEnabled = true; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away sounds are enabled."); return true; } if ( command == "kaflagresetoff" ) { keepaway.flagResetEnabled = false; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away flag reset is disabled."); return true; } if ( command == "kaflagreseton" ) { keepaway.flagResetEnabled = true; bz_sendTextMessage (BZ_SERVER, playerID, "Keep Away flag reset is enabled."); return true; } if ( command == "kaf+" ) { if (!keepaway.forcedFlags) // this will always create an open spot for getFlag(), if it's needed bz_removePlayerFlag (keepaway.id); keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; keepaway.flagToKeep = getFlag(); keepaway.lastReminder = bz_getCurrentTime(); bz_sendTextMessagef(BZ_SERVER, playerID, "Keep Away flag advanced to: %s", convertFlag(keepaway.flagToKeep).c_str()); return true; } if ( command == "kaon") { keepaway.enabled = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away is enabled."); return true; } if ( command == "kaoff") { keepaway.enabled = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away is disabled."); return true; } if ( command == "katimemult") { double inputvalue = ConvertToNum(message, 1, 99); if (inputvalue > 0) { keepaway.timeMult = (inputvalue/100); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier set to %i percent.", (int)(keepaway.timeMult*100 + 0.5)); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier must be between 1 and 99 percent.", (int)(keepaway.timeMult*100 + 0.5)); autoTime(); return true; } if ( command == "katimemultmin") { double inputvalue = ConvertToNum(message, 1, 99); if (inputvalue > 0) { keepaway.timeMultMin = (inputvalue/100); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier minimum set to %i percent.", (int)(keepaway.timeMultMin*100 + 0.5)); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away auto time multiplier minimum must be between 1 and 99 percent."); autoTime(); return true; } if ( command == "kastatus") { if (keepaway.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away is currently enabled."); if (!keepaway.enabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away is currently disabled."); if (keepaway.autoTimeOn) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away automatic time adjustment is currently enabled."); if (!keepaway.autoTimeOn) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away automatic time adjustment is currently disabled."); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away time multiplier = %i percent.", (int)(keepaway.timeMult*100 + 0.5)); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away time multiplier minimum = %i percent.", (int)(keepaway.timeMultMin*100 + 0.5)); int AdjTime = (int)(keepaway.adjustedTime + 0.5); bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away hold time is currently set to: %i seconds", AdjTime); if (keepaway.forcedFlags) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away forced flags is enabled."); if (!keepaway.forcedFlags) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away forced flags is disabled."); if (keepaway.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away sounds are enabled."); if (!keepaway.soundEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away sounds are disabled."); if (keepaway.flagResetEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away flag reset is enabled."); if (!keepaway.flagResetEnabled) bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away flag reset is disabled."); return true; } // explicit time command handler: if ( command == "katime" ) { double inputvalue = ConvertToNum(message, 1, 7200); if (inputvalue > 0 ) { keepaway.TTH = inputvalue; autoTime(); int AdjTime = (int)(inputvalue + 0.5); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away hold time has been set to %i seconds.", AdjTime); } else bz_sendTextMessagef (BZ_SERVER, playerID, "Keep Away hold time invalid: must be between 1 and 7200 seconds."); autoTime(); return true; } if ( command == "kaautotimeon") { keepaway.autoTimeOn = true; autoTime(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away automatic time adjustment on."); return true; } if ( command == "kaautotimeoff") { keepaway.autoTimeOn = false; keepaway.adjustedTime = keepaway.TTH; autoTime(); bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away automatic time adjustment off."); return true; } if ( command == "kaffon") { keepaway.forcedFlags = true; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Forced flags on."); return true; } if ( command == "kaffoff") { keepaway.forcedFlags = false; bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Forced flags off."); return true; } return false; }
void KeepAwayEventHandler::Event ( bz_EventData *eventData ) { if (eventData->eventType == bz_ePlayerDieEvent) KeepAwayPlayerDied(eventData); else if (eventData->eventType == bz_ePlayerPartEvent) KeepAwayPlayerLeft(eventData); else if (eventData->eventType == bz_ePlayerJoinEvent) KeepAwayPlayerJoined(eventData); else if (eventData->eventType == bz_ePlayerPausedEvent) KeepAwayPlayerPaused(eventData); if (eventData->eventType != bz_ePlayerUpdateEvent || !keepaway.enabled || keepaway.flagToKeep == "") return; if (keepaway.notEnoughTeams) // Not enough teams - we can leave return; checkKeepAwayHolder(); // check for someone holding flag if (!keepaway.toldFlagFree && keepaway.id == -1) // Flag is free - inform players { bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away flag: %s is free; find it and keep it!", convertFlag(keepaway.flagToKeep).c_str()); keepaway.toldFlagFree = true; if ((bz_getCurrentTime() - keepaway.lastReminder) > 2 && keepaway.soundEnabled) // do not play free flag sound alert if player just won/lost (overlapping sounds) playAlert(); } if (timeForReminder() && keepaway.id == -1) bz_sendTextMessagef (BZ_SERVER, BZ_ALLUSERS, "Keep Away flag: %s is free; find it and keep it!", convertFlag(keepaway.flagToKeep).c_str()); if (keepaway.id == -1) // no one has it, we can leave return; sendWarnings(getTeamColor(keepaway.team), keepaway.callsign, keepaway.startTime); double timeStanding = bz_getCurrentTime() - keepaway.startTime; if (timeStanding >= keepaway.adjustedTime) // time's up - kill 'em { if (keepaway.teamPlay && keepaway.team != eRogueTeam) { killTeams(keepaway.team, keepaway.callsign); bz_sendTextMessage (BZ_SERVER, keepaway.team, "Your team did it! Go find the next Keep Away flag and keep it!"); } else { killPlayers(keepaway.id, keepaway.callsign); bz_sendTextMessage (BZ_SERVER, keepaway.id, "You did it! Go find the next Keep Away flag and keep it!"); } if (!keepaway.forcedFlags) // this will always create an open spot for getFlag(), if it's needed bz_removePlayerFlag (keepaway.id); keepaway.id = -1; keepaway.team = eNoTeam; keepaway.toldFlagFree = false; keepaway.flagToKeep = getFlag(); keepaway.lastReminder = bz_getCurrentTime(); return; } }
void EventHandler::Event ( bz_EventData *eventData ) { float pos[3] = {0}; int playerID = -1; switch (eventData->eventType) { case bz_ePlayerUpdateEvent: pos[0] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[0]; pos[1] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[1]; pos[2] = ((bz_PlayerUpdateEventData_V1*)eventData)->state.pos[2]; playerID = ((bz_PlayerUpdateEventData_V1*)eventData)->playerID; break; case bz_eShotFiredEvent: pos[0] = ((bz_ShotFiredEventData_V1*)eventData)->pos[0]; pos[1] = ((bz_ShotFiredEventData_V1*)eventData)->pos[1]; pos[2] = ((bz_ShotFiredEventData_V1*)eventData)->pos[2]; playerID = ((bz_ShotFiredEventData_V1*)eventData)->playerID; break; default: return; } const char* flagAbrev = bz_getPlayerFlag(playerID); if (!flagAbrev) return; std::vector<FlagStayZone*> validZones; // check and see if a zone cares about the current flag for ( unsigned int i = 0; i < zoneList.size(); i++ ) { if ( zoneList[i].checkFlag(flagAbrev) ) validZones.push_back(&zoneList[i]); } // Check each zone for this flag to see if we are in one bool insideOne = false; for ( unsigned int i = 0; i < validZones.size(); i++ ) { if ( validZones[i]->pointInZone(pos) ) { insideOne = true; playerIDToZoneMap[playerID] = i; } } // if they have taken the flag out of a zone, pop it. if (!insideOne && validZones.size() > 0) { int lastZone = -1; if ( playerIDToZoneMap.find(playerID) != playerIDToZoneMap.end() ) lastZone = playerIDToZoneMap[playerID]; bz_removePlayerFlag(playerID); if (lastZone != -1 && zoneList[lastZone].message.size()) bz_sendTextMessage(BZ_SERVER,playerID,zoneList[lastZone].message.c_str()); } }
void Defusal::Event(bz_EventData *eventData) { switch (eventData->eventType) { case bz_eFlagGrabbedEvent: //A player grabs a flag { bz_FlagGrabbedEventData_V1* flagGrabData = (bz_FlagGrabbedEventData_V1*)eventData; bz_BasePlayerRecord *playerdata = bz_getPlayerByIndex(flagGrabData->playerID); std::string flag = playerdata->currentFlag.c_str(); if (flag=="Red team flag" && playerdata->team==eRedTeam && bombPlaced) { bz_sendTextMessage(BZ_SERVER,flagGrabData->playerID,"The bomb has already been set. You may not move it."); bz_removePlayerFlag(flagGrabData->playerID); } else if(flag=="Red team flag" && playerdata->team==eBlueTeam && bombPlaced) { defusionStartTime = bz_getCurrentTime(); defusionInProgress = true; //Pseudo code, if player moves away from a X unit radius, take away flag and reset timer bz_sendTextMessagef(BZ_SERVER,flagGrabData->playerID,"You found the bomb! Defusing in %i seconds...",defusionTime); bz_sendTextMessagef(BZ_SERVER,eBlueTeam,"'%s' found the bomb! Go protect '%s' while (s)he is defusing the bomb!"); bz_sendTextMessagef(BZ_SERVER,eRedTeam,"Your bomb is being defused! Hurray and protect it!"); } bz_freePlayerRecord(playerdata); } break; case bz_eFlagDroppedEvent: //A player drops a flag { } break; case bz_ePlayerUpdateEvent: { } break; case bz_eTickEvent: { /* bool bz_setPlayerWins ( int playerId, int wins ); int bz_getPlayerWins ( int playerId ); int bz_getTeamScore (bz_eTeamType team ); int bz_getTeamWins (bz_eTeamType team ); int bz_getTeamLosses (bz_eTeamType team ); void bz_setTeamWins (bz_eTeamType team, int wins ); void bz_setTeamLosses (bz_eTeamType team, int losses ); */ if(defusionInProgress) { if((bombPlacementTime + detonationTime) < bz_getCurrentTime()) { //BOOM bz_sendTextMessage(BZ_SERVER,BZ_ALLUSERS,"Terrorists Win"); killAllTeam(bombPlacerID,eBlueTeam,eRedTeam); } else if((defusionStartTime + defusionTime) < bz_getCurrentTime()) { //whew bz_sendTextMessage(BZ_SERVER,BZ_ALLUSERS,"Counter-Terrorists Win"); killAllTeam(defusionID,eRedTeam,eBlueTeam); } } } break; default:break; //really? wtf? -.-" } }