diff options
| author | oy <Tom_Adams@web.de> | 2011-01-08 11:34:19 +0100 |
|---|---|---|
| committer | oy <Tom_Adams@web.de> | 2011-01-08 11:34:19 +0100 |
| commit | df47aedbfebd9d5ab71cb8aeeede83a77c36de95 (patch) | |
| tree | f69e1083a8da580265fd139807588ac21e722bc1 /src/game/server | |
| parent | 26f7c67895dd49e8ed91bf7a4c67aff485119087 (diff) | |
| download | zcatch-df47aedbfebd9d5ab71cb8aeeede83a77c36de95.tar.gz zcatch-df47aedbfebd9d5ab71cb8aeeede83a77c36de95.zip | |
reset flags and projectiles when leaving the game layer too much. Closes #385
Diffstat (limited to 'src/game/server')
| -rw-r--r-- | src/game/server/entities/character.cpp | 12 | ||||
| -rw-r--r-- | src/game/server/entities/projectile.cpp | 2 | ||||
| -rw-r--r-- | src/game/server/entity.cpp | 6 | ||||
| -rw-r--r-- | src/game/server/entity.h | 3 | ||||
| -rw-r--r-- | src/game/server/gamemodes/ctf.cpp | 4 |
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(); |