/* ============================================================================== 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 idlebn01 idlebn02 idlebn03 idlebn04 idlebn05 $frame idlebn06 idlebn07 idlebn08 idlebn09 idlebn10 $frame idlebn11 idlebn12 idlebn13 idlebn14 idlebn15 $frame idlebn16 idlebn17 idlebn18 idlebn19 idlebn20 $frame idlebn21 idlebn22 idlebn23 idlebn24 idlebn25 // $frame idlean26 idlean27 idlean28 idlean29 idlean30 $frame idlean31 idlean32 idlean33 idlean34 idlean35 $frame idlean36 idlean37 idlean38 idlean39 idlean40 $frame idlean41 idlean42 idlean43 idlean44 idlean45 $frame idlean46 idlean47 idlean48 idlean49 idlean50 // $frame normal51 normal52 normal53 normal54 normal55 $frame normal56 normal57 normal58 normal59 normal60 $frame normal61 normal62 normal63 normal64 // $frame topowr65 topowr66 topowr67 topowr68 topowr69 $frame topowr70 topowr71 topowr72 topowr73 topowr74 $frame topowr75 topowr76 topowr77 topowr78 topowr79 $frame topowr80 topowr81 topowr82 topowr83 topowr84 // $frame pidleb085 pidleb086 pidleb087 pidleb088 pidleb089 $frame pidleb090 pidleb091 pidleb092 pidleb093 pidleb094 $frame pidleb095 pidleb096 pidleb097 pidleb098 pidleb099 $frame pidleb100 pidleb101 pidleb102 pidleb103 pidleb104 $frame pidleb105 pidleb106 pidleb107 pidleb108 pidleb109 // $frame pidlea110 pidlea111 pidlea112 pidlea113 pidlea114 $frame pidlea115 pidlea116 pidlea117 pidlea118 pidlea119 $frame pidlea120 pidlea121 pidlea122 pidlea123 pidlea124 $frame pidlea125 pidlea126 pidlea127 pidlea128 pidlea129 $frame pidlea130 pidlea131 pidlea132 pidlea133 pidlea134 // $frame powern135 powern136 powern137 powern138 powern139 $frame powern140 powern141 powern142 powern143 powern144 $frame powern145 powern146 powern147 powern148 // $frame tonrml149 tonrml150 tonrml151 tonrml152 tonrml153 $frame tonrml154 tonrml155 tonrml156 tonrml157 tonrml158 $frame tonrml159 tonrml160 tonrml161 tonrml162 tonrml163 $frame tonrml164 tonrml165 tonrml166 tonrml167 tonrml168 // $frame ndesel213 ndesel214 ndesel215 ndesel216 ndesel217 $frame ndesel218 ndesel219 ndesel220 ndesel221 ndesel222 $frame ndesel223 // $frame pselon224 pselon225 pselon226 pselon227 pselon228 $frame pselon229 pselon230 pselon231 pselon232 pselon233 $frame pselon234 void burner_think () { vector org,vel; if(self.lifetime0) smolder(other_org); } else { T_Damage(other, self.owner, self.owner, 10); } local float rand; rand = random(); if (rand < 0.2) starteffect(CE_SM_EXPLOSION, self.origin-self.movedir*6, '0 0 6', 0); else if (rand < 0.3) starteffect(CE_FBOOM, self.origin-self.movedir*6, '0 0 6', 0); else starteffect(CE_BOMB, self.origin-self.movedir*6, '0 0 6', 0); remove(self); } void flameball_think() { starteffect(CE_FLAMESTREAM, self.origin, '0 0 2', 0); self.think = SUB_Remove; thinktime self : 2; } void flameball_spawn(vector pos, entity targ) { newmis = spawn(); newmis.classname = "flameball"; newmis.owner = self.owner; setmodel(newmis, "models/sucwp1p.mdl"); setsize(newmis, '-3 -3 -3', '3 3 3'); newmis.hull = HULL_POINT; newmis.solid = SOLID_BBOX; newmis.movetype = MOVETYPE_FLYMISSILE; newmis.drawflags (+) MLS_ABSLIGHT; newmis.abslight = 0.5; newmis.frame = 4; setorigin(newmis, pos); pos = targ.origin - newmis.origin; pos = normalize(pos); pos *= 800 + random(100); newmis.velocity = pos; newmis.angles = vectoangles(newmis.velocity); newmis.movedir = normalize(newmis.velocity); starteffect(CE_FLAMESTREAM, newmis.origin, '0 0 0', 0); newmis.touch = flameball_touch; newmis.think = flameball_think; thinktime newmis : 0.05; } void flamestream_boom() { local vector rand; if (self.lifetime < time || self.lockentity.origin == '0 0 0') { remove(self); return; } if (self.attack_finished < time) { sound(self,CHAN_BODY,"succubus/flamend.wav",0.5,ATTN_NORM); self.attack_finished = time + 1.5; } makevectors(self.lockentity.angles); rand = self.lockentity.origin + '0 0 200' + randomv('-140 -140 -140', '140 140 140'); traceline(self.lockentity.origin, rand, TRUE, self); flameball_spawn(trace_endpos, self.lockentity); self.think = flamestream_boom; thinktime self : 0.1; } void flamestream_touch () { self.velocity = '0 0 0'; if(other.classname=="flamestream") return; if(other.takedamage) { float old_health; vector other_org; sound(self,CHAN_BODY,"succubus/flamend.wav",0.5,ATTN_NORM); if (other.thingtype == THINGTYPE_FLESH || other.thingtype == THINGTYPE_WOOD || other.thingtype == THINGTYPE_HAY || other.thingtype == THINGTYPE_LEAVES || other.thingtype == THINGTYPE_CLOTH || other.thingtype == THINGTYPE_WOOD_LEAF || other.thingtype == THINGTYPE_WOOD_METAL || other.thingtype == THINGTYPE_WOOD_STONE || other.thingtype == THINGTYPE_METAL_CLOTH) { if (random() < 0.5 || deathmatch) spawn_burner(other); } other_org=other.origin; old_health=other.health; starteffect(CE_FBOOM, self.origin-self.movedir*6,'0 0 0', 0); T_Damage(other,self,self.owner,self.dmg + random(1,5)); if(other.health<=0&&old_health>0) smolder(other_org); remove(self); } else { sound(self,CHAN_BODY,"succubus/flamend.wav",0.5,ATTN_NORM); starteffect(CE_BOMB, self.origin-self.movedir*6,'0 0 0', 0); T_RadiusDamage(self,self.owner,40,self.owner); remove(self); } } void flamestream_touch2 () { entity found,loser; float lastdist,dist; self.velocity = '0 0 0'; if(other.classname=="flamestream") return; loser=other; if(!loser.takedamage) { found=findradius(self.origin,200); lastdist=200; dist=0; while(found) { dist=vlen((loser.absmin+loser.absmax)*0.5-self.origin); if(dist0) smolder(loser_org); sound(self,CHAN_BODY,"succubus/flampow.wav",0.5,ATTN_NORM); self.lockentity = loser; self.lifetime = time + 3; self.solid = SOLID_NOT; self.think = flamestream_boom; thinktime self : 0.1; return; } else { sound(self,CHAN_BODY,"succubus/flampow.wav",0.5,ATTN_NORM); starteffect(CE_FBOOM, self.origin-self.movedir*6,'0 0 0', 0); T_RadiusDamage(self,self.owner,50+random(1,10),self.owner); remove(self); } } void flamestream_anim() { makevectors(self.angles); float rand; float old_health; vector other_org; traceline(self.origin, self.origin + '0 0 -256', FALSE, self); if (trace_ent) { if (rand < 0.33) starteffect(CE_FIREWALL_SMALL, trace_endpos, '0 0 0', 0); else if (rand < 0.66) starteffect(CE_FIREWALL_MEDIUM, trace_endpos, '0 0 0', 0); else starteffect(CE_FIREWALL_LARGE, trace_endpos, '0 0 0', 0); if (trace_ent.thingtype == THINGTYPE_FLESH || trace_ent.thingtype == THINGTYPE_WOOD || trace_ent.thingtype == THINGTYPE_HAY || trace_ent.thingtype == THINGTYPE_LEAVES || trace_ent.thingtype == THINGTYPE_CLOTH || trace_ent.thingtype == THINGTYPE_WOOD_LEAF || trace_ent.thingtype == THINGTYPE_WOOD_METAL || trace_ent.thingtype == THINGTYPE_WOOD_STONE || trace_ent.thingtype == THINGTYPE_METAL_CLOTH) { if (random() < 0.5 || deathmatch) spawn_burner(trace_ent); } other_org=trace_ent.origin; old_health=trace_ent.health; if(trace_ent.health<=0&&old_health>0) smolder(other_org); } else { traceline(self.origin, self.origin + '0 0 -256', TRUE, self); if (trace_fraction < 1) { trace_endpos += v_up * 24; rand = random(); starteffect(CE_FLAMESTREAM, self.origin, randomv('-4 -4 -3', '4 4 2'), 0); starteffect(CE_FLAMESTREAM, self.origin, randomv('-4 -4 -3', '4 4 2'), 0); if (rand < 0.33) starteffect(CE_FIREWALL_SMALL, trace_endpos, '0 0 0', 0); else if (rand < 0.66) starteffect(CE_FIREWALL_MEDIUM, trace_endpos, '0 0 0', 0); else starteffect(CE_FIREWALL_LARGE, trace_endpos, '0 0 0', 0); } else { starteffect(CE_FLAMESTREAM, self.origin, randomv('-4 -4 -3', '4 4 2'), 0); starteffect(CE_FLAMESTREAM, self.origin, randomv('-4 -4 -3', '4 4 2'), 0); } } if (self.lifetime < time) self.touch(); self.think = flamestream_anim; thinktime self : 0.05; } void flamestream_anim2() { self.angles += '0 0 24'; makevectors(self.angles); starteffect(CE_FLAMESTREAM, self.origin, v_right * 6, 0); starteffect(CE_FLAMESTREAM, self.origin, v_right * -6, 0); if (self.lifetime < time) self.touch(); self.think = flamestream_anim2; thinktime self : 0.05; } void firestarter_think() { local vector rand; if (self.lifetime < time) { self.think = SUB_Remove; thinktime self : 0; return; } rand = newmis.origin + randomv('-15 0 -2', '15 0 10'); T_RadiusDamage(self,self.owner,30+random(10),self.owner); if (random() < 0.5) starteffect(CE_FBOOM, rand,'0 0 4', 0); else starteffect(CE_SM_EXPLOSION, rand,'0 0 4', 0); self.think = firestarter_think; thinktime self : random(0.2, 0.6); } void flamestream_fire () { /*local vector endpos, startpos, vect; local float incr, dist, i;*/ self.effects (+) EF_MUZZLEFLASH; self.greenmana-=4; self.punchangle_x = -2; makevectors(self.v_angle); self.velocity+=normalize(v_forward) * -100; self.flags(-)FL_ONGROUND; newmis=spawn(); newmis.classname="flamestream"; newmis.owner=self; newmis.movetype=MOVETYPE_FLYMISSILE; newmis.solid=SOLID_BBOX; newmis.abslight=1; newmis.touch=flamestream_touch; newmis.dmg=40; newmis.lifetime=time+2; newmis.o_angle=self.origin+self.proj_ofs+v_forward*16-v_right*16-v_up*16; newmis.movedir=v_forward; newmis.speed=1500+random(50); newmis.velocity=newmis.movedir*newmis.speed; newmis.angles = vectoangles(newmis.velocity); setmodel(newmis,"models/null.spr"); setsize(newmis,'-6 -6 -6','6 6 6'); newmis.level=0; newmis.hull=HULL_POINT; setorigin(newmis,newmis.o_angle); newmis.wallspot=newmis.origin; newmis.count = 20; newmis.cnt = 0; newmis.effects (+) EF_DIMLIGHT; newmis.think=flamestream_anim; thinktime newmis : 0.05; //Some would call it the Orb of... Tim? /*makevectors(self.v_angle); self.greenmana-=4; self.effects(+)EF_MUZZLEFLASH; endpos = v_forward * 99999; startpos = self.origin+self.proj_ofs+v_forward*16-v_right*24-v_up*16; traceline(startpos, endpos, FALSE, self); starteffect(CE_FBOOM, trace_endpos, '0 0 0', 0); vect = trace_endpos - startpos; dist = fabs(vlen(vect)); vect = normalize(vect); vect = vectoangles(vect); vect_x *= -1; makevectors (vect); //starteffect(CE_FLAMESTREAM, startpos + (v_forward * 32), '0 0 2', 0); incr = dist / 6; i = 6; while (i > 0) { starteffect(CE_SLOW_WHITE_SMOKE, startpos + v_forward * (incr * i), '0 0 2', 0); i -= 1; } newmis = spawn(); newmis.classname = "fire starter"; //Twisted fiyah-stahtah! setorigin(newmis, trace_endpos); setsize(newmis, '0 0 0', '0 0 0'); newmis.solid = SOLID_NOT; newmis.movetype = MOVETYPE_NONE; newmis.lifetime = time + random(1,2); newmis.owner = self; newmis.think = firestarter_think; thinktime newmis : 0.1; if (trace_ent.takedamage == DAMAGE_YES) { T_Damage(trace_ent, self, self, 20); }*/ } void flameswarm_fire() { makevectors(self.v_angle); self.greenmana-=8; self.effects(+)EF_MUZZLEFLASH; self.velocity+=normalize(v_forward) * -200; self.punchangle_x = -6; self.flags(-)FL_ONGROUND; newmis=spawn(); newmis.classname="flamestream"; newmis.owner=self; newmis.movetype=MOVETYPE_FLYMISSILE; newmis.solid=SOLID_BBOX; newmis.abslight=1; newmis.touch=flamestream_touch2; //newmis.effects = EF_BRIGHTLIGHT; newmis.dmg=40; newmis.lifetime=time+2; newmis.o_angle=self.origin+self.proj_ofs+v_forward*16-v_right*24-v_up*16; newmis.movedir=v_forward; newmis.speed=1250+random(50); newmis.velocity=newmis.movedir*newmis.speed; setmodel(newmis,"models/null.spr"); setsize(newmis,'-6 -6 -6','6 6 6'); newmis.level=0; newmis.hull=HULL_POINT; setorigin(newmis,newmis.o_angle); newmis.wallspot=newmis.origin; newmis.angles = vectoangles(newmis.velocity); newmis.effects (+) EF_DIMLIGHT; newmis.think=flamestream_anim2; thinktime newmis : 0.05; } /*====================== 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()flameorb_ready_power; void()flameorb_ready_normal; void flameorb_fire (void) { if(self.artifact_active&ART_TOMEOFPOWER) self.wfs = advanceweaponframe($powern135,$powern148); else self.wfs = advanceweaponframe($normal51,$normal64); /*if(self.button0&&self.weaponframe>$normal60 &&!self.artifact_active&ART_TOMEOFPOWER) self.weaponframe=$normal60;*/ self.th_weapon=flameorb_fire; self.last_attack=time; if(self.wfs==WF_CYCLE_WRAPPED||self.greenmana<1||(self.greenmana<10&&self.artifact_active&ART_TOMEOFPOWER)) { self.t_width=-1; self.weaponframe_cnt=0; if(!self.artifact_active&ART_TOMEOFPOWER) { self.aflag=FALSE; self.attack_finished=time+0.2; flameorb_ready_normal(); } else { self.attack_finished = time + 1; flameorb_ready_power(); } } else if(self.weaponframe==$normal52) { if(self.t_width==-1) { sound(self,CHAN_BODY,"succubus/flamstrt.wav",0.5,ATTN_NORM); self.t_width=FALSE; } if(self.t_width