about summary refs log tree commit diff
path: root/src/game/server
diff options
context:
space:
mode:
Diffstat (limited to 'src/game/server')
-rw-r--r--src/game/server/entities/character.cpp2
-rw-r--r--src/game/server/entities/projectile.cpp2
-rw-r--r--src/game/server/entity.cpp9
-rw-r--r--src/game/server/entity.h5
-rw-r--r--src/game/server/gamecontext.cpp23
-rw-r--r--src/game/server/gamecontext.h2
6 files changed, 31 insertions, 12 deletions
diff --git a/src/game/server/entities/character.cpp b/src/game/server/entities/character.cpp
index d7da2498..ee6b1019 100644
--- a/src/game/server/entities/character.cpp
+++ b/src/game/server/entities/character.cpp
@@ -416,6 +416,8 @@ void CCharacter::FireWeapon()
 			// pack the Projectile and send it to the client Directly
 			CNetObj_Projectile p;
 			pProj->FillInfo(&p);
+			
+			pProj->SetCharactersNearby();
 
 			CMsgPacker Msg(NETMSGTYPE_SV_EXTRAPROJECTILE);
 			Msg.AddInt(1);
diff --git a/src/game/server/entities/projectile.cpp b/src/game/server/entities/projectile.cpp
index e89e0e6f..d9654a58 100644
--- a/src/game/server/entities/projectile.cpp
+++ b/src/game/server/entities/projectile.cpp
@@ -73,7 +73,7 @@ void CProjectile::Tick()
 			GameServer()->CreateSound(CurPos, m_SoundImpact);
 
 		if(m_Explosive)
-			GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false);
+			GameServer()->CreateExplosion(CurPos, m_Owner, m_Weapon, false, m_CharactersNearbyInitialized, m_CharactersNearby);
 
 		else if(TargetChr)
 			TargetChr->TakeDamage(m_Direction * max(0.001f, m_Force), m_Damage, m_Owner, m_Weapon);
diff --git a/src/game/server/entity.cpp b/src/game/server/entity.cpp
index 788c3f45..e1985877 100644
--- a/src/game/server/entity.cpp
+++ b/src/game/server/entity.cpp
@@ -54,3 +54,12 @@ 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;
 }
+
+void CEntity::SetCharactersNearby()
+{
+	CCharacter *c;
+	for(int i = 0; i < MAX_CLIENTS; ++i)
+		if((c = GameServer()->GetPlayerChar(i)))
+			m_CharactersNearby[i] = (absolute(c->m_Pos.x - m_Pos.x) <= 9000.0f && absolute(c->m_Pos.y - m_Pos.y) <= 700.0f && distance(c->m_Pos, m_Pos) <= 900.0f);
+	m_CharactersNearbyInitialized = true;
+}
diff --git a/src/game/server/entity.h b/src/game/server/entity.h
index 0f838730..7abf76c9 100644
--- a/src/game/server/entity.h
+++ b/src/game/server/entity.h
@@ -154,6 +154,11 @@ public:
 			Contains the current posititon of the entity.
 	*/
 	vec2 m_Pos;
+	
+	// nearby characters
+	bool m_CharactersNearbyInitialized;
+	bool m_CharactersNearby[MAX_CLIENTS];
+	void SetCharactersNearby();
 };
 
 #endif
diff --git a/src/game/server/gamecontext.cpp b/src/game/server/gamecontext.cpp
index 1160d56e..ba08cebb 100644
--- a/src/game/server/gamecontext.cpp
+++ b/src/game/server/gamecontext.cpp
@@ -121,7 +121,7 @@ void CGameContext::CreateHammerHit(vec2 Pos)
 }
 
 
-void CGameContext::CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage)
+void CGameContext::CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, bool limitVictims, const bool *victims)
 {
 	// create the event
 	CNetEvent_Explosion *pEvent = (CNetEvent_Explosion *)m_Events.Create(NETEVENTTYPE_EXPLOSION, sizeof(CNetEvent_Explosion));
@@ -140,15 +140,18 @@ void CGameContext::CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamag
 		int Num = m_World.FindEntities(Pos, Radius, (CEntity**)apEnts, MAX_CLIENTS, CGameWorld::ENTTYPE_CHARACTER);
 		for(int i = 0; i < Num; i++)
 		{
-			vec2 Diff = apEnts[i]->m_Pos - Pos;
-			vec2 ForceDir(0,1);
-			float l = length(Diff);
-			if(l)
-				ForceDir = normalize(Diff);
-			l = 1-clamp((l-InnerRadius)/(Radius-InnerRadius), 0.0f, 1.0f);
-			float Dmg = 6 * l;
-			if((int)Dmg)
-				apEnts[i]->TakeDamage(ForceDir*Dmg*2, (int)Dmg, Owner, Weapon);
+			if(!limitVictims || victims[apEnts[i]->GetPlayer()->GetCID()])
+			{
+				vec2 Diff = apEnts[i]->m_Pos - Pos;
+				vec2 ForceDir(0,1);
+				float l = length(Diff);
+				if(l)
+					ForceDir = normalize(Diff);
+				l = 1-clamp((l-InnerRadius)/(Radius-InnerRadius), 0.0f, 1.0f);
+				float Dmg = 6 * l;
+				if((int)Dmg)
+					apEnts[i]->TakeDamage(ForceDir*Dmg*2, (int)Dmg, Owner, Weapon);
+			}
 		}
 	}
 }
diff --git a/src/game/server/gamecontext.h b/src/game/server/gamecontext.h
index 5d340613..27551ac8 100644
--- a/src/game/server/gamecontext.h
+++ b/src/game/server/gamecontext.h
@@ -127,7 +127,7 @@ public:
 
 	// helper functions
 	void CreateDamageInd(vec2 Pos, float AngleMod, int Amount);
-	void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage);
+	void CreateExplosion(vec2 Pos, int Owner, int Weapon, bool NoDamage, bool limitVictims = false, const bool *victims = NULL);
 	void CreateHammerHit(vec2 Pos);
 	void CreatePlayerSpawn(vec2 Pos);
 	void CreateDeath(vec2 Pos, int Who);