/* ============================================================================== C:\projects\h2mp\data1\bossbudda\newguy\pravus.hc ============================================================================== */ // For building the model $cd C:\projects\h2mp\data1\bossbudda\newguy $origin 0 0 0 $base base skin $skin skin $flags 0 // $frame attakC1 attakC2 attakC3 attakC4 attakC5 $frame attakC6 attakC7 attakC8 attakC9 attakC10 $frame attakC11 attakC12 attakC13 attakC14 attakC15 $frame attakC16 attakC17 attakC18 attakC19 attakC20 // $frame beamB1 beamB2 beamB3 beamB4 beamB5 $frame beamB6 beamB7 beamB8 // $frame birth1 birth2 birth3 birth4 birth5 $frame birth6 birth7 birth8 birth9 birth10 $frame birth11 birth12 birth13 birth14 birth15 $frame birth16 birth17 birth18 birth19 birth20 $frame birth21 birth22 birth23 birth24 // $frame death1 death2 death3 death4 death5 $frame death6 death7 death8 death9 death10 $frame death11 death12 death13 death14 // $frame point1 point2 point3 point4 point5 $frame point6 point7 point8 point9 point10 $frame point11 point12 // $frame pravus // $frame push1 push2 push3 push4 push5 $frame push6 push7 push8 push9 push10 $frame push11 push12 push13 push14 push15 $frame push16 push17 push18 push19 push20 $frame push21 push22 push23 push24 push25 $frame push26 push27 push28 push29 push30 $frame push31 push32 push33 push34 push35 $frame push36 push37 push38 push39 push40 $frame push41 push42 push43 push44 push45 $frame push46 push47 push48 push49 push50 $frame push51 push52 push53 push54 push55 $frame push56 push57 push58 push59 push60 $frame push61 push62 push63 push64 push65 $frame push66 push67 push68 push69 push70 // $frame ready1 ready2 ready3 ready4 ready5 $frame ready6 ready7 ready8 ready9 ready10 $frame ready11 ready12 ready13 ready14 ready15 $frame ready16 ready17 ready18 ready19 ready20 // $frame rechar1 rechar2 rechar3 rechar4 rechar5 $frame rechar6 rechar7 rechar8 rechar9 rechar10 $frame rechar11 rechar12 rechar13 rechar14 rechar15 $frame rechar16 rechar17 rechar18 rechar19 rechar20 $frame rechar21 rechar22 rechar23 rechar24 rechar25 $frame rechar26 rechar27 rechar28 rechar29 rechar30 // $frame rewait1 rewait2 rewait3 rewait4 rewait5 $frame rewait6 rewait7 rewait8 rewait9 rewait10 $frame rewait11 rewait12 rewait13 rewait14 rewait15 $frame rewait16 rewait17 rewait18 rewait19 rewait20 $frame rewait21 rewait22 rewait23 rewait24 rewait25 $frame rewait26 rewait27 rewait28 rewait29 rewait30 // $frame tele1 tele2 tele3 tele4 tele5 $frame tele6 tele7 tele8 tele9 tele10 $frame tele11 tele12 tele13 tele14 tele15 $frame tele16 tele17 tele18 tele19 tele20 $frame tele21 tele22 tele23 tele24 tele25 $frame tele26 float BUDDHA_PROJ1 = 1; float BUDDHA_PROJ2 = 2; float BUDDHA_TELE_IN = 4; float BUDDHA_TELE_OUT = 8; float BUDDHA_RECHARGE = 16; float BUDDHA_TELE_GONE = 32; float SHARD_TINT_UP = 2; float SHARD_TINT_DOWN = 4; void buddha_do_firewall(void); void buddha_seek (void); void buddha_run (void); void buddha_get_new_target(void); void buddha_pain(entity attacker, float damg) { if (self.enemy.health < 0 || self.enemy == world) self.enemy = attacker; if (random() < 0.2) sound(self, CHAN_AUTO, "buddha/laugh.wav", 1, ATTN_NONE); } void buddha_warp(void) { local entity spot; local float cyc; if (self.velocity) self.velocity = '0 0 0'; spot = find (world, classname, "teleport_buddha"); if (spot) { cyc = random(3); while (cyc > 1) { spot = find (spot, classname, "teleport_buddha"); if (spot.origin == self.oldorigin) spot = find (spot, classname, "teleport_buddha"); if (!spot) spot = find (spot, classname, "teleport_buddha"); cyc = cyc - 1; } } self.oldorigin = spot.origin; setorigin(self, spot.origin); setorigin(self.controller, spot.origin); } void buddha_recharge_done(void) [++ $rechar20 .. $rechar30] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $rechar30) { self.drawflags (-) MLS_POWERMODE; self.attack_state (-) BUDDHA_RECHARGE; self.takedamage = DAMAGE_YES; self.think = buddha_do_firewall; thinktime self : 0.05; } } void buddha_recharge_wait(void) [++ $rewait1 .. $rewait30] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $rewait1 && self.lifetime < time) { self.lifetime = time + 4; self.drawflags (+) MLS_POWERMODE; starteffect(44, self.origin + '0 0 -20', 128, time + 3); } if (self.frame == $rewait30 && self.lifetime < time) { self.think = buddha_recharge_done; thinktime self : 0.05; } } void buddha_recharge(void) [++ $rechar1 .. $rechar20] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $rechar1) { sound(self, CHAN_AUTO, "buddha/recharge.wav", 1, ATTN_NONE); self.takedamage = DAMAGE_NO; } if (self.frame == $rechar20) { self.think = buddha_recharge_wait; thinktime self : 0.05; } } /*void buddha_tele_out(void) [-- $tele26 .. $tele1] { if (self.velocity) self.velocity = '0 0 0'; dprint("I'm not even getting here!\n"); if (self.frame == $tele25) { dprint("Hi\n"); sound(self,CHAN_VOICE,"buddha/tele_out.wav",1,ATTN_NONE); } if (self.frame == $tele1) { self.think = buddha_run; thinktime self : 0.1; } }*/ void buddha_spindown(void) { local vector vect; if (self.velocity) self.velocity = '0 0 0'; if (self.frame < $birth24) self.frame += 1; if (self.count <= 0) { vect = self.enemy.origin - self.origin; normalize(vect); self.ideal_yaw = vectoyaw(vect); if (FacingIdeal()) { self.avelocity = '0 0 0'; self.takedamage = DAMAGE_YES; self.solid = SOLID_BBOX; self.attack_state (-) BUDDHA_TELE_OUT; self.think = buddha_run; thinktime self : 0.1; } else { self.think = buddha_spindown; thinktime self : 0.05; } return; } if (self.avelocity_y - self.count <= 150) { self.avelocity = '0 150 0'; self.count = 0; } else { self.avelocity_y -= self.count; self.count -= 2.5; } self.think = buddha_spindown; thinktime self : 0.05; } void buddha_grow(void) { if (self.velocity) self.velocity = '0 0 0'; if (self.scale < 1) { self.scale += 0.1; if (self.scale < 0.2) { sound(self,CHAN_AUTO,"buddha/tele_out.wav",1,ATTN_NONE); self.attack_state (-) BUDDHA_TELE_GONE; self.attack_state (+) BUDDHA_TELE_OUT; self.frame = $birth15; setmodel(self, "models/pravus.mdl"); starteffect(CE_FLOOR_EXPLOSION3, self.origin); particle4(self.origin,25,256+242+random(1,16),PARTICLETYPE_SLOWGRAV,random(35,40)); } } else { self.drawflags (-) DRF_TRANSLUCENT; self.think = buddha_spindown; thinktime self : 0.1; return; } self.think = buddha_grow; thinktime self : 0.05; } void buddha_shrink(void) { if (self.velocity) self.velocity = '0 0 0'; if (self.scale > 0.1) { self.scale -= 0.1; if (self.scale < 0.3 && self.scale > 0.2) { sound(self,CHAN_AUTO,"weapons/fbfire.wav",1,ATTN_NONE); starteffect(CE_FLOOR_EXPLOSION3, self.origin); } } else { self.frame = 0; setmodel (self, "models/null.spr"); buddha_warp(); self.think = buddha_grow; self.attack_state (+) BUDDHA_TELE_GONE; self.attack_state (-) BUDDHA_TELE_IN; thinktime self : random(2,3); return; } self.think = buddha_shrink; thinktime self : 0.1; } void buddha_teleport(void) [++ $tele1 .. $tele26] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $tele1) { sound(self,CHAN_AUTO,"buddha/teleport.wav",1,ATTN_NONE); self.teleport_time = time + 10; self.takedamage = DAMAGE_NO; starteffect(CE_GRAVITYWELL, self.origin + '0 0 -20', random(208, 223), time + 0.8); } if (self.frame == $tele26) { self.drawflags (+) DRF_TRANSLUCENT; self.think = buddha_shrink; thinktime self : 0.1; return; } else { self.avelocity_y += self.count; self.count += 2.5; } } void firewall_touch(void) { T_Damage(other, self, self.owner, (skill + 1)); self.think = SUB_Remove; thinktime self : 0; } void firewalker_check_damage(void) { local vector dif; local float dist; local float distx, disty; local float objx, objy; makevectors(self.angles); dif = self.enemy.origin - (self.origin + v_forward * -64); dif_z = 0; dist = vhlen(dif); dif = normalize(dif); objx = dif * v_forward; if (objx < 0) return; objy = dif * v_right; distx = fabs(objx * dist); disty = fabs(objy * dist); if (distx < 128 && disty < 200) { if (self.enemy.health > 0) T_Damage(self.enemy, self, self.owner, (skill + 1)); } } void firewalker_think(void) { local vector vect, dif; local float dist, rnd1, rnd2, rnd3; if (self.lifetime < time) { self.think = SUB_Remove; thinktime self : 0.1; return; } makevectors(self.angles); vect = '0 0 0'; if (random() < 0.9) { rnd1 = random(0, 200); rnd2 = random(0, 10); rnd3 = random(0, 40); if (random() < 0.5) { vect += v_forward * rnd2; } else { vect -= v_forward * rnd2; } if (random() < 0.5) { vect += v_right * rnd1; } else { vect -= v_right * rnd1; } vect_z = 10; if (random() < 0.33) starteffect(CE_FIREWALL_LARGE, self.origin + vect, '0 0 1', 0); else if (random() < 0.66) starteffect(CE_FIREWALL_MEDIUM , self.origin + vect, '0 0 1', 0); else starteffect(CE_FLAMEWALL , self.origin + vect, '0 0 1', 0); } vect = v_up * -10000; traceline(self.origin, vect, FALSE, self); dif = self.origin - trace_endpos; dist = dif_z; if (dist > 20) { self.velocity_z -= 8; } else { self.velocity_z = 0; } self.think = firewalker_think; thinktime self : 0.05; } void buddha_firewalker_spawn(void) { local entity newmis; newmis = spawn(); newmis.classname = "buddha_firewalker"; newmis.effects = EF_NODRAW; newmis.movetype = MOVETYPE_FLY; newmis.solid = SOLID_TRIGGER; newmis.safe_time = time + 9999999; newmis.velocity = '0 0 0'; newmis.owner = self; setmodel(newmis, "models/null.spr"); setsize(newmis, '-100 -100 -100', '100 100 100'); newmis.angles = self.angles; newmis.enemy = self.enemy; makevectors(newmis.angles); setorigin(newmis, self.origin + v_up * -48 + v_forward * 64); newmis.velocity = v_forward * (125 + (skill * 25)); newmis.monsterclass = CLASS_BOSS; newmis.touch = firewalker_check_damage; newmis.lifetime = time + random(5,10); newmis.think = firewalker_think; thinktime newmis : 0.05; } void buddha_send_firewall(void) [++ $push33 .. $push70] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $push34) { buddha_firewalker_spawn(); } else if (self.frame == $push70) { self.think = buddha_run; thinktime self : 0.1; } } void firepillar_think(void) { local vector rand; local entity item; if (self.lifetime < time) { self.think = SUB_Remove; thinktime self : 0.1; return; } item = findradius(self.origin, 64); while (item) { if (item.classname == "player") { T_Damage(item, self, self.owner, 2); } item = item.chain; } if (random() < 0.5) rand = self.origin + randomv('0 0 32','32 32 64'); else rand = self.origin - randomv('0 0 32','32 32 64'); starteffect(CE_FLAMEWALL, rand, randomv('-1 -1 1', '1 1 2'), 0); self.think = firepillar_think; thinktime self : 0.1; } void buddha_spawn_firepillar(void) { newmis = spawn(); newmis.classname = "buddha_firepillar"; setmodel(newmis, "models/null.spr"); setsize(newmis, '0 0 0', '0 0 0'); newmis.safe_time = time + 9999999; newmis.movetype = MOVETYPE_FLY; newmis.solid = SOLID_NOT; newmis.monsterclass = CLASS_BOSS; newmis.owner = self; makevectors(self.enemy.angles); vector ofs; ofs = v_forward * random(32, 64); traceline(self.enemy.origin, self.enemy.origin + '0 0 -9999', TRUE, self); starteffect(CE_FLOOR_EXPLOSION3, trace_endpos + ofs + '0 0 24'); setorigin(newmis, trace_endpos); newmis.velocity = '0 0 100'; newmis.lifetime = time + 2.5; sound (self, CHAN_AUTO, "weapons/fbfire.wav", 1, ATTN_NORM); newmis.think = firepillar_think; thinktime newmis : 0.2; } void buddha_do_firepillar(void) [++ $push1 .. $push30] { local float rand; if (self.velocity) self.velocity = '0 0 0'; if (self.count == 0) { self.count = random(0,0.3) * 10; } ai_face(); if (self.frame == $push4) { self.count -= 1; rand = random(1,2); while (rand > 0) { buddha_spawn_firepillar(); rand -= 1; } } else if (self.frame == $push30) { if (self.count <= 0) { self.think = buddha_run; thinktime self : 0.05; return; } } } void buddha_do_firewall(void) [++ $push1 .. $push33] { ai_face(); if (self.velocity) self.velocity = '0 0 0'; local vector vect; makevectors(self.angles); vect = self.origin + v_right * random(-200, 200) + v_forward * 32; particle2(vect,'0 0 25','0 0 25',256 + 168 + random(1,4),7,5); if (self.frame == $push1) sound(self, CHAN_AUTO, "buddha/firewall.wav", 1, ATTN_NONE); if (self.frame == $push33) { self.think = buddha_send_firewall; thinktime self : 0.05; return; } self.think = buddha_do_firewall; thinktime self : 0.05; } void buddha_proj_touch(void) { if (other.owner == self.owner) return; else T_Damage(other, self, self.owner, 10*random(2,3)); CreateBSpark (self.origin); remove(self); } void buddha_missile_think(void) { if (self.lifetime < time) { self.touch(); } HomeThink(); self.think = buddha_missile_think; thinktime self : 0.1; } void buddha_create_missile(vector spot1, vector spot2, float ofs, float homing) { local vector vect; newmis = spawn(); newmis.classname = "buddha_missile"; newmis.movetype = MOVETYPE_FLYMISSILE; newmis.solid = SOLID_BBOX; newmis.drawflags (+) DRF_TRANSLUCENT; makevectors(self.angles); setmodel(newmis, "models/budd_star.mdl"); setsize(newmis, '0 0 0', '0 0 0'); setorigin(newmis, self.origin + v_forward * 164); newmis.owner = self; newmis.enemy = newmis.goalentity = self.enemy; newmis.yaw_speed = 3; newmis.hull = HULL_POINT; makevectors(self.angles); vect = (spot2 - spot1); vect = normalize(vect); vect += v_right * ofs; makevectors(vect); vect *= 400; newmis.velocity = vect; newmis.angles = vectoangles(newmis.velocity); newmis.speed = 400; newmis.drawflags (+) MLS_POWERMODE; newmis.veer=1; //slight veering, random course modifications newmis.turn_time = 0.2; newmis.hoverz=TRUE; //slow down on turns newmis.ideal_yaw=TRUE; newmis.lifetime = time + 5; newmis.touch = buddha_proj_touch; newmis.think = buddha_missile_think; thinktime newmis : 0.1; } void buddha_launch_proj(void) { local vector spot1, spot2; if (self.velocity) self.velocity = '0 0 0'; makevectors(self.angles); spot1 = self.origin + v_forward * 256; spot2 = self.enemy.origin + self.enemy.view_ofs; sound (self, CHAN_WEAPON, "buddha/shoot.wav", 1, ATTN_NORM); buddha_create_missile(spot1, spot2, self.dflags, FALSE); } void buddha_do_point(void) [++ $point1 .. $point12] { if (self.velocity) self.velocity = '0 0 0'; ai_face(); if (self.frame == $point1) self.dflags = -0.45; if (self.frame == $point2) { buddha_launch_proj(); self.dflags = 0; } if (self.frame == $point6) { buddha_launch_proj(); self.dflags = 0.45; } if (self.frame == $point9) buddha_launch_proj(); if (self.frame == $point12) { self.think = buddha_run; thinktime self : 0.1; } } void buddha_end_lightning(void)[++ $attakC13 .. $attakC20] { self.frags += 1; if (self.velocity) self.velocity = '0 0 0'; if (self.frags > 16) self.frags = 16; self.colormap = 143 + self.frags; if (self.frame == $attakC14) self.drawflags (-) DRF_TRANSLUCENT | MLS_POWERMODE; if (self.frame == $attakC20) { self.frags = 16; self.colormap = 0; self.think = buddha_run; thinktime self : 0.05; } } void buddha_bring_lightning(void) { local entity oself; if (self.velocity) self.velocity = '0 0 0'; if (self.wait < time) { self.think = buddha_end_lightning; thinktime self : 0.05; return; } if (random() < 0.7) { oself=self; self=self.lockentity; self.use(); self=oself; } self.think = buddha_bring_lightning; thinktime self : 0.05; } void buddha_do_conjure(void) [++ $attakC1 .. $attakC13] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $attakC13) { self.drawflags (+) MLS_POWERMODE; self.wait = time + random(2,4); self.think = buddha_bring_lightning; thinktime self : 0.05; } self.frags -= 1; if (self.frags < 12) self.frags = 12; self.colormap = 143 + self.frags; } float buddha_decide_attack (void) { local float rand; if (self.velocity) self.velocity = '0 0 0'; rand = random(); if (rand > 0.9) { if (self.teleport_time < time) { self.attack_state (+) BUDDHA_TELE_IN; self.think = buddha_teleport; thinktime self : 0.1; return 1; } else return 1; } else if (rand > 0.7) { self.attack_state (+) BUDDHA_PROJ1; self.think = buddha_do_point; thinktime self : 0.1; return 1; } else if (rand > 0.5) { self.attack_state (+) BUDDHA_PROJ2; self.think = buddha_do_firepillar; thinktime self : 0.1; return 1; } else if (rand > 0.3) { self.attack_state (+) BUDDHA_PROJ1; self.think = buddha_do_firewall; thinktime self : 0.1; return 1; } else if (rand > 0.2) { self.attack_state (+) BUDDHA_PROJ2; self.think = buddha_do_conjure; thinktime self : 0.1; return 1; } else return 0; } void buddha_run (void) [++ $ready1 .. $ready20] { local float ret; if (self.velocity) self.velocity = '0 0 0'; self.goalentity = self.enemy; if (random() < 0.2) { if (self.camera_time < time) { if (random() < 0.5) sound(self, CHAN_AUTO, "buddha/random1.wav", 1, ATTN_NORM); else sound(self, CHAN_AUTO, "buddha/random2.wav", 1, ATTN_NORM); self.camera_time = time + 5; } } if (self.enemy.health <= 0 || self.enemy == world || !self.enemy.flags2 & FL_ALIVE) { if (self.oldenemy.health <=0 || self.oldenemy == world || !self.oldenemy.flags2 & FL_ALIVE) { self.enemy = world; self.think = buddha_get_new_target; thinktime self : 0.1; return; } else { self.enemy = self.oldenemy; } } if (self.health < self.max_health * (1 / 5) && self.dmgtime == 3) { self.dmgtime+=1; SUB_UseTargets(); self.target = self.netname; self.think = buddha_recharge; thinktime self : 0.1; return; } else if (self.health < self.max_health * (2 / 5) && self.dmgtime == 2) { self.dmgtime+=1; SUB_UseTargets(); self.target = self.targetname; self.think = buddha_recharge; thinktime self : 0.1; return; } else if (self.health < self.max_health * (3 / 5) && self.dmgtime == 1) { self.dmgtime+=1; self.think = buddha_recharge; thinktime self : 0.1; return; } else if (self.health < self.max_health * (4 / 5) && !self.dmgtime) { self.think = buddha_recharge; self.dmgtime+=1; thinktime self : 0.1; return; } ai_face(); if (self.attack_finished < time) ret = buddha_decide_attack(); if (!ret) self.attack_finished = time + rint(random(6 / (skill) + 0.1)); else return; self.think = buddha_run; thinktime self : 0.05; } void buddha_get_new_target(void)[++ $ready1 .. $ready20] { entity enemy_proj; enemy_proj = look_projectiles(); if (enemy_proj != world) self.enemy = enemy_proj.owner; if (!self.enemy.flags2&FL_ALIVE||(self.enemy.artifact_active&ARTFLAG_STONED&&self.classname!="monster_medusa")) { self.enemy = world; if (self.oldenemy.health > 0 && self.oldenemy != world) { self.enemy = self.oldenemy; self.think = buddha_run; thinktime self : 0.05; return; } else if(coop) { if(!FindTarget(TRUE)) //Look for other enemies in the area { self.think = buddha_run; thinktime self : 0.05; return; } } } else { self.oldenemy = self.enemy; self.think = buddha_run; thinktime self : 0.05; return; } } void buddha_die (void)[++ $death1 .. $death14] { if (self.velocity) self.velocity = '0 0 0'; entity beam; entity save; entity found; vector new_origin; self.target = self.netname; if (self.think != buddha_die) { self.think = buddha_die; self.count = 0; self.cnt = 0; thinktime self : HX_FRAME_TIME; self.rider_death_speed = 0.2; return; } if (self.cnt == 0) { sound(self, CHAN_VOICE, "buddha/die.wav", 1, ATTN_NONE); found=find(world,classname,"player"); while(found) {//Give them all the exp AwardExperience(found,self,self.experience_value); found=find(found,classname,"player"); } self.experience_value= self.init_exp_val = FALSE; self.drawflags = self.drawflags | MLS_ABSLIGHT; self.abslight = 3; /*if(self.noise) sound(self,CHAN_VOICE,self.noise,1,ATTN_NONE);*/ self.movetype=MOVETYPE_NONE; self.velocity='0 0 0'; } //thinktime self : self.rider_death_speed; self.rider_death_speed += 0.1; if (self.count >= 10) { if (self.count == 3) { beam = spawn(); new_origin = self.origin + '0 0 50'; setmodel(beam,"models/boss/circle.mdl"); setorigin(beam,new_origin); setsize (beam, '0 0 0', '0 0 0'); beam.owner = self; beam.movetype = MOVETYPE_FLYMISSILE; beam.solid = SOLID_NOT; beam.drawflags = SCALE_TYPE_UNIFORM; beam.scale = .1; beam.skin = 0; beam.avelocity = '0 0 300'; beam.think = circle_think; thinktime beam : HX_FRAME_TIME; //self.count = 13; } self.count = 0; if (self.count == 0) { self.count = 1; self.effects (-) EF_BRIGHTLIGHT; self.effects (+) EF_NODRAW; if(self.movechain!=world) self.movechain.effects (+) EF_NODRAW; //thinktime self : 0.05; entity search; search = find(world, classname, "rider_temp"); while (search != world) { remove(search); search = find(search, classname, "rider_temp"); } doWhiteFlash(); remove(self); return; } return; } else self.effects = EF_BRIGHTLIGHT; self.count += 0.1; if (self.cnt < 8) { if (self.count == 3) { beam = spawn(); new_origin = self.origin + '0 0 50'; setmodel(beam,"models/boss/circle.mdl"); setorigin(beam,new_origin); setsize (beam, '0 0 0', '0 0 0'); beam.owner = self; beam.movetype = MOVETYPE_FLYMISSILE; beam.solid = SOLID_NOT; beam.drawflags = SCALE_TYPE_UNIFORM; beam.scale = .1; beam.skin = 0; beam.avelocity = '0 0 300'; beam.think = circle_think; thinktime beam : HX_FRAME_TIME; //self.count = 13; } beam = spawn(); makevectors(self.angles); // new_origin = v_factorrange('-3 -25 45', '3 25 50') + self.origin; new_origin = self.origin;// + '0 0 50'; setmodel(beam,"models/boss/shaft.mdl"); setorigin(beam,new_origin); setsize (beam, '0 0 0', '0 0 0'); beam.owner = self; beam.drawflags = SCALE_ORIGIN_BOTTOM | SCALE_TYPE_XYONLY; beam.movetype = MOVETYPE_NOCLIP; beam.solid = SOLID_NOT; beam.think = beam_move; beam.angles = '0 0 0'; beam.angles_x = random(-50,50); beam.angles_z = random(-50,50); beam.beam_angle_a = random(360); beam.beam_angle_b = random(20,130); beam.scale = .1; beam.beam_max_scale = random(.5,1.5); beam.classname = "rider_temp"; if (random() > 0.5) beam.beam_direction = 1; beam.beam_speed = random(2,4.5); save = self; self = beam; beam_move(); self = save; self.cnt += 1; } } void buddha_birth (void); void buddha_wait(void) { if (self.velocity) self.velocity = '0 0 0'; if (self.lifetime < time) { self.think = buddha_birth; thinktime self : 0.1; return; } self.think = buddha_wait; thinktime self : 0.1; } void buddha_birth (void) [++ $birth1 .. $birth24] { if (self.velocity) self.velocity = '0 0 0'; if (self.frame == $birth16) { sound(self, CHAN_VOICE, "buddha/sight.wav", 1, ATTN_NONE); self.lifetime = time + random(1,2); self.think = buddha_wait; thinktime self : 0.1; return; } if (self.frame > $birth16) { self.origin_z += 4; } if (self.frame == $birth24) { self.think = buddha_run; thinktime self : 0.05; } } void buddha_seek (void) { if (self.velocity) self.velocity = '0 0 0'; self.frame = $birth1; entity enemy_proj; enemy_proj=look_projectiles(); if (FindTarget(TRUE) || (enemy_proj != world) ) { self.think = buddha_birth; thinktime self : 0.05; return; } self.think = buddha_seek; thinktime self : 0.1; } void shard_think(void) { if (self.velocity) self.velocity = '0 0 0'; if ((self.frame == 0 || self.frame == 11 || self.frame == 22) && !self.attack_state & 1) { self.lifetime = time + 1; self.attack_state (+) 1; } if (self.lifetime <= time) { self.frame += 1; if (self.frame > 32) self.frame = 0; self.attack_state (-) 1; } if (self.owner.attack_state & BUDDHA_TELE_GONE) { self.effects = EF_NODRAW; } else { self.effects = 0; } local vector vect; vect = self.controller.angles; vect_y += self.count; makevectors(vect); setorigin(self, self.controller.origin + v_forward * (self.cnt - self.strength)); vect = self.origin - self.controller.origin; self.angles = vectoangles(vect); if ((self.attack_finished & 2) && self.colormap > 16) self.colormap -= 0.05; else { self.colormap = 0; self.attack_state (-) 2; } if (self.owner.attack_state & BUDDHA_TELE_IN) { if (self.scale > 0.1) { self.scale -= 0.02; if (self.strength < 120) self.strength += 3; } else { self.strength = 120; } } else if (self.owner.attack_state & BUDDHA_TELE_OUT) { if (self.strength >= 0) { self.strength -= 4; } else { self.strength = 0; } if (self.scale <= 1) { if (self.solid == SOLID_NOT) { setmodel(self, "models/shield.mdl"); self.solid = SOLID_PHASE; self.scale = 0.1; } self.scale += 0.05; } } else { self.scale = 1; } self.think = shard_think; thinktime self : 0.05; } void buddha_shard_touch(void) { self.colormap = 32; self.attack_state (+) 2; } void buddha_add_shard(float ofs, float dist, float sframe) { //local vector vect; newmis = spawn(); newmis.movetype = MOVETYPE_NOCLIP; newmis.solid = SOLID_PHASE; newmis.classname = "buddha_shield"; newmis.angles_y += ofs; makevectors(newmis.angles); newmis.touch = buddha_shard_touch; newmis.owner = self.owner; newmis.controller = self; newmis.drawflags (+) MLS_ABSLIGHT; newmis.monsterclass = CLASS_BOSS; newmis.lifetime = 0; newmis.abslight = 1; newmis.cnt = dist; newmis.count = ofs; newmis.safe_time = time + 9999999; newmis.colormap = 0; newmis.takedamage = DAMAGE_YES; newmis.health = 500 + ((skill) * 200); newmis.th_die = SUB_Remove; newmis.drawflags (+) DRF_TRANSLUCENT; setmodel(newmis, "models/shield.mdl"); setsize(newmis, '-32 -32 -64', '32 32 64'); setorigin(newmis, self.origin + v_forward * dist); newmis.strength = 0; newmis.frame = sframe; newmis.scale = 1; newmis.drawflags (+) SCALE_ORIGIN_BOTTOM; newmis.think = shard_think; thinktime newmis : 0.1; } void shield_think(void) { setorigin(self, self.owner.origin); self.think = shield_think; thinktime self : 0.1; } void shield_init(void) { local float ang, incr; incr = 360 / 6; ang += incr; buddha_add_shard(ang, 125, 0); ang += incr; buddha_add_shard(ang, 125, 0); ang += incr; buddha_add_shard(ang, 125, 0); ang += incr; buddha_add_shard(ang, 125, 0); ang += incr; buddha_add_shard(ang, 125, 0); ang += incr; buddha_add_shard(ang, 125, 0); self.think = shield_think; thinktime self : 0.1; } void buddha_spawn_shield(void) { if (self.velocity) self.velocity = '0 0 0'; newmis = spawn(); newmis.classname = "shield_hub"; self.controller = newmis; newmis.effects = EF_NODRAW; newmis.movetype = MOVETYPE_NOCLIP; newmis.solid = SOLID_NOT; newmis.takedamage = DAMAGE_NO; setsize(newmis, '0 0 0', '0 0 0'); newmis.owner = self; newmis.avelocity = '0 100 0'; setorigin(newmis, self.origin); newmis.think = shield_init; thinktime newmis : 0; } void buddha_find_lightning () { local entity found; self.max_health = self.health = 5000 + ((skill) * 1000); found = find(world,classname,"light_thunderstorm"); if(found) { self.lockentity=found; found.lockentity=self; } self.think = buddha_seek; thinktime self : 0.1; } void buddha_trigger_use(void) { intermission_running = 1; intermission_exittime = time + 99999; //Remove cross-level trigger server flags for next hub serverflags(-)(SFL_CROSS_TRIGGER_1| SFL_CROSS_TRIGGER_2| SFL_CROSS_TRIGGER_3| SFL_CROSS_TRIGGER_4| SFL_CROSS_TRIGGER_5| SFL_CROSS_TRIGGER_6| SFL_CROSS_TRIGGER_7| SFL_CROSS_TRIGGER_8); entity search; search=find(world,classname,"player"); while(search) {//Take away all their goodies search.puzzle_inv1 = string_null; search.puzzle_inv2 = string_null; search.puzzle_inv3 = string_null; search.puzzle_inv4 = string_null; search.puzzle_inv5 = string_null; search.puzzle_inv6 = string_null; search.puzzle_inv7 = string_null; search.puzzle_inv8 = string_null; search=find(search,classname,"player"); } WriteByte (MSG_ALL, SVC_INTERMISSION); WriteByte (MSG_ALL, 10); FreezeAllEntities(); } /*QUAKED buddha_trigger_endgame (1 0.4 1) (-16 -16 0) (16 16 50) The Buddga's teleport locations -------------------------FIELDS------------------------- -------------------------------------------------------- */ void buddha_trigger_endgame (void) { self.use = buddha_trigger_use; } /*QUAKED teleport_buddha (1 0.4 1) (-16 -16 0) (16 16 50) The Buddga's teleport locations -------------------------FIELDS------------------------- -------------------------------------------------------- */ void teleport_buddha (void) { } /*QUAKED monster_buddha (1 0.3 0) (-16 -16 0) (16 16 50) The Big Baddie -------------------------FIELDS------------------------- -------------------------------------------------------- */ void monster_buddha (void) { if (deathmatch) { remove(self); return; } precache_model4("models/shield.mdl"); precache_model4("models/budd_star.mdl"); precache_model4("models/pravus.mdl"); precache_model4("models/biggy.spr"); precache_model4("models/firewal1.spr"); precache_model4("models/firewal4.spr"); precache_model4("models/firewal5.spr"); precache_sound4("buddha/sight.wav"); precache_sound4("buddha/die.wav"); precache_sound4("buddha/laugh.wav"); precache_sound4("buddha/shoot.wav"); precache_sound4("buddha/teleport.wav"); precache_sound4("buddha/tele_out.wav"); precache_sound4("buddha/recharge.wav"); precache_sound4("buddha/firewall.wav"); precache_sound4("buddha/random1.wav"); precache_sound4("buddha/random2.wav"); precache_sound("weapons/fbfire.wav"); CreateEntityNew(self,ENT_BUDDHA,"models/pravus.mdl",buddha_die); setorigin(self, self.origin - '0 0 32'); rider_init(); self.safe_time = time + 9999999; self.th_pain = buddha_pain; self.solid = SOLID_BBOX; self.movetype = MOVETYPE_NOCLIP; self.thingtype=THINGTYPE_FLESH; self.decap = 0; self.scale = 1; if(!self.yaw_speed) self.yaw_speed = 10; self.mass = 999999; self.takedamage = DAMAGE_YES; self.monsterclass = CLASS_FINAL_BOSS; self.experience_value = 9999; self.dmgtime = 0; self.drawflags (+) SCALE_TYPE_ZONLY | SCALE_ORIGIN_BOTTOM; self.flags2 (+) FL_ALIVE; self.flags (+) FL_MONSTER; self.view_ofs = '0 0 40'; self.frame = $birth1; buddha_spawn_shield(); self.th_run = buddha_birth; self.th_die = buddha_die; self.frags = 16; self.camera_time = time; self.think = buddha_find_lightning; thinktime self : 0.1; }