289 lines
7.2 KiB
C++
289 lines
7.2 KiB
C++
|
/*
|
||
|
==============================================================================
|
||
|
|
||
|
Q:\art\models\weapons\spllbook\spllbook.hc
|
||
|
|
||
|
==============================================================================
|
||
|
*/
|
||
|
|
||
|
// For building the model
|
||
|
$cd Q:\art\models\weapons\spllbook
|
||
|
$origin 0 0 0
|
||
|
$base BASE skin
|
||
|
$skin skin
|
||
|
$flags 0
|
||
|
|
||
|
//
|
||
|
$frame normal02 normal03 normal04 normal05 normal06
|
||
|
$frame normal07 normal08 normal09 normal10 normal11
|
||
|
$frame normal12 normal13
|
||
|
|
||
|
//
|
||
|
$frame idlean12 idlean13 idlean14 idlean15 idlean16
|
||
|
$frame idlean17 idlean18 idlean19 idlean20 idlean21
|
||
|
$frame idlean22 idlean23 idlean24 idlean25 idlean26
|
||
|
$frame idlean27 idlean28 idlean29 idlean30 idlean31
|
||
|
$frame idlean32 idlean33 idlean34 idlean35
|
||
|
|
||
|
//
|
||
|
$frame idlebn36 idlebn37 idlebn38 idlebn39 idlebn40
|
||
|
$frame idlebn41 idlebn42 idlebn43 idlebn44 idlebn45
|
||
|
$frame idlebn46 idlebn47 idlebn48 idlebn49 idlebn50
|
||
|
$frame idlebn51 idlebn52 idlebn53 idlebn54 idlebn55
|
||
|
$frame idlebn56 idlebn57 idlebn58 idlebn59
|
||
|
|
||
|
|
||
|
//
|
||
|
$frame select80 select81 select82 select83 select84
|
||
|
$frame select85 select86 select87 select88 select89
|
||
|
$frame select90 select91 select92 select93 select94
|
||
|
$frame select95 select96 select97 select98 select99
|
||
|
|
||
|
|
||
|
void BloodMissileTouch (void)
|
||
|
{
|
||
|
if(pointcontents(self.origin)==CONTENT_SKY)
|
||
|
{
|
||
|
remove(self);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
if(other.classname==self.classname&&other.owner==self.owner)
|
||
|
return;
|
||
|
|
||
|
self.movedir=normalize(self.velocity);
|
||
|
|
||
|
if(!other.takedamage)
|
||
|
{
|
||
|
if(self.frags)
|
||
|
{
|
||
|
//counter for number of bounces
|
||
|
sound (self, CHAN_WEAPON, "succubus/brnbounce.wav", 1, ATTN_NORM);
|
||
|
if(self.dmg>=2)
|
||
|
self.dmg-=1;
|
||
|
starteffect(CE_BRN_BOUNCE,self.origin - self.movedir*8 - '0 0 6','0 0 0',HX_FRAME_TIME);//CreateRedFlash(self.origin);
|
||
|
self.health += 45;
|
||
|
thinktime self : 0;
|
||
|
return;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
starteffect(CE_BLDRN_EXPL, self.origin-self.movedir*6,'0 0 0', HX_FRAME_TIME);
|
||
|
sound (self, CHAN_WEAPON, "succubus/brnwall.wav", 1, ATTN_NORM);
|
||
|
remove(self);
|
||
|
return;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
spawn_touchpuff(self.dmg,other);
|
||
|
T_Damage(other,self,self.owner,self.dmg);
|
||
|
starteffect(CE_BLDRN_EXPL, self.origin-self.movedir*6,'0 0 0', HX_FRAME_TIME);
|
||
|
sound(self,CHAN_AUTO,"succubus/brnhit.wav",1,ATTN_NORM);
|
||
|
|
||
|
remove(self);
|
||
|
}
|
||
|
|
||
|
void BloodMissileFade ()
|
||
|
{
|
||
|
self.angles=vectoangles(self.velocity);
|
||
|
if(self.health>30)
|
||
|
{
|
||
|
self.health-=60;
|
||
|
thinktime self : 0.3;
|
||
|
if(self.dmg>=1.75)
|
||
|
self.dmg-=0.75;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
remove(self);
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
traceline(self.origin, self.origin + self.movedir * 240, FALSE, newmis);
|
||
|
|
||
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||
|
WriteByte (MSG_MULTICAST, TE_BLOODRAIN);
|
||
|
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 * 240.0);
|
||
|
WriteByte (MSG_MULTICAST, self.health);
|
||
|
multicast(self.origin,MULTICAST_PVS);
|
||
|
}
|
||
|
|
||
|
void FireBloodMissile (float offset)
|
||
|
{
|
||
|
float f_dist;
|
||
|
|
||
|
makevectors(self.v_angle);
|
||
|
|
||
|
self.effects(+)EF_MUZZLEFLASH;
|
||
|
newmis=spawn();
|
||
|
newmis.classname="blood missile";
|
||
|
newmis.owner=self;
|
||
|
newmis.effects(+) EF_NODRAW;
|
||
|
f_dist=8;
|
||
|
if(self.artifact_active&ART_TOMEOFPOWER)
|
||
|
{
|
||
|
newmis.health=250;
|
||
|
newmis.dmg=random(40,60);
|
||
|
f_dist=16;
|
||
|
newmis.solid=SOLID_PHASE;
|
||
|
|
||
|
newmis.movetype=MOVETYPE_BOUNCEMISSILE;
|
||
|
newmis.frags=TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
newmis.dmg=random(15,22);
|
||
|
newmis.health=90;
|
||
|
newmis.frags=FALSE;
|
||
|
newmis.movetype=MOVETYPE_FLYMISSILE;
|
||
|
}
|
||
|
|
||
|
newmis.solid=SOLID_BBOX;
|
||
|
newmis.touch=BloodMissileTouch;
|
||
|
|
||
|
newmis.speed=800;
|
||
|
newmis.velocity=normalize(v_forward)*newmis.speed;// + spread;
|
||
|
newmis.movedir=normalize(newmis.velocity);
|
||
|
newmis.angles=vectoangles(newmis.velocity);
|
||
|
|
||
|
setmodel(newmis,"models/sucwp1p.mdl");
|
||
|
setsize(newmis,'0 0 0','0 0 0');
|
||
|
|
||
|
setorigin(newmis,self.origin+self.proj_ofs+v_forward*f_dist-v_right*12 + v_right*(offset*3) - '0 0 6');
|
||
|
weapon_sound(self, "succubus/brnfire.wav");
|
||
|
|
||
|
newmis.think=BloodMissileFade;
|
||
|
thinktime newmis : 0.3;
|
||
|
|
||
|
traceline(newmis.origin, newmis.origin + newmis.movedir * 240, FALSE, newmis);
|
||
|
|
||
|
WriteByte (MSG_MULTICAST, SVC_TEMPENTITY);
|
||
|
WriteByte (MSG_MULTICAST, TE_BLOODRAIN);
|
||
|
WriteCoord (MSG_MULTICAST, newmis.origin_x);
|
||
|
WriteCoord (MSG_MULTICAST, newmis.origin_y);
|
||
|
WriteCoord (MSG_MULTICAST, newmis.origin_z);
|
||
|
WriteByte (MSG_MULTICAST, newmis.angles_y*256.0/360.0);
|
||
|
WriteByte (MSG_MULTICAST, newmis.angles_x*256.0/360.0);
|
||
|
WriteByte (MSG_MULTICAST, trace_fraction * 240.0);
|
||
|
WriteByte (MSG_MULTICAST, newmis.health);
|
||
|
multicast(self.origin,MULTICAST_PVS);
|
||
|
}
|
||
|
|
||
|
void blrn_power(float offset)
|
||
|
{
|
||
|
if(self.attack_finished>time)
|
||
|
return;
|
||
|
|
||
|
FireBloodMissile(offset);
|
||
|
self.attack_finished=time+0.7;
|
||
|
self.punchangle_x=3;
|
||
|
}
|
||
|
|
||
|
void blrn_normal()
|
||
|
{
|
||
|
if(self.attack_finished>time)
|
||
|
return;
|
||
|
|
||
|
FireBloodMissile(0);
|
||
|
self.attack_finished=time+0.4;
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*======================
|
||
|
ACTION
|
||
|
select
|
||
|
deselect
|
||
|
ready loop
|
||
|
relax loop
|
||
|
fire once
|
||
|
fire loop
|
||
|
ready to relax(after short delay)
|
||
|
relax to ready(Fire delay? or automatic if see someone?)
|
||
|
=======================*/
|
||
|
|
||
|
|
||
|
void()bloodrain_ready;
|
||
|
void() Suc_Blrn_Fire;
|
||
|
|
||
|
void bloodrain_fire (void)
|
||
|
{
|
||
|
if(self.button0&&self.weaponframe==$normal07 &&!self.artifact_active&ART_TOMEOFPOWER)
|
||
|
self.weaponframe=$normal07;
|
||
|
else
|
||
|
self.wfs = advanceweaponframe($normal02,$normal13);
|
||
|
if(self.weaponframe<=$normal07)
|
||
|
self.weaponframe+=1;
|
||
|
self.th_weapon=bloodrain_fire;
|
||
|
self.last_attack=time;
|
||
|
if(self.wfs==WF_CYCLE_WRAPPED)
|
||
|
bloodrain_ready();
|
||
|
if(self.artifact_active&ART_TOMEOFPOWER)
|
||
|
{
|
||
|
// if(self.weaponframe>=$normal07 && self.weaponframe<=$normal09)
|
||
|
// blrn_power((self.weaponframe - $normal08) *3);
|
||
|
if(self.weaponframe==$normal07)
|
||
|
blrn_power(0);
|
||
|
|
||
|
}
|
||
|
else if(self.weaponframe==$normal07)
|
||
|
blrn_normal();
|
||
|
}
|
||
|
|
||
|
void() Suc_Blrn_Fire =
|
||
|
{
|
||
|
self.weaponframe_cnt=0;
|
||
|
bloodrain_fire();
|
||
|
|
||
|
thinktime self : 0;
|
||
|
};
|
||
|
|
||
|
void bloodrain_jellyfingers ()
|
||
|
{
|
||
|
self.wfs = advanceweaponframe($idlebn36,$idlebn59);
|
||
|
self.th_weapon=bloodrain_jellyfingers;
|
||
|
if(self.wfs==WF_CYCLE_WRAPPED)
|
||
|
bloodrain_ready();
|
||
|
}
|
||
|
|
||
|
void bloodrain_ready (void)
|
||
|
{
|
||
|
self.wfs = advanceweaponframe($idlean12,$idlean35);
|
||
|
if(random()<0.1&&self.weaponframe==$idlean35)
|
||
|
self.th_weapon=bloodrain_jellyfingers;
|
||
|
else
|
||
|
self.th_weapon=bloodrain_ready;
|
||
|
}
|
||
|
|
||
|
|
||
|
void bloodrain_select (void)
|
||
|
{
|
||
|
self.wfs = advanceweaponframe($select80,$select99);
|
||
|
self.weaponmodel = "models/sucwp1.mdl";
|
||
|
self.th_weapon=bloodrain_select;
|
||
|
if(self.wfs==WF_CYCLE_WRAPPED)
|
||
|
{
|
||
|
self.attack_finished = time - 1;
|
||
|
bloodrain_ready();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void bloodrain_deselect (void)
|
||
|
{
|
||
|
self.wfs = advanceweaponframe($select99,$select80);
|
||
|
self.th_weapon=bloodrain_deselect;
|
||
|
if(self.wfs==WF_CYCLE_WRAPPED)
|
||
|
W_SetCurrentAmmo();
|
||
|
}
|