]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Rip CreatureFrame apart
authorMario <mario@smbclan.net>
Thu, 3 Dec 2015 07:03:20 +0000 (17:03 +1000)
committerMario <mario@smbclan.net>
Thu, 3 Dec 2015 07:07:30 +0000 (17:07 +1000)
qcsrc/server/sv_main.qc

index dd6ad7260f19eb41232ab4a31987ac264d42cca9..f05203c5859c903d6732063000ebe8301aa5e31f 100644 (file)
 .float lastground;
 .int state;
 
-void CreatureFrame ()
-{SELFPARAM();
-       float dm;
-
-       for(entity e = world; (e = findfloat(e, damagedbycontents, true)); )
+void CreatureFrame_drowning(entity this)
+{
+       if(!IS_VEHICLE(this) && !(this.flags & FL_PROJECTILE) && !IS_MONSTER(this)) // vehicles, monsters and projectiles don't drown
        {
-               setself(e);
-               if (self.movetype == MOVETYPE_NOCLIP) { continue; }
-
-               float vehic = IS_VEHICLE(self);
-               float projectile = (self.flags & FL_PROJECTILE);
-               float monster = IS_MONSTER(self);
-
-               if (self.watertype <= CONTENT_WATER && self.waterlevel > 0) // workaround a retarded bug made by id software :P (yes, it's that old of a bug)
+               if (this.waterlevel != WATERLEVEL_SUBMERGED)
                {
-                       if (!(self.flags & FL_INWATER))
+                       if(this.air_finished < time)
+                               PlayerSound(this, playersound_gasp, CH_PLAYER, VOICETYPE_PLAYERSOUND);
+                       this.air_finished = time + autocvar_g_balance_contents_drowndelay;
+                       this.dmg = 2;
+               }
+               else if (this.air_finished < time)
+               {       // drown!
+                       if (!this.deadflag)
+                       if (this.pain_finished < time)
                        {
-                               self.flags |= FL_INWATER;
-                               self.dmgtime = 0;
+                               Damage (this, world, world, autocvar_g_balance_contents_playerdamage_drowning * autocvar_g_balance_contents_damagerate, DEATH_DROWN.m_id, this.origin, '0 0 0');
+                               this.pain_finished = time + 0.5;
                        }
+               }
+       }
+}
+
+void CreatureFrame_hotliquids(entity this)
+{
+       if (this.dmgtime < time)
+       {
+               this.dmgtime = time + autocvar_g_balance_contents_damagerate;
 
-                       if(!vehic && !projectile && !monster) // vehicles, monsters and projectiles don't drown
+               if (this.flags & FL_PROJECTILE)
+               {
+                       if (this.watertype == CONTENT_LAVA)
+                               Damage (this, world, world, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, this.origin, '0 0 0');
+                       else if (this.watertype == CONTENT_SLIME)
+                               Damage (this, world, world, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, this.origin, '0 0 0');
+               }
+               else
+               {
+                       if (this.watertype == CONTENT_LAVA)
                        {
-                               if (self.waterlevel != WATERLEVEL_SUBMERGED)
+                               if (this.watersound_finished < time)
                                {
-                                       if(self.air_finished < time)
-                                               PlayerSound(self, playersound_gasp, CH_PLAYER, VOICETYPE_PLAYERSOUND);
-                                       self.air_finished = time + autocvar_g_balance_contents_drowndelay;
-                                       self.dmg = 2;
-                               }
-                               else if (self.air_finished < time)
-                               {       // drown!
-                                       if (!self.deadflag)
-                                       if (self.pain_finished < time)
-                                       {
-                                               Damage (self, world, world, autocvar_g_balance_contents_playerdamage_drowning * autocvar_g_balance_contents_damagerate, DEATH_DROWN.m_id, self.origin, '0 0 0');
-                                               self.pain_finished = time + 0.5;
-                                       }
+                                       this.watersound_finished = time + 0.5;
+                                       sound (this, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
                                }
+                               Damage (this, world, world, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_LAVA.m_id, this.origin, '0 0 0');
+                               if(autocvar_g_balance_contents_playerdamage_lava_burn)
+                                       Fire_AddDamage(this, world, autocvar_g_balance_contents_playerdamage_lava_burn * this.waterlevel, autocvar_g_balance_contents_playerdamage_lava_burn_time * this.waterlevel, DEATH_LAVA.m_id);
                        }
-
-                       if (self.dmgtime < time)
+                       else if (this.watertype == CONTENT_SLIME)
                        {
-                               self.dmgtime = time + autocvar_g_balance_contents_damagerate;
-
-                               if (projectile)
+                               if (this.watersound_finished < time)
                                {
-                                       if (self.watertype == CONTENT_LAVA)
-                                       {
-                                               Damage (self, world, world, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * self.waterlevel, DEATH_LAVA.m_id, self.origin, '0 0 0');
-                                       }
-                                       else if (self.watertype == CONTENT_SLIME)
-                                       {
-                                               Damage (self, world, world, autocvar_g_balance_contents_projectiledamage * autocvar_g_balance_contents_damagerate * self.waterlevel, DEATH_SLIME.m_id, self.origin, '0 0 0');
-                                       }
-                               }
-                               else
-                               {
-                                       if (self.watertype == CONTENT_LAVA)
-                                       {
-                                               if (self.watersound_finished < time)
-                                               {
-                                                       self.watersound_finished = time + 0.5;
-                                                       sound (self, CH_PLAYER_SINGLE, SND_LAVA, VOL_BASE, ATTEN_NORM);
-                                               }
-                                               Damage (self, world, world, autocvar_g_balance_contents_playerdamage_lava * autocvar_g_balance_contents_damagerate * self.waterlevel, DEATH_LAVA.m_id, self.origin, '0 0 0');
-                                               if(autocvar_g_balance_contents_playerdamage_lava_burn)
-                                                       Fire_AddDamage(self, world, autocvar_g_balance_contents_playerdamage_lava_burn * self.waterlevel, autocvar_g_balance_contents_playerdamage_lava_burn_time * self.waterlevel, DEATH_LAVA.m_id);
-                                       }
-                                       else if (self.watertype == CONTENT_SLIME)
-                                       {
-                                               if (self.watersound_finished < time)
-                                               {
-                                                       self.watersound_finished = time + 0.5;
-                                                       sound (self, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
-                                               }
-                                               Damage (self, world, world, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * self.waterlevel, DEATH_SLIME.m_id, self.origin, '0 0 0');
-                                       }
+                                       this.watersound_finished = time + 0.5;
+                                       sound (this, CH_PLAYER_SINGLE, SND_SLIME, VOL_BASE, ATTEN_NORM);
                                }
+                               Damage (this, world, world, autocvar_g_balance_contents_playerdamage_slime * autocvar_g_balance_contents_damagerate * this.waterlevel, DEATH_SLIME.m_id, this.origin, '0 0 0');
                        }
                }
-               else
+       }
+}
+
+void CreatureFrame_Liquids(entity this)
+{
+       if (this.watertype <= CONTENT_WATER && this.waterlevel > 0) // workaround a retarded bug made by id software :P (yes, it's that old of a bug)
+       {
+               if (!(this.flags & FL_INWATER))
                {
-                       if (self.flags & FL_INWATER)
-                       {
-                               // play leave water sound
-                               self.flags &= ~FL_INWATER;
-                               self.dmgtime = 0;
-                       }
-                       self.air_finished = time + 12;
-                       self.dmg = 2;
+                       this.flags |= FL_INWATER;
+                       this.dmgtime = 0;
                }
 
-               if(!vehic && !projectile) // vehicles don't get falling damage
+               CreatureFrame_drowning(this);
+
+               CreatureFrame_hotliquids(this);
+       }
+       else
+       {
+               if (this.flags & FL_INWATER)
                {
-                       // check for falling damage
-                       float velocity_len = vlen(self.velocity);
-                       if(!self.hook.state)
-                       {
-                               dm = vlen(self.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
-                               if (self.deadflag)
-                                       dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
-                               else
-                                       dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
-                               if (dm > 0)
-                                       Damage (self, world, world, dm, DEATH_FALL.m_id, self.origin, '0 0 0');
-                       }
+                       // play leave water sound
+                       this.flags &= ~FL_INWATER;
+                       this.dmgtime = 0;
+               }
+               this.air_finished = time + 12;
+               this.dmg = 2;
+       }
+}
 
-                       if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
-                               Damage (self, world, world, 100000, DEATH_SHOOTING_STAR.m_id, self.origin, '0 0 0');
-                       // play stupid sounds
-                       if (g_footsteps)
-                       if (!gameover)
-                       if (self.flags & FL_ONGROUND)
-                       if (!self.crouch)
-                       if (velocity_len > autocvar_sv_maxspeed * 0.6)
-                       if (!self.deadflag)
-                       if (time < self.lastground + 0.2)
+void CreatureFrame_FallDamage(entity this)
+{
+       if(!IS_VEHICLE(this) && !(this.flags & FL_PROJECTILE)) // vehicles don't get falling damage
+       {
+               // check for falling damage
+               float velocity_len = vlen(this.velocity);
+               if(!this.hook.state)
+               {
+                       float dm = vlen(this.oldvelocity) - velocity_len; // dm is now the velocity DECREASE. Velocity INCREASE should never cause a sound or any damage.
+                       if (this.deadflag)
+                               dm = (dm - autocvar_g_balance_falldamage_deadminspeed) * autocvar_g_balance_falldamage_factor;
+                       else
+                               dm = min((dm - autocvar_g_balance_falldamage_minspeed) * autocvar_g_balance_falldamage_factor, autocvar_g_balance_falldamage_maxdamage);
+                       if (dm > 0)
+                               Damage (this, world, world, dm, DEATH_FALL.m_id, this.origin, '0 0 0');
+               }
+
+               if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
+                       Damage (this, world, world, 100000, DEATH_SHOOTING_STAR.m_id, this.origin, '0 0 0');
+       }
+}
+
+void CreatureFrame_Footsteps(entity this)
+{
+       // play stupid sounds
+       if (g_footsteps && !gameover && (this.flags & FL_ONGROUND))
+       if (!IS_VEHICLE(this) && !(this.flags & FL_PROJECTILE))
+       if (!this.crouch && (vlen(this.velocity) > autocvar_sv_maxspeed * 0.6) && !this.deadflag && time < this.lastground + 0.2)
+       {
+               if((time > this.nextstep) || (time < (this.nextstep - 10.0)))
+               {
+                       this.nextstep = time + 0.3 + random() * 0.1;
+                       trace_dphitq3surfaceflags = 0;
+                       tracebox(this.origin, this.mins, this.maxs, this.origin - '0 0 1', MOVE_NOMONSTERS, this);
+                       /*
+                       if(trace_fraction == 1)
+                               dprint("nohit\n");
+                       else
+                               dprint(ftos(trace_dphitq3surfaceflags), "\n");
+                       */
+                       if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS))
                        {
-                               if((time > self.nextstep) || (time < (self.nextstep - 10.0)))
-                               {
-                                       self.nextstep = time + 0.3 + random() * 0.1;
-                                       trace_dphitq3surfaceflags = 0;
-                                       tracebox(self.origin, self.mins, self.maxs, self.origin - '0 0 1', MOVE_NOMONSTERS, self);
-                                       /*
-                                       if(trace_fraction == 1)
-                                               dprint("nohit\n");
-                                       else
-                                               dprint(ftos(trace_dphitq3surfaceflags), "\n");
-                                       */
-                                       if (!(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS))
-                                       {
-                                               if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-                                                       GlobalSound(self, GS_STEP_METAL, CH_PLAYER, VOICETYPE_PLAYERSOUND);
-                                               else
-                                                       GlobalSound(self, GS_STEP, CH_PLAYER, VOICETYPE_PLAYERSOUND);
-                                       }
-                               }
+                               if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
+                                       GlobalSound(this, GS_STEP_METAL, CH_PLAYER, VOICETYPE_PLAYERSOUND);
+                               else
+                                       GlobalSound(this, GS_STEP, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                        }
                }
+       }
+}
+
+void CreatureFrame_All()
+{
+       for(entity e = world; (e = findfloat(e, damagedbycontents, true)); )
+       {
+               if (e.movetype == MOVETYPE_NOCLIP) { continue; }
+
+               CreatureFrame_Liquids(e);
+               CreatureFrame_FallDamage(e);
+               CreatureFrame_Footsteps(e);
 
-        self.oldvelocity = self.velocity;
+        e.oldvelocity = e.velocity;
        }
-       setself(this);
 }
 
 
@@ -248,7 +256,7 @@ void StartFrame()
 
        game_delay_last = game_delay;
 
-       CreatureFrame();
+       CreatureFrame_All();
        CheckRules_World();
 
        // if in warmup stage and limit for warmup is hit start match