/* ============================================================================== iceman ============================================================================== */ $frame stand1 stand2 stand3 stand4 stand5 stand6 stand7 stand8 stand9 $frame stand10 stand11 stand12 stand13 $frame walk1 walk2 walk3 walk4 walk5 walk6 walk7 walk8 walk9 walk10 $frame walk11 walk12 $frame run1 run2 run3 run4 run5 run6 $frame pain1 pain2 pain3 pain4 pain5 pain6 $frame paina1 paina2 paina3 paina4 paina5 paina6 paina7 paina8 paina9 paina10 $frame paina11 paina12 paina13 paina14 paina15 paina16 paina17 paina18 paina19 paina20 $frame paina21 paina22 paina23 paina24 paina25 paina26 paina27 paina28 paina29 $frame death1 death2 death3 death4 death5 death6 death7 death8 death9 death10 $frame death11 death12 death13 death14 death15 death16 $frame rise1 rise2 rise3 rise4 rise5 rise6 rise7 rise8 rise9 $frame rise10 rise11 rise12 rise13 rise14 rise15 rise16 rise17 rise18 rise19 $frame melt1 melt2 melt3 melt4 melt5 melt6 melt7 melt8 $frame satta1 satta2 satta3 satta4 satta5 satta6 satta7 satta8 $frame satta9 satta10 satta11 satta12 $frame sattb1 sattb2 sattb3 sattb4 sattb5 sattb6 sattb7 sattb8 $frame sattb9 sattb10 sattb11 sattb12 $frame xatta1 xatta2 xatta3 xatta4 xatta5 xatta6 xatta7 xatta8 $frame xatta9 xatta10 xatta11 xatta12 void() iceman_Laser_Touch = { local vector org; if (other == self.owner) return; // don't explode on owner if (pointcontents(self.origin) == CONTENT_SKY) { remove(self); return; } org = self.origin - 8*normalize(self.velocity); if (other.health) { SpawnBlood (org, self.velocity*0.2, 15); T_Damage (other, self, self.owner, 10); } else { WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_GUNSHOT); WriteCoord (MSG_BROADCAST, org_x); WriteCoord (MSG_BROADCAST, org_y); WriteCoord (MSG_BROADCAST, org_z); } remove(self); }; void(vector org, vector vec) Ice_LaunchShard = { local vector vec; vec = normalize(vec); newmis = spawn(); newmis.owner = self; newmis.movetype = MOVETYPE_FLY; newmis.solid = SOLID_BBOX; newmis.effects = EF_DIMLIGHT; setmodel (newmis, "progs/iceshard.mdl"); setsize (newmis, '0 0 0', '0 0 0'); setorigin (newmis, org); newmis.velocity = vec * 600; newmis.angles = vectoangles(newmis.velocity); newmis.nextthink = time + 3; newmis.think = SUB_Remove; newmis.touch = iceman_Laser_Touch; }; void() ice_atkb1; void() ice_xatk1; void() ShardTouch = { local vector t1, t2, vec; vec = self.old_velocity; if (other == self.owner) return; if (other == world) { if (random() < 0.5) sound(self, CHAN_AUTO, "weapons/tink1.wav", 1, 3); self.state = 0; self.avelocity_x = random()*500; self.avelocity_y = random()*500; self.avelocity_z = random()*500; // give seom random upwards velocity self.velocity_z = random() * 500 - 100; } if (other.takedamage == DAMAGE_AIM) { spawn_touchblood (20); T_Damage(other, self, self.owner, 3); remove(self); return; } self.last_touch = time; if (self.velocity == '0 0 0') remove(self); }; void(vector org, vector dir) spawn_shard = { local entity missile, mpuff; local vector vect; missile = spawn (); missile.owner = self; missile.movetype = MOVETYPE_BOUNCE; missile.state = 1; missile.solid = SOLID_SLIDEBOX; missile.classname = "shard"; // set missile speed vect = normalize(dir); missile.velocity = vect * 1000; // missile.velocity_z = 0; missile.angles = vectoangles(missile.velocity); missile.old_velocity = missile.velocity; missile.touch = ShardTouch; // set missile duration // missile.last_idle = time; missile.last_touch = 0; missile.oldorigin = missile.origin; missile.nextthink = time + 2.8; // missile.think = GrenadeExplode; missile.think = SUB_Remove; setmodel (missile, "progs/iceshard.mdl"); setsize (missile, '0 0 0', '0 0 0'); setorigin (missile, org); self.old_velocity = self.velocity; }; void(float offs) iceman_fire = { local vector org, vect, ang; ang = self.angles; ang_y = anglemod(ang_y + offs); makevectors (ang); vect = v_forward; org = self.origin + '0 0 12'; spawn_shard(org, vect); }; void() iceballTouch = { if (other == self.owner) return; if (((other.classname == "player") || (coop && (other.flags & FL_MONSTER))) && (other.parallize_time < (time - 4))) { if (!deathmatch && (other.flags & FL_CLIENT)) other.parallize_time = time + 2; else other.parallize_time = time + 3; other.x_flags = other.x_flags | X_PARALLIZED; other.parallized_velocity = '0 0 0'; if (other.flags & FL_CLIENT) { centerprint(other, "You have been iced!"); stuffcmd(other, "v_cshift 128 128 256 180\n"); } else { other.think = other.th_stand; other.enemy = world; } sound(other, CHAN_BODY, "generic/frozen1.wav", 1, ATTN_NORM); if (deathmatch) other.skin = 1; remove(self); return; } remove(self); }; void(vector org, vector dir) spawn_iceball = { local entity missile, mpuff; local vector vect; missile = spawn (); missile.owner = self; missile.movetype = MOVETYPE_FLYMISSILE; missile.solid = SOLID_BBOX; missile.classname = "iceblast"; // set missile speed vect = normalize(dir); if (self.flags & FL_MONSTER) missile.velocity = ProjectVelocity(1400, '0 0 0'); else missile.velocity = vect * 1400; missile.angles = vectoangles(missile.velocity); missile.old_velocity = missile.velocity; missile.touch = iceballTouch; // set missile duration // missile.last_idle = time; missile.last_touch = 0; missile.oldorigin = missile.origin; missile.nextthink = time + 2; // missile.think = GrenadeExplode; missile.think = SUB_Remove; missile.avelocity_z = 300; setmodel (missile, "progs/iceblast.mdl"); setsize (missile, '0 0 0', '0 0 0'); setorigin (missile, org); }; void () ice_fire_iceball = { local vector org,o2; makevectors (self.angles); org = self.origin + v_forward * 1 + '0 0 12'; o2 = self.enemy.origin + v_right * ((random() * 64) - 32); spawn_iceball(org, o2 - self.origin); }; //============================================================================ void() ice_stand1 =[ $stand1, ice_stand2 ] {ai_stand();}; void() ice_stand2 =[ $stand2, ice_stand3 ] {ai_stand();}; void() ice_stand3 =[ $stand3, ice_stand4 ] {ai_stand();}; void() ice_stand4 =[ $stand4, ice_stand5 ] {ai_stand();}; void() ice_stand5 =[ $stand5, ice_stand6 ] {ai_stand();}; void() ice_stand6 =[ $stand6, ice_stand7 ] {ai_stand();}; void() ice_stand7 =[ $stand7, ice_stand8 ] {ai_stand();}; void() ice_stand8 =[ $stand8, ice_stand9 ] {ai_stand();}; void() ice_stand9 =[ $stand9, ice_stand10 ] {ai_stand();}; void() ice_stand10 =[ $stand10, ice_stand11 ] {ai_stand();}; void() ice_stand11 =[ $stand11, ice_stand12 ] {ai_stand();}; void() ice_stand12 =[ $stand12, ice_stand13 ] {ai_stand();}; void() ice_stand13 =[ $stand13, ice_stand1 ] {ai_stand();}; void() ice_walk1 =[ $walk1 , ice_walk2 ] {ai_walk(7);}; void() ice_walk2 =[ $walk2 , ice_walk3 ] {ai_walk(4);}; void() ice_walk3 =[ $walk3 , ice_walk4 ] {ai_walk(4);}; void() ice_walk4 =[ $walk4 , ice_walk5 ] {ai_walk(4);}; void() ice_walk5 =[ $walk5 , ice_walk6 ] {ai_walk(4);}; void() ice_walk6 =[ $walk6 , ice_walk7 ] {ai_walk(5);}; void() ice_walk7 =[ $walk7 , ice_walk8 ] {ai_walk(5);}; void() ice_walk8 =[ $walk8 , ice_walk9 ] {ai_walk(4);}; void() ice_walk9 =[ $walk9 , ice_walk10 ] {ai_walk(7);}; void() ice_walk10 =[ $walk10, ice_walk11 ] {ai_walk(4);}; void() ice_walk11 =[ $walk11, ice_walk12 ] {ai_walk(0);}; void() ice_walk12 =[ $walk12, ice_walk1 ] {ai_walk(5);}; void() ice_run1 =[ $run1 , ice_run2 ] { ai_run(14);}; void() ice_run2 =[ $run2 , ice_run3 ] {ai_run(16);}; void() ice_run3 =[ $run3 , ice_run4 ] {ai_run(16);}; void() ice_run4 =[ $run4 , ice_run5 ] {ai_run(16);}; void() ice_run5 =[ $run5 , ice_run6 ] {ai_run(16);}; void() ice_run6 =[ $run6 , ice_run1 ] {ai_run(16);}; void() ice_pain1 =[ $pain1, ice_pain2 ] {}; void() ice_pain2 =[ $pain2, ice_pain3 ] {}; void() ice_pain3 =[ $pain3, ice_pain4 ] {}; void() ice_pain4 =[ $pain4, ice_pain5 ] {}; void() ice_pain5 =[ $pain5, ice_pain6 ] {}; void() ice_pain6 =[ $pain6, ice_run1 ] {}; void() ice_melt1 =[ $melt1, ice_melt2 ] {}; void() ice_melt2 =[ $melt2, ice_melt3 ] {}; void() ice_melt3 =[ $melt3, ice_melt4 ] {}; void() ice_melt4 =[ $melt4, ice_melt5 ] {}; void() ice_melt5 =[ $melt5, ice_melt6 ] {}; void() ice_melt6 =[ $melt6, ice_melt7 ] {}; void() ice_melt7 =[ $melt7, ice_melt8 ] {}; void() ice_melt8 =[ $melt8, ice_melt8 ] { setmodel(self, "progs/puddle.mdl"); self.skin = 0; self.solid = SOLID_NOT; self.deadflag = DEAD_DEAD; self.think = SUB_Remove; self.nextthink = time + 120 + random() * 30; }; void() ice_paina1 =[ $paina1, ice_paina2 ] {}; void() ice_paina2 =[ $paina2, ice_paina3 ] {}; void() ice_paina3 =[ $paina3, ice_paina4 ] {}; void() ice_paina4 =[ $paina4, ice_paina5 ] {}; void() ice_paina5 =[ $paina5, ice_paina6 ] {}; void() ice_paina6 =[ $paina6, ice_paina7 ] {}; void() ice_paina7 =[ $paina7, ice_paina8 ] {}; void() ice_paina8 =[ $paina8, ice_paina9 ] {}; void() ice_paina9 =[ $paina9, ice_paina10 ] {}; void() ice_paina10 =[ $paina10, ice_paina11 ] {}; void() ice_paina11 =[ $paina11, ice_paina12 ] {}; void() ice_paina12 =[ $paina12, ice_paina13 ] {}; void() ice_paina13 =[ $paina12, ice_paina14 ] {}; void() ice_paina14 =[ $paina12, ice_paina15 ] {}; void() ice_paina15 =[ $paina13, ice_paina16 ] {}; void() ice_paina16 =[ $paina14, ice_paina17 ] {}; void() ice_paina17 =[ $paina15, ice_paina18 ] {}; void() ice_paina18 =[ $paina16, ice_paina19 ] {}; void() ice_paina19 =[ $paina16, ice_paina20 ] {}; void() ice_paina20 =[ $paina16, ice_paina21 ] {}; void() ice_paina21 =[ $paina17, ice_paina22 ] {}; void() ice_paina22 =[ $paina18, ice_paina23 ] {}; void() ice_paina23 =[ $paina19, ice_paina24 ] {}; void() ice_paina24 =[ $paina20, ice_paina25 ] {}; void() ice_paina25 =[ $paina21, ice_paina26 ] {}; void() ice_paina26 =[ $paina22, ice_paina27 ] {}; void() ice_paina27 =[ $paina23, ice_paina28 ] {}; void() ice_paina28 =[ $paina24, ice_paina29 ] {}; void() ice_paina29 =[ $paina25, ice_paina30 ] {}; void() ice_paina30 =[ $paina26, ice_paina31 ] {}; void() ice_paina31 =[ $paina27, ice_paina32 ] {}; void() ice_paina32 =[ $paina28, ice_paina33 ] {}; void() ice_paina33 =[ $paina29, ice_run1 ] {}; //============================================================================ void(entity attacker, float damage) ice_pain; void() ice_atk1 =[ $satta1, ice_atk2 ] { ai_face(); self.start_attack_health = self.health; if (self.count) ai_forward(24); }; void() ice_atk2 =[ $satta2, ice_atk3 ] { ai_face(); iceman_fire(-15); if (self.count) ai_forward(14); }; void() ice_atk3 =[ $satta3, ice_atk4 ] { ai_face(); iceman_fire(-9); if (self.count) ai_forward(8); }; void() ice_atk4 =[ $satta4, ice_atk5 ] { ai_face(); iceman_fire(-3); if (self.count) ai_forward(4); }; void() ice_atk5 =[ $satta5, ice_atk6 ] { ai_face(); iceman_fire(3); if (self.count) ai_forward(2); self.count = 0; }; void() ice_atk6 =[ $satta6, ice_atk7 ] {iceman_fire(9);}; void() ice_atk7 =[ $satta7, ice_atk8 ] { iceman_fire(15); if (self.health < self.start_attack_health) { ice_pain(self.enemy, self.start_attack_health - self.health); } }; void() ice_atk8 =[ $satta8, ice_atk9 ] {}; void() ice_atk9 =[ $satta9, ice_atk10 ] {}; void() ice_atk10 =[ $satta10, ice_atk11 ] {}; void() ice_atk11 =[ $satta11, ice_atk12 ] {}; void() ice_atk12 =[ $satta12, ice_run1 ] {}; void() ice_xatk1 =[ $xatta1, ice_xatk2 ] { ai_face(); self.start_attack_health = self.health; if (self.count) ai_forward(24); }; void() ice_xatk2 =[ $xatta2, ice_xatk3 ] { ai_face(); if (self.count) ai_forward(14); }; void() ice_xatk3 =[ $xatta3, ice_xatk4 ] { ai_face(); if (self.count) ai_forward(8); }; void() ice_xatk4 =[ $xatta4, ice_xatk5 ] { ai_face(); if (self.count) ai_forward(4); }; void() ice_xatk5 =[ $xatta5, ice_xatk6 ] { ai_face(); if (self.count) ai_forward(2); self.count = 0; }; void() ice_xatk6 =[ $xatta6, ice_xatk7 ] {ai_face();}; void() ice_xatk7 =[ $xatta7, ice_xatk8 ] {ai_face(); if (self.health < self.start_attack_health) { ice_pain(self.enemy, self.start_attack_health - self.health); } }; void() ice_xatk8 =[ $xatta8, ice_xatk9 ] {ai_face();}; void() ice_xatk9 =[ $xatta9, ice_xatk10 ] {ai_face();}; void() ice_xatk10 =[ $xatta10, ice_xatk11 ] {ai_face();}; void() ice_xatk11 =[ $xatta11, ice_xatk12 ] {ai_face();}; void() ice_xatk12 =[ $xatta12, ice_run1 ] {ai_face(); ice_fire_iceball(); }; void(entity attacker, float damage) ice_pain = { local float r; if (self.enemy.weapon == IT_SUPER_NAILGUN) return; r = random (); if (self.pain_finished > time) return; if (random()*40 > damage) return; // didn't flinch MalePainSound(2); if ((random()*10 < 8) || ((damage > 50) && (random() < 0.5))) { self.pain_finished = time + 2; ice_pain1 (); } else { self.pain_finished = time + 4; ice_paina1 (); } }; void() ice_atkb1 =[ $sattb1, ice_atkb2 ] { ai_face(); self.start_attack_health = self.health; if (self.count) ai_forward(32); }; void() ice_atkb2 =[ $sattb2, ice_atkb3 ] { ai_face(); iceman_fire(15); if (self.count) ai_forward(24); }; void() ice_atkb3 =[ $sattb3, ice_atkb4 ] { ai_face(); iceman_fire(9); if (self.count) ai_forward(16); }; void() ice_atkb4 =[ $sattb4, ice_atkb5 ] { ai_face(); iceman_fire(3); if (self.count) ai_forward(8); }; void() ice_atkb5 =[ $sattb5, ice_atkb6 ] { ai_face(); iceman_fire(-3); if (self.count) ai_forward(8); self.count = 0; }; void() ice_atkb6 =[ $sattb6, ice_atkb7 ] {iceman_fire(-9);}; void() ice_atkb7 =[ $sattb7, ice_atkb8 ] { if (self.health < self.start_attack_health) { ice_pain(self.enemy, self.start_attack_health - self.health); iceman_fire(-15); } }; void() ice_atkb8 =[ $sattb8, ice_atkb9 ] {}; void() ice_atkb9 =[ $sattb9, ice_atkb10 ] {}; void() ice_atkb10 =[ $sattb10, ice_atkb11 ] {}; void() ice_atkb11 =[ $sattb11, ice_atkb12 ] {}; void() ice_atkb12 =[ $sattb12, ice_run1 ] {}; void() ice_attack = { local float rnd; rnd = random(); if (rnd < 0.3) ice_atk1(); else if (rnd < 0.6) ice_atkb1(); else if (self.last_special < (time - 8)) { self.last_special = time; ice_xatk1(); } else { ice_atk1(); } }; //============================================================================ void () iceman_melt_go = { self.deadflag = DEAD_DYING; self.pain_finished = time + 99; ice_melt1(); }; void (entity e) iceman_melt = { //e.health = 1; e.think = iceman_melt_go; e.nextthink = time + 0.1; // up the kill count, since he is now officially DEAD killed_monsters = killed_monsters + 1; WriteByte (MSG_ALL, SVC_KILLEDMONSTER); }; void () ice_getup = { self.takedamage = DAMAGE_AIM; self.solid = SOLID_SLIDEBOX; if (!walkmove(0,0)) { self.think = ice_getup; self.solid = SOLID_NOT; self.nextthink = time + 0.5; return; } self.health = self.start_health; ice_run1(); }; void() ice_rise1 =[ $rise1, ice_rise2 ] { self.solid = SOLID_SLIDEBOX; if (!walkmove(0,0)) { self.think = ice_rise1; self.solid = SOLID_NOT; self.nextthink = time + 0.5; return; } }; void() ice_rise2 =[ $rise2, ice_rise3 ] {}; void() ice_rise3 =[ $rise3, ice_rise4 ] {}; void() ice_rise4 =[ $rise4, ice_rise5 ] {}; void() ice_rise5 =[ $rise5, ice_rise6 ] {}; void() ice_rise6 =[ $rise6, ice_rise7 ] {}; void() ice_rise7 =[ $rise7, ice_rise8 ] {}; void() ice_rise8 =[ $rise8, ice_rise9 ] {}; void() ice_rise9 =[ $rise9, ice_rise10 ] {}; void() ice_rise10 =[ $rise10, ice_rise11 ] {}; void() ice_rise11 =[ $rise11, ice_rise12 ] {}; void() ice_rise12 =[ $rise12, ice_rise13 ] {}; void() ice_rise13 =[ $rise13, ice_rise14 ] {}; void() ice_rise14 =[ $rise14, ice_rise15 ] {}; void() ice_rise15 =[ $rise15, ice_rise16 ] {}; void() ice_rise16 =[ $rise16, ice_rise17 ] {}; void() ice_rise17 =[ $rise17, ice_rise18 ] {}; void() ice_rise18 =[ $rise18, ice_rise19 ] {}; void() ice_rise19 =[ $rise19, ice_getup ] {}; void() ice_die1 =[ $death1, ice_die2 ] {}; void() ice_die2 =[ $death2, ice_die3 ] {}; void() ice_die3 =[ $death3, ice_die4 ] {self.solid = SOLID_NOT;self.ammo_cells = 5;}; void() ice_die4 =[ $death4, ice_die5 ] {}; void() ice_die5 =[ $death5, ice_die6 ] {}; void() ice_die6 =[ $death6, ice_die7 ] {}; void() ice_die7 =[ $death7, ice_die8 ] {}; void() ice_die8 =[ $death8, ice_die9 ] {}; void() ice_die9 =[ $death9, ice_die10 ] {}; void() ice_die10 =[ $death10, ice_die11 ] {}; void() ice_die11 =[ $death11, ice_die12 ] {}; void() ice_die12 =[ $death12, ice_die13 ] {}; void() ice_die13 =[ $death13, ice_die14 ] {}; void() ice_die14 =[ $death14, ice_die15 ] {}; void() ice_die15 =[ $death15, ice_die16 ] {}; void() ice_die16 =[ $death16, ice_die16 ] { if (!(self.spawnflags & SPAWNFLAG_CLONE)) { self.solid = SOLID_NOT; self.think = ice_rise1; self.takedamage = DAMAGE_NO; self.nextthink = time + 20 + random() * 20; } }; void() GibShardThink = { if (self.velocity_z == 0) remove(self); else self.nextthink = time + 0.2; }; void(entity ent, float num_gibs) IcemanShardGib = { local entity shard; local float num; local vector vect; if (damage_inflictor.classname == "guided_rocket") { vect = normalize(damage_inflictor.velocity); } else { vect = '0 0 0'; } num = num_gibs; while (num > 0) { shard = spawn(); shard.movetype = MOVETYPE_BOUNCE; shard.velocity_x = random() * 150 - 75; shard.velocity_y = random() * 150 - 75; shard.velocity_z = 220 + random() * 150; shard.velocity = shard.velocity + vect * 200; shard.angles = shard.velocity; shard.avelocity = '200 200 200'; setsize(shard, '0 0 0', '0 0 0'); setmodel(shard, "progs/iceshard.mdl"); setorigin(shard, ent.origin + shard.velocity * 0.1); shard.frame = 1; shard.think = GibShardThink; shard.nextthink = time + 1; num = num - 1; } }; void() ice_die = { // check for shard gib if ((damage_inflictor.classname == "guided_rocket") || (damage_inflictor.classname == "orb") || (damage_inflictor.classname == "prox_missile") || (damage_inflictor.classname == "proximity_ball")) { IcemanShardGib(self, 15); remove(self); return; } ice_die1 (); }; /*QUAKED monster_iceman (1 0 0) (-16 -16 -24) (16 16 40) Ambush */ void() monster_zombie = { remove(self); }; void() xmen_iceman = { if ((deathmatch) || (self.spawnflags & 1)) { remove(self); return; } precache_model2 ("progs/iceshard.mdl"); precache_model2 ("progs/puddle.mdl"); precache_model2 ("progs/iceblast.mdl"); precache_sound ("generic/frozen1.wav"); self.solid = SOLID_SLIDEBOX; self.movetype = MOVETYPE_STEP; if ((self.map == "green") || (self.map == "")) { precache_model2("progs/ice1.mdl"); setmodel (self, "progs/ice1.mdl"); } if (self.map == "blue") { precache_model2("progs/ice2.mdl"); setmodel (self, "progs/ice2.mdl"); } if (self.map == "purple") { precache_model2("progs/ice3.mdl"); setmodel (self, "progs/ice3.mdl"); } if (self.map == "brown") { precache_model2("progs/ice4.mdl"); setmodel (self, "progs/ice4.mdl"); } if (self.map == "gold") { precache_model2("progs/ice5.mdl"); setmodel (self, "progs/ice5.mdl"); } setsize (self, '-16 -16 -24', '16 16 40'); self.health = 80 + cvar("skill") * 10; self.th_stand = ice_stand1; self.th_walk = ice_walk1; self.th_run = ice_run1; self.th_pain = ice_pain; self.th_die = ice_die; self.th_missile = ice_attack; self.count = 0; walkmonster_start(); };