diff options
Diffstat (limited to 'src/game/server/player.cpp')
| -rw-r--r-- | src/game/server/player.cpp | 137 |
1 files changed, 111 insertions, 26 deletions
diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index aeafe3a4..7464e3c7 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -15,17 +15,29 @@ CPlayer::CPlayer(CGameContext *pGameServer, int ClientID, int Team) m_RespawnTick = Server()->Tick(); m_DieTick = Server()->Tick(); m_ScoreStartTick = Server()->Tick(); - Character = 0; - this->m_ClientID = ClientID; + m_pCharacter = 0; + m_ClientID = ClientID; m_Team = GameServer()->m_pController->ClampTeam(Team); m_SpectatorID = SPEC_FREEVIEW; m_LastActionTick = Server()->Tick(); + m_TeamChangeTick = Server()->Tick(); + + //zCatch + m_CatchedBy = -1; + m_SpecExplicit = 0; + m_Kills = 0; + m_Deaths = 0; + m_PlayerWantToFollowCatcher = g_Config.m_SvFollowCatcher; + m_LastKillTry = Server()->Tick(); + m_TicksSpec = 0; + m_TicksIngame = 0; + m_ChatTicks = 0; } CPlayer::~CPlayer() { - delete Character; - Character = 0; + delete m_pCharacter; + m_pCharacter = 0; } void CPlayer::Tick() @@ -37,6 +49,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 && m_pCharacter && !GameServer()->m_World.m_Paused) + Anticamper(); + /* end zCatch*/ // do latency stuff { @@ -59,19 +85,22 @@ void CPlayer::Tick() } } - if(!Character && m_DieTick+Server()->TickSpeed()*3 <= Server()->Tick()) + if(!m_pCharacter && m_Team == TEAM_SPECTATORS && m_SpectatorID == SPEC_FREEVIEW) + m_ViewPos -= vec2(clamp(m_ViewPos.x-m_LatestActivity.m_TargetX, -500.0f, 500.0f), clamp(m_ViewPos.y-m_LatestActivity.m_TargetY, -400.0f, 400.0f)); + + if(!m_pCharacter && m_DieTick+Server()->TickSpeed()*3 <= Server()->Tick()) m_Spawning = true; - if(Character) + if(m_pCharacter) { - if(Character->IsAlive()) + if(m_pCharacter->IsAlive()) { - m_ViewPos = Character->m_Pos; + m_ViewPos = m_pCharacter->m_Pos; } else { - delete Character; - Character = 0; + delete m_pCharacter; + m_pCharacter = 0; } } else if(m_Spawning && m_RespawnTick <= Server()->Tick()) @@ -160,23 +189,38 @@ void CPlayer::OnDisconnect(const char *pReason) void CPlayer::OnPredictedInput(CNetObj_PlayerInput *NewInput) { - if(Character) - Character->OnPredictedInput(NewInput); + // skip the input if chat is active + if((m_PlayerFlags&PLAYERFLAG_CHATTING) && (NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING)) + return; + + if(m_pCharacter) + m_pCharacter->OnPredictedInput(NewInput); } void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) { + if(NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING) + { + // skip the input if chat is active + if(m_PlayerFlags&PLAYERFLAG_CHATTING) + return; + + // reset input + if(m_pCharacter) + m_pCharacter->ResetInput(); + + m_PlayerFlags = NewInput->m_PlayerFlags; + return; + } + m_PlayerFlags = NewInput->m_PlayerFlags; - if(Character) - Character->OnDirectInput(NewInput); + if(m_pCharacter) + m_pCharacter->OnDirectInput(NewInput); - if(!Character && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) + if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) m_Spawning = true; - if(!Character && m_Team == TEAM_SPECTATORS && m_SpectatorID == SPEC_FREEVIEW) - m_ViewPos = vec2(NewInput->m_TargetX, NewInput->m_TargetY); - // check for activity if(NewInput->m_Direction || m_LatestActivity.m_TargetX != NewInput->m_TargetX || m_LatestActivity.m_TargetY != NewInput->m_TargetY || NewInput->m_Jump || @@ -190,18 +234,18 @@ void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) CCharacter *CPlayer::GetCharacter() { - if(Character && Character->IsAlive()) - return Character; + if(m_pCharacter && m_pCharacter->IsAlive()) + return m_pCharacter; return 0; } void CPlayer::KillCharacter(int Weapon) { - if(Character) + if(m_pCharacter) { - Character->Die(m_ClientID, Weapon); - delete Character; - Character = 0; + m_pCharacter->Die(m_ClientID, Weapon); + delete m_pCharacter; + m_pCharacter = 0; } } @@ -244,6 +288,11 @@ void CPlayer::SetTeam(int Team) } } +void CPlayer::SetTeamDirect(int Team) +{ + m_Team = Team; +} + void CPlayer::TryRespawn() { vec2 SpawnPos; @@ -252,7 +301,43 @@ void CPlayer::TryRespawn() return; m_Spawning = false; - Character = new(m_ClientID) CCharacter(&GameServer()->m_World); - Character->Spawn(this, SpawnPos); + m_pCharacter = new(m_ClientID) CCharacter(&GameServer()->m_World); + m_pCharacter->Spawn(this, SpawnPos); GameServer()->CreatePlayerSpawn(SpawnPos); } + +int CPlayer::Anticamper() +{ + 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)) + { + m_pCharacter->Die(m_ClientID, WEAPON_ANTICAMPER); + m_CampTick = -1; + m_SentCampMsg = false; + return 1; + } + return 0; +} |