X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fmonsters%2Fsv_monsters.qc;h=cc3379ee36a9e94c657d898a9ac6f91ef4676251;hb=1182fdc12fe84d3cd9489af075ce1c2e6a88facb;hp=927501e654b81e11171198ed9f4102a0f9ecde13;hpb=3d335488e6f73c2837fca9e128e8199df616427a;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/monsters/sv_monsters.qc b/qcsrc/common/monsters/sv_monsters.qc index 927501e65..cc3379ee3 100644 --- a/qcsrc/common/monsters/sv_monsters.qc +++ b/qcsrc/common/monsters/sv_monsters.qc @@ -104,7 +104,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) @@ -537,6 +537,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) @@ -712,6 +757,9 @@ void monster_remove(entity mon) if(mon.weaponentity) remove(mon.weaponentity); + if(mon.iceblock) + remove(mon.iceblock); + WaypointSprite_Kill(mon.sprite); remove(mon); @@ -762,6 +810,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; @@ -797,6 +847,12 @@ void monster_die(entity attacker, float gibbed) self.nextthink = time; self.ltime = 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); @@ -840,6 +896,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(time < self.pain_finished && deathtype != DEATH_KILL) return;