Advertisement
Guest User

Untitled

a guest
Mar 12th, 2013
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.13 KB | None | 0 0
  1. /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
  2. /* If you are missing that file, acquire a complete release at teeworlds.com.                */
  3. #include "dm.h"
  4. #include "../player.h"
  5. #include "../gamecontext.h"
  6.  
  7. #include <engine/shared/config.h>
  8. #include <game/mapitems.h>
  9. #include <game/server/entities/character.h>
  10. #include <game/server/entities/flag.h>
  11. #include <game/server/player.h>
  12. #include <game/server/gamecontext.h>
  13.  
  14. CGameControllerDM::CGameControllerDM(class CGameContext *pGameServer)
  15. : IGameController(pGameServer)
  16. {
  17.   Flag = 0;
  18.   m_pGameType = "asd";
  19.   m_GameFlags = GAMEFLAG_FLAGS;
  20. }
  21.  
  22. bool CGameControllerDM::OnEntity(int Index, vec2 Pos)
  23. {
  24.   if(IGameController::OnEntity(Index, Pos))
  25.     return true;
  26.  
  27.   int Team = -1;
  28.  
  29.   if(Index == ENTITY_FLAGSTAND_RED) Team = TEAM_G;
  30.   if(Team == -1 || Flag)
  31.     return false;
  32.  
  33.   CFlag *F = new CFlag(&GameServer()->m_World, Team);
  34.   F->m_StandPos = Pos;
  35.   F->m_Pos = Pos;
  36.   Flag = F;
  37.   GameServer()->m_World.InsertEntity(F);
  38.   return true;
  39. }
  40.  
  41. int CGameControllerDM::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int WeaponID)
  42. {
  43.   IGameController::OnCharacterDeath(pVictim, pKiller, WeaponID);
  44.   int HadFlag = 0;
  45.  
  46.   CFlag *F = Flag;
  47.   if(F && pKiller && pKiller->GetCharacter() && F->m_pCarryingCharacter == pKiller->GetCharacter())
  48.     HadFlag |= 2;
  49.   if(F && F->m_pCarryingCharacter == pVictim)
  50.   {
  51.     GameServer()->CreateSoundGlobal(SOUND_CTF_DROP);
  52.     F->m_DropTick = Server()->Tick();
  53.     F->m_pCarryingCharacter = 0;
  54.     F->m_Vel = vec2(0,0);
  55.     if(pKiller && pKiller->acc_Race != pVictim->GetPlayer()->acc_Race)
  56.       pKiller->m_Score++;
  57.     HadFlag |= 1;
  58.   }
  59.  
  60.   return HadFlag;
  61. }
  62.  
  63. void CGameControllerDM::DoWincheck()
  64. {
  65. /*  if(m_GameOverTick == -1 && !m_Warmup)
  66.   {
  67.     // check score win condition
  68.     if((g_Config.m_SvScorelimit > 0 && (m_aTeamscore[TEAM_RED] >= g_Config.m_SvScorelimit || m_aTeamscore[TEAM_BLUE] >= g_Config.m_SvScorelimit)) ||
  69.       (g_Config.m_SvTimelimit > 0 && (Server()->Tick()-m_RoundStartTick) >= g_Config.m_SvTimelimit*Server()->TickSpeed()*60))
  70.     {
  71.       if(m_SuddenDeath)
  72.       {
  73.         if(m_aTeamscore[TEAM_RED]/100 != m_aTeamscore[TEAM_BLUE]/100)
  74.           EndRound();
  75.       }
  76.       else
  77.       {
  78.         if(m_aTeamscore[TEAM_RED] != m_aTeamscore[TEAM_BLUE])
  79.           EndRound();
  80.         else
  81.           m_SuddenDeath = 1;
  82.       }
  83.     }
  84.   }*/
  85. }
  86.  
  87. bool CGameControllerDM::CanBeMovedOnBalance(int ClientID)
  88. {
  89.   /*CCharacter* Character = GameServer()->m_apPlayers[ClientID]->GetCharacter();
  90.   if(Character)
  91.   {
  92.     CFlag *F = Flag[0];
  93.     if(F->m_pCarryingCharacter == Character)
  94.       return false;
  95.   }*/
  96.   return true;
  97. }
  98.  
  99. void CGameControllerDM::Snap(int SnappingClient)
  100. {
  101.   IGameController::Snap(SnappingClient);
  102.  
  103.   CNetObj_GameData *pGameDataObj = (CNetObj_GameData *)Server()->SnapNewItem(NETOBJTYPE_GAMEDATA, 0, sizeof(CNetObj_GameData));
  104.   if(!pGameDataObj)
  105.     return;
  106.  
  107.   if(Flag){
  108.     if(Flag->m_AtStand){
  109.       pGameDataObj->m_FlagCarrierRed = FLAG_ATSTAND;
  110.       pGameDataObj->m_FlagCarrierBlue = FLAG_ATSTAND;
  111.     }
  112.     else if(Flag->m_pCarryingCharacter && Flag->m_pCarryingCharacter->GetPlayer())
  113.       pGameDataObj->m_FlagCarrierRed = Flag->m_pCarryingCharacter->GetPlayer()->GetCID();
  114.     else
  115.       pGameDataObj->m_FlagCarrierRed = FLAG_TAKEN;
  116.   }else
  117.     pGameDataObj->m_FlagCarrierRed = FLAG_MISSING;
  118. }
  119.  
  120. void CGameControllerDM::Tick()
  121. {
  122.   IGameController::Tick();
  123.  
  124.   if(GameServer()->m_World.m_ResetRequested || GameServer()->m_World.m_Paused)
  125.     return;
  126.  
  127.   CFlag *F = Flag;
  128.  
  129.   if(!F){
  130.     F->m_Pos = vec2(300, 300);
  131.     if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y)&CCollision::COLFLAG_DEATH || F->GameLayerClipped(F->m_Pos)){
  132.       GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", "flag_return");
  133.       GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
  134.       F->Reset();
  135.     }
  136.  
  137.     if(F->m_pCarryingCharacter){
  138.       F->m_Pos = F->m_pCarryingCharacter->m_Pos;
  139.  
  140.       if(Flag && Flag->m_AtStand){
  141.         if(distance(F->m_Pos, Flag->m_Pos) < CFlag::ms_PhysSize + CCharacter::ms_PhysSize){
  142.           F->m_pCarryingCharacter->GetPlayer()->m_Score += 5;
  143.  
  144.           char aBuf[512];
  145.           str_format(aBuf, sizeof(aBuf), "flag_capture player='%d:%s'",
  146.             F->m_pCarryingCharacter->GetPlayer()->GetCID(),
  147.             Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
  148.             GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
  149.  
  150.           float CaptureTime = (Server()->Tick() - F->m_GrabTick)/(float)Server()->TickSpeed();
  151.           if(CaptureTime <= 60){
  152.             str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s' (%d.%s%d seconds)", 0 ? "blue" : "red", Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()), (int)CaptureTime%60, ((int)(CaptureTime*100)%100)<10?"0":"", (int)(CaptureTime*100)%100);
  153.           }else{
  154.             str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s'", 0 ? "blue" : "red", Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
  155.           }
  156.           GameServer()->SendChat(-1, -2, aBuf);
  157.           Flag->Reset();
  158.           GameServer()->CreateSoundGlobal(SOUND_CTF_CAPTURE);
  159.         }
  160.       }
  161.     }else{
  162.       CCharacter *apCloseCCharacters[MAX_CLIENTS];
  163.       int Num = GameServer()->m_World.FindEntities(F->m_Pos, CFlag::ms_PhysSize, (CEntity**)apCloseCCharacters, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER);
  164.       for(int i = 0; i < Num; i++){
  165.         if(!apCloseCCharacters[i]->IsAlive() || apCloseCCharacters[i]->GetPlayer()->acc_IsLogged || GameServer()->Collision()->IntersectLine(F->m_Pos, apCloseCCharacters[i]->m_Pos, NULL, NULL))
  166.           continue;
  167.  
  168.         if(apCloseCCharacters[i]->GetPlayer()->acc_R == F->m_Team){
  169.           if(!F->m_AtStand){
  170.             CCharacter *pChr = apCloseCCharacters[i];
  171.             pChr->GetPlayer()->m_Score += 1;
  172.             char aBuf[256];
  173.             str_format(aBuf, sizeof(aBuf), "flag_return player='%d:%s'",
  174.               pChr->GetPlayer()->GetCID(),
  175.               Server()->ClientName(pChr->GetPlayer()->GetCID()));
  176.             GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
  177.  
  178.             GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
  179.             F->Reset();
  180.           }
  181.         }else if(apCloseCCharacters[i]->GetPlayer()->acc_R == TEAM_E){
  182.           if(F->m_AtStand){
  183.             F->m_GrabTick = Server()->Tick();
  184.           }
  185.  
  186.           F->m_AtStand = 0;
  187.           F->m_pCarryingCharacter = apCloseCCharacters[i];
  188.           F->m_pCarryingCharacter->GetPlayer()->m_Score += 1;
  189.  
  190.           char aBuf[256];
  191.           str_format(aBuf, sizeof(aBuf), "flag_grab player='%d:%s'",
  192.             F->m_pCarryingCharacter->GetPlayer()->GetCID(),
  193.             Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
  194.           GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
  195.  
  196.           for(int c = 0; c < MAX_CLIENTS; c++){
  197.             CPlayer *pPlayer = GameServer()->m_apPlayers[c];
  198.             if(!pPlayer)
  199.               continue;
  200.  
  201.             if(pPlayer->GetTeam() == TEAM_SPECTATORS && pPlayer->m_SpectatorID != SPEC_FREEVIEW && GameServer()->m_apPlayers[pPlayer->m_SpectatorID] && GameServer()->m_apPlayers[pPlayer->m_SpectatorID]->GetTeam() == 0)
  202.               GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, c);
  203.             else if(pPlayer->acc_Race == 0)
  204.               GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, c);
  205.             else
  206.               GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_PL, c);
  207.           }
  208.           break;
  209.         }
  210.       }
  211.       if(!F->m_pCarryingCharacter && !F->m_AtStand){
  212.         if(Server()->Tick() > F->m_DropTick + Server()->TickSpeed()*30){
  213.           GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
  214.           F->Reset();
  215.         }else       {
  216.           F->m_Vel.y += GameServer()->m_World.m_Core.m_Tuning.m_Gravity;
  217.           GameServer()->Collision()->MoveBox(&F->m_Pos, &F->m_Vel, vec2(F->ms_PhysSize, F->ms_PhysSize), 0.5f);
  218.         }
  219.       }
  220.     }
  221.   }
  222. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement