void renderInterfaceOverlay(bool scoreboardVisible) { Parent::renderInterfaceOverlay(scoreboardVisible); Ship *u = (Ship *) gClientGame->getConnectionToServer()->getControlObject(); if(!u) return; bool uFlag = false; for(S32 i = 0; i < mFlags.size(); i++) { if(mFlags[i].isValid() && mFlags[i]->getMount() == u) { for(S32 j = 0; j < mZones.size(); j++) { // see if this is one of our zones and that it doesn't have a flag in it. if(mZones[j]->getTeam() != u->getTeam()) continue; S32 k; for(k = 0; k < mFlags.size(); k++) { if(!mFlags[k].isValid()) continue; if(mFlags[k]->getZone() == mZones[j]) break; } if(k == mFlags.size()) renderObjectiveArrow(mZones[j], getTeamColor(u->getTeam())); } uFlag = true; break; } } for(S32 i = 0; i < mFlags.size(); i++) { if(!mFlags[i].isValid()) continue; if(!mFlags[i]->isMounted() && !uFlag) { GoalZone *gz = mFlags[i]->getZone(); if(gz && gz->getTeam() != u->getTeam()) renderObjectiveArrow(mFlags[i], getTeamColor(gz->getTeam())); else if(!gz) renderObjectiveArrow(mFlags[i], getTeamColor(-1)); } else { Ship *mount = mFlags[i]->getMount(); if(mount && mount != u) renderObjectiveArrow(mount, getTeamColor(mount->getTeam())); } } }
void killTeams(bz_eTeamType safeteam, std::string kothcallsign) { 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) { if (player->team != safeteam) { bz_killPlayer(player->playerID, true, BZ_SERVER); if (koth.soundEnabled) bz_sendPlayCustomLocalSound(player->playerID, "flag_lost"); } else if (koth.soundEnabled) { bz_sendPlayCustomLocalSound(player->playerID, "flag_won"); } } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); bz_sendTextMessagef(BZ_SERVER, BZ_ALLUSERS, "%s (%s) IS KING OF THE HILL!", getTeamColor(safeteam), kothcallsign.c_str()); return; }
Spaceship::Spaceship( const std::string& spaceshipName, short teamNumber, int screenWidth, int screenHeight, bool isServerSide ) : SpaceGameActor( spaceshipName, teamNumber, screenWidth, screenHeight ) , m_spaceShipName( spaceshipName ) { m_actorType = SPACE_SHIP_ACTOR_TYPE; m_radius = 20.0f; m_drag = 15.0f; if( !isServerSide ) createMesh( getTeamColor( teamNumber ) ); m_weaponTimer = new Timer( 0.5f ); m_weaponTimer->start(); m_actorTypesCanCollideWith = BULLET_ACTOR_TYPE; m_fontParams.set( "fontName", std::string( "mainFont_72" ) ); m_fontParams.set( "fontHeight", 12 ); m_fontParams.set( "color", getTeamColor( teamNumber ) ); m_fontParams.set( "posRel", std::string( "BOTLEFT" ) ); m_fontParams.set( "text", spaceshipName ); }
void Team::_createPlayers() { std::vector<int> vec_pos = PlayerPositionManager::get().getAssignedPosition("WaitingForKickOff"); // Generate players with PlayerManager if (getTeamColor() == RED) { for (int i = 0; i < 3; ++i) { mPlayers.push_back((FieldPlayer*)addChildNode(PlayerManager::get().createFieldPlayer("Red_" + dt::Utils::toString(i), this, FieldPlayer::ATTACKER, vec_pos[i])).get()); } #if !DEBUG_FOR_ONE_TEAM for (int i = 3; i < 6; ++i) { mPlayers.push_back((FieldPlayer*)addChildNode(PlayerManager::get().createFieldPlayer("Red_" + dt::Utils::toString(i), this, FieldPlayer::DEFENDER, vec_pos[i])).get()); } mPlayers.push_back((GoalKeeper*)addChildNode(PlayerManager::get().createGoalKeeper("Red_" + dt::Utils::toString(6), this, vec_pos[6])).get()); #endif for (int i = 0; i < mPlayers.size(); ++i) { mPlayers[i]->placeAtPosition(mPlayers[i]->getPositionWithRegion(), RED_TEAM_HEADING, Prm.PlayerScale); } } else { #if !DEBUG_FOR_ONE_TEAM for (int i = 7; i < 10; ++i) { mPlayers.push_back((FieldPlayer*)addChildNode(PlayerManager::get().createFieldPlayer("Blue_" + dt::Utils::toString(i - 7), this, FieldPlayer::ATTACKER, vec_pos[i])).get()); } for (int i = 10; i < 13; ++i) { mPlayers.push_back((FieldPlayer*)addChildNode(PlayerManager::get().createFieldPlayer("Blue_" + dt::Utils::toString(i - 7), this, FieldPlayer::DEFENDER, vec_pos[i])).get()); } mPlayers.push_back((GoalKeeper*)addChildNode(PlayerManager::get().createGoalKeeper("Blue_" + dt::Utils::toString(6), this, vec_pos[13])).get()); #endif for (int i = 0; i < mPlayers.size(); ++i) { mPlayers[i]->placeAtPosition(mPlayers[i]->getPositionWithRegion(), BLUE_TEAM_HEADING, Prm.PlayerScale); } } }
void CTFGameType::renderInterfaceOverlay(bool scoreboardVisible) { Parent::renderInterfaceOverlay(scoreboardVisible); Ship *u = (Ship *) gClientGame->getConnectionToServer()->getControlObject(); if(!u) return; for(S32 i = 0; i < mFlags.size(); i++) { if(!mFlags[i].isValid()) continue; if(mFlags[i]->isMounted()) { Ship *mount = mFlags[i]->getMount(); if(mount) renderObjectiveArrow(mount, getTeamColor(mount->getTeam())); } else renderObjectiveArrow(mFlags[i], getTeamColor(mFlags[i]->getTeam())); } }
void Team::setAssignedRegion(const std::vector<int>& vec_pos) { if (getTeamColor() == RED) { for (int i = mPlayers.size() - 1; i >= 0; --i) { mPlayers[i]->setAssignedRegion(vec_pos[i]); } } else { for (int i = mPlayers.size() - 1; i >= 0; --i) { mPlayers[i]->setAssignedRegion(vec_pos[i + 7]); } } }
inline void KOTHEventHandler::process(bz_EventData * eventData) { if (!koth.enabled) // King of the Hill disabled - we can leave return; if (onePlayer()) // Not enough players - we can leave return; 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; } if (!koth.toldHillOpen && koth.id == -1) // Hill is open - inform players { bz_sendTextMessage(BZ_SERVER, BZ_ALLUSERS, "Hill is not controlled - take it!"); koth.toldHillOpen = true; } if (kothzone.pointIn(pos)) // player is on Hill { bz_BasePlayerRecord *player = bz_getPlayerByIndex(playerID); if (player) { if (player->playerID != koth.playerJustWon && player->spawned) { if ((koth.id == -1 && player->team != koth.team) || (koth.id == -1 && teamClear(koth.team))) initiatekoth(player->team, player->callsign, player->playerID); double timeStanding = bz_getCurrentTime() - koth.startTime; if (timeStanding >= koth.adjustedTime && koth.id != -1) // time's up - kill 'em { if (koth.teamPlay && koth.team != eRogueTeam) killTeams(koth.team, koth.callsign); else killPlayers(koth.id, koth.callsign); if (!koth.teamPlay || koth.team == eRogueTeam) bz_sendTextMessage(BZ_SERVER, koth.id, "You are King of the Hill! You must leave hill to retake it."); else bz_sendTextMessage(BZ_SERVER, koth.team, "Your team is King of the Hill! Entire team must leave hill to retake it."); koth.playerJustWon = koth.id; koth.id = -1; return; } if (koth.id != -1) sendWarnings(getTeamColor(koth.team), koth.callsign, koth.startTime); } } bz_freePlayerRecord(player); } else { // player is off Hill if (playerID == koth.playerJustWon) koth.playerJustWon = -1; if (playerID == koth.id) { koth.id = -1; koth.team = eNoTeam; } } }
void initiatekoth(bz_eTeamType plyrteam, bz_ApiString plyrcallsign, int plyrID) { koth.team = plyrteam; koth.callsign = plyrcallsign.c_str(); if (koth.callsign.size() > 16) { std::string tofix = truncate(koth.callsign); koth.callsign = tofix; } koth.id = plyrID; koth.startTime = bz_getCurrentTime(); koth.TTHminutes = (int) (koth.adjustedTime / 60 + 0.5); koth.TTHseconds = 30; koth.toldHillOpen = false; bool multipleof30 = false; if ((int) ((koth.adjustedTime / 30) + 0.5) != (double) (koth.adjustedTime / 30)) multipleof30 = false; else multipleof30 = true; if (!multipleof30) { if ((!koth.teamPlay || koth.team == eRogueTeam)) bz_sendTextMessagef(BZ_SERVER, BZ_ALLUSERS, "%s has Hill; will be King in %i secs!", koth.callsign.c_str(), (int) koth.adjustedTime); else bz_sendTextMessagef(BZ_SERVER, BZ_ALLUSERS, "%s (%s) has Hill; will be King in %i secs!", getTeamColor(koth.team), koth.callsign.c_str(), (int) koth.adjustedTime); } if (koth.soundEnabled) { 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) { if (player->team != koth.team) bz_sendPlayCustomLocalSound(player->playerID, "flag_alert"); else bz_sendPlayCustomLocalSound(player->playerID, "teamgrab"); } bz_freePlayerRecord(player); } bz_deleteIntList(playerList); } return; }
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; } }
Bullet::Bullet( const std::string& id, const vec2f& pos, float rotation, short teamNumber, int screenWidth, int screenHeight, bool isServerSide ) : SpaceGameActor( id + "_" + toString( sm_nextBulletID++ ), teamNumber, screenWidth, screenHeight ) , BULLET_SPEED( 500.0f ) { m_actorType = BULLET_ACTOR_TYPE; setPosition( pos ); m_lifespan = 2.0f; m_drag = 0.0f; m_radius = 4.0f; SGA_State currentState; currentState.pos = pos; currentState.rot = rotation; m_stateTimeline.SetDrag( m_drag ); const float radians = MathFuncs<float>::degreesToRadians( rotation ); const float sinRotation = std::sin( radians ); const float cosRotation = std::cos( radians ); vec2f dir = vec2f( sinRotation, cosRotation ); currentState.vel = dir * BULLET_SPEED; if( !isServerSide ) setMesh( MeshFactory::generateLine( vec2f(), vec2f( 0.0f, 4.0f ), "SimpleColorMaterial", getTeamColor( teamNumber ) ) ); setRotation( mat3f::createMatrixFromQuaternion( quatf::makeQuaternionFromAxisAngle( MathFuncs<float>::degreesToRadians( rotation ), vec3f( 0.0f, 0.0f, 1.0f ) ) ) ); m_stateTimeline.Set( 0, currentState ); m_actorTypesCanCollideWith = SPACE_SHIP_ACTOR_TYPE; }