/* * $Header: /HexenWorld/HCode/meteor.hc 32 4/10/98 10:58a Nalbury $ */ /* ============================================================================== Q:\art\models\weapons\meteor\final\meteor.hc ============================================================================== */ // For building the model $cd Q:\art\models\weapons\meteor\final $origin 0 0 0 $base BASE skin $skin skin $flags 0 // $frame idle // $frame Select1 Select2 Select3 Select4 Select5 $frame Select6 Select7 Select8 Select9 Select10 $frame Select11 Select12 Select13 Select14 Select15 $frame Select16 Select17 Select18 // $frame fire1 fire2 fire3 fire4 fire5 $frame fire6 fire7 fire8 fire9 void MeteoriteFizzle (void) { CreateWhiteSmoke(self.origin,'0 0 8',HX_FRAME_TIME * 2); remove(self); } void ByeByeMeteor(void) { remove(self); } void MeteorExplode(void) { WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_METEORHIT); WriteCoord (MSG_MULTICAST, self.origin_x - self.movedir_x * 8); WriteCoord (MSG_MULTICAST, self.origin_y - self.movedir_y * 8); WriteCoord (MSG_MULTICAST, self.origin_z - self.movedir_z * 8); multicast(self.origin,MULTICAST_PHS_R); T_RadiusDamage (self, self.owner, 80.0, world); remove(self); } void MeteorTouch (void) { if(other.controller==self.owner) return; if(other.takedamage&&other.health) { T_Damage(other,self,self.owner,self.dmg); if((other.flags&FL_CLIENT||other.flags&FL_MONSTER)&&other.mass<200) { vector hitdir; hitdir=self.o_angle*300; hitdir_z+=150; if(hitdir_z<0) hitdir_z=0; other.velocity=hitdir; other.flags(-)FL_ONGROUND; } } self.dmg=90; WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_METEORHIT); WriteCoord (MSG_MULTICAST, self.origin_x - self.movedir_x * 8); WriteCoord (MSG_MULTICAST, self.origin_y - self.movedir_y * 8); WriteCoord (MSG_MULTICAST, self.origin_z - self.movedir_z * 8); multicast(self.origin,MULTICAST_PHS_R); T_RadiusDamage (self, self.owner, self.dmg, other); remove(self); } void MeteorThink(void) { self.movedir = normalize(self.velocity); self.angles = vectoangles(self.movedir); traceline(self.origin, self.origin + self.movedir * 300.0, FALSE, self); WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_METEOR); WriteCoord (MSG_MULTICAST, self.origin_x); WriteCoord (MSG_MULTICAST, self.origin_y); WriteCoord (MSG_MULTICAST, self.origin_z); WriteByte (MSG_MULTICAST, self.angles_y*256.0/360.0); WriteByte (MSG_MULTICAST, self.angles_x*256.0/360.0); WriteByte (MSG_MULTICAST, trace_fraction * 100); multicast(self.origin,MULTICAST_PVS); thinktime self : 0.3; if (self.lifetime < time) SUB_Remove(); } void FireMeteor (string type) { vector org; entity meteor; meteor=spawn(); setmodel(meteor,"models/tempmetr.mdl"); meteor.th_die=MultiExplode; meteor.takedamage = DAMAGE_NO; meteor.health = 9999; if(self.classname=="player") { self.greenmana-=8; self.velocity+=normalize(v_forward)*-300;//include mass self.flags(-)FL_ONGROUND; } meteor.classname="meteor"; self.punchangle_x = -6; weapon_sound(self, "crusader/metfire.wav"); self.attack_finished=time + 0.7; self.effects(+)EF_MUZZLEFLASH; makevectors(self.v_angle); meteor.speed=1000; meteor.o_angle=normalize(v_forward); meteor.velocity=meteor.o_angle*meteor.speed; meteor.veer=30; meteor.lifetime=time + 5; meteor.dmg=65; meteor.movetype=MOVETYPE_FLYMISSILE; org=self.origin+self.proj_ofs+v_forward*12; setsize(meteor,'0 0 0', '0 0 0'); meteor.movedir = normalize(meteor.velocity); meteor.effects(+)EF_NODRAW; meteor.drawflags(+)MLS_FIREFLICKER;//|MLS_ABSLIGHT; if(self.classname=="tornato") meteor.owner=self.controller; else if(self.classname=="meteor") meteor.owner=self.owner; else meteor.owner=self; meteor.controller=self; meteor.solid=SOLID_BBOX; meteor.touch=MeteorTouch; setorigin(meteor,org); entity oldself; oldself = self; self = meteor; meteor.think = MeteorThink; meteor.think(); self = oldself; } void MegaMeteorIgnite(void) { float i; vector startPos, endPos; entity hurtGuy; if(self.health == 6) { // must've timed out or been in-air ignited... self.health = 5; } if(self.health == 5) { traceline(self.origin, self.origin + '0 0 -2000', FALSE, self); // only make meteors on the first frame WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_METEOR_CRUSH); WriteCoord (MSG_MULTICAST, self.origin_x - self.movedir_x * 8); WriteCoord (MSG_MULTICAST, self.origin_y - self.movedir_y * 8); WriteCoord (MSG_MULTICAST, self.origin_z - self.movedir_z * 8); WriteLong (MSG_MULTICAST, 2000 * trace_fraction); multicast(self.origin,MULTICAST_PHS_R); self.effects (+) EF_NODRAW; self.think = MegaMeteorIgnite; self.velocity_x = 0; self.velocity_y = 0; self.velocity_z = 0; } i = 6; while(i > 0) { startPos = self.origin; startPos_x += random(-80, 80); startPos_y += random(-80, 80); endPos = startPos; endPos_x += random(-90, 90)*4; endPos_y += random(-90, 90)*4; endPos_z += random(-1800, -1600)*4; // simulate the meteor going through the air; simulate the meteor's width traceline (startPos, endPos, FALSE, self.owner); // if(trace_ent.takedamage) // { // T_Damage (trace_ent, self, self.owner, 40); // } hurtGuy=findradius(trace_endpos,90); while(hurtGuy) { T_Damage(hurtGuy, self, self, 50 * (1.0 - (vlen(hurtGuy.origin - trace_endpos)/90))); hurtGuy=hurtGuy.chain; } i-=1; } self.health -= 1; if(self.health == 0) { remove(self); } else { self.nextthink = time + 0.05; } } void MegaMeteorTouch(void) { if(other == self.owner) { return; } if((other != world)&&(self.health != 6)) { return; } if(self.health == 6) { self.health = 5; self.velocity_x = 0; self.velocity_y = 0; self.velocity_z = 1600; self.lifetime = time + 0.5; self.flags(-)FL_ONGROUND; } else { MegaMeteorIgnite(); } } void MegaMeteorThink(void) { if(self.lifetime < time) { self.health = 5; MegaMeteorIgnite(); return; //self.health = 5; } /* if((self.owner.button0)&&(self.lifetime - time < 4.7)) { // if the owner tries firing again and the projectile's been around for at least .3 of a second... self.health = 5; }*/ if(self.health == 5) { self.velocity_x = 0; self.velocity_y = 0; self.velocity_z = 1600; self.flags(-)FL_ONGROUND; } self.movedir = normalize(self.velocity); self.angles = vectoangles(self.movedir); traceline(self.origin, self.origin + self.velocity*.3, TRUE, self); WriteByte (MSG_MULTICAST, SVC_TEMPENTITY); WriteByte (MSG_MULTICAST, TE_MEGAMETEOR); WriteCoord (MSG_MULTICAST, self.origin_x); WriteCoord (MSG_MULTICAST, self.origin_y); WriteCoord (MSG_MULTICAST, self.origin_z); WriteByte (MSG_MULTICAST, self.angles_y*256.0/360.0); WriteByte (MSG_MULTICAST, self.angles_x*256.0/360.0); WriteByte (MSG_MULTICAST, trace_fraction * 100); multicast(self.origin,MULTICAST_PVS); thinktime self : 0.3; } void FireMeteorTornado(void) { vector org; entity meteor; meteor=spawn(); setmodel(meteor,"models/tempmetr.mdl"); meteor.scale = 2.3; if(self.classname=="player") { self.greenmana-=16; self.velocity+=normalize(v_forward)*-100;//include mass self.flags(-)FL_ONGROUND; } meteor.classname="meteor"; self.punchangle_x = -6; weapon_sound(self, "crusader/metfire.wav"); self.attack_finished=time + 1.5; self.effects(+)EF_MUZZLEFLASH; makevectors(self.v_angle); meteor.speed=1600; meteor.o_angle=normalize(v_forward); meteor.velocity=meteor.o_angle*meteor.speed; meteor.lifetime=time + 5; meteor.th_die=MegaMeteorIgnite; meteor.nextthink = time + 0.1; meteor.dmg=60; meteor.movetype=MOVETYPE_FLYMISSILE; meteor.health = 6; setsize(meteor,'0 0 0', '0 0 0'); meteor.movedir = normalize(meteor.velocity); // meteor.effects(+)EF_BRIGHTLIGHT|EF_TORNADO_EFFECT; meteor.effects(+)EF_NODRAW; meteor.drawflags(+)MLS_FIREFLICKER|DRF_TRANSLUCENT;//|MLS_ABSLIGHT; meteor.owner=self; //meteor.solid=SOLID_PHASE; meteor.solid=SOLID_BBOX; meteor.touch=MegaMeteorTouch; org=self.origin+self.proj_ofs+v_forward*12; setorigin(meteor,org); entity oldself; oldself = self; self = meteor; meteor.think = MegaMeteorThink; meteor.think(); self = oldself; } void()meteor_ready_loop; void() Cru_Met_Attack; void meteor_power_fire (void) { self.wfs = advanceweaponframe($fire1,$fire9); self.th_weapon=meteor_power_fire; if(self.weaponframe==$fire2 && self.attack_finished<=time) { FireMeteorTornado(); } if(self.wfs==WF_CYCLE_WRAPPED) { self.last_attack=time; meteor_ready_loop(); } } void meteor_fire (void) { self.wfs = advanceweaponframe($fire1,$fire9); self.th_weapon=meteor_fire; if((!self.button0||self.attack_finished>time)&&self.wfs==WF_CYCLE_WRAPPED) { self.last_attack=time; meteor_ready_loop(); } else if(self.weaponframe==$fire1 &&self.attack_finished<=time) FireMeteor("meteor"); } void() Cru_Met_Attack = { if(self.artifact_active&ART_TOMEOFPOWER) self.th_weapon=meteor_power_fire; else self.th_weapon=meteor_fire; thinktime self : 0; }; void meteor_ready_loop (void) { self.weaponframe = $idle; self.th_weapon=meteor_ready_loop; } void meteor_select (void) { //go to ready loop, not relaxed? self.wfs = advanceweaponframe($Select1,$Select16); self.weaponmodel = "models/meteor.mdl"; self.th_weapon=meteor_select; self.last_attack=time; if(self.wfs==WF_CYCLE_WRAPPED) { self.attack_finished = time - 1; meteor_ready_loop(); } } void meteor_deselect (void) { self.wfs = advanceweaponframe($Select16,$Select1); self.th_weapon=meteor_deselect; if(self.wfs==WF_CYCLE_WRAPPED) W_SetCurrentAmmo(); } /* * $Log: /HexenWorld/HCode/meteor.hc $ * * 32 4/10/98 10:58a Nalbury * moved some stuff from the phs to the pvs... * * 31 4/09/98 2:07p Nalbury * Made powered up meteor staff easier to use and powered up icemace a bit * less potent... * * 30 4/07/98 9:07p Nalbury * No more reliable junk... * * 29 4/04/98 4:22p Nalbury * tweaked lightning some... * * 28 4/04/98 5:47a Nalbury * Tweaked ALOT of damage amounts. It's getting there... * * 27 4/04/98 3:04a Nalbury * fixed up powered up meteor a biit... * * 26 4/02/98 2:37p Ssengele * specifically set takedamage to no, although that didn't seem to help a * lot with the xbolts; also set health to 9999; something dies with * multiexplode as its th_die, and i want to make sure the meteors aren't * causing the other infrequent stack overflow. only touched the * unpowered meteors. * * 25 4/01/98 6:32p Nalbury * improved megamissile speed... * * 24 3/31/98 5:27p Nalbury * Removed some unused flags. * * 23 3/30/98 12:25a Nalbury * Did some blood rain stuff... * * 22 3/27/98 4:09p Nalbury * Upped damage, reload time for powered up version... * * 21 3/27/98 1:13a Nalbury * Got the meteor storm where I want it - still needs to be balanced... * * 20 3/26/98 8:00p Nalbury * decreased powered sunstaff damage; changed meteor effect * * 19 3/23/98 5:33p Nalbury * Increased meteor staff damage. * * 18 3/23/98 5:04p Nalbury * * 17 3/12/98 7:49p Nalbury * Decreased damage for meteors and tornades; decreased tornado's range * * 16 3/12/98 1:48p Nalbury * modified sound stuff. * * 15 3/12/98 11:41a Nalbury * tornados can now go up stairs and stuff. * * 14 3/10/98 3:00p Nalbury * Changed the amount tornados lift. * * 13 3/09/98 5:11p Nalbury * changed purifier around * * 12 3/09/98 2:41p Nalbury * Fixed more gib stuff * * 11 3/07/98 2:49a Nalbury * worked on player gib stuff * * 10 3/05/98 4:41p Nalbury * * 9 3/05/98 2:58p Nalbury * Adjusted meteor stuff * * 8 3/04/98 5:53a Nalbury * Removed unneeded code... Added cost to tornados. * * 7 3/02/98 11:01p Nalbury * Added more functionality to the tornados * * 6 3/02/98 4:09p Nalbury * Messed around with the tornado alot... * * 5 2/23/98 6:45p Nalbury * Really prevent the meteors from being in the wall... * * 4 2/23/98 6:25p Nalbury * pulled ice shards and meteors out of wall * * 3 2/20/98 4:22p Nalbury * Cheapened meteor stuff * * 2 2/18/98 12:07p Nalbury * Changed meteors to temp ents. * * 1 2/04/98 1:59p Rjohnson * * 77 9/11/97 12:02p Mgummelt * * 76 9/02/97 7:54p Mgummelt * * 75 9/01/97 8:18p Mgummelt * * 74 9/01/97 7:09a Mgummelt * * 73 9/01/97 5:58a Mgummelt * * 72 9/01/97 5:13a Mgummelt * * 71 9/01/97 3:08a Mgummelt * * 70 8/31/97 6:55p Mgummelt * * 69 8/30/97 6:58p Mgummelt * * 68 8/30/97 3:05p Mgummelt * * 67 8/28/97 2:41p Mgummelt * * 66 8/26/97 6:01p Mgummelt * * 65 8/26/97 7:38a Mgummelt * * 64 8/26/97 2:26a Mgummelt * * 63 8/25/97 11:41p Mgummelt * * 62 8/25/97 4:15p Mgummelt * * 61 8/22/97 5:15p Mgummelt * * 60 8/12/97 6:10p Mgummelt * * 59 8/08/97 6:21p Mgummelt * * 58 8/07/97 10:30p Mgummelt * * 57 8/06/97 10:19p Mgummelt * * 56 8/04/97 8:03p Mgummelt * * 55 7/30/97 10:43p Mgummelt * * 54 7/29/97 5:44p Mgummelt * * 53 7/28/97 7:50p Mgummelt * * 52 7/28/97 1:51p Mgummelt * * 51 7/26/97 8:39a Mgummelt * * 50 7/24/97 4:06p Rlove * * 49 7/24/97 3:53p Rlove * * 48 7/24/97 3:26a Mgummelt * * 47 7/21/97 4:04p Mgummelt * * 46 7/21/97 4:02p Mgummelt * * 45 7/21/97 11:45a Mgummelt * * 44 7/19/97 9:53p Mgummelt * * 43 7/18/97 3:55p Mgummelt * * 42 7/15/97 8:31p Mgummelt * * 41 7/14/97 9:30p Mgummelt * * 40 7/10/97 7:21p Mgummelt * * 39 7/09/97 6:31p Mgummelt * * 38 7/01/97 3:30p Mgummelt * * 37 7/01/97 2:21p Mgummelt * * 36 6/30/97 5:38p Mgummelt * * 35 6/23/97 4:50p Mgummelt * * 34 6/18/97 7:06p Mgummelt * * 33 6/18/97 4:19p Mgummelt * * 32 6/18/97 4:00p Mgummelt * * 31 6/16/97 4:00p Mgummelt * * 30 6/15/97 5:10p Mgummelt * * 29 6/05/97 9:29a Rlove * Weapons now have deselect animations * * 28 6/04/97 8:16p Mgummelt * * 27 6/03/97 12:35p Mgummelt * * 26 5/31/97 3:59p Mgummelt * * 25 5/28/97 8:24p Mgummelt * * 23 5/23/97 2:54p Mgummelt * * 22 5/22/97 7:05p Mgummelt * * 21 5/22/97 2:50a Mgummelt * * 20 5/20/97 9:36p Mgummelt * * 19 5/19/97 11:36p Mgummelt * * 18 5/19/97 12:06p Mgummelt * * 17 5/17/97 8:45p Mgummelt * * 16 5/16/97 11:27p Mgummelt * * 15 5/15/97 8:28p Mgummelt * * 14 5/15/97 2:44p Mgummelt * * 13 5/15/97 5:04a Mgummelt * * 12 5/15/97 3:45a Mgummelt * * 10 5/12/97 10:37a Rlove * * 9 5/06/97 1:29p Mgummelt * * 8 5/05/97 10:09p Mgummelt * * 7 5/05/97 4:48p Mgummelt * * 6 4/28/97 6:53p Mgummelt * * 5 4/25/97 8:32p Mgummelt * * 4 4/24/97 2:21p Mgummelt * * 3 4/21/97 12:31p Mgummelt * * 2 4/17/97 1:45p Mgummelt * * 1 4/17/97 12:13p Mgummelt */