/* * $Header: /H3/game/hcode/setstaff.hc 62 9/18/97 2:34p Rlove $ */ /* ============================================================================== Q:\art\models\weapons\setstaff\newstff\scarabst.hc ============================================================================== */ // For building the model $cd Q:\art\models\weapons\setstaff\newstff $origin 0 0 0 $base BASE skin $skin skin $skin SKIN2 $flags 0 // $frame build1 build2 build3 build4 build5 $frame build6 build7 build8 build9 build10 $frame build11 build12 build13 build14 build15 // $frame chain1 chain2 chain3 chain4 chain5 $frame chain6 chain7 chain8 chain9 // $frame rootpose // $frame scarab1 scarab2 scarab3 scarab4 scarab5 $frame scarab6 scarab7 // $frame select1 select2 select3 select4 select5 $frame select6 select7 select8 select9 select10 $frame select11 select12 void setstaff_decide_attack (void); void setstaff_idle (void); void DrawLinks(void) { //These seem to lock up game if there are too many of them vector org, dir; org = self.origin; dir=normalize(self.view_ofs-org); org+=dir*15; WriteByte (MSG_BROADCAST, SVC_TEMPENTITY); WriteByte (MSG_BROADCAST, TE_STREAM_CHAIN); WriteEntity (MSG_BROADCAST, self); WriteByte (MSG_BROADCAST, 1+STREAM_ATTACHED); WriteByte (MSG_BROADCAST, 1); WriteCoord (MSG_BROADCAST, org_x); WriteCoord (MSG_BROADCAST, org_y); WriteCoord (MSG_BROADCAST, org_z); WriteCoord (MSG_BROADCAST, self.view_ofs_x); WriteCoord (MSG_BROADCAST, self.view_ofs_y); WriteCoord (MSG_BROADCAST, self.view_ofs_z); } void() DeactivateGhook = { self.aflag=FALSE; CreateRedFlash(self.origin); sound (self, CHAN_BODY, "items/itmspawn.wav", 1, ATTN_NORM); remove(self); }; void PullBack (void) { if(self.enemy!=world) { self.enemy.flags2(-)FL_CHAINED; if(self.enemy.flags2&FL_ALIVE) { dprintf("Restoring old movetype: %s\n",self.enemy.oldmovetype); self.enemy.movetype=self.enemy.oldmovetype; } else { dprint("Setting movetype to bounce\n"); self.enemy.movetype=MOVETYPE_BOUNCE; } self.enemy=world; } else dprint("No enemy\n"); self.movetype=MOVETYPE_NOCLIP; self.solid=SOLID_NOT; self.velocity=normalize(self.view_ofs-self.origin)*350; self.flags(-)FL_ONGROUND; DrawLinks(); if(vlen(self.origin-self.view_ofs)<48||self.lifetime 100 ) dir = dir*300; if(self.enemy.flags&FL_ONGROUND) { self.enemy.flags(-)FL_ONGROUND; dir+='0 0 200'; } if(self.enemy.flags&FL_CLIENT) self.enemy.adjust_velocity=(self.enemy.velocity+dir)*0.5; else self.enemy.velocity = (self.enemy.velocity+dir)*0.5; } else self.enemy.velocity='0 0 0'; if(!self.enemy.health||!self.enemy.flags2&FL_ALIVE||!self.enemy.flags2&FL_CHAINED||self.attack_finished150||(other.flags&FL_MONSTER&&other.monsterclass>=CLASS_BOSS))//other.classname!="player") { self.lockentity=other; scarab_die(); } else { self.touch=SUB_Null; self.velocity='0 0 0'; self.enemy=other; ChainsOfLove(); } } else scarab_die(); } void scarab_think () { self.frame+=1; if(self.frame>15) self.frame=8; self.movechain.frame=self.frame; if(self.pain_finished<=time) { HomeThink(); self.angles=vectoangles(self.velocity); self.pain_finished=time+0.1; sound(self,CHAN_BODY,"assassin/scrbfly.wav",1,ATTN_NORM); } // particle4(self.origin,7,random(250,254),PARTICLETYPE_EXPLODE2,random(3,7)); if(self.lifetime300) DarkExplosion(); else if(other!=self.enemy) { if(other.takedamage) { self.enemy=other; makevectors(self.velocity); T_Damage(other,self,self.owner,self.dmg); if(self.dmg<10) { T_Damage(other,self,self.owner,10); DarkExplosion(); } else { SpawnPuff (self.origin, self.velocity, 10,other); SpawnPuff (self.origin+v_forward*36, self.velocity, 10,other); if(other.thingtype==THINGTYPE_FLESH) { sound(self,CHAN_VOICE,"assassin/core.wav",1,ATTN_NORM); MeatChunks(self.origin+v_forward*36, self.velocity*0.2+v_right*random(-30,150)+v_up*random(-30,150),5,other); } if(other.classname=="player") T_Damage(other,self,self.owner,(self.dmg+self.frags*10)/3); else T_Damage(other,self,self.owner,self.dmg+self.frags*10); self.frags+=1; self.dmg-=10; } } } } void pincer_think () { if(self.frame<7) self.frame+=1; if(self.pain_finished<=time) { self.pain_finished=time+1; sound(self,CHAN_BODY,"assassin/spin.wav",1,ATTN_NORM); } if(self.lifetime$build15) self.weaponframe=$build1; if(self.weaponframe==$build1) sound(self,CHAN_WEAPON,"assassin/build.wav",1,ATTN_NORM); if (self.weaponframe >= $build1 && self.weaponframe < $build15) { self.weaponframe_cnt +=1; if (self.weaponframe_cnt > 3) { self.wfs = advanceweaponframe($build1,$build15); self.weaponframe_cnt =0; } else if(self.weaponframe_cnt==1) { if(self.greenmana>=1) self.greenmana-=1; if(self.bluemana>=1) self.bluemana-=1; } if(self.weaponframe==$build15) self.weaponframe_cnt=0; } else if(self.weaponframe_cnt=10) self.greenmana-=10; else self.button0=FALSE; if(self.bluemana>=10) self.bluemana-=10; else self.button0=FALSE; } self.th_weapon = setstaff_readyfire; if(!self.button0||self.greenmana<=0||self.bluemana<=0) { self.weaponframe_cnt=0; Drilla(14 - ($build15 - self.weaponframe)); setstaff_settle(); } } void() ass_setstaff_fire = { if (self.artifact_active & ART_TOMEOFPOWER) // Pause for firing in power up mode self.th_weapon=setstaff_powerfire; else self.th_weapon=setstaff_readyfire; thinktime self : 0; self.nextthink=time; }; void setstaff_idle (void) { self.weaponframe=$rootpose; self.th_weapon=setstaff_idle; } void setstaff_select (void) { self.wfs = advanceweaponframe($select12,$select1); self.weaponmodel = "models/scarabst.mdl"; self.th_weapon=setstaff_select; self.last_attack=time; if (self.wfs == WF_LAST_FRAME) { self.attack_finished = time - 1; setstaff_idle(); } } void setstaff_deselect (void) { self.wfs = advanceweaponframe($select1,$select12); self.th_weapon=setstaff_deselect; if (self.wfs == WF_LAST_FRAME) W_SetCurrentAmmo(); } void setstaff_decide_attack (void) { self.attack_finished = time + 0.5; }