/* Damage entities within a specific radius. */ void Entity_RadiusDamage(edict_t *eInflictor,float fRadius,int iDamage,int iDamageType) { int i; float fDistance; vec3_t vOrigin; edict_t *eTarget = Engine.Server_FindRadius(eInflictor->v.origin,fRadius); Engine.WriteByte(MSG_BROADCAST,SVC_TEMPENTITY); Engine.WriteByte(MSG_BROADCAST,CTE_EXPLOSION); for(i = 0; i < 3; i++) Engine.WriteCoord(MSG_BROADCAST,eInflictor->v.origin[i]); do { if(eTarget->v.bTakeDamage) { int i; for(i = 0; i < 3; i++) vOrigin[i] = eTarget->v.origin[i]+(eTarget->v.mins[i]+eTarget->v.maxs[i])*0.5f; Math_VectorSubtract(eInflictor->v.origin,vOrigin,vOrigin); fDistance = 0.5f*(float)Math_VectorLength(vOrigin); if(fDistance > 0) { Math_VectorInverse(vOrigin); Math_VectorAdd(eTarget->v.velocity,vOrigin,eTarget->v.velocity); // [15/7/2013] Reduce the damage by distance ~hogsy fDistance = (float)iDamage-(100.0f/fDistance); // [15/8/2013] Less damage for the inflictor ~hogsy if(eTarget == eInflictor) fDistance = fDistance/2.0f; if(fDistance > 0) if(Entity_CanDamage(eInflictor,eTarget, iDamageType)) MONSTER_Damage(eTarget,eInflictor,(int)fDistance,iDamageType); } } eTarget = eTarget->v.chain; } while(eTarget); }
void GreekfireTouch(ServerEntity_t *ent, ServerEntity_t *other) { vec3_t vel; if (other == ent->local.eOwner) return; if(other->v.bTakeDamage) Entity_Damage(other, ent, 50, 0); Math_VectorCopy(ent->v.velocity,vel); Math_VectorInverse(vel); Engine.Particle(ent->v.origin,vel,5,"spark",17); Math_VectorClear(ent->v.velocity); Entity_Remove(ent); }
void GreekfireTouch(edict_t *ent, edict_t *other) { vec3_t vel; if (other == ent->local.eOwner) return; if(other->v.bTakeDamage) MONSTER_Damage(other,ent,50,0); // [25/6/2012] Simplified ~hogsy Math_VectorCopy(ent->v.velocity,vel); Math_VectorInverse(vel); Engine.Particle(ent->v.origin,vel,5,"spark",17); // [25/6/2012] Simplified ~hogsy Math_VectorClear(ent->v.velocity); RemoveEntity(ent); }
/* Damage entities within a specific radius. */ void Entity_RadiusDamage(ServerEntity_t *eInflictor, float fRadius, int iDamage, int iDamageType) { int i; float fDistance; MathVector3f_t vOrigin; ServerEntity_t *eTarget = Engine.Server_FindRadius(eInflictor->v.origin, fRadius); do { if(eTarget->v.bTakeDamage) { for(i = 0; i < 3; i++) vOrigin[i] = eTarget->v.origin[i]+(eTarget->v.mins[i]+eTarget->v.maxs[i])*0.5f; Math_VectorSubtract(eInflictor->v.origin,vOrigin,vOrigin); fDistance = 0.5f*(float)Math_VectorLength(vOrigin); if(fDistance > 0) { Math_VectorInverse(vOrigin); Math_VectorAdd(eTarget->v.velocity,vOrigin,eTarget->v.velocity); // Reduce the damage by distance. fDistance = (float)iDamage-(100.0f/fDistance); // Less damage for the inflictor. if(eTarget == eInflictor) fDistance = fDistance/2.0f; if(fDistance > 0) Entity_Damage(eTarget,eInflictor,(int)fDistance,iDamageType); } } eTarget = eTarget->v.chain; } while(eTarget); }