From 4bf20ed169f3f433bc518b055faf5a945ed97264 Mon Sep 17 00:00:00 2001 From: TimePath Date: Wed, 30 Sep 2015 17:05:34 +1000 Subject: [PATCH] Monsters: make spider attack usable --- qcsrc/common/monsters/monster/spider.qc | 72 ++++++++++++++++++------- 1 file changed, 54 insertions(+), 18 deletions(-) diff --git a/qcsrc/common/monsters/monster/spider.qc b/qcsrc/common/monsters/monster/spider.qc index 5de8fccd87..3ce64e3bd1 100644 --- a/qcsrc/common/monsters/monster/spider.qc +++ b/qcsrc/common/monsters/monster/spider.qc @@ -22,19 +22,66 @@ REGISTER_MONSTER(SPIDER, NEW(Spider)) { #endif } +#include "../../weapons/all.qh" + +CLASS(SpiderAttack, PortoLaunch) +/* flags */ ATTRIB(SpiderAttack, spawnflags, int, WEP_TYPE_OTHER); +/* impulse */ ATTRIB(SpiderAttack, impulse, int, 9); +/* refname */ ATTRIB(SpiderAttack, netname, string, "spider"); +/* wepname */ ATTRIB(SpiderAttack, message, string, _("Spider attack")); +ENDCLASS(SpiderAttack) +REGISTER_WEAPON(SPIDER_ATTACK, NEW(SpiderAttack)); + #endif #ifdef IMPLEMENTATION #ifdef SVQC -float autocvar_g_monster_spider_health; -float autocvar_g_monster_spider_damageforcescale = 0.6; -float autocvar_g_monster_spider_attack_bite_damage; -float autocvar_g_monster_spider_attack_bite_delay; + +.float spider_web_delay; + float autocvar_g_monster_spider_attack_web_damagetime; float autocvar_g_monster_spider_attack_web_speed; float autocvar_g_monster_spider_attack_web_speed_up; float autocvar_g_monster_spider_attack_web_delay; + +float autocvar_g_monster_spider_attack_bite_damage; +float autocvar_g_monster_spider_attack_bite_delay; + +void M_Spider_Attack_Web(); + +METHOD(SpiderAttack, wr_think, bool(SpiderAttack thiswep, bool fire1, bool fire2)) { + SELFPARAM(); + bool isPlayer = IS_PLAYER(self); + if (fire1) + if ((!isPlayer && time >= self.spider_web_delay) || weapon_prepareattack(false, autocvar_g_monster_spider_attack_web_delay)) { + if (!isPlayer) { + self.spider_web_delay = time + 3; + setanim(self, self.anim_shoot, true, true, true); + self.attack_finished_single = time + (autocvar_g_monster_spider_attack_web_delay); + self.anim_finished = time + 1; + } + if (isPlayer) self.enemy = Monster_FindTarget(self); + W_SetupShot_Dir(self, v_forward, false, 0, W_Sound("electro_fire"), CH_WEAPON_B, 0); + if (!isPlayer) w_shotdir = normalize((self.enemy.origin + '0 0 10') - self.origin); + M_Spider_Attack_Web(); + weapon_thinkf(WFRAME_FIRE1, 0, w_ready); + return true; + } + if (fire2) + if (!isPlayer || weapon_prepareattack(true, 0.5)) { + if (isPlayer) { + self.enemy = Monster_FindTarget(self); + self.attack_range = 60; + } + Monster_Attack_Melee(self.enemy, (autocvar_g_monster_spider_attack_bite_damage), ((random() > 0.5) ? self.anim_melee : self.anim_shoot), self.attack_range, (autocvar_g_monster_spider_attack_bite_delay), DEATH_MONSTER_SPIDER, true); + weapon_thinkf(WFRAME_FIRE2, 0, w_ready); + } + return true; +} + +float autocvar_g_monster_spider_health; +float autocvar_g_monster_spider_damageforcescale = 0.6; float autocvar_g_monster_spider_speed_stop; float autocvar_g_monster_spider_speed_run; float autocvar_g_monster_spider_speed_walk; @@ -46,8 +93,6 @@ const float spider_anim_attack = 2; const float spider_anim_attack2 = 3; */ -.float spider_web_delay; - void M_Spider_Attack_Web_Explode() {SELFPARAM(); entity e; @@ -112,23 +157,14 @@ bool M_Spider_Attack(int attack_type, entity targ) {SELFPARAM(); switch(attack_type) { + Weapon wep = WEP_SPIDER_ATTACK; case MONSTER_ATTACK_MELEE: { - return Monster_Attack_Melee(self.enemy, (autocvar_g_monster_spider_attack_bite_damage), ((random() > 0.5) ? self.anim_melee : self.anim_shoot), self.attack_range, (autocvar_g_monster_spider_attack_bite_delay), DEATH_MONSTER_SPIDER, true); + return wep.wr_think(wep, false, true); } case MONSTER_ATTACK_RANGED: { - if(time >= self.spider_web_delay) - { - setanim(self, self.anim_shoot, true, true, true); - self.attack_finished_single = time + (autocvar_g_monster_spider_attack_web_delay); - self.anim_finished = time + 1; - M_Spider_Attack_Web(); - self.spider_web_delay = time + 3; - return true; - } - - return false; + return wep.wr_think(wep, true, false); } } -- 2.39.2