]> git.rm.cloudns.org Git - xonotic/xonotic-data.pk3dir.git/commitdiff
Rewrite
authordrjaska <drjaska83@gmail.com>
Fri, 23 Aug 2024 21:19:34 +0000 (00:19 +0300)
committerdrjaska <drjaska83@gmail.com>
Fri, 23 Aug 2024 21:31:09 +0000 (00:31 +0300)
qcsrc/server/client.qc
qcsrc/server/client.qh
qcsrc/server/player.qc
qcsrc/server/player.qh
xonotic-server.cfg

index 1336aef590a6d44c985e9bd2ba34c5e2049415e0..6057d0dd521f208b0829409e2e99eeff066ccc6b 100644 (file)
@@ -1470,19 +1470,10 @@ void respawn(entity this)
        bool damagedbycontents_prev = this.damagedbycontents;
        if(this.alpha >= 0)
        {
-               if(autocvar_g_respawn_ghosts && !(this.effects & EF_NODRAW))
+               if(autocvar_g_respawn_ghosts
+               && !(this.effects & EF_NODRAW)) // only spawn one ghost
                {
-                       this.solid = SOLID_NOT;
-                       this.takedamage = DAMAGE_NO;
-                       this.damagedbycontents = false;
-                       set_movetype(this, MOVETYPE_FLY);
-                       this.velocity = '0 0 1' * autocvar_g_respawn_ghosts_speed;
-                       this.avelocity = randomvec() * autocvar_g_respawn_ghosts_speed * 3 - randomvec() * autocvar_g_respawn_ghosts_speed * 3;
-                       this.effects |= CSQCMODEL_EF_RESPAWNGHOST;
-                       this.alpha = min(this.alpha, autocvar_g_respawn_ghosts_alpha);
-                       Send_Effect(EFFECT_RESPAWN_GHOST, this.origin, '0 0 0', 1);
-                       if(autocvar_g_respawn_ghosts_time > 0)
-                               SUB_SetFade(this, time + autocvar_g_respawn_ghosts_time, autocvar_g_respawn_ghosts_fadetime);
+                       SpawnGhost(this);
                }
                else
                        SUB_SetFade (this, time, 1); // fade out the corpse immediately
index d7fb948373ab1c45e692deb63f518cc1d2ca2e63..d7240d952ee2a421f1fb4e71dd36c010c4f298fd 100644 (file)
@@ -26,6 +26,7 @@ int autocvar_g_respawn_delay_large_count;
 float autocvar_g_respawn_delay_max;
 bool autocvar_g_respawn_delay_forced;
 bool autocvar_g_respawn_ghosts;
+bool autocvar_g_respawn_ghosts_gib;
 float autocvar_g_respawn_ghosts_alpha = 1;
 float autocvar_g_respawn_ghosts_fadetime = 1.5;
 float autocvar_g_respawn_ghosts_time = 4.5;
index 9bf43125dd9af63852cc8a4da6952acdd184799d..faaec731c48e893706024b23de40d0a5fec637d7 100644 (file)
@@ -225,19 +225,11 @@ void PlayerCorpseDamage(entity this, entity inflictor, entity attacker, float da
                        IL_REMOVE(g_damagedbycontents, this);
                this.damagedbycontents = false;
 
-               if (autocvar_g_respawn_ghosts)
+               if(autocvar_g_respawn_ghosts
+               && autocvar_g_respawn_ghosts_gib
+               && !(this.effects & EF_NODRAW)) // only spawn one ghost
                {
-                       //this.solid = SOLID_NOT; // already set above
-                       //this.takedamage = DAMAGE_NO;
-                       //this.damagedbycontents = false;
-                       set_movetype(this, MOVETYPE_FLY);
-                       this.velocity = '0 0 1' * autocvar_g_respawn_ghosts_speed;
-                       this.avelocity = randomvec() * autocvar_g_respawn_ghosts_speed * 3 - randomvec() * autocvar_g_respawn_ghosts_speed * 3;
-                       this.effects |= CSQCMODEL_EF_RESPAWNGHOST;
-                       this.alpha = min(this.alpha, autocvar_g_respawn_ghosts_alpha);
-                       Send_Effect(EFFECT_RESPAWN_GHOST, this.origin, '0 0 0', 1);
-                       if(autocvar_g_respawn_ghosts_time > 0)
-                               SUB_SetFade(this, time + autocvar_g_respawn_ghosts_time, autocvar_g_respawn_ghosts_fadetime);
+                       SpawnGhost(this);
 
                        CopyBody(this, 1);
                        this.effects |= EF_NODRAW; // prevent another CopyBody and 2nd ghost spawns
@@ -636,6 +628,25 @@ bool PlayerHeal(entity targ, entity inflictor, float amount, float limit)
        return true;
 }
 
+void SpawnGhost(entity this)
+{
+       // effects are disabled or one ghost was already spawned
+       if (this.effects & EF_NODRAW)
+               return;
+
+       this.solid = SOLID_NOT;
+       this.takedamage = DAMAGE_NO;
+       this.damagedbycontents = false;
+       set_movetype(this, MOVETYPE_FLY);
+       this.velocity = '0 0 1' * autocvar_g_respawn_ghosts_speed;
+       this.avelocity = randomvec() * autocvar_g_respawn_ghosts_speed * 3 - randomvec() * autocvar_g_respawn_ghosts_speed * 3;
+       this.effects |= CSQCMODEL_EF_RESPAWNGHOST;
+       this.alpha = min(this.alpha, autocvar_g_respawn_ghosts_alpha);
+       Send_Effect(EFFECT_RESPAWN_GHOST, this.origin, '0 0 0', 1);
+       if(autocvar_g_respawn_ghosts_time > 0)
+               SUB_SetFade(this, time + autocvar_g_respawn_ghosts_time, autocvar_g_respawn_ghosts_fadetime);
+}
+
 void precache_playermodel(string m)
 {
        int globhandle, i, n;
index 34c8fdbdfbd6fa79bd03731780f3284678646cd1..10b394502e531df8df2d09c25566bb021681d5df 100644 (file)
@@ -44,5 +44,7 @@ bool PlayerHeal(entity targ, entity inflictor, float amount, float limit);
 
 void precache_all_playermodels(string pattern);
 
+void SpawnGhost(entity this);
+
 IntrusiveList g_clones;
 STATIC_INIT(g_clones) { g_clones = IL_NEW(); }
index 327abe3f30fd353f8b53c1ced19de26081ca4d72..7d62a345a87eda3d4e0c36b4b0a5ceb47f1d07f6 100644 (file)
@@ -60,6 +60,7 @@ set g_teleport_maxspeed 0 "maximum speed that a player can keep when going throu
 set g_teleport_minspeed 0 "minimum speed that a player can keep when going through a teleporter which affects speed"
 
 set g_respawn_ghosts 1 "if 1 dead bodies become ghosts and float away when the player respawns"
+set g_respawn_ghosts_gib 0 "spawn a ghost for gibbed players instantly"
 set g_respawn_ghosts_speed 5 "the speed with which respawn ghosts float and rotate"
 set g_respawn_ghosts_time 4.5 "amount of time a respawn ghost lasts before it starts fading out. 0 disables and ghosts fade when the body would"
 set g_respawn_ghosts_fadetime 1.5 "amount of time a respawn ghost takes to fade out"