]> git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/server/sv_main.qc
Add hook primary/secondary to have health and such so it can be damaged by contents too
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / sv_main.qc
index 0a2c04f93bb48e0fec3e73ded78970a6e6644eaa..c4eb965a7d95ec74070568adc3160a192edf89a9 100644 (file)
@@ -1,27 +1,34 @@
-
 void CreatureFrame (void)
 {
        local entity oldself;
        local float dm;
+       
+       float damagerate; // where damagerate 5 means 5 hits per second (0.2 delay)
+       damagerate = (1 / bound(1, autocvar_g_balance_contents_damagerate, 100));
+       
        oldself = self;
-       for(self = world; (self = findfloat(self, iscreature, TRUE)); )
+       for(self = world; (self = findfloat(self, damagedbycontents, TRUE)); )
        {
-               if (self.movetype == MOVETYPE_NOCLIP)
-                       continue;
+               if (self.movetype == MOVETYPE_NOCLIP) { continue; }
+               
                float vehic = (self.vehicle_flags & VHF_ISVEHICLE);
-               if (self.waterlevel)
+               float projectile = (self.projectiledeathtype);
+               
+               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 (!(self.flags & FL_INWATER))
                        {
                                self.flags |= FL_INWATER;
                                self.dmgtime = 0;
+                               //te_customflash(self.origin, 200, 20, '50 0.1 0.1');
                        }
-                       if(!vehic) // vehicles don't drown
+
+                       if(!vehic && !projectile) // vehicles and projectiles don't drown
                        {
                                if (self.waterlevel != WATERLEVEL_SUBMERGED)
                                {
                                        if(self.air_finished < time + 9)
-                                               PlayerSound(playersound_gasp, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                               PlayerSound(playersound_gasp, CH_PLAYER, VOICETYPE_PLAYERSOUND);
                                        self.air_finished = time + 12;
                                        self.dmg = 2;
                                }
@@ -30,31 +37,40 @@ void CreatureFrame (void)
                                        if (!self.deadflag)
                                        if (self.pain_finished < time)
                                        {
-                                               Damage (self, world, world, 5, DEATH_DROWN, self.origin, '0 0 0');
+                                               Damage (self, world, world, autocvar_g_balance_contents_playerdamage_drowning * damagerate, DEATH_DROWN, self.origin, '0 0 0');
                                                self.pain_finished = time + 0.5;
                                        }
                                }
                        }
+                       
                        if (self.dmgtime < time)
                        {
-                               self.dmgtime = time + 0.2;
-                               if (self.watertype == CONTENT_LAVA)
+                               self.dmgtime = time + damagerate; 
+                               
+                               if (!projectile)
                                {
-                                       if (self.watersound_finished < time)
+                                       if (self.watertype == CONTENT_LAVA)
                                        {
-                                               self.watersound_finished = time + 0.5;
-                                               sound (self, CHAN_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);
+                                               if (self.watersound_finished < time)
+                                               {
+                                                       self.watersound_finished = time + 0.5;
+                                                       sound (self, CH_PLAYER, "player/lava.wav", VOL_BASE, ATTN_NORM);
+                                               }
+                                               Damage (self, world, world, autocvar_g_balance_contents_playerdamage_lava * damagerate * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
                                        }
-                                       Damage (self, world, world, 6 * self.waterlevel, DEATH_LAVA, self.origin, '0 0 0');
-                               }
-                               else if (self.watertype == CONTENT_SLIME)
-                               {
-                                       if (self.watersound_finished < time)
+                                       else if (self.watertype == CONTENT_SLIME)
                                        {
-                                               self.watersound_finished = time + 0.5;
-                                               sound (self, CHAN_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);
+                                               if (self.watersound_finished < time)
+                                               {
+                                                       self.watersound_finished = time + 0.5;
+                                                       sound (self, CH_PLAYER, "player/slime.wav", VOL_BASE, ATTN_NORM);
+                                               }
+                                               Damage (self, world, world, autocvar_g_balance_contents_playerdamage_slime * damagerate * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
                                        }
-                                       Damage (self, world, world, 2 * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
+                               }
+                               else if ((self.watertype == CONTENT_LAVA) || (self.watertype == CONTENT_SLIME))
+                               {
+                                       Damage (self, world, world, autocvar_g_balance_contents_projectiledamage * damagerate * self.waterlevel, DEATH_SLIME, self.origin, '0 0 0');
                                }
                        }
                }
@@ -65,12 +81,13 @@ void CreatureFrame (void)
                                // play leave water sound
                                self.flags &~= FL_INWATER;
                                self.dmgtime = 0;
+                               //te_customflash(self.origin, 200, 20, '0.1 0.1 50');
                        }
                        self.air_finished = time + 12;
                        self.dmg = 2;
                }
 
-               if(!vehic) // vehicles don't get falling damage
+               if(!vehic && !projectile) // vehicles don't get falling damage
                {
                        // check for falling damage
                        float velocity_len = vlen(self.velocity);
@@ -84,40 +101,39 @@ void CreatureFrame (void)
                                if (dm > 0)
                                        Damage (self, world, world, dm, DEATH_FALL, self.origin, '0 0 0');
                        }
-               }
 
-               if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
-                       Damage (self, world, world, 100000, DEATH_SHOOTING_STAR, self.origin, '0 0 0');
-
-               // play stupid sounds
-               if (!vehic) // vehicles don't get footsteps
-               if (g_footsteps)
-               if (!gameover)
-               if (self.flags & FL_ONGROUND)
-               if (velocity_len > autocvar_sv_maxspeed * 0.6)
-               if (!self.deadflag)
-               if (time < self.lastground + 0.2)
-               {
-                       if((time > self.nextstep) || (time < (self.nextstep - 10.0)))
+                       if(autocvar_g_maxspeed > 0 && velocity_len > autocvar_g_maxspeed)
+                               Damage (self, world, world, 100000, DEATH_SHOOTING_STAR, self.origin, '0 0 0');
+                       // play stupid sounds
+                       if (g_footsteps)
+                       if (!gameover)
+                       if (self.flags & FL_ONGROUND)
+                       if (velocity_len > autocvar_sv_maxspeed * 0.6)
+                       if (!self.deadflag)
+                       if (time < self.lastground + 0.2)
                        {
-                               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 not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
+                               if((time > self.nextstep) || (time < (self.nextstep - 10.0)))
                                {
-                                       if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
-                                               GlobalSound(globalsound_metalstep, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                       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
-                                               GlobalSound(globalsound_step, CHAN_PLAYER, VOICETYPE_PLAYERSOUND);
+                                               dprint(ftos(trace_dphitq3surfaceflags), "\n");
+                                       */
+                                       if not(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOSTEPS)
+                                       {
+                                               if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_METALSTEPS)
+                                                       GlobalSound(globalsound_metalstep, CH_PLAYER, VOICETYPE_PLAYERSOUND);
+                                               else
+                                                       GlobalSound(globalsound_step, CH_PLAYER, VOICETYPE_PLAYERSOUND);
+                                       }
                                }
                        }
                }
+
                self.oldvelocity = self.velocity;
        }
        self = oldself;
@@ -390,3 +406,20 @@ void SV_OnEntityPreSpawnFunction()
                return;
        }
 }
+
+void WarpZone_PostInitialize_Callback(void)
+{
+       // create waypoint links for warpzones
+       entity e;
+       for(e = world; (e = find(e, classname, "trigger_warpzone")); )
+       {
+               vector src, dst;
+               src = (e.absmin + e.absmax) * 0.5;
+               makevectors(e.warpzone_angles);
+               src = src + ((e.warpzone_origin - src) * v_forward) * v_forward + 16 * v_right;
+               dst = (e.enemy.absmin + e.enemy.absmax) * 0.5;
+               makevectors(e.enemy.warpzone_angles);
+               dst = dst + ((e.enemy.warpzone_origin - dst) * v_forward) * v_forward - 16 * v_right;
+               waypoint_spawnforteleporter_v(e, src, dst, 0);
+       }
+}