From 8d93bb7abdb604ccff48e94eb928f7e923c28fbf Mon Sep 17 00:00:00 2001 From: Teetime Date: Sat, 19 Nov 2011 10:13:28 +0100 Subject: refractor freezing --- src/game/server/entities/character.cpp | 33 ++++++++++++++++++++++++--------- src/game/server/entities/character.h | 1 + 2 files changed, 25 insertions(+), 9 deletions(-) (limited to 'src/game/server/entities') 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 -- cgit 1.4.1