diff options
Diffstat (limited to 'src/game/server/player.cpp')
| -rw-r--r-- | src/game/server/player.cpp | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 4b37385f..7e07c07f 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -21,6 +21,16 @@ CPlayer::CPlayer(CGameContext *pGameServer, int ClientID, int Team) m_SpectatorID = SPEC_FREEVIEW; m_LastActionTick = Server()->Tick(); m_TeamChangeTick = Server()->Tick(); + + //zCatch + m_CaughtBy = -1; + m_SpecExplicit = 0; + m_Kills = 0; + m_Deaths = 0; + m_LastKillTry = Server()->Tick(); + m_TicksSpec = 0; + m_TicksIngame = 0; + m_ChatTicks = 0; } CPlayer::~CPlayer() @@ -38,6 +48,20 @@ void CPlayer::Tick() return; Server()->SetClientScore(m_ClientID, m_Score); + + /* begin zCatch*/ + + if(m_Team == TEAM_SPECTATORS) + m_TicksSpec++; + else + m_TicksIngame++; + + if(m_ChatTicks > 0) + m_ChatTicks--; + + if((g_Config.m_SvAnticamper == 2 && g_Config.m_SvMode == 1) || (g_Config.m_SvAnticamper == 1)) + Anticamper(); + /* end zCatch*/ // do latency stuff { @@ -179,6 +203,9 @@ void CPlayer::OnPredictedInput(CNetObj_PlayerInput *NewInput) if((m_PlayerFlags&PLAYERFLAG_CHATTING) && (NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING)) return; + if(m_pCharacter && m_pCharacter->m_FreezeTicks) + return; + if(m_pCharacter) m_pCharacter->OnPredictedInput(NewInput); } @@ -204,6 +231,9 @@ void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) if(m_pCharacter) m_pCharacter->OnDirectInput(NewInput); + if(m_pCharacter && m_pCharacter->m_FreezeTicks) + return; + if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) m_Spawning = true; @@ -275,7 +305,15 @@ void CPlayer::SetTeam(int Team, bool DoChatMsg) if(GameServer()->m_apPlayers[i] && GameServer()->m_apPlayers[i]->m_SpectatorID == m_ClientID) GameServer()->m_apPlayers[i]->m_SpectatorID = SPEC_FREEVIEW; } + m_SpecExplicit = 1; } + else + m_SpecExplicit = 0; +} + +void CPlayer::SetTeamDirect(int Team) +{ + m_Team = Team; } void CPlayer::TryRespawn() @@ -290,3 +328,52 @@ void CPlayer::TryRespawn() m_pCharacter->Spawn(this, SpawnPos); GameServer()->CreatePlayerSpawn(SpawnPos); } + +int CPlayer::Anticamper() +{ + if(GameServer()->m_World.m_Paused || !m_pCharacter || m_Team == TEAM_SPECTATORS || m_pCharacter->m_FreezeTicks) + { + m_CampTick = -1; + m_SentCampMsg = false; + return 0; + } + + int AnticamperTime = g_Config.m_SvAnticamperTime; + int AnticamperRange = g_Config.m_SvAnticamperRange; + + if(m_CampTick == -1) + { + m_CampPos = m_pCharacter->m_Pos; + m_CampTick = Server()->Tick() + Server()->TickSpeed()*AnticamperTime; + } + + // Check if the player is moving + if((m_CampPos.x - m_pCharacter->m_Pos.x >= (float)AnticamperRange || m_CampPos.x - m_pCharacter->m_Pos.x <= -(float)AnticamperRange) + || (m_CampPos.y - m_pCharacter->m_Pos.y >= (float)AnticamperRange || m_CampPos.y - m_pCharacter->m_Pos.y <= -(float)AnticamperRange)) + { + m_CampTick = -1; + } + + // Send warning to the player + if(m_CampTick <= Server()->Tick() + Server()->TickSpeed() * AnticamperTime/2 && m_CampTick != -1 && !m_SentCampMsg) + { + GameServer()->SendBroadcast("ANTICAMPER: Move or die", m_ClientID); + m_SentCampMsg = true; + } + + // Kill him + if((m_CampTick <= Server()->Tick()) && (m_CampTick > 0)) + { + if(g_Config.m_SvAnticamperFreeze) + { + m_pCharacter->Freeze(Server()->TickSpeed()*g_Config.m_SvAnticamperFreeze); + GameServer()->SendBroadcast("You have been freezed due camping", m_ClientID); + } + else + m_pCharacter->Die(m_ClientID, WEAPON_GAME); + m_CampTick = -1; + m_SentCampMsg = false; + return 1; + } + return 0; +} |