]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/g_violence.qc
Merge branch 'master' into mirceakitsune/damage_effects
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / g_violence.qc
index 7d4e20b78a433e7e7255fb4ece49136155f47377..1c3c8d04ec3edbc1465a9517c57682e587117f5a 100644 (file)
@@ -48,7 +48,7 @@ void Violence_GibSplash(entity source, float type, float amount, entity attacker
 
 // damage effect
 
-.float lifetime;
+.float damageeffect_lifetime;
 .entity damageeffect_repeater;
 
 float Violence_DamageEffect_SendEntity(entity to, float sf)
@@ -61,9 +61,10 @@ float Violence_DamageEffect_SendEntity(entity to, float sf)
                return FALSE;
 
        WriteByte(MSG_ENTITY, ENT_CLIENT_DAMAGEEFFECT);
-       WriteByte(MSG_ENTITY, self.cnt); // the damage weapon
-       WriteByte(MSG_ENTITY, self.state); // species
+       WriteByte(MSG_ENTITY, self.cnt); // damage weapon
+       WriteByte(MSG_ENTITY, self.state); // player species
        WriteByte(MSG_ENTITY, self.team); // player entnum
+       WriteByte(MSG_ENTITY, self.deadflag); // is dead body / gibbed
        WriteCoord(MSG_ENTITY, floor(self.origin_x));
        WriteCoord(MSG_ENTITY, floor(self.origin_y));
        WriteCoord(MSG_ENTITY, floor(self.origin_z));
@@ -85,7 +86,17 @@ void Violence_DamageEffect(entity pl, float type)
        else
                e.team = num_for_edict(pl);
 
-       setorigin(e, pl.origin);
+       // is this a whole dead body, or a gibbed body / player?
+       if(!pl.modelindex) // gibbed
+               e.deadflag = 2;
+       else if(pl.classname == "body")
+               e.deadflag = 1;
+
+       // if the player is dead, show the effect lower, else it appears floating above the body
+       if(pl.health <= 0)
+               setorigin(e, pl.origin - '0 0 25');
+       else
+               setorigin(e, pl.origin);
 
        Net_LinkEntity(e, FALSE, 0.2, Violence_DamageEffect_SendEntity);
 }
@@ -93,7 +104,7 @@ void Violence_DamageEffect(entity pl, float type)
 void Violence_DamageEffect_Remove(entity pl);
 void Violence_DamageEffect_DoRepeat()
 {
-       if(time > self.lifetime || (self.owner.classname != "player" && self.owner.classname != "body"))
+       if(time > self.damageeffect_lifetime || (self.owner.classname != "player" && self.owner.classname != "body"))
        {
                Violence_DamageEffect_Remove(self.owner);
                return;
@@ -118,17 +129,17 @@ void Violence_DamageEffect_SetRepeat(entity pl, float damage, float type)
                pl.damageeffect_repeater.owner = pl;
                pl.damageeffect_repeater.think = Violence_DamageEffect_DoRepeat;
 
-               pl.damageeffect_repeater.lifetime = time + (autocvar_sv_damageeffect_lifetime * damage);
+               pl.damageeffect_repeater.damageeffect_lifetime = time + (autocvar_sv_damageeffect_lifetime * damage);
        }
        else
        {
                // if the repeater is being updated, increase its lifetime instead of re-setting it entirely
                // this fixes the shotgun among other things, where only the damage of one bullet would be taken into account
-               pl.damageeffect_repeater.lifetime += (autocvar_sv_damageeffect_lifetime * damage);
+               pl.damageeffect_repeater.damageeffect_lifetime += (autocvar_sv_damageeffect_lifetime * damage);
        }
 
        if(autocvar_sv_damageeffect_lifetime_max)
-               pl.damageeffect_repeater.lifetime = bound(0, pl.damageeffect_repeater.lifetime, time + autocvar_sv_damageeffect_lifetime_max);
+               pl.damageeffect_repeater.damageeffect_lifetime = bound(0, pl.damageeffect_repeater.damageeffect_lifetime, time + autocvar_sv_damageeffect_lifetime_max);
 
        pl.damageeffect_repeater.cnt = type;
        pl.damageeffect_repeater.nextthink = time;
@@ -147,5 +158,5 @@ void Violence_DamageEffect_Copy(entity old_pl, entity pl)
                Violence_DamageEffect_Remove(pl);
 
        Violence_DamageEffect_SetRepeat(pl, 0, old_pl.damageeffect_repeater.cnt); // spawn a new repeater
-       pl.damageeffect_repeater.lifetime = old_pl.damageeffect_repeater.lifetime; // copy the lifetime
+       pl.damageeffect_repeater.damageeffect_lifetime = old_pl.damageeffect_repeater.damageeffect_lifetime; // copy the lifetime
 }