diff options
Diffstat (limited to 'src/game/server')
| -rw-r--r-- | src/game/server/entities/character.cpp | 33 | ||||
| -rw-r--r-- | src/game/server/entities/character.h | 1 | ||||
| -rw-r--r-- | src/game/server/gamecontext.cpp | 2 | ||||
| -rw-r--r-- | src/game/server/gamemodes/zcatch.cpp | 1 | ||||
| -rw-r--r-- | src/game/server/player.cpp | 14 | ||||
| -rw-r--r-- | src/game/server/player.h | 1 |
6 files changed, 29 insertions, 23 deletions
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp index 098bc255..f4a43c08 100644 --- a/src/game/server/entities/character.cpp +++ b/src/game/server/entities/character.cpp @@ -45,6 +45,7 @@ CCharacter::CCharacter(CGameWorld *pWorld) m_ProximityRadius = ms_PhysSize; m_Health = 0; m_Armor = 0; + m_FreezeTicks = 0; } void CCharacter::Reset() @@ -526,6 +527,9 @@ void CCharacter::SetEmote(int Emote, int Tick) void CCharacter::OnPredictedInput(CNetObj_PlayerInput *pNewInput) { + if(m_FreezeTicks) + return; + // check for changes if(mem_comp(&m_Input, pNewInput, sizeof(CNetObj_PlayerInput)) != 0) m_LastAction = Server()->Tick(); @@ -541,11 +545,8 @@ void CCharacter::OnPredictedInput(CNetObj_PlayerInput *pNewInput) void CCharacter::OnDirectInput(CNetObj_PlayerInput *pNewInput) { - if(m_pPlayer->m_FreezeTicks) - { - ResetInput(); + if(m_FreezeTicks) return; - } mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput)); mem_copy(&m_LatestInput, pNewInput, sizeof(m_LatestInput)); @@ -585,9 +586,19 @@ void CCharacter::Tick() m_Core.m_Input = m_Input; m_Core.Tick(true); - //Set weapon back to the last one - if(m_pPlayer->m_FreezeTicks == 1) - SetWeapon(m_LastWeapon); + if(m_FreezeTicks) + { + if(Server()->Tick() % Server()->TickSpeed() == 0) + { + GameServer()->CreateDamageInd(m_Pos, 0, m_FreezeTicks/Server()->TickSpeed()+1); + m_Armor = m_FreezeTicks/Server()->TickSpeed(); + GameServer()->CreateSound(m_Pos, SOUND_WEAPON_NOAMMO); + } + //Set weapon back to the last one + if(m_FreezeTicks == 1) + SetWeapon(m_LastWeapon); + m_FreezeTicks--; + } // handle death-tiles and leaving gamelayer @@ -733,7 +744,7 @@ void CCharacter::Die(int Killer, int Weapon) // this is for auto respawn after 3 secs m_pPlayer->m_DieTick = Server()->Tick(); // unfreeze the player - m_pPlayer->m_FreezeTicks = 0; + m_FreezeTicks = 0; m_Alive = false; GameServer()->m_World.RemoveEntity(this); @@ -784,6 +795,9 @@ bool CCharacter::TakeDamage(vec2 Force, int Dmg, int From, int Weapon) { m_Health = 0; m_Armor = 0; + char aBuf[8]; + str_format(aBuf, sizeof(aBuf), "%d", Dmg); + GameServer()->SendChatTarget(-1, aBuf); } /* end zCatch*/ @@ -915,8 +929,9 @@ void CCharacter::Snap(int SnappingClient) void CCharacter::Freeze(int Ticks) { - m_pPlayer->m_FreezeTicks = Ticks; + m_FreezeTicks = Ticks; m_LastWeapon = m_ActiveWeapon; m_ActiveWeapon = WEAPON_NINJA; + ResetInput(); GameServer()->CreateSound(m_Pos, SOUND_PLAYER_PAIN_LONG); } diff --git a/src/game/server/entities/character.h b/src/game/server/entities/character.h index 5744de7c..a3a7e9d2 100644 --- a/src/game/server/entities/character.h +++ b/src/game/server/entities/character.h @@ -64,6 +64,7 @@ public: class CPlayer *GetPlayer() { return m_pPlayer; } void Freeze(int Tick); + int m_FreezeTicks; private: // player controlling this character diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp index e22401e6..403f782e 100644 --- a/src/game/server/gamecontext.cpp +++ b/src/game/server/gamecontext.cpp @@ -1134,7 +1134,7 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID) if((pPlayer->GetTeam() == TEAM_SPECTATORS) || (pPlayer->m_LastKillTry && pPlayer->m_LastKillTry+Server()->TickSpeed()*2 > Server()->Tick())) return; - if(pPlayer->m_FreezeTicks) + if(pPlayer->GetCharacter() && pPlayer->GetCharacter()->m_FreezeTicks) { SendChatTarget(ClientID, "You can't kill yourself while you're frozen"); pPlayer->m_LastKillTry = Server()->Tick(); diff --git a/src/game/server/gamemodes/zcatch.cpp b/src/game/server/gamemodes/zcatch.cpp index 0a02d6f3..2f373e84 100644 --- a/src/game/server/gamemodes/zcatch.cpp +++ b/src/game/server/gamemodes/zcatch.cpp @@ -151,7 +151,6 @@ void CGameController_zCatch::StartRound() GameServer()->m_apPlayers[i]->m_Deaths = 0; GameServer()->m_apPlayers[i]->m_TicksSpec = 0; GameServer()->m_apPlayers[i]->m_TicksIngame = 0; - GameServer()->m_apPlayers[i]->m_FreezeTicks = 0; } } char aBufMsg[256]; diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp index 9c30a31c..2bf09a45 100644 --- a/src/game/server/player.cpp +++ b/src/game/server/player.cpp @@ -32,7 +32,6 @@ CPlayer::CPlayer(CGameContext *pGameServer, int ClientID, int Team) m_TicksSpec = 0; m_TicksIngame = 0; m_ChatTicks = 0; - m_FreezeTicks = 0; } CPlayer::~CPlayer() @@ -60,13 +59,6 @@ void CPlayer::Tick() if(m_ChatTicks > 0) m_ChatTicks--; - - if(m_FreezeTicks) - { - if(Server()->Tick() % Server()->TickSpeed() == 0) - GameServer()->CreateDamageInd(m_ViewPos, 0, m_FreezeTicks/Server()->TickSpeed()+1); - m_FreezeTicks--; - } if((g_Config.m_SvAnticamper == 2 && g_Config.m_SvMode == 1) || (g_Config.m_SvAnticamper == 1)) Anticamper(); @@ -201,7 +193,7 @@ void CPlayer::OnPredictedInput(CNetObj_PlayerInput *NewInput) if((m_PlayerFlags&PLAYERFLAG_CHATTING) && (NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING)) return; - if(m_FreezeTicks) + if(m_pCharacter && m_pCharacter->m_FreezeTicks) return; if(m_pCharacter) @@ -229,7 +221,7 @@ void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput) if(m_pCharacter) m_pCharacter->OnDirectInput(NewInput); - if(m_FreezeTicks) + if(m_pCharacter && m_pCharacter->m_FreezeTicks) return; if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1)) @@ -322,7 +314,7 @@ void CPlayer::TryRespawn() int CPlayer::Anticamper() { - if(GameServer()->m_World.m_Paused || m_FreezeTicks || m_Team == TEAM_SPECTATORS || !m_pCharacter) + if(GameServer()->m_World.m_Paused || !m_pCharacter || m_Team == TEAM_SPECTATORS || m_pCharacter->m_FreezeTicks) { m_CampTick = -1; m_SentCampMsg = false; diff --git a/src/game/server/player.h b/src/game/server/player.h index 20c6256d..99de2952 100644 --- a/src/game/server/player.h +++ b/src/game/server/player.h @@ -113,7 +113,6 @@ public: bool m_SentCampMsg; int m_CampTick; vec2 m_CampPos; - int m_FreezeTicks; private: CCharacter *m_pCharacter; |