diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/game/server/entities/character.cpp | 2 | ||||
| -rw-r--r-- | src/game/server/entities/projectile.cpp | 2 | ||||
| -rw-r--r-- | src/game/server/entity.cpp | 9 | ||||
| -rw-r--r-- | src/game/server/entity.h | 5 | ||||
| -rw-r--r-- | src/game/server/gamecontext.cpp | 23 | ||||
| -rw-r--r-- | src/game/server/gamecontext.h | 2 |
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); |