hexen2/H2W/HCode/meteor.hc
2000-11-10 00:00:00 +00:00

703 lines
16 KiB
C++

/*
* $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
*/