diff options
| author | Teetime <TeetimeTW@yahoo.de> | 2011-11-19 10:13:28 +0100 |
|---|---|---|
| committer | Teetime <TeetimeTW@yahoo.de> | 2011-11-19 10:13:28 +0100 |
| commit | 8d93bb7abdb604ccff48e94eb928f7e923c28fbf (patch) | |
| tree | 82086f610cb15c6a358db7fe9df2a8ee139a8057 /src/game/server/entities | |
| parent | b7854656772b0608440d1b1db5264ae9c0ed4868 (diff) | |
| download | zcatch-8d93bb7abdb604ccff48e94eb928f7e923c28fbf.tar.gz zcatch-8d93bb7abdb604ccff48e94eb928f7e923c28fbf.zip | |
refractor freezing
Diffstat (limited to 'src/game/server/entities')
| -rw-r--r-- | src/game/server/entities/character.cpp | 33 | ||||
| -rw-r--r-- | src/game/server/entities/character.h | 1 |
2 files changed, 25 insertions, 9 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 |