about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorTeetime <TeetimeTW@yahoo.de>2011-11-19 10:13:28 +0100
committerTeetime <TeetimeTW@yahoo.de>2011-11-19 10:13:28 +0100
commit8d93bb7abdb604ccff48e94eb928f7e923c28fbf (patch)
tree82086f610cb15c6a358db7fe9df2a8ee139a8057 /src
parentb7854656772b0608440d1b1db5264ae9c0ed4868 (diff)
downloadzcatch-8d93bb7abdb604ccff48e94eb928f7e923c28fbf.tar.gz
zcatch-8d93bb7abdb604ccff48e94eb928f7e923c28fbf.zip
refractor freezing
Diffstat (limited to 'src')
-rw-r--r--src/game/server/entities/character.cpp33
-rw-r--r--src/game/server/entities/character.h1
-rw-r--r--src/game/server/gamecontext.cpp2
-rw-r--r--src/game/server/gamemodes/zcatch.cpp1
-rw-r--r--src/game/server/player.cpp14
-rw-r--r--src/game/server/player.h1
-rw-r--r--src/game/variables.h2
7 files changed, 30 insertions, 24 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;
diff --git a/src/game/variables.h b/src/game/variables.h
index 9750ce7f..d0204dcf 100644
--- a/src/game/variables.h
+++ b/src/game/variables.h
@@ -101,7 +101,7 @@ MACRO_CONFIG_INT(SvChatValue, sv_chat_value, 250, 100, 1000, CFGFLAG_SERVER, "A
 MACRO_CONFIG_INT(SvChatThreshold, sv_chat_threshold, 1000, 250, 10000, CFGFLAG_SERVER, "If this threshold will exceed by too many messages the player will be muted")
 MACRO_CONFIG_INT(SvMuteDuration, sv_mute_duration, 60, 0, 3600, CFGFLAG_SERVER, "How long the player will be muted (in seconds)")
 MACRO_CONFIG_INT(SvAnticamper, sv_anticamper, 2, 0, 2, CFGFLAG_SERVER, "0 disables, 1 enables anticamper in all modes and 2 only in Instagib")
-MACRO_CONFIG_INT(SvAnticamperFreeze, sv_anticamper_freeze, 5, 0, 15, CFGFLAG_SERVER, "If a player should freeze on camping (and how long) or die")
+MACRO_CONFIG_INT(SvAnticamperFreeze, sv_anticamper_freeze, 7, 0, 15, CFGFLAG_SERVER, "If a player should freeze on camping (and how long) or die")
 MACRO_CONFIG_INT(SvAnticamperTime, sv_anticamper_time, 10, 5, 120, CFGFLAG_SERVER, "How long to wait till the player dies/freezes")
 MACRO_CONFIG_INT(SvAnticamperRange, sv_anticamper_range, 200, 0, 1000, CFGFLAG_SERVER, "Distance how far away the player must move to escape anticamper")