about summary refs log tree commit diff
path: root/src/game/server/player.cpp
diff options
context:
space:
mode:
authorTeetime <teetimetw@yahoo.de>2011-11-05 18:03:33 +0100
committerTeetime <teetimetw@yahoo.de>2011-11-05 18:03:33 +0100
commit744018aaafb218321907c4e0c0e0b4472fb7e1b9 (patch)
tree50323eec409c701dfd16c5275ef17d795b85efc9 /src/game/server/player.cpp
parent24718cc8d6f8021f6c54e1c2207f7e68b75a22c3 (diff)
downloadzcatch-744018aaafb218321907c4e0c0e0b4472fb7e1b9.tar.gz
zcatch-744018aaafb218321907c4e0c0e0b4472fb7e1b9.zip
Added possibility to freeze players and improved and extended anticamper
Diffstat (limited to 'src/game/server/player.cpp')
-rw-r--r--src/game/server/player.cpp31
1 files changed, 29 insertions, 2 deletions
diff --git a/src/game/server/player.cpp b/src/game/server/player.cpp
index 7464e3c7..e165d0b6 100644
--- a/src/game/server/player.cpp
+++ b/src/game/server/player.cpp
@@ -32,6 +32,7 @@ CPlayer::CPlayer(CGameContext *pGameServer, int ClientID, int Team)
 	m_TicksSpec = 0;
 	m_TicksIngame = 0;
 	m_ChatTicks = 0;
+	m_FreezeTicks = 0;
 }
 
 CPlayer::~CPlayer()
@@ -60,7 +61,14 @@ void CPlayer::Tick()
 	if(m_ChatTicks > 0)
 		m_ChatTicks--;
 	
-	if(g_Config.m_SvAnticamper && m_pCharacter && !GameServer()->m_World.m_Paused)
+	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)
 		Anticamper();
 	/* end zCatch*/
 
@@ -193,6 +201,9 @@ void CPlayer::OnPredictedInput(CNetObj_PlayerInput *NewInput)
 	if((m_PlayerFlags&PLAYERFLAG_CHATTING) && (NewInput->m_PlayerFlags&PLAYERFLAG_CHATTING))
 		return;
 
+	if(m_FreezeTicks)
+		return;
+
 	if(m_pCharacter)
 		m_pCharacter->OnPredictedInput(NewInput);
 }
@@ -218,6 +229,9 @@ void CPlayer::OnDirectInput(CNetObj_PlayerInput *NewInput)
 	if(m_pCharacter)
 		m_pCharacter->OnDirectInput(NewInput);
 
+	if(m_FreezeTicks)
+		return;
+
 	if(!m_pCharacter && m_Team != TEAM_SPECTATORS && (NewInput->m_Fire&1))
 		m_Spawning = true;
 
@@ -308,6 +322,13 @@ void CPlayer::TryRespawn()
 
 int CPlayer::Anticamper()
 {
+	if(GameServer()->m_World.m_Paused || m_FreezeTicks || m_Team == TEAM_SPECTATORS || !m_pCharacter)
+	{
+		m_CampTick = -1;
+		m_SentCampMsg = false;
+		return 0;
+	}
+
 	int AnticamperTime = g_Config.m_SvAnticamperTime;
 	int AnticamperRange = g_Config.m_SvAnticamperRange;
 
@@ -334,7 +355,13 @@ int CPlayer::Anticamper()
 	// Kill him
 	if((m_CampTick <= Server()->Tick()) && (m_CampTick > 0))
 	{
-		m_pCharacter->Die(m_ClientID, WEAPON_ANTICAMPER);
+		if(g_Config.m_SvAnticamperFreeze)
+		{
+			m_pCharacter->Freeze(Server()->TickSpeed()*g_Config.m_SvAnticamperFreeze);
+			GameServer()->SendBroadcast("You have been freezed due camping", m_ClientID);
+		}
+		else
+			m_pCharacter->Die(m_ClientID, WEAPON_ANTICAMPER);
 		m_CampTick = -1;
 		m_SentCampMsg = false;
 		return 1;