]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/monsters/sv_monsters.qc
Merge branch 'master' into Mario/nade_updates
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / monsters / sv_monsters.qc
index 34e7ceb9901ebbb30583e88b3862ba3204cd28fb..6d06de50ebb30e9c8ff98ee6c5fefcb5542dbcf7 100644 (file)
@@ -94,7 +94,7 @@ float monster_isvalidtarget (entity targ, entity ent)
        if(SAME_TEAM(targ, ent))
                return FALSE; // enemy is on our team
 
-       if (targ.freezetag_frozen)
+       if (targ.frozen)
                return FALSE; // ignore frozen
 
        if(autocvar_g_monsters_target_infront || (ent.spawnflags & MONSTERFLAG_INFRONT))
@@ -480,7 +480,7 @@ vector monster_pickmovetarget(entity targ)
                
                if((self.enemy == world)
                        || (self.enemy.deadflag != DEAD_NO || self.enemy.health < 1)
-                       || (self.enemy.freezetag_frozen)
+                       || (self.enemy.frozen)
                        || (self.enemy.flags & FL_NOTARGET)
                        || (self.enemy.alpha < 0.5)
                        || (self.enemy.takedamage == DAMAGE_NO)
@@ -605,6 +605,51 @@ void monster_move(float runspeed, float walkspeed, float stopspeed, float manim_
 
        entity targ;
 
+       if(self.frozen == 2)
+       {
+               self.revive_progress = bound(0, self.revive_progress + self.ticrate * self.revive_speed, 1);
+               self.health = max(1, self.revive_progress * self.max_health);
+               self.iceblock.alpha = bound(0.2, 1 - self.revive_progress, 1);
+
+               WaypointSprite_UpdateHealth(self.sprite, self.health);
+
+               movelib_beak_simple(stopspeed);
+               self.frame = manim_idle;
+
+               self.enemy = world;
+               self.nextthink = time + self.ticrate;
+
+               if(self.revive_progress >= 1)
+                       Unfreeze(self);
+
+               return;
+       }
+       else if(self.frozen == 3)
+       {
+               self.revive_progress = bound(0, self.revive_progress - self.ticrate * self.revive_speed, 1);
+               self.health = max(0, autocvar_g_nades_ice_health + (self.max_health-autocvar_g_nades_ice_health) * self.revive_progress );
+
+               WaypointSprite_UpdateHealth(self.sprite, self.health);
+
+               movelib_beak_simple(stopspeed);
+               self.frame = manim_idle;
+
+               self.enemy = world;
+               self.nextthink = time + self.ticrate;
+
+               if(self.health < 1)
+               {
+                       Unfreeze(self);
+                       self.health = 0;
+                       self.event_damage(self, self.frozen_by, 1, DEATH_NADE_ICE_FREEZE, self.origin, '0 0 0');
+               }
+
+               else if ( self.revive_progress <= 0 )
+                       Unfreeze(self);
+
+               return;
+       }
+
        if(self.flags & FL_SWIM)
        {
                if(self.waterlevel < WATERLEVEL_WETFEET)
@@ -776,6 +821,9 @@ void monster_remove(entity mon)
        if(mon.weaponentity)
                remove(mon.weaponentity);
 
+       if(mon.iceblock)
+               remove(mon.iceblock);
+
        WaypointSprite_Kill(mon.sprite);
 
        remove(mon);
@@ -827,6 +875,8 @@ void monsters_reset()
        setorigin(self, self.pos1);
        self.angles = self.pos2;
 
+       Unfreeze(self); // remove any icy remains
+
        self.health = self.max_health;
        self.velocity = '0 0 0';
        self.enemy = world;
@@ -860,6 +910,12 @@ void monster_die(entity attacker, float gibbed)
        self.nextthink = time;
        self.monster_lifetime = time + 5;
 
+       if(self.frozen)
+       {
+               Unfreeze(self); // remove any icy remains
+               self.health = 0; // reset by Unfreeze
+       }
+
        monster_dropitem();
 
        MonsterSound(monstersound_death, 0, FALSE, CH_VOICE);
@@ -900,6 +956,9 @@ void monster_die(entity attacker, float gibbed)
 
 void monsters_damage (entity inflictor, entity attacker, float damage, float deathtype, vector hitloc, vector force)
 {
+       if(self.frozen && deathtype != DEATH_KILL && deathtype != DEATH_NADE_ICE_FREEZE)
+               return;
+
        if((self.spawnflags & MONSTERFLAG_INVINCIBLE) && deathtype != DEATH_KILL)
                return;