]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Use a trick to indicate dead bodies to the client. Read code comments for more info...
authorMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Sun, 10 Apr 2011 17:19:45 +0000 (20:19 +0300)
committerMircea Kitsune <sonichedgehog_hyperblast00@yahoo.com>
Sun, 10 Apr 2011 17:19:45 +0000 (20:19 +0300)
qcsrc/client/gibs.qc
qcsrc/server/g_violence.qc

index 7239fffe283c4094f490e6ecbbd4af7164aa2e5a..f3fe88bf85def81141dc51c6e3752e7563e4b27d 100644 (file)
@@ -281,6 +281,7 @@ void GibSplash_Precache()
 void Ent_DamageEffect()
 {
        float type, specnum1, specnum2, entnumber;
+       float is_body;
        vector org;
        string specstr, effectnum;
        entity e;
@@ -299,6 +300,15 @@ void Ent_DamageEffect()
 
        e = get_weaponinfo(type);
 
+       if(specnum1 >= 100)
+       {
+               // The server sends the specnum increased by 100 when the target is a dead body (a trick used to save bandwidth)
+               // Species range from 0 to 15, and could never reach 100, so this should never risk causing a conflict.
+               // Revert the species back and mark that this is a dead body.
+               specnum1 -= 100;
+               is_body = TRUE;
+       }
+
        specnum2 = (specnum1 & 0x78) / 8; // blood type: using four bits (0..7, bit indexes 3,4,5)
        specstr = species_prefix(specnum2);
 
index 947791835c381161c7d7c3c006509b74f21f79c9..35372337780d25be1182c5193b160878f4528d38 100644 (file)
@@ -81,7 +81,14 @@ void Violence_DamageEffect(entity pl, float type)
 
        // if this is a copied dead body, send the num of its player instead
        if(pl.classname == "body")
+       {
                e.team = num_for_edict(pl.owner);
+
+               // Use a trick to indicate this is a copied dead body and not an alive player to the client (saves an extra WriteByte).
+               // Do this by increasing species with 100 (species range from 0 to 15, and there could never be 100 of them).
+               // The client will notice this and turn them back, while also noting what the server is trying to say.
+               e.state += 100;
+       }
        else
                e.team = num_for_edict(pl);