/*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_hover (edict_t *self) { if (deathmatch->value) { G_FreeEdict (self); return; } sound_pain1 = gi.soundindex ("hover/hovpain1.wav"); sound_pain2 = gi.soundindex ("hover/hovpain2.wav"); sound_death1 = gi.soundindex ("hover/hovdeth1.wav"); sound_death2 = gi.soundindex ("hover/hovdeth2.wav"); sound_sight = gi.soundindex ("hover/hovsght1.wav"); sound_search1 = gi.soundindex ("hover/hovsrch1.wav"); sound_search2 = gi.soundindex ("hover/hovsrch2.wav"); gi.soundindex ("hover/hovatck1.wav"); self->s.sound = gi.soundindex ("hover/hovidle1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); VectorSet (self->mins, -24, -24, -24); VectorSet (self->maxs, 24, 24, 32); // Lazarus: mapper-configurable health if(!self->health) self->health = 240; if(!self->gib_health) self->gib_health = -100; if(!self->mass) self->mass = 150; self->pain = hover_pain; self->die = hover_die; self->monsterinfo.stand = hover_stand; self->monsterinfo.walk = hover_walk; self->monsterinfo.run = hover_run; // self->monsterinfo.dodge = hover_dodge; self->monsterinfo.attack = hover_start_attack; self->monsterinfo.sight = hover_sight; self->monsterinfo.search = hover_search; gi.linkentity (self); self->monsterinfo.currentmove = &hover_move_stand; if(self->health < 0) { mmove_t *deathmoves[] = {&hover_move_death1, NULL}; M_SetDeath(self,(mmove_t **)&deathmoves); } self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/* * QUAKED monster_flyer (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_flyer(edict_t *self) { if (!self) { return; } if (deathmatch->value) { G_FreeEdict(self); return; } /* fix a map bug in jail5.bsp */ if (!Q_stricmp(level.mapname, "jail5") && (self->s.origin[2] == -104)) { self->targetname = self->target; self->target = NULL; } sound_sight = gi.soundindex("flyer/flysght1.wav"); sound_idle = gi.soundindex("flyer/flysrch1.wav"); sound_pain1 = gi.soundindex("flyer/flypain1.wav"); sound_pain2 = gi.soundindex("flyer/flypain2.wav"); sound_slash = gi.soundindex("flyer/flyatck2.wav"); sound_sproing = gi.soundindex("flyer/flyatck1.wav"); sound_die = gi.soundindex("flyer/flydeth1.wav"); gi.soundindex("flyer/flyatck3.wav"); self->s.modelindex = gi.modelindex("models/monsters/flyer/tris.md2"); VectorSet(self->mins, -16, -16, -24); VectorSet(self->maxs, 16, 16, 32); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.sound = gi.soundindex("flyer/flyidle1.wav"); self->health = 50; self->mass = 50; self->pain = flyer_pain; self->die = flyer_die; self->monsterinfo.stand = flyer_stand; self->monsterinfo.walk = flyer_walk; self->monsterinfo.run = flyer_run; self->monsterinfo.attack = flyer_attack; self->monsterinfo.melee = flyer_melee; self->monsterinfo.sight = flyer_sight; self->monsterinfo.idle = flyer_idle; gi.linkentity(self); self->monsterinfo.currentmove = &flyer_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start(self); }
/* suicide fliers */ void SP_monster_kamikaze(edict_t *self) { if (!self) { return; } if (deathmatch->value) { G_FreeEdict(self); return; } sound_sight = gi.soundindex("flyer/flysght1.wav"); sound_idle = gi.soundindex("flyer/flysrch1.wav"); sound_pain1 = gi.soundindex("flyer/flypain1.wav"); sound_pain2 = gi.soundindex("flyer/flypain2.wav"); sound_slash = gi.soundindex("flyer/flyatck2.wav"); sound_sproing = gi.soundindex("flyer/flyatck1.wav"); sound_die = gi.soundindex("flyer/flydeth1.wav"); gi.soundindex("flyer/flyatck3.wav"); self->s.modelindex = gi.modelindex("models/monsters/flyer/tris.md2"); VectorSet(self->mins, -16, -16, -24); VectorSet(self->maxs, 16, 16, 16); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.sound = gi.soundindex("flyer/flyidle1.wav"); self->s.effects |= EF_ROCKET; self->health = 50; self->mass = 100; self->pain = flyer_pain; self->die = flyer_die; self->monsterinfo.stand = flyer_stand; self->monsterinfo.walk = flyer_walk; self->monsterinfo.run = flyer_run; self->monsterinfo.attack = flyer_attack; self->monsterinfo.melee = flyer_melee; self->monsterinfo.sight = flyer_sight; self->monsterinfo.idle = flyer_idle; self->monsterinfo.blocked = (void *)flyer_blocked; gi.linkentity(self); self->monsterinfo.currentmove = &flyer_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start(self); }
/* * QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_hover(edict_t *self) { if (!self) { return; } if (deathmatch->value) { G_FreeEdict(self); return; } sound_pain1 = gi.soundindex("hover/hovpain1.wav"); sound_pain2 = gi.soundindex("hover/hovpain2.wav"); sound_death1 = gi.soundindex("hover/hovdeth1.wav"); sound_death2 = gi.soundindex("hover/hovdeth2.wav"); sound_sight = gi.soundindex("hover/hovsght1.wav"); sound_search1 = gi.soundindex("hover/hovsrch1.wav"); sound_search2 = gi.soundindex("hover/hovsrch2.wav"); gi.soundindex("hover/hovatck1.wav"); self->s.sound = gi.soundindex("hover/hovidle1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); VectorSet(self->mins, -24, -24, -24); VectorSet(self->maxs, 24, 24, 32); self->health = 240; self->gib_health = -100; self->mass = 150; self->pain = hover_pain; self->die = hover_die; self->monsterinfo.stand = hover_stand; self->monsterinfo.walk = hover_walk; self->monsterinfo.run = hover_run; self->monsterinfo.dodge = hover_dodge; /* FS: Zaero specific game dll changes */ self->monsterinfo.attack = hover_start_attack; self->monsterinfo.sight = hover_sight; self->monsterinfo.search = hover_search; gi.linkentity(self); self->monsterinfo.currentmove = &hover_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start(self); }
/*QUAKED monster_floater (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_floater (edict_t *self) { if (deathmatch->value) { G_FreeEdict (self); return; } sound_attack2 = gi.soundindex ("floater/fltatck2.wav"); sound_attack3 = gi.soundindex ("floater/fltatck3.wav"); sound_death1 = gi.soundindex ("floater/fltdeth1.wav"); sound_idle = gi.soundindex ("floater/fltidle1.wav"); sound_pain1 = gi.soundindex ("floater/fltpain1.wav"); sound_pain2 = gi.soundindex ("floater/fltpain2.wav"); sound_sight = gi.soundindex ("floater/fltsght1.wav"); gi.soundindex ("floater/fltatck1.wav"); self->s.sound = gi.soundindex ("floater/fltsrch1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex ("models/monsters/float/tris.md2"); VectorSet (self->mins, -24, -24, -24); VectorSet (self->maxs, 24, 24, 32); self->health = 200; self->gib_health = -80; self->mass = 300; self->pain = floater_pain; self->die = floater_die; self->monsterinfo.stand = floater_stand; self->monsterinfo.walk = floater_walk; self->monsterinfo.run = floater_run; // self->monsterinfo.dodge = floater_dodge; self->monsterinfo.attack = floater_attack; self->monsterinfo.melee = floater_melee; self->monsterinfo.sight = floater_sight; self->monsterinfo.idle = floater_idle; gi.linkentity (self); if (random() <= 0.5) self->monsterinfo.currentmove = &floater_move_stand1; else self->monsterinfo.currentmove = &floater_move_stand2; self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/* * QUAKED monster_boss2 (1 .5 0) (-56 -56 0) (56 56 80) Ambush Trigger_Spawn Sight */ void SP_monster_boss2(edict_t *self) { if (!self) { return; } if (deathmatch->value) { G_FreeEdict(self); return; } sound_pain1 = gi.soundindex("bosshovr/bhvpain1.wav"); sound_pain2 = gi.soundindex("bosshovr/bhvpain2.wav"); sound_pain3 = gi.soundindex("bosshovr/bhvpain3.wav"); sound_death = gi.soundindex("bosshovr/bhvdeth1.wav"); sound_search1 = gi.soundindex("bosshovr/bhvunqv1.wav"); self->s.sound = gi.soundindex("bosshovr/bhvengn1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex("models/monsters/boss2/tris.md2"); VectorSet(self->mins, -56, -56, 0); VectorSet(self->maxs, 56, 56, 80); self->health = 2000; self->gib_health = -200; self->mass = 1000; self->flags |= FL_IMMUNE_LASER; self->pain = boss2_pain; self->die = boss2_die; self->monsterinfo.stand = boss2_stand; self->monsterinfo.walk = boss2_walk; self->monsterinfo.run = boss2_run; self->monsterinfo.attack = boss2_attack; self->monsterinfo.search = boss2_search; self->monsterinfo.checkattack = Boss2_CheckAttack; gi.linkentity(self); self->monsterinfo.currentmove = &boss2_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start(self); }
/*QUAKED monster_fixbot (1 .5 0) (-32 -32 -24) (32 32 24) Ambush Trigger_Spawn Fixit Takeoff Landing */ void SP_monster_fixbot (edict_t *self) { if (deathmatch->value) { G_FreeEdict (self); return; } sound_pain1 = gi.soundindex ("flyer/flypain1.wav"); sound_die = gi.soundindex ("flyer/flydeth1.wav"); sound_weld1 = gi.soundindex ("misc/welder1.wav"); sound_weld2 = gi.soundindex ("misc/welder2.wav"); sound_weld3 = gi.soundindex ("misc/welder3.wav"); self->s.modelindex = gi.modelindex ("models/monsters/fixbot/tris.md2"); VectorSet (self->mins, -32, -32, -24); VectorSet (self->maxs, 32, 32, 24); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->health = 150; self->mass = 150; self->pain = fixbot_pain; self->die = fixbot_die; self->monsterinfo.stand = fixbot_stand; self->monsterinfo.walk = fixbot_walk; self->monsterinfo.run = fixbot_run; self->monsterinfo.attack = fixbot_attack; gi.linkentity (self); self->monsterinfo.currentmove = &fixbot_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/*QUAKED misc_insane (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn CRAWL CRUCIFIED STAND_GROUND ALWAYS_STAND */ void SP_misc_insane (edict_t *self) { // static int skin = 0; //@@ if (deathmatch->value) { G_FreeEdict (self); return; } sound_fist = gi.soundindex ("insane/insane11.wav"); sound_shake = gi.soundindex ("insane/insane5.wav"); sound_moan = gi.soundindex ("insane/insane7.wav"); sound_scream[0] = gi.soundindex ("insane/insane1.wav"); sound_scream[1] = gi.soundindex ("insane/insane2.wav"); sound_scream[2] = gi.soundindex ("insane/insane3.wav"); sound_scream[3] = gi.soundindex ("insane/insane4.wav"); sound_scream[4] = gi.soundindex ("insane/insane6.wav"); sound_scream[5] = gi.soundindex ("insane/insane8.wav"); sound_scream[6] = gi.soundindex ("insane/insane9.wav"); sound_scream[7] = gi.soundindex ("insane/insane10.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex("models/monsters/insane/tris.md2"); VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 32); if(!self->health) self->health = 100; if(!self->gib_health) self->gib_health = -50; if(!self->mass) self->mass = 300; self->pain = insane_pain; self->die = insane_die; self->monsterinfo.stand = insane_stand; self->monsterinfo.walk = insane_walk; self->monsterinfo.run = insane_run; self->monsterinfo.dodge = NULL; self->monsterinfo.attack = NULL; self->monsterinfo.melee = NULL; self->monsterinfo.sight = NULL; self->monsterinfo.aiflags |= AI_GOOD_GUY; //@@ // self->s.skinnum = skin; // skin++; // if (skin > 12) // skin = 0; gi.linkentity (self); if (self->spawnflags & 16) // Stand Ground self->monsterinfo.aiflags |= AI_STAND_GROUND; self->monsterinfo.currentmove = &insane_move_stand_normal; if(!self->monsterinfo.flies) self->monsterinfo.flies = 0.30; self->common_name = "Insane Marine"; self->monsterinfo.scale = MODEL_SCALE; if (self->spawnflags & 8) // Crucified ? { VectorSet (self->mins, -16, 0, 0); VectorSet (self->maxs, 16, 8, 32); self->flags |= FL_NO_KNOCKBACK; flymonster_start (self); } else { walkmonster_start (self); self->s.skinnum = rand()%3; } }
/* * QUAKED monster_carrier (1 .5 0) (-56 -56 -44) (56 56 44) Ambush Trigger_Spawn Sight */ void SP_monster_carrier(edict_t *self) { if (!self) { return; } if (deathmatch->value) { G_FreeEdict(self); return; } sound_pain1 = gi.soundindex("carrier/pain_md.wav"); sound_pain2 = gi.soundindex("carrier/pain_lg.wav"); sound_pain3 = gi.soundindex("carrier/pain_sm.wav"); sound_death = gi.soundindex("carrier/death.wav"); sound_rail = gi.soundindex("gladiator/railgun.wav"); sound_sight = gi.soundindex("carrier/sight.wav"); sound_spawn = gi.soundindex("medic_commander/monsterspawn1.wav"); self->s.sound = gi.soundindex("bosshovr/bhvengn1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex("models/monsters/carrier/tris.md2"); VectorSet(self->mins, -56, -56, -44); VectorSet(self->maxs, 56, 56, 44); /* 2000 - 4000 health */ self->health = max(2000, 2000 + 1000 * ((skill->value) - 1)); /* add health in coop (500 * skill) */ if (coop->value) { self->health += 500 * (skill->value); } self->gib_health = -200; self->mass = 1000; self->yaw_speed = 15; orig_yaw_speed = self->yaw_speed; self->flags |= FL_IMMUNE_LASER; self->monsterinfo.aiflags |= AI_IGNORE_SHOTS; self->pain = carrier_pain; self->die = carrier_die; self->monsterinfo.melee = NULL; self->monsterinfo.stand = carrier_stand; self->monsterinfo.walk = carrier_walk; self->monsterinfo.run = carrier_run; self->monsterinfo.attack = carrier_attack; self->monsterinfo.sight = carrier_sight; self->monsterinfo.checkattack = Carrier_CheckAttack; gi.linkentity(self); self->monsterinfo.currentmove = &carrier_move_stand; self->monsterinfo.scale = MODEL_SCALE; CarrierPrecache(); flymonster_start(self); self->monsterinfo.attack_finished = 0; switch ((int)skill->value) { case 0: self->monsterinfo.monster_slots = 3; break; case 1: case 2: self->monsterinfo.monster_slots = 6; break; case 3: self->monsterinfo.monster_slots = 9; break; default: self->monsterinfo.monster_slots = 6; break; } }
/*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_hover (edict_t *self) { if (deathmatch->value) { G_FreeEdict (self); return; } sound_pain1 = gi.soundindex ("hover/hovpain1.wav"); sound_pain2 = gi.soundindex ("hover/hovpain2.wav"); sound_death1 = gi.soundindex ("hover/hovdeth1.wav"); sound_death2 = gi.soundindex ("hover/hovdeth2.wav"); sound_sight = gi.soundindex ("hover/hovsght1.wav"); sound_search1 = gi.soundindex ("hover/hovsrch1.wav"); sound_search2 = gi.soundindex ("hover/hovsrch2.wav"); gi.soundindex ("hover/hovatck1.wav"); self->s.sound = gi.soundindex ("hover/hovidle1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; // Lazarus: special purpose skins if ( self->style ) { PatchMonsterModel("models/monsters/hover/tris.md2"); self->s.skinnum = self->style * 2; } self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); VectorSet (self->mins, -24, -24, -24); VectorSet (self->maxs, 24, 24, 32); // Lazarus: mapper-configurable health if(!self->health) self->health = 240; if(!self->gib_health) self->gib_health = -100; if(!self->mass) self->mass = 150; self->pain = hover_pain; self->die = hover_die; self->monsterinfo.stand = hover_stand; self->monsterinfo.walk = hover_walk; self->monsterinfo.run = hover_run; // self->monsterinfo.dodge = hover_dodge; self->monsterinfo.attack = hover_start_attack; self->monsterinfo.sight = hover_sight; self->monsterinfo.search = hover_search; // Knightmare- added sparks and blood type if (!self->blood_type) self->blood_type = 3; //sparks and blood // Lazarus if(self->powerarmor) { self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD; self->monsterinfo.power_armor_power = self->powerarmor; } gi.linkentity (self); self->monsterinfo.currentmove = &hover_move_stand; if(self->health < 0) { mmove_t *deathmoves[] = {&hover_move_death1, NULL}; M_SetDeath(self,(mmove_t **)&deathmoves); } self->common_name = "Icarus"; self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/*QUAKED monster_hover (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_hover (edict_t *self) { /* if (deathmatch->value) { G_FreeEdict (self); return; }*/ sound_pain1 = gi.soundindex ("hover/hovpain1.wav"); // sound_pain2 = gi.soundindex ("hover/hovpain2.wav"); sound_death1 = gi.soundindex ("hover/hovdeth1.wav"); // sound_death2 = gi.soundindex ("hover/hovdeth2.wav"); sound_sight = gi.soundindex ("hover/hovsght1.wav"); // sound_search1 = gi.soundindex ("hover/hovsrch1.wav"); // sound_search2 = gi.soundindex ("hover/hovsrch2.wav"); gi.soundindex ("hover/hovatck1.wav"); self->s.sound = gi.soundindex ("hover/hovidle1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.modelindex = gi.modelindex("models/monsters/hover/tris.md2"); VectorSet (self->mins, -24, -24, -24); VectorSet (self->maxs, 24, 24, 32); self->mass = 150; self->health = 90 + 9 * skill->value; self->max_health = self->health; self->monsterinfo.level = 268 + 130 * skill->value; self->monsterinfo.skill = skill->value; self->gib_health = -160 - 20 * skill->value; strcpy(self->monsterinfo.name, "a hover"); self->monsterinfo.cts_any = 0.35; self->monsterinfo.cts_class1 = 0.01; self->monsterinfo.cts_class2 = 0.04; self->monsterinfo.cts_class3 = 0.25; self->monsterinfo.item_any = 0.05; self->monsterinfo.itemmult_class1 = 1.0; self->monsterinfo.itemmult_class2 = 1.0; self->monsterinfo.itemmult_class3 = 1.0; self->monsterinfo.itemmult_class4 = 0.9; self->pain = hover_pain; self->die = hover_die; self->monsterinfo.stand = hover_stand; self->monsterinfo.walk = hover_walk; self->monsterinfo.run = hover_run; // self->monsterinfo.dodge = hover_dodge; self->monsterinfo.attack = hover_start_attack; self->monsterinfo.sight = hover_sight; // self->monsterinfo.search = hover_search; self->monsterinfo.aggressive = true; self->monsterinfo.prefered_range = 212; gi.linkentity (self); self->monsterinfo.currentmove = &hover_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/*QUAKED monster_flyer (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_flyer (edict_t *self) { if (deathmatch->value) { G_FreeEdict (self); return; } // fix a map bug in jail5.bsp if (!Q_strcasecmp(level.mapname, "jail5") && (self->s.origin[2] == -104)) { self->targetname = self->target; self->target = NULL; } sound_sight = gi.soundindex ("flyer/flysght1.wav"); sound_idle = gi.soundindex ("flyer/flysrch1.wav"); sound_pain1 = gi.soundindex ("flyer/flypain1.wav"); sound_pain2 = gi.soundindex ("flyer/flypain2.wav"); sound_slash = gi.soundindex ("flyer/flyatck2.wav"); sound_sproing = gi.soundindex ("flyer/flyatck1.wav"); sound_die = gi.soundindex ("flyer/flydeth1.wav"); gi.soundindex ("flyer/flyatck3.wav"); // Lazarus: special purpose skins if ( self->style ) { PatchMonsterModel("models/monsters/flyer/tris.md2"); self->s.skinnum = self->style * 2; } self->s.modelindex = gi.modelindex ("models/monsters/flyer/tris.md2"); VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 16); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.sound = gi.soundindex ("flyer/flyidle1.wav"); // Lazarus: mapper-configurable health if(!self->health) self->health = 50; if(!self->mass) self->mass = 50; self->pain = flyer_pain; self->die = flyer_die; self->monsterinfo.stand = flyer_stand; self->monsterinfo.walk = flyer_walk; self->monsterinfo.run = flyer_run; self->monsterinfo.attack = flyer_attack; self->monsterinfo.melee = flyer_melee; self->monsterinfo.sight = flyer_sight; self->monsterinfo.idle = flyer_idle; // Knightmare- added sparks and blood type if (!self->blood_type) self->blood_type = 3; //sparks and blood // Lazarus if(self->powerarmor) { self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD; self->monsterinfo.power_armor_power = self->powerarmor; } self->common_name = "Flyer"; gi.linkentity (self); self->monsterinfo.currentmove = &flyer_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/*QUAKED monster_flyer (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_flyer(edict_t *self) { if (deathmatch->value) { G_FreeEdict(self); return; } // fix a map bug in jail5.bsp if (!Q_stricmp(level.mapname, "jail5") && (self->s.origin[2] == -104)) { self->targetname = self->target; self->target = NULL; } sound_sight = gi.soundindex("flyer/flysght1.wav"); sound_idle = gi.soundindex("flyer/flysrch1.wav"); sound_pain1 = gi.soundindex("flyer/flypain1.wav"); sound_pain2 = gi.soundindex("flyer/flypain2.wav"); sound_slash = gi.soundindex("flyer/flyatck2.wav"); sound_sproing = gi.soundindex("flyer/flyatck1.wav"); sound_die = gi.soundindex("flyer/flydeth1.wav"); sound_suicide_init = gi.soundindex("flyer/suicide_init.wav"); //mxd sound_suicide_beep = gi.soundindex("flyer/suicide_beep.wav"); //mxd gi.soundindex("flyer/flyatck3.wav"); // Lazarus: special purpose skins if (self->style) { PatchMonsterModel("models/monsters/flyer/tris.md2"); self->s.skinnum = self->style * 2; } self->s.modelindex = gi.modelindex("models/monsters/flyer/tris.md2"); VectorSet(self->mins, -16, -16, -24); VectorSet(self->maxs, 16, 16, 16); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->classname = "monster_flyer"; //mxd self->class_id = ENTITY_MONSTER_FLYER; //mxd self->s.sound = gi.soundindex("flyer/flyidle1.wav"); // Lazarus: mapper-configurable health if (!self->health) self->health = 50; if (!self->mass) self->mass = 50; self->pain = flyer_pain; self->die = flyer_die; self->monsterinfo.stand = flyer_stand; self->monsterinfo.walk = flyer_walk; self->monsterinfo.run = flyer_run; self->monsterinfo.attack = flyer_attack; self->monsterinfo.melee = flyer_melee; self->monsterinfo.sight = flyer_sight; self->monsterinfo.idle = flyer_idle; self->monsterinfo.blocked = flyer_blocked; //mxd // Knightmare- added sparks and blood type if (!self->blood_type) self->blood_type = 3; //sparks and blood // Lazarus if (self->powerarmor) { self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD; self->monsterinfo.power_armor_power = self->powerarmor; } self->common_name = "Flyer"; //mxd. Adjust run speed based on skill const int s = flyer_frames_run_distances_per_skill[max(0, min(3, skill->integer))]; for (int i = 0; i < 45; i++) flyer_frames_run[i].dist = s; gi.linkentity(self); self->monsterinfo.currentmove = &flyer_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start(self); }
/*QUAKED monster_boss2 (1 .5 0) (-56 -56 0) (56 56 80) Ambush Trigger_Spawn Sight */ void SP_monster_boss2 (edict_t *self) { if (deathmatch->value) { G_FreeEdict (self); return; } // Lazarus: special purpose skins if ( (self->spawnflags & SF_MONSTER_SPECIAL) && self->style ) { PatchMonsterModel("models/monsters/boss2/tris.md2"); self->s.skinnum = self->style * 2; } sound_pain1 = gi.soundindex ("bosshovr/bhvpain1.wav"); sound_pain2 = gi.soundindex ("bosshovr/bhvpain2.wav"); sound_pain3 = gi.soundindex ("bosshovr/bhvpain3.wav"); sound_death = gi.soundindex ("bosshovr/bhvdeth1.wav"); sound_search1 = gi.soundindex ("bosshovr/bhvunqv1.wav"); self->s.sound = gi.soundindex ("bosshovr/bhvengn1.wav"); #ifdef LOOP_SOUND_ATTENUATION self->s.attenuation = ATTN_IDLE; #endif self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; // Lazarus: special purpose skins if ( self->style ) { PatchMonsterModel("models/monsters/boss2/tris.md2"); self->s.skinnum = self->style * 2; } self->s.modelindex = gi.modelindex ("models/monsters/boss2/tris.md2"); VectorSet (self->mins, -56, -56, 0); VectorSet (self->maxs, 56, 56, 80); // Lazarus: mapper-configurable health if(!self->health) self->health = 2000; if(!self->gib_health) self->gib_health = -200; if(!self->mass) self->mass = 1000; self->flags |= FL_IMMUNE_LASER; self->pain = boss2_pain; self->die = boss2_die; self->monsterinfo.stand = boss2_stand; self->monsterinfo.walk = boss2_walk; self->monsterinfo.run = boss2_run; self->monsterinfo.attack = boss2_attack; self->monsterinfo.search = boss2_search; self->monsterinfo.checkattack = Boss2_CheckAttack; // Knightmare- added sparks and blood type if (!self->blood_type) self->blood_type = 2; //sparks else self->fogclip |= 2; //custom bloodtype flag gi.linkentity (self); self->monsterinfo.currentmove = &boss2_move_stand; if(self->health < 0) { mmove_t *deathmoves[] = {&boss2_move_death, NULL}; M_SetDeath(self,(mmove_t **)&deathmoves); } self->monsterinfo.scale = MODEL_SCALE; // Lazarus power armor if(self->powerarmor) { self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD; self->monsterinfo.power_armor_power = self->powerarmor; } self->common_name = "Flying Boss"; flymonster_start (self); }
/*QUAKED monster_flyer (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_flyer (edict_t *self) { /* if (deathmatch->value) { G_FreeEdict (self); return; }*/ // fix a map bug in jail5.bsp if (!Q_strcasecmp(level.mapname, "jail5") && (self->s.origin[2] == -104)) { self->targetname = self->target; self->target = NULL; } sound_sight = gi.soundindex ("flyer/flysght1.wav"); // sound_idle = gi.soundindex ("flyer/flysrch1.wav"); sound_pain1 = gi.soundindex ("flyer/flypain1.wav"); // sound_pain2 = gi.soundindex ("flyer/flypain2.wav"); // sound_slash = gi.soundindex ("flyer/flyatck2.wav"); sound_sproing = gi.soundindex ("flyer/flyatck1.wav"); sound_die = gi.soundindex ("flyer/flydeth1.wav"); gi.soundindex ("flyer/flyatck3.wav"); self->s.modelindex = gi.modelindex ("models/monsters/flyer/tris.md2"); VectorSet (self->mins, -16, -16, -24); VectorSet (self->maxs, 16, 16, 32); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; self->s.sound = gi.soundindex ("flyer/flyidle1.wav"); self->mass = 50; self->health = 65 + 12 * skill->value; self->max_health = self->health; self->monsterinfo.level = 280 + 160 * skill->value; self->monsterinfo.skill = skill->value; self->gib_health = -100; strcpy(self->monsterinfo.name, "a flyer"); self->yaw_speed = 20 + skill->value; self->pain = flyer_pain; self->die = flyer_die; self->monsterinfo.cts_any = 0.52; self->monsterinfo.cts_class1 = 0.03; self->monsterinfo.cts_class2 = 0.08; self->monsterinfo.cts_class3 = 0.25; self->monsterinfo.item_any = 0.02; self->monsterinfo.itemmult_class1 = 1.0; self->monsterinfo.itemmult_class2 = 1.0; self->monsterinfo.itemmult_class3 = 1.0; self->monsterinfo.itemmult_class4 = 0.9; self->monsterinfo.stand = flyer_stand; self->monsterinfo.walk = flyer_walk; self->monsterinfo.run = flyer_run; self->monsterinfo.attack = flyer_attack; self->monsterinfo.melee = flyer_melee; self->monsterinfo.sight = flyer_sight; self->monsterinfo.idle = NULL; self->monsterinfo.aggressive = true; self->monsterinfo.prefered_range = 0; gi.linkentity (self); self->monsterinfo.currentmove = &flyer_move_stand; self->monsterinfo.scale = MODEL_SCALE; flymonster_start (self); }
/*QUAKED monster_floater (1 .5 0) (-16 -16 -24) (16 16 32) Ambush Trigger_Spawn Sight */ void SP_monster_floater(edict_t *self) { if (deathmatch->value) { G_FreeEdict(self); return; } sound_attack2 = gi.soundindex("floater/fltatck2.wav"); sound_attack3 = gi.soundindex("floater/fltatck3.wav"); sound_death1 = gi.soundindex("floater/fltdeth1.wav"); sound_idle = gi.soundindex("floater/fltidle1.wav"); sound_pain1 = gi.soundindex("floater/fltpain1.wav"); sound_pain2 = gi.soundindex("floater/fltpain2.wav"); sound_sight = gi.soundindex("floater/fltsght1.wav"); gi.soundindex("floater/fltatck1.wav"); self->s.sound = gi.soundindex("floater/fltsrch1.wav"); self->movetype = MOVETYPE_STEP; self->solid = SOLID_BBOX; // Lazarus: special purpose skins if (self->style) { PatchMonsterModel("models/monsters/float/tris.md2"); self->s.skinnum = self->style * 2; } self->s.modelindex = gi.modelindex("models/monsters/float/tris.md2"); VectorSet(self->mins, -24, -24, -24); VectorSet(self->maxs, 24, 24, 32); // Lazarus: mapper-configurable health if (!self->health) self->health = 200; if (!self->gib_health) self->gib_health = -80; if (!self->mass) self->mass = 300; self->pain = floater_pain; self->die = floater_die; self->monsterinfo.stand = floater_stand; self->monsterinfo.walk = floater_walk; self->monsterinfo.run = floater_run; // self->monsterinfo.dodge = floater_dodge; self->monsterinfo.attack = floater_attack; self->monsterinfo.melee = floater_melee; self->monsterinfo.sight = floater_sight; self->monsterinfo.idle = floater_idle; // Knightmare- added sparks and blood type if (!self->blood_type) self->blood_type = 2; //sparks else self->fogclip |= 2; //custom bloodtype flag // Lazarus if (self->powerarmor) { self->monsterinfo.power_armor_type = POWER_ARMOR_SHIELD; self->monsterinfo.power_armor_power = self->powerarmor; } self->common_name = "Technician"; gi.linkentity(self); if (self->health < 0) { mmove_t *deathmoves[] = { &floater_move_death, NULL }; if (!M_SetDeath(self, (mmove_t **)&deathmoves)) self->monsterinfo.currentmove = &floater_move_stand1; } else { if (random() <= 0.5) self->monsterinfo.currentmove = &floater_move_stand1; else self->monsterinfo.currentmove = &floater_move_stand2; } self->monsterinfo.scale = MODEL_SCALE; flymonster_start(self); }