Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /* (c) Magnus Auvinen. See licence.txt in the root of the distribution for more information. */
- /* If you are missing that file, acquire a complete release at teeworlds.com. */
- #include "dm.h"
- #include "../player.h"
- #include "../gamecontext.h"
- #include <engine/shared/config.h>
- #include <game/mapitems.h>
- #include <game/server/entities/character.h>
- #include <game/server/entities/flag.h>
- #include <game/server/player.h>
- #include <game/server/gamecontext.h>
- CGameControllerDM::CGameControllerDM(class CGameContext *pGameServer)
- : IGameController(pGameServer)
- {
- Flag = 0;
- m_pGameType = "asd";
- m_GameFlags = GAMEFLAG_FLAGS;
- }
- bool CGameControllerDM::OnEntity(int Index, vec2 Pos)
- {
- if(IGameController::OnEntity(Index, Pos))
- return true;
- int Team = -1;
- if(Index == ENTITY_FLAGSTAND_RED) Team = TEAM_G;
- if(Team == -1 || Flag)
- return false;
- CFlag *F = new CFlag(&GameServer()->m_World, Team);
- F->m_StandPos = Pos;
- F->m_Pos = Pos;
- Flag = F;
- GameServer()->m_World.InsertEntity(F);
- return true;
- }
- int CGameControllerDM::OnCharacterDeath(class CCharacter *pVictim, class CPlayer *pKiller, int WeaponID)
- {
- IGameController::OnCharacterDeath(pVictim, pKiller, WeaponID);
- int HadFlag = 0;
- CFlag *F = Flag;
- if(F && pKiller && pKiller->GetCharacter() && F->m_pCarryingCharacter == pKiller->GetCharacter())
- HadFlag |= 2;
- if(F && F->m_pCarryingCharacter == pVictim)
- {
- GameServer()->CreateSoundGlobal(SOUND_CTF_DROP);
- F->m_DropTick = Server()->Tick();
- F->m_pCarryingCharacter = 0;
- F->m_Vel = vec2(0,0);
- if(pKiller && pKiller->acc_Race != pVictim->GetPlayer()->acc_Race)
- pKiller->m_Score++;
- HadFlag |= 1;
- }
- return HadFlag;
- }
- void CGameControllerDM::DoWincheck()
- {
- /* if(m_GameOverTick == -1 && !m_Warmup)
- {
- // check score win condition
- if((g_Config.m_SvScorelimit > 0 && (m_aTeamscore[TEAM_RED] >= g_Config.m_SvScorelimit || m_aTeamscore[TEAM_BLUE] >= g_Config.m_SvScorelimit)) ||
- (g_Config.m_SvTimelimit > 0 && (Server()->Tick()-m_RoundStartTick) >= g_Config.m_SvTimelimit*Server()->TickSpeed()*60))
- {
- if(m_SuddenDeath)
- {
- if(m_aTeamscore[TEAM_RED]/100 != m_aTeamscore[TEAM_BLUE]/100)
- EndRound();
- }
- else
- {
- if(m_aTeamscore[TEAM_RED] != m_aTeamscore[TEAM_BLUE])
- EndRound();
- else
- m_SuddenDeath = 1;
- }
- }
- }*/
- }
- bool CGameControllerDM::CanBeMovedOnBalance(int ClientID)
- {
- /*CCharacter* Character = GameServer()->m_apPlayers[ClientID]->GetCharacter();
- if(Character)
- {
- CFlag *F = Flag[0];
- if(F->m_pCarryingCharacter == Character)
- return false;
- }*/
- return true;
- }
- void CGameControllerDM::Snap(int SnappingClient)
- {
- IGameController::Snap(SnappingClient);
- CNetObj_GameData *pGameDataObj = (CNetObj_GameData *)Server()->SnapNewItem(NETOBJTYPE_GAMEDATA, 0, sizeof(CNetObj_GameData));
- if(!pGameDataObj)
- return;
- if(Flag){
- if(Flag->m_AtStand){
- pGameDataObj->m_FlagCarrierRed = FLAG_ATSTAND;
- pGameDataObj->m_FlagCarrierBlue = FLAG_ATSTAND;
- }
- else if(Flag->m_pCarryingCharacter && Flag->m_pCarryingCharacter->GetPlayer())
- pGameDataObj->m_FlagCarrierRed = Flag->m_pCarryingCharacter->GetPlayer()->GetCID();
- else
- pGameDataObj->m_FlagCarrierRed = FLAG_TAKEN;
- }else
- pGameDataObj->m_FlagCarrierRed = FLAG_MISSING;
- }
- void CGameControllerDM::Tick()
- {
- IGameController::Tick();
- if(GameServer()->m_World.m_ResetRequested || GameServer()->m_World.m_Paused)
- return;
- CFlag *F = Flag;
- if(!F){
- F->m_Pos = vec2(300, 300);
- if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y)&CCollision::COLFLAG_DEATH || F->GameLayerClipped(F->m_Pos)){
- GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", "flag_return");
- GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
- F->Reset();
- }
- if(F->m_pCarryingCharacter){
- F->m_Pos = F->m_pCarryingCharacter->m_Pos;
- if(Flag && Flag->m_AtStand){
- if(distance(F->m_Pos, Flag->m_Pos) < CFlag::ms_PhysSize + CCharacter::ms_PhysSize){
- F->m_pCarryingCharacter->GetPlayer()->m_Score += 5;
- char aBuf[512];
- str_format(aBuf, sizeof(aBuf), "flag_capture player='%d:%s'",
- F->m_pCarryingCharacter->GetPlayer()->GetCID(),
- Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
- GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
- float CaptureTime = (Server()->Tick() - F->m_GrabTick)/(float)Server()->TickSpeed();
- if(CaptureTime <= 60){
- 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);
- }else{
- str_format(aBuf, sizeof(aBuf), "The %s flag was captured by '%s'", 0 ? "blue" : "red", Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
- }
- GameServer()->SendChat(-1, -2, aBuf);
- Flag->Reset();
- GameServer()->CreateSoundGlobal(SOUND_CTF_CAPTURE);
- }
- }
- }else{
- CCharacter *apCloseCCharacters[MAX_CLIENTS];
- int Num = GameServer()->m_World.FindEntities(F->m_Pos, CFlag::ms_PhysSize, (CEntity**)apCloseCCharacters, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER);
- for(int i = 0; i < Num; i++){
- if(!apCloseCCharacters[i]->IsAlive() || apCloseCCharacters[i]->GetPlayer()->acc_IsLogged || GameServer()->Collision()->IntersectLine(F->m_Pos, apCloseCCharacters[i]->m_Pos, NULL, NULL))
- continue;
- if(apCloseCCharacters[i]->GetPlayer()->acc_R == F->m_Team){
- if(!F->m_AtStand){
- CCharacter *pChr = apCloseCCharacters[i];
- pChr->GetPlayer()->m_Score += 1;
- char aBuf[256];
- str_format(aBuf, sizeof(aBuf), "flag_return player='%d:%s'",
- pChr->GetPlayer()->GetCID(),
- Server()->ClientName(pChr->GetPlayer()->GetCID()));
- GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
- GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
- F->Reset();
- }
- }else if(apCloseCCharacters[i]->GetPlayer()->acc_R == TEAM_E){
- if(F->m_AtStand){
- F->m_GrabTick = Server()->Tick();
- }
- F->m_AtStand = 0;
- F->m_pCarryingCharacter = apCloseCCharacters[i];
- F->m_pCarryingCharacter->GetPlayer()->m_Score += 1;
- char aBuf[256];
- str_format(aBuf, sizeof(aBuf), "flag_grab player='%d:%s'",
- F->m_pCarryingCharacter->GetPlayer()->GetCID(),
- Server()->ClientName(F->m_pCarryingCharacter->GetPlayer()->GetCID()));
- GameServer()->Console()->Print(IConsole::OUTPUT_LEVEL_DEBUG, "game", aBuf);
- for(int c = 0; c < MAX_CLIENTS; c++){
- CPlayer *pPlayer = GameServer()->m_apPlayers[c];
- if(!pPlayer)
- continue;
- if(pPlayer->GetTeam() == TEAM_SPECTATORS && pPlayer->m_SpectatorID != SPEC_FREEVIEW && GameServer()->m_apPlayers[pPlayer->m_SpectatorID] && GameServer()->m_apPlayers[pPlayer->m_SpectatorID]->GetTeam() == 0)
- GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, c);
- else if(pPlayer->acc_Race == 0)
- GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_EN, c);
- else
- GameServer()->CreateSoundGlobal(SOUND_CTF_GRAB_PL, c);
- }
- break;
- }
- }
- if(!F->m_pCarryingCharacter && !F->m_AtStand){
- if(Server()->Tick() > F->m_DropTick + Server()->TickSpeed()*30){
- GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
- F->Reset();
- }else {
- F->m_Vel.y += GameServer()->m_World.m_Core.m_Tuning.m_Gravity;
- GameServer()->Collision()->MoveBox(&F->m_Pos, &F->m_Vel, vec2(F->ms_PhysSize, F->ms_PhysSize), 0.5f);
- }
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement