about summary refs log tree commit diff
path: root/src
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
parent24718cc8d6f8021f6c54e1c2207f7e68b75a22c3 (diff)
downloadzcatch-744018aaafb218321907c4e0c0e0b4472fb7e1b9.tar.gz
zcatch-744018aaafb218321907c4e0c0e0b4472fb7e1b9.zip
Added possibility to freeze players and improved and extended anticamper
Diffstat (limited to 'src')
-rw-r--r--src/game/server/entities/character.cpp19
-rw-r--r--src/game/server/entities/character.h2
-rw-r--r--src/game/server/gamecontext.cpp15
-rw-r--r--src/game/server/gamemodes/zcatch.cpp6
-rw-r--r--src/game/server/player.cpp31
-rw-r--r--src/game/server/player.h1
-rw-r--r--src/game/variables.h1
7 files changed, 67 insertions, 8 deletions
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp
index 06c1c913..d09bc714 100644
--- a/src/game/server/entities/character.cpp
+++ b/src/game/server/entities/character.cpp
@@ -541,6 +541,12 @@ void CCharacter::OnPredictedInput(CNetObj_PlayerInput *pNewInput)
 
 void CCharacter::OnDirectInput(CNetObj_PlayerInput *pNewInput)
 {
+	if(m_pPlayer->m_FreezeTicks)
+	{
+		ResetInput();
+		return;
+	}
+
 	mem_copy(&m_LatestPrevInput, &m_LatestInput, sizeof(m_LatestInput));
 	mem_copy(&m_LatestInput, pNewInput, sizeof(m_LatestInput));
 
@@ -579,6 +585,11 @@ 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);
+
+
 	// handle death-tiles and leaving gamelayer
 	if(GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y-m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH ||
 		GameServer()->Collision()->GetCollisionAt(m_Pos.x+m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH ||
@@ -894,3 +905,11 @@ void CCharacter::Snap(int SnappingClient)
 
 	pCharacter->m_PlayerFlags = GetPlayer()->m_PlayerFlags;
 }
+
+void CCharacter::Freeze(int Ticks)
+{
+	m_pPlayer->m_FreezeTicks = Ticks;
+	m_LastWeapon = m_ActiveWeapon;
+	m_ActiveWeapon = WEAPON_NINJA;
+	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 a311a6f9..f90e4d80 100644
--- a/src/game/server/entities/character.h
+++ b/src/game/server/entities/character.h
@@ -64,6 +64,8 @@ public:
 	bool IsAlive() const { return m_Alive; }
 	class CPlayer *GetPlayer() { return m_pPlayer; }
 
+	void Freeze(int Tick);
+
 private:
 	// player controlling this character
 	class CPlayer *m_pPlayer;
diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp
index a34890e5..1900b314 100644
--- a/src/game/server/gamecontext.cpp
+++ b/src/game/server/gamecontext.cpp
@@ -1124,13 +1124,18 @@ void CGameContext::OnMessage(int MsgID, CUnpacker *pUnpacker, int ClientID)
 	else if (MsgID == NETMSGTYPE_CL_KILL && !m_World.m_Paused)
 	{
 		/* begin zCatch*/
-		if(pPlayer->m_LastKill && pPlayer->m_LastKill + Server()->TickSpeed()*15 > Server()->Tick())
-		{	
-			if((pPlayer->GetTeam() == TEAM_SPECTATORS) || (pPlayer->m_LastKillTry && pPlayer->m_LastKillTry+Server()->TickSpeed()*2 > Server()->Tick()))
-				return;			
-			SendChatTarget(ClientID, "Only one kill in 15sec is allowed.");
+		if((pPlayer->GetTeam() == TEAM_SPECTATORS) || (pPlayer->m_LastKillTry && pPlayer->m_LastKillTry+Server()->TickSpeed()*2 > Server()->Tick()))
+			return;
+
+		if(pPlayer->m_FreezeTicks)
+		{
+			SendChatTarget(ClientID, "You can't kill yourself while you're frozen");
 			pPlayer->m_LastKillTry = Server()->Tick();
 		}
+		else if(pPlayer->m_LastKill && pPlayer->m_LastKill + Server()->TickSpeed()*15 > Server()->Tick())
+		{	
+			SendBroadcast("Only one kill in 15sec is allowed.", ClientID);
+		}
 		else
 		{
 			pPlayer->m_LastKill = Server()->Tick();
diff --git a/src/game/server/gamemodes/zcatch.cpp b/src/game/server/gamemodes/zcatch.cpp
index eac8a4d3..4699166f 100644
--- a/src/game/server/gamemodes/zcatch.cpp
+++ b/src/game/server/gamemodes/zcatch.cpp
@@ -94,7 +94,10 @@ int CGameController_zCatch::OnCharacterDeath(class CCharacter *pVictim, class CP
 		if(WeaponID == WEAPON_SELF || WeaponID == WEAPON_WORLD)
 			pVictim->GetPlayer()->m_Score -= 15;
 	}
-	
+
+	// Unfreeze the victim if he dies
+	pVictim->GetPlayer()->m_FreezeTicks = 0;
+
 	for(int i=0; i < MAX_CLIENTS; i++)
 	{
 		if(GameServer()->m_apPlayers[i])
@@ -151,6 +154,7 @@ 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 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;
diff --git a/src/game/server/player.h b/src/game/server/player.h
index 99de2952..20c6256d 100644
--- a/src/game/server/player.h
+++ b/src/game/server/player.h
@@ -113,6 +113,7 @@ 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 3f0d7bf9..f4f9738a 100644
--- a/src/game/variables.h
+++ b/src/game/variables.h
@@ -101,6 +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, 1, 0, 1, CFGFLAG_SERVER, "Toggle to enable/disable Anticamper")
+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(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")
 #endif