about summary refs log tree commit diff
path: root/src/game
diff options
context:
space:
mode:
Diffstat (limited to 'src/game')
-rw-r--r--src/game/server/entities/character.cpp12
-rw-r--r--src/game/server/entities/projectile.cpp2
-rw-r--r--src/game/server/entity.cpp6
-rw-r--r--src/game/server/entity.h3
-rw-r--r--src/game/server/gamemodes/ctf.cpp4
5 files changed, 14 insertions, 13 deletions
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp
index e6bb0680..77755925 100644
--- a/src/game/server/entities/character.cpp
+++ b/src/game/server/entities/character.cpp
@@ -544,18 +544,12 @@ void CCharacter::Tick()
 	m_Core.m_Input = m_Input;
 	m_Core.Tick(true);
 	
-	// handle death-tiles
+	// 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 ||
 		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)
-	{
-		Die(m_pPlayer->GetCID(), WEAPON_WORLD);
-	}
-
-	// kill player when leaving gamelayer
-	if((int)m_Pos.x/32 < -200 || (int)m_Pos.x/32 > GameServer()->Collision()->GetWidth()+200 ||
-		(int)m_Pos.y/32 < -200 || (int)m_Pos.y/32 > GameServer()->Collision()->GetHeight()+200)
+		GameServer()->Collision()->GetCollisionAt(m_Pos.x-m_ProximityRadius/3.f, m_Pos.y+m_ProximityRadius/3.f)&CCollision::COLFLAG_DEATH ||
+		GameLayerClipped(m_Pos))
 	{
 		Die(m_pPlayer->GetCID(), WEAPON_WORLD);
 	}
diff --git a/src/game/server/entities/projectile.cpp b/src/game/server/entities/projectile.cpp
index 5b3bc482..f5c376a2 100644
--- a/src/game/server/entities/projectile.cpp
+++ b/src/game/server/entities/projectile.cpp
@@ -67,7 +67,7 @@ void CProjectile::Tick()
 
 	m_LifeSpan--;
 	
-	if(TargetChr || Collide || m_LifeSpan < 0)
+	if(TargetChr || Collide || m_LifeSpan < 0 || GameLayerClipped(CurPos))
 	{
 		if(m_LifeSpan >= 0 || m_Weapon == WEAPON_GRENADE)
 			GameServer()->CreateSound(CurPos, m_SoundImpact);
diff --git a/src/game/server/entity.cpp b/src/game/server/entity.cpp
index 1f37d167..5241c06b 100644
--- a/src/game/server/entity.cpp
+++ b/src/game/server/entity.cpp
@@ -50,3 +50,9 @@ int CEntity::NetworkClipped(int SnappingClient, vec2 CheckPos)
 		return 1;
 	return 0;
 }
+
+bool CEntity::GameLayerClipped(vec2 CheckPos)
+{
+	return round(CheckPos.x)/32 < -200 || round(CheckPos.x)/32 > GameServer()->Collision()->GetWidth()+200 ||
+			round(CheckPos.y)/32 < -200 || round(CheckPos.y)/32 > GameServer()->Collision()->GetHeight()+200 ? true : false;
+}
diff --git a/src/game/server/entity.h b/src/game/server/entity.h
index b088864d..dc50daca 100644
--- a/src/game/server/entity.h
+++ b/src/game/server/entity.h
@@ -137,7 +137,8 @@ public:
 	*/
 	int NetworkClipped(int SnappingClient);
 	int NetworkClipped(int SnappingClient, vec2 CheckPos);
-		
+	
+	bool GameLayerClipped(vec2 CheckPos);
 
 	/*
 		Variable: proximity_radius
diff --git a/src/game/server/gamemodes/ctf.cpp b/src/game/server/gamemodes/ctf.cpp
index 18905dbf..f6681ff6 100644
--- a/src/game/server/gamemodes/ctf.cpp
+++ b/src/game/server/gamemodes/ctf.cpp
@@ -91,8 +91,8 @@ void CGameControllerCTF::Tick()
 		if(!F)
 			continue;
 		
-		// flag hits death-tile, reset it
-		if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y)&CCollision::COLFLAG_DEATH)
+		// flag hits death-tile or left the game layer, reset it
+		if(GameServer()->Collision()->GetCollisionAt(F->m_Pos.x, F->m_Pos.y)&CCollision::COLFLAG_DEATH || F->GameLayerClipped(F->m_Pos))
 		{
 			GameServer()->CreateSoundGlobal(SOUND_CTF_RETURN);
 			F->Reset();