Beispiel #1
0
   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()));
         }
      }
   }
Beispiel #2
0
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;
}
Beispiel #3
0
	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 );
	}	
Beispiel #4
0
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);
		}
	}
}
Beispiel #5
0
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()));
   }
}
Beispiel #6
0
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]);
		}
	}
}
Beispiel #7
0
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;
    }
  }
}
Beispiel #8
0
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;
}
Beispiel #9
0
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;
	}
}
Beispiel #10
0
	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;
	}