From 0d87135bf25ac17611ac8a57c792805b0d5d51b7 Mon Sep 17 00:00:00 2001 From: Mario Date: Sun, 14 Apr 2013 13:46:11 +1000 Subject: [PATCH] Remove enforcer & all W_ attack functions from the monster code --- monsters.cfg | 16 +- qcsrc/client/monsters.qc | 14 -- qcsrc/common/deathtypes.qh | 2 +- qcsrc/common/notifications.qh | 4 +- qcsrc/menu/xonotic/dialog_monstertools.c | 1 - qcsrc/server/monsters/lib/monsters_early.qh | 5 +- qcsrc/server/monsters/monster/enforcer.qc | 172 ------------------ qcsrc/server/monsters/monster/knight.qc | 6 +- qcsrc/server/monsters/monster/ogre.qc | 2 +- qcsrc/server/monsters/monster/spider.qc | 79 +++++--- qcsrc/server/monsters/monsters.qh | 1 - .../server/mutators/gamemode_towerdefense.qc | 7 +- .../server/mutators/gamemode_towerdefense.qh | 2 +- 13 files changed, 70 insertions(+), 241 deletions(-) delete mode 100644 qcsrc/server/monsters/monster/enforcer.qc diff --git a/monsters.cfg b/monsters.cfg index 815cfabd8..7b329d437 100644 --- a/monsters.cfg +++ b/monsters.cfg @@ -25,16 +25,7 @@ set g_monsters_skill_normal 4 "Monster normal skill level (used for skill based set g_monsters_skill_hard 5 "Monster hard skill level (used for skill based functions)" set g_monsters_skill_insane 7 "Monster insane skill level (used for skill based functions)" set g_monsters_skill_nightmare 10 "Monster nightmare skill level (used for skill based functions)" -set g_monsters_spawn_list "ogre demon shambler knight soldier scrag dog spawn hellknight fish vore enforcer zombie spider" "monsters not listed here will spawn as knights" - -// Enforcer -set g_monster_enforcer 1 "Enable Enforcers" -set g_monster_enforcer_health 80 "Enforcer health" -set g_monster_enforcer_drop armor "Enforcer drops this item on death" -set g_monster_enforcer_drop_size large "Size of the item Enforcers drop. Possible values are: small, medium, large" -set g_monster_enforcer_speed_walk 75 "Enforcer walk speed" -set g_monster_enforcer_speed_run 100 "Enforcer run speed" -set g_monster_enforcer_attack_uzi_bullets 3 "Number of machine gun bullets Enforcer fires" +set g_monsters_spawn_list "ogre demon shambler knight soldier scrag dog spawn hellknight fish vore zombie spider" "monsters not listed here will spawn as knights" // Ogre set g_monster_ogre 1 "Enable Ogres" @@ -223,6 +214,11 @@ set g_monster_spider_attack_type 0 "Spider attack type (0 = ice, 1 = fire, ...)" set g_monster_spider_attack_leap_delay 1.5 "Delay after spider attack leap" set g_monster_spider_attack_stand_damage 35 "Damage when spider hits from a standing position" set g_monster_spider_attack_stand_delay 1.2 "Delay after a spider hits from a standing position" +set g_monster_spider_attack_fire_time 2 "Spider fire attack burn time" +set g_monster_spider_attack_web_speed 1000 "Spider web fly speed" +set g_monster_spider_attack_web_speed_up 150 "Spider web upwards fly speed" +set g_monster_spider_attack_web_spread 0 "Spider web spread" +set g_monster_spider_attack_web_speed_z 0 "Spider web upwards angle" set g_monster_spider_health 200 "Spider health" set g_monster_spider_idle_timer_min 1 "Minimum time a spider can stay idle" set g_monster_spider_speed_walk 150 "Spider walk speed" diff --git a/qcsrc/client/monsters.qc b/qcsrc/client/monsters.qc index ec1919d62..53292d28e 100644 --- a/qcsrc/client/monsters.qc +++ b/qcsrc/client/monsters.qc @@ -80,12 +80,6 @@ void monster_precache(float _mid) precache_model(SHALRATH_MODEL); break; } - case MONSTER_ENFORCER: - { - precache_model(ENFORCER_MODEL); - precache_model("models/turrets/ewheel-gun1.md3"); - break; - } case MONSTER_SPIDER: { precache_model(SPIDER_MODEL); @@ -203,14 +197,6 @@ void monster_mid2info(float _mid) mid2info_max = SHALRATH_MAX; break; } - case MONSTER_ENFORCER: - { - mid2info_model = ENFORCER_MODEL; - mid2info_name = "Enforcer"; - mid2info_min = ENFORCER_MIN; - mid2info_max = ENFORCER_MAX; - break; - } case MONSTER_SPIDER: { mid2info_model = SPIDER_MODEL; diff --git a/qcsrc/common/deathtypes.qh b/qcsrc/common/deathtypes.qh index 0e088ea5c..5b84d63ec 100644 --- a/qcsrc/common/deathtypes.qh +++ b/qcsrc/common/deathtypes.qh @@ -17,7 +17,6 @@ DEATHTYPE(DEATH_MIRRORDAMAGE, DEATH_SELF_BETRAYAL, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_DOG_BITE, DEATH_SELF_MON_DOG_BITE, NO_MSG, DEATH_MONSTER_FIRST) \ DEATHTYPE(DEATH_MONSTER_DOG_JUMP, DEATH_SELF_MON_DOG_JUMP, NO_MSG, NORMAL_POS) \ - DEATHTYPE(DEATH_MONSTER_ENFORCER, DEATH_SELF_MON_ENFORCER, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_FIEND, DEATH_SELF_MON_FIEND, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_FISH, DEATH_SELF_MON_FISH, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_HKNIGHT_CRUSH, DEATH_SELF_MON_HKNIGHT_CRUSH, NO_MSG, NORMAL_POS) \ @@ -36,6 +35,7 @@ DEATHTYPE(DEATH_MONSTER_MARINE, DEATH_SELF_MON_MARINE, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_MARINE_SLAP, DEATH_SELF_MON_MARINE_SLAP, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_SPIDER, DEATH_SELF_MON_SPIDER, NO_MSG, NORMAL_POS) \ + DEATHTYPE(DEATH_MONSTER_SPIDER_FIRE, DEATH_SELF_MON_SPIDER_FIRE, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_TARBABY, DEATH_SELF_MON_TARBABY, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_SCRAG, DEATH_SELF_MON_SCRAG, NO_MSG, NORMAL_POS) \ DEATHTYPE(DEATH_MONSTER_ZOMBIE_JUMP, DEATH_SELF_MON_ZOMBIE_JUMP, NO_MSG, NORMAL_POS) \ diff --git a/qcsrc/common/notifications.qh b/qcsrc/common/notifications.qh index 368123fc7..f1b2efa41 100644 --- a/qcsrc/common/notifications.qh +++ b/qcsrc/common/notifications.qh @@ -228,7 +228,6 @@ void Send_Notification_WOVA( MSG_INFO_NOTIF(1, INFO_DEATH_SELF_LAVA, 2, 1, "s1 s2loc spree_lost", "s1", "notify_lava", _("^BG%s^K1 turned into hot slag%s%s\n"), _("^BG%s^K1 found a hot place%s%s\n")) \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_DOG_BITE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was mauled by a Rottweiler%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_DOG_JUMP, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 didn't see the pouncing Rottweiler%s%s\n"), "") \ - MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ENFORCER, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was blasted by an Enforcer%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_FIEND, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was eviscerated by a Fiend%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_FISH, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was fed to the Rotfish%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_HKNIGHT_CRUSH, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was crushed by a pouncing Hell-Knight%s%s\n"), "") \ @@ -247,6 +246,7 @@ void Send_Notification_WOVA( MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MARINE_SLAP, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was slapped to death by a Marine%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_MARINE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was gunned down by a Marine%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was bitten by a Spider%s%s\n"), "") \ + MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SPIDER_FIRE, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was incinerated by a Spider%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_TARBABY, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 came too close to an exploding Pumpkin%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_SCRAG, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 was cursed by a Scrag%s%s\n"), "") \ MSG_INFO_NOTIF(1, INFO_DEATH_SELF_MON_ZOMBIE_JUMP, 2, 1, "s1 s2loc spree_lost", "s1", "notify_death", _("^BG%s^K1 joins the Zombies%s%s\n"), "") \ @@ -569,7 +569,6 @@ void Send_Notification_WOVA( MSG_MULTI_NOTIF(1, DEATH_SELF_LAVA, INFO_DEATH_SELF_LAVA, CENTER_DEATH_SELF_LAVA) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_DOG_BITE, INFO_DEATH_SELF_MON_DOG_BITE, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_DOG_JUMP, INFO_DEATH_SELF_MON_DOG_JUMP, CENTER_DEATH_SELF_MONSTER) \ - MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ENFORCER, INFO_DEATH_SELF_MON_ENFORCER, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_FIEND, INFO_DEATH_SELF_MON_FIEND, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_FISH, INFO_DEATH_SELF_MON_FISH, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_HKNIGHT_CRUSH, INFO_DEATH_SELF_MON_HKNIGHT_CRUSH, CENTER_DEATH_SELF_MONSTER) \ @@ -588,6 +587,7 @@ void Send_Notification_WOVA( MSG_MULTI_NOTIF(1, DEATH_SELF_MON_MARINE_SLAP, INFO_DEATH_SELF_MON_MARINE_SLAP, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_MARINE, INFO_DEATH_SELF_MON_MARINE, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER, INFO_DEATH_SELF_MON_SPIDER, CENTER_DEATH_SELF_MONSTER) \ + MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SPIDER_FIRE, INFO_DEATH_SELF_MON_SPIDER_FIRE, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_TARBABY, INFO_DEATH_SELF_MON_TARBABY, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_SCRAG, INFO_DEATH_SELF_MON_SCRAG, CENTER_DEATH_SELF_MONSTER) \ MSG_MULTI_NOTIF(1, DEATH_SELF_MON_ZOMBIE_JUMP, INFO_DEATH_SELF_MON_ZOMBIE_JUMP, CENTER_DEATH_SELF_MONSTER) \ diff --git a/qcsrc/menu/xonotic/dialog_monstertools.c b/qcsrc/menu/xonotic/dialog_monstertools.c index e448a8be8..89e3f4d19 100644 --- a/qcsrc/menu/xonotic/dialog_monstertools.c +++ b/qcsrc/menu/xonotic/dialog_monstertools.c @@ -31,7 +31,6 @@ void XonoticMonsterToolsDialog_fill(entity me) me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "spawn", _("Tarbaby"))); me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "fish", _("Rotfish"))); me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "vore", _("Mage"))); - me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "enforcer", _("Enforcer"))); me.TD(me, 1, 0.4, e = makeXonoticRadioButton(2, "menu_monsters_edit_spawn", "scrag", _("Scrag"))); me.TR(me); me.TD(me, 1, 0.25, e = makeXonoticTextLabel(0, _("Name:"))); diff --git a/qcsrc/server/monsters/lib/monsters_early.qh b/qcsrc/server/monsters/lib/monsters_early.qh index 5a2f2b7bc..3493b44a7 100644 --- a/qcsrc/server/monsters/lib/monsters_early.qh +++ b/qcsrc/server/monsters/lib/monsters_early.qh @@ -34,9 +34,8 @@ float MONSTER_TARBABY = 10; float MONSTER_HELLKNIGHT = 11; float MONSTER_FISH = 12; float MONSTER_MAGE = 13; -float MONSTER_ENFORCER = 14; -float MONSTER_SPIDER = 15; -float MONSTER_LAST = 16; +float MONSTER_SPIDER = 14; +float MONSTER_LAST = 15; float MSF_UPDATE = 2; float MSF_STATUS = 4; diff --git a/qcsrc/server/monsters/monster/enforcer.qc b/qcsrc/server/monsters/monster/enforcer.qc deleted file mode 100644 index 1f8b176b4..000000000 --- a/qcsrc/server/monsters/monster/enforcer.qc +++ /dev/null @@ -1,172 +0,0 @@ -#ifndef MENUQC -// size -const vector ENFORCER_MIN = '-32 -32 0'; -const vector ENFORCER_MAX = '32 32 64'; - -// model -string ENFORCER_MODEL = "models/turrets/ewheel-base2.md3"; - -#endif - -#ifdef SVQC -// cvars -float autocvar_g_monster_enforcer; -float autocvar_g_monster_enforcer_health; -float autocvar_g_monster_enforcer_speed_walk; -float autocvar_g_monster_enforcer_speed_run; -float autocvar_g_monster_enforcer_attack_uzi_bullets; - -// animations -const float enforcer_anim_stop = 0; -const float enforcer_anim_walk = 1; -const float enforcer_anim_run = 2; -const float enforcer_anim_walkback = 3; -const float enforcer_anim_runback = 4; - -void enforcer_think () -{ - self.think = enforcer_think; - self.nextthink = time + self.ticrate; - - if(self.delay != -1) - self.nextthink = self.delay; - - monster_move(autocvar_g_monster_enforcer_speed_run, autocvar_g_monster_enforcer_speed_walk, 100, enforcer_anim_run, enforcer_anim_walk, enforcer_anim_stop); -} - -.float enf_cycles; -void enforcer_uzi_fire () -{ - self.enf_cycles += 1; - - if(self.enf_cycles > autocvar_g_monster_enforcer_attack_uzi_bullets) - { - self.monster_delayedattack = func_null; - self.delay = -1; - return; - } - W_UZI_Attack(DEATH_MONSTER_ENFORCER); - self.delay = time + 0.1; - self.monster_delayedattack = enforcer_uzi_fire; -} - -float enforcer_attack() -{ - makevectors(self.angles); - switch(self.weapon) - { - case WEP_ROCKET_LAUNCHER: - { - self.attack_finished_single = time + 0.8; - W_Rocket_Attack(); - return TRUE; - } - case WEP_ELECTRO: - { - self.attack_finished_single = time + 0.8; - W_Electro_Attack(); - return TRUE; - } - case WEP_SHOTGUN: - { - self.attack_finished_single = time + 0.8; - W_Shotgun_Attack(); - return TRUE; - } - case WEP_UZI: - { - self.enf_cycles = 0; - self.attack_finished_single = time + 0.8; - self.delay = time + 0.1; - self.monster_delayedattack = enforcer_uzi_fire; - return TRUE; - } - case WEP_LASER: - { - self.attack_finished_single = time + 0.8; - W_Laser_Attack(0); - } - default: - return FALSE; // no weapon? - } - - // never gets here -} - -void enforcer_die () -{ - Monster_CheckDropCvars ("enforcer"); - - self.think = Monster_Fade; - self.nextthink = time + 5; - monsters_setframe(enforcer_anim_stop); - - monster_hook_death(); // for post-death mods -} - -void enforcer_spawn () -{ - if not(self.health) - self.health = autocvar_g_monster_enforcer_health * self.scale; - - self.damageforcescale = 0; - self.classname = "monster_enforcer"; - self.checkattack = GenericCheckAttack; - self.nextthink = time + random() * 0.5 + 0.1; - self.think = enforcer_think; - self.items = (IT_SHELLS | IT_ROCKETS | IT_NAILS | IT_CELLS); - self.sprite_height = 45; - self.attack_ranged = enforcer_attack; - self.view_ofs *= 0.5; - - monsters_setframe(enforcer_anim_stop); - - monster_setupsounds("enforcer"); - - setmodel(self, ENFORCER_MODEL); // for weapon entity - - self.weaponentity = spawn(); - self.weaponentity.owner = self; - self.weaponentity.team = self.team; - self.weaponentity.solid = SOLID_NOT; - self.weaponentity.owner = self.weaponentity.realowner = self; - self.weaponentity.movetype = MOVETYPE_NOCLIP; - setmodel(self.weaponentity, "models/turrets/ewheel-gun1.md3"); - setattachment(self.weaponentity, self, "tag_head"); - - RandomSelection_Init(); - RandomSelection_Add(world, WEP_ROCKET_LAUNCHER, "", 1, 1); - RandomSelection_Add(world, WEP_ELECTRO, "", 1, 1); - RandomSelection_Add(world, WEP_SHOTGUN, "", 1, 1); - RandomSelection_Add(world, WEP_UZI, "", 1, 1); - RandomSelection_Add(world, WEP_LASER, "", 1, 1); - - self.weapon = RandomSelection_chosen_float; - - monster_hook_spawn(); // for post-spawn mods -} - -void spawnfunc_monster_enforcer () -{ - if not(autocvar_g_monster_enforcer) { remove(self); return; } - - self.monster_spawnfunc = spawnfunc_monster_enforcer; - - if(Monster_CheckAppearFlags(self)) - return; - - precache_model("models/turrets/ewheel-gun1.md3"); - precache_model(ENFORCER_MODEL); - - if not (monster_initialize( - "Enforcer", MONSTER_ENFORCER, - ENFORCER_MIN, ENFORCER_MAX, - FALSE, - enforcer_die, enforcer_spawn)) - { - remove(self); - return; - } -} - -#endif // SVQC diff --git a/qcsrc/server/monsters/monster/knight.qc b/qcsrc/server/monsters/monster/knight.qc index 93cbe663c..48845d457 100644 --- a/qcsrc/server/monsters/monster/knight.qc +++ b/qcsrc/server/monsters/monster/knight.qc @@ -12,7 +12,7 @@ string KNIGHT_MODEL = "models/monsters/knight.mdl"; // cvars float autocvar_g_monster_knight; float autocvar_g_monster_knight_health; -//float autocvar_g_monster_knight_melee_damage; +float autocvar_g_monster_knight_melee_damage; float autocvar_g_monster_knight_speed_walk; float autocvar_g_monster_knight_speed_run; @@ -40,14 +40,12 @@ void knight_think () void knight_attack () { float len = vlen(self.velocity); - - W_Shotgun_Attack2(); monsters_setframe((len < 50) ? knight_anim_attack : knight_anim_runattack); self.attack_finished_single = time + 1.25; - //monster_melee(self.enemy, autocvar_g_monster_knight_melee_damage, 0.3, DEATH_MONSTER_KNIGHT); + monster_melee(self.enemy, autocvar_g_monster_knight_melee_damage, 0.3, DEATH_MONSTER_KNIGHT, FALSE); } void knight_die () diff --git a/qcsrc/server/monsters/monster/ogre.qc b/qcsrc/server/monsters/monster/ogre.qc index af2005bbf..ed947bb8b 100644 --- a/qcsrc/server/monsters/monster/ogre.qc +++ b/qcsrc/server/monsters/monster/ogre.qc @@ -146,7 +146,7 @@ void ogre_grenade_think() if (time > self.cnt) { other = world; - W_Grenade_Explode (); + ogre_grenade_explode(); return; } } diff --git a/qcsrc/server/monsters/monster/spider.qc b/qcsrc/server/monsters/monster/spider.qc index be1e7b77e..62c968e12 100644 --- a/qcsrc/server/monsters/monster/spider.qc +++ b/qcsrc/server/monsters/monster/spider.qc @@ -15,6 +15,7 @@ float autocvar_g_monster_spider_stopspeed; float autocvar_g_monster_spider_attack_leap_delay; float autocvar_g_monster_spider_attack_stand_damage; float autocvar_g_monster_spider_attack_stand_delay; +float autocvar_g_monster_spider_attack_fire_time; float autocvar_g_monster_spider_health; float autocvar_g_monster_spider_speed_walk; float autocvar_g_monster_spider_speed_run; @@ -49,32 +50,69 @@ void spider_attack_standing() void spider_web_explode () { - RadiusDamage (self, self.realowner, 0, 0, 1, world, 0, self.projectiledeathtype, other); + float damg = 0, edamg = 0, rad = 1; + switch(self.realowner.spider_type) + { + case SPIDER_TYPE_ICE: + break; // no change + case SPIDER_TYPE_FIRE: + damg = 15; + rad = 25; + edamg = 6; + break; + } + + RadiusDamage (self, self.realowner, damg, edamg, rad, world, 0, self.projectiledeathtype, other); + remove (self); } void spider_web_touch () { PROJECTILE_TOUCH; - if (other.takedamage == DAMAGE_AIM) - Freeze(other, 0.3); + + if(other.takedamage == DAMAGE_AIM) + switch(self.realowner.spider_type) + { + case SPIDER_TYPE_ICE: + Freeze(other, 0.3); + break; + case SPIDER_TYPE_FIRE: + Fire_AddDamage(other, self.realowner, 5 * monster_skill, autocvar_g_monster_spider_attack_fire_time, DEATH_MONSTER_SPIDER_FIRE); + break; + } spider_web_explode(); } -void spider_shootweb() +void spider_shootweb(float ptype) { - // clone of the electro secondary attack, with less bouncing + float p = 0, dt = 0; + string snd = ""; + switch(ptype) + { + case SPIDER_TYPE_ICE: + p = PROJECTILE_ELECTRO; + dt = WEP_ELECTRO; + snd = "weapons/electro_fire2.wav"; + break; + case SPIDER_TYPE_FIRE: + p = ((self.scale >= 2) ? PROJECTILE_FIREBALL : PROJECTILE_FIREMINE); + dt = WEP_FIREBALL; + snd = "weapons/fireball_fire.wav"; + break; + } + + vector fmins = ((self.scale >= 2) ? '-16 -16 -16' : '-4 -4 -4'), fmaxs = ((self.scale >= 2) ? '16 16 16' : '4 4 4'); + entity proj = world; makevectors(self.angles); - W_SetupShot_ProjectileSize (self, '0 0 -4', '0 0 -4', FALSE, 2, "weapons/electro_fire2.wav", CH_WEAPON_A, 0); + W_SetupShot_ProjectileSize(self, fmins, fmaxs, FALSE, 2, snd, CH_WEAPON_A, 0); w_shotdir = v_forward; // no TrueAim for grenades please - pointparticles(particleeffectnum("electro_muzzleflash"), w_shotorg, w_shotdir * 1000, 1); - proj = spawn (); proj.classname = "plasma"; proj.owner = proj.realowner = self; @@ -82,21 +120,21 @@ void spider_shootweb() proj.think = adaptor_think2use_hittype_splash; proj.bot_dodge = TRUE; proj.bot_dodgerating = 0; - proj.nextthink = time + autocvar_g_balance_electro_secondary_lifetime; + proj.nextthink = time + 5; PROJECTILE_MAKETRIGGER(proj); - proj.projectiledeathtype = WEP_ELECTRO | HITTYPE_SECONDARY; + proj.projectiledeathtype = dt | HITTYPE_SECONDARY; setorigin(proj, w_shotorg); //proj.glow_size = 50; //proj.glow_color = 45; proj.movetype = MOVETYPE_BOUNCE; - W_SETUPPROJECTILEVELOCITY_UP(proj, g_balance_electro_secondary); + W_SETUPPROJECTILEVELOCITY_UP(proj, g_monster_spider_attack_web); proj.touch = spider_web_touch; - setsize(proj, '0 0 -4', '0 0 -4'); - proj.takedamage = DAMAGE_YES; + setsize(proj, fmins, fmaxs); + proj.takedamage = DAMAGE_NO; proj.damageforcescale = 0; proj.health = 500; - proj.event_damage = W_Plasma_Damage; + proj.event_damage = func_null; proj.flags = FL_PROJECTILE; proj.damagedbycontents = TRUE; @@ -104,9 +142,7 @@ void spider_shootweb() proj.bouncestop = 0.05; proj.missile_flags = MIF_SPLASH | MIF_ARC; - CSQCProjectile(proj, TRUE, PROJECTILE_ELECTRO, FALSE); // no culling, it has sound - - other = proj; MUTATOR_CALLHOOK(EditProjectile); + CSQCProjectile(proj, TRUE, p, FALSE); // no culling, it has sound } void spider_attack_leap() @@ -120,14 +156,7 @@ void spider_attack_leap() makevectors(self.angles); - switch(self.spider_type) - { - default: - case SPIDER_TYPE_ICE: - spider_shootweb(); break; // must... remember... breaks! - case SPIDER_TYPE_FIRE: - W_Fireball_Attack2(); break; - } + spider_shootweb(self.spider_type); } float spider_attack_ranged() diff --git a/qcsrc/server/monsters/monsters.qh b/qcsrc/server/monsters/monsters.qh index c43a999d0..014d3251f 100644 --- a/qcsrc/server/monsters/monsters.qh +++ b/qcsrc/server/monsters/monsters.qh @@ -17,6 +17,5 @@ #include "monster/hknight.qc" #include "monster/fish.qc" #include "monster/shalrath.qc" -#include "monster/enforcer.qc" #include "monster/zombie.qc" #include "monster/spider.qc" diff --git a/qcsrc/server/mutators/gamemode_towerdefense.qc b/qcsrc/server/mutators/gamemode_towerdefense.qc index 1f8a9c33a..8c1523395 100644 --- a/qcsrc/server/mutators/gamemode_towerdefense.qc +++ b/qcsrc/server/mutators/gamemode_towerdefense.qc @@ -362,7 +362,6 @@ float Monster_GetStrength(string mnster) case "knight": case "wizard": case "soldier": - case "enforcer": case "zombie": case "tarbaby": case "dog": @@ -387,7 +386,6 @@ float Monster_GetType(string mnster) default: case "knight": case "soldier": - case "enforcer": case "zombie": case "spider": case "tarbaby": @@ -413,7 +411,6 @@ string RandomMonster() if(n_shalraths) RandomSelection_Add(world, 0, "vore", 1, 1); if(n_soldiers) RandomSelection_Add(world, 0, "soldier", 1, 1); if(n_hknights) RandomSelection_Add(world, 0, "hellknight", 1, 1); - if(n_enforcers) RandomSelection_Add(world, 0, "enforcer", 1, 1); if(n_zombies) RandomSelection_Add(world, 0, "zombie", 1, 1); if(n_spiders) RandomSelection_Add(world, 0, "spider", 1, 1); if(n_ogres) RandomSelection_Add(world, 0, "ogre", 1, 1); @@ -458,7 +455,7 @@ void combat_phase() void queue_monsters(float maxmonsters) { - float mc = 11; // note: shambler + tarbaby = 1 + float mc = 10; // note: shambler + tarbaby = 1 if(waterspawns_count > 0) mc += 1; @@ -473,7 +470,6 @@ void queue_monsters(float maxmonsters) n_shalraths = DistributeEvenly_Get(1); n_soldiers = DistributeEvenly_Get(1); n_hknights = DistributeEvenly_Get(1); - n_enforcers = DistributeEvenly_Get(1); n_zombies = DistributeEvenly_Get(1); n_spiders = DistributeEvenly_Get(1); n_tarbabies = DistributeEvenly_Get(0.7); @@ -815,7 +811,6 @@ MUTATOR_HOOKFUNCTION(td_MonsterSpawn) case MONSTER_HELLKNIGHT: n_hknights -= 1; break; case MONSTER_FISH: n_fish -= 1; break; case MONSTER_MAGE: n_shalraths -= 1; break; - case MONSTER_ENFORCER: n_enforcers -= 1; break; case MONSTER_SPIDER: n_spiders -= 1; break; } diff --git a/qcsrc/server/mutators/gamemode_towerdefense.qh b/qcsrc/server/mutators/gamemode_towerdefense.qh index b199fd5e8..513cb9287 100644 --- a/qcsrc/server/mutators/gamemode_towerdefense.qh +++ b/qcsrc/server/mutators/gamemode_towerdefense.qh @@ -1,6 +1,6 @@ // Counters float monster_count, totalmonsters; -float n_knights, n_dogs, n_ogres, n_shamblers, n_wizards, n_shalraths, n_soldiers, n_hknights, n_enforcers, n_demons, n_zombies, n_tarbabies, n_fish, n_spiders; +float n_knights, n_dogs, n_ogres, n_shamblers, n_wizards, n_shalraths, n_soldiers, n_hknights, n_demons, n_zombies, n_tarbabies, n_fish, n_spiders; float current_monsters; float waterspawns_count, flyspawns_count; float wave_count, max_waves; -- 2.39.2