X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fseeker.qc;h=55d6b4f7af125b411a0d6c528ac64890d6eb84cd;hb=c2d50c76c59b481a0b0e29a205f5e0dfc9f95630;hp=b79bb081e25e76a26fc98b2e2ed6e4459e54b823;hpb=96e1acc3050bcb718e2f06702e5b88a60459a015;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapon/seeker.qc b/qcsrc/common/weapons/weapon/seeker.qc index b79bb081e..55d6b4f7a 100644 --- a/qcsrc/common/weapons/weapon/seeker.qc +++ b/qcsrc/common/weapons/weapon/seeker.qc @@ -1,95 +1,100 @@ #ifndef IMPLEMENTATION -REGISTER_WEAPON( -/* WEP_##id */ SEEKER, -/* function */ W_Seeker, -/* ammotype */ ammo_rockets, -/* impulse */ 8, -/* flags */ WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH, -/* rating */ BOT_PICKUP_RATING_MID, -/* color */ '0.5 1 0', -/* modelname */ "seeker", -/* simplemdl */ "foobar", -/* crosshair */ "gfx/crosshairseeker 0.8", -/* wepimg */ "weaponseeker", -/* refname */ "seeker", -/* wepname */ _("T.A.G. Seeker") -); - -#define SEEKER_SETTINGS(w_cvar,w_prop) SEEKER_SETTINGS_LIST(w_cvar, w_prop, SEEKER, seeker) -#define SEEKER_SETTINGS_LIST(w_cvar,w_prop,id,sn) \ - w_cvar(id, sn, NONE, type) \ - w_cvar(id, sn, NONE, flac_ammo) \ - w_cvar(id, sn, NONE, flac_animtime) \ - w_cvar(id, sn, NONE, flac_damage) \ - w_cvar(id, sn, NONE, flac_edgedamage) \ - w_cvar(id, sn, NONE, flac_force) \ - w_cvar(id, sn, NONE, flac_lifetime) \ - w_cvar(id, sn, NONE, flac_lifetime_rand) \ - w_cvar(id, sn, NONE, flac_radius) \ - w_cvar(id, sn, NONE, flac_refire) \ - w_cvar(id, sn, NONE, flac_speed) \ - w_cvar(id, sn, NONE, flac_speed_up) \ - w_cvar(id, sn, NONE, flac_speed_z) \ - w_cvar(id, sn, NONE, flac_spread) \ - w_cvar(id, sn, NONE, missile_accel) \ - w_cvar(id, sn, NONE, missile_ammo) \ - w_cvar(id, sn, NONE, missile_animtime) \ - w_cvar(id, sn, NONE, missile_count) \ - w_cvar(id, sn, NONE, missile_damage) \ - w_cvar(id, sn, NONE, missile_damageforcescale) \ - w_cvar(id, sn, NONE, missile_decel) \ - w_cvar(id, sn, NONE, missile_delay) \ - w_cvar(id, sn, NONE, missile_edgedamage) \ - w_cvar(id, sn, NONE, missile_force) \ - w_cvar(id, sn, NONE, missile_health) \ - w_cvar(id, sn, NONE, missile_lifetime) \ - w_cvar(id, sn, NONE, missile_proxy) \ - w_cvar(id, sn, NONE, missile_proxy_delay) \ - w_cvar(id, sn, NONE, missile_proxy_maxrange) \ - w_cvar(id, sn, NONE, missile_radius) \ - w_cvar(id, sn, NONE, missile_refire) \ - w_cvar(id, sn, NONE, missile_smart) \ - w_cvar(id, sn, NONE, missile_smart_mindist) \ - w_cvar(id, sn, NONE, missile_smart_trace_max) \ - w_cvar(id, sn, NONE, missile_smart_trace_min) \ - w_cvar(id, sn, NONE, missile_speed) \ - w_cvar(id, sn, NONE, missile_speed_max) \ - w_cvar(id, sn, NONE, missile_speed_up) \ - w_cvar(id, sn, NONE, missile_speed_z) \ - w_cvar(id, sn, NONE, missile_spread) \ - w_cvar(id, sn, NONE, missile_turnrate) \ - w_cvar(id, sn, NONE, tag_ammo) \ - w_cvar(id, sn, NONE, tag_animtime) \ - w_cvar(id, sn, NONE, tag_damageforcescale) \ - w_cvar(id, sn, NONE, tag_health) \ - w_cvar(id, sn, NONE, tag_lifetime) \ - w_cvar(id, sn, NONE, tag_refire) \ - w_cvar(id, sn, NONE, tag_speed) \ - w_cvar(id, sn, NONE, tag_spread) \ - w_cvar(id, sn, NONE, tag_tracker_lifetime) \ - w_prop(id, sn, float, reloading_ammo, reload_ammo) \ - w_prop(id, sn, float, reloading_time, reload_time) \ - w_prop(id, sn, float, switchdelay_raise, switchdelay_raise) \ - w_prop(id, sn, float, switchdelay_drop, switchdelay_drop) \ - w_prop(id, sn, string, weaponreplace, weaponreplace) \ - w_prop(id, sn, float, weaponstart, weaponstart) \ - w_prop(id, sn, float, weaponstartoverride, weaponstartoverride) \ - w_prop(id, sn, float, weaponthrowable, weaponthrowable) +CLASS(Seeker, Weapon) +/* ammotype */ ATTRIB(Seeker, ammo_field, .int, ammo_rockets) +/* impulse */ ATTRIB(Seeker, impulse, int, 8) +/* flags */ ATTRIB(Seeker, spawnflags, int, WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH); +/* rating */ ATTRIB(Seeker, bot_pickupbasevalue, float, BOT_PICKUP_RATING_HIGH); +/* color */ ATTRIB(Seeker, wpcolor, vector, '0.5 1 0'); +/* modelname */ ATTRIB(Seeker, mdl, string, "seeker"); +#ifndef MENUQC +/* model */ ATTRIB(Seeker, m_model, Model, MDL_SEEKER_ITEM); +#endif +/* crosshair */ ATTRIB(Seeker, w_crosshair, string, "gfx/crosshairseeker"); +/* crosshair */ ATTRIB(Seeker, w_crosshair_size, float, 0.8); +/* wepimg */ ATTRIB(Seeker, model2, string, "weaponseeker"); +/* refname */ ATTRIB(Seeker, netname, string, "seeker"); +/* wepname */ ATTRIB(Seeker, m_name, string, _("T.A.G. Seeker")); + +#define X(BEGIN, P, END, class, prefix) \ + BEGIN(class) \ + P(class, prefix, flac_ammo, float, NONE) \ + P(class, prefix, flac_animtime, float, NONE) \ + P(class, prefix, flac_damage, float, NONE) \ + P(class, prefix, flac_edgedamage, float, NONE) \ + P(class, prefix, flac_force, float, NONE) \ + P(class, prefix, flac_lifetime, float, NONE) \ + P(class, prefix, flac_lifetime_rand, float, NONE) \ + P(class, prefix, flac_radius, float, NONE) \ + P(class, prefix, flac_refire, float, NONE) \ + P(class, prefix, flac_speed, float, NONE) \ + P(class, prefix, flac_speed_up, float, NONE) \ + P(class, prefix, flac_speed_z, float, NONE) \ + P(class, prefix, flac_spread, float, NONE) \ + P(class, prefix, missile_accel, float, NONE) \ + P(class, prefix, missile_ammo, float, NONE) \ + P(class, prefix, missile_animtime, float, NONE) \ + P(class, prefix, missile_count, float, NONE) \ + P(class, prefix, missile_damageforcescale, float, NONE) \ + P(class, prefix, missile_damage, float, NONE) \ + P(class, prefix, missile_decel, float, NONE) \ + P(class, prefix, missile_delay, float, NONE) \ + P(class, prefix, missile_edgedamage, float, NONE) \ + P(class, prefix, missile_force, float, NONE) \ + P(class, prefix, missile_health, float, NONE) \ + P(class, prefix, missile_lifetime, float, NONE) \ + P(class, prefix, missile_proxy, float, NONE) \ + P(class, prefix, missile_proxy_delay, float, NONE) \ + P(class, prefix, missile_proxy_maxrange, float, NONE) \ + P(class, prefix, missile_radius, float, NONE) \ + P(class, prefix, missile_refire, float, NONE) \ + P(class, prefix, missile_smart, float, NONE) \ + P(class, prefix, missile_smart_mindist, float, NONE) \ + P(class, prefix, missile_smart_trace_max, float, NONE) \ + P(class, prefix, missile_smart_trace_min, float, NONE) \ + P(class, prefix, missile_speed, float, NONE) \ + P(class, prefix, missile_speed_max, float, NONE) \ + P(class, prefix, missile_speed_up, float, NONE) \ + P(class, prefix, missile_speed_z, float, NONE) \ + P(class, prefix, missile_spread, float, NONE) \ + P(class, prefix, missile_turnrate, float, NONE) \ + P(class, prefix, reload_ammo, float, NONE) \ + P(class, prefix, reload_time, float, NONE) \ + P(class, prefix, switchdelay_drop, float, NONE) \ + P(class, prefix, switchdelay_raise, float, NONE) \ + P(class, prefix, tag_ammo, float, NONE) \ + P(class, prefix, tag_animtime, float, NONE) \ + P(class, prefix, tag_damageforcescale, float, NONE) \ + P(class, prefix, tag_health, float, NONE) \ + P(class, prefix, tag_lifetime, float, NONE) \ + P(class, prefix, tag_refire, float, NONE) \ + P(class, prefix, tag_speed, float, NONE) \ + P(class, prefix, tag_spread, float, NONE) \ + P(class, prefix, tag_tracker_lifetime, float, NONE) \ + P(class, prefix, type, float, NONE) \ + P(class, prefix, weaponreplace, string, NONE) \ + P(class, prefix, weaponstartoverride, float, NONE) \ + P(class, prefix, weaponstart, float, NONE) \ + P(class, prefix, weaponthrowable, float, NONE) \ + END() + W_PROPS(X, Seeker, seeker) +#undef X +ENDCLASS(Seeker) +REGISTER_WEAPON(SEEKER, seeker, NEW(Seeker)); + #ifdef SVQC -SEEKER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) .entity tag_target, wps_tag_tracker; .float tag_time; #endif #endif #ifdef IMPLEMENTATION #ifdef SVQC -void spawnfunc_weapon_seeker(void) { weapon_defaultspawnfunc(WEP_SEEKER.m_id); } +spawnfunc(weapon_seeker) { weapon_defaultspawnfunc(this, WEP_SEEKER); } // ============================ // Begin: Missile functions, these are general functions to be manipulated by other code // ============================ -void W_Seeker_Missile_Explode(void) +void W_Seeker_Missile_Explode() {SELFPARAM(); self.event_damage = func_null; RadiusDamage(self, self.realowner, WEP_CVAR(seeker, missile_damage), WEP_CVAR(seeker, missile_edgedamage), WEP_CVAR(seeker, missile_radius), world, world, WEP_CVAR(seeker, missile_force), self.projectiledeathtype, other); @@ -97,14 +102,14 @@ void W_Seeker_Missile_Explode(void) remove(self); } -void W_Seeker_Missile_Touch(void) +void W_Seeker_Missile_Touch() { PROJECTILE_TOUCH; W_Seeker_Missile_Explode(); } -void W_Seeker_Missile_Think(void) +void W_Seeker_Missile_Think() {SELFPARAM(); entity e; vector desireddir, olddir, newdir, eorg; @@ -219,7 +224,7 @@ void W_Seeker_Missile_Damage(entity inflictor, entity attacker, float damage, in } /* -void W_Seeker_Missile_Animate(void) +void W_Seeker_Missile_Animate() { self.frame = self.frame +1; self.nextthink = time + 0.05; @@ -243,11 +248,11 @@ void W_Seeker_Missile_Animate(void) } */ -void W_Seeker_Fire_Missile(vector f_diff, entity m_target) +void W_Seeker_Fire_Missile(Weapon thiswep, vector f_diff, entity m_target) {SELFPARAM(); entity missile; - W_DecreaseAmmo(WEP_CVAR(seeker, missile_ammo)); + W_DecreaseAmmo(thiswep, self, WEP_CVAR(seeker, missile_ammo)); makevectors(self.v_angle); W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, SND(SEEKER_FIRE), CH_WEAPON_A, 0); @@ -256,9 +261,8 @@ void W_Seeker_Fire_Missile(vector f_diff, entity m_target) //self.detornator = false; - missile = spawn(); + missile = new(seeker_missile); missile.owner = missile.realowner = self; - missile.classname = "seeker_missile"; missile.bot_dodge = true; missile.bot_dodgerating = WEP_CVAR(seeker, missile_damage); @@ -300,7 +304,7 @@ void W_Seeker_Fire_Missile(vector f_diff, entity m_target) // ============================ // Begin: FLAC, close range attack meant for defeating rockets which are coming at you. // ============================ -void W_Seeker_Flac_Explode(void) +void W_Seeker_Flac_Explode() {SELFPARAM(); self.event_damage = func_null; @@ -309,20 +313,20 @@ void W_Seeker_Flac_Explode(void) remove(self); } -void W_Seeker_Flac_Touch(void) +void W_Seeker_Flac_Touch() { PROJECTILE_TOUCH; W_Seeker_Flac_Explode(); } -void W_Seeker_Fire_Flac(void) +void W_Seeker_Fire_Flac(Weapon thiswep) {SELFPARAM(); entity missile; vector f_diff; float c; - W_DecreaseAmmo(WEP_CVAR(seeker, flac_ammo)); + W_DecreaseAmmo(thiswep, self, WEP_CVAR(seeker, flac_ammo)); c = self.bulletcounter % 4; switch(c) @@ -346,9 +350,8 @@ void W_Seeker_Fire_Flac(void) Send_Effect(EFFECT_HAGAR_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); - missile = spawn(); + missile = new(missile); missile.owner = missile.realowner = self; - missile.classname = "missile"; missile.bot_dodge = true; missile.bot_dodgerating = WEP_CVAR(seeker, flac_damage); missile.touch = W_Seeker_Flac_Explode; @@ -388,7 +391,7 @@ entity W_Seeker_Tagged_Info(entity isowner, entity istarget) return world; } -void W_Seeker_Attack(void) +void W_Seeker_Attack() {SELFPARAM(); entity tracker, closest_target; @@ -408,16 +411,17 @@ void W_Seeker_Attack(void) if((!closest_target) || ((trace_fraction < 1) && (trace_ent != closest_target))) closest_target = world; - W_Seeker_Fire_Missile('0 0 0', closest_target); + W_Seeker_Fire_Missile(WEP_SEEKER, '0 0 0', closest_target); } -void W_Seeker_Vollycontroller_Think(void) // TODO: Merge this with W_Seeker_Attack +void W_Seeker_Vollycontroller_Think() // TODO: Merge this with W_Seeker_Attack {SELFPARAM(); float c; entity oldenemy; self.cnt = self.cnt - 1; - if((!(self.realowner.items & IT_UNLIMITED_AMMO) && self.realowner.WEP_AMMO(SEEKER) < WEP_CVAR(seeker, missile_ammo)) || (self.cnt <= -1) || (self.realowner.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER.m_id)) + Weapon thiswep = WEP_SEEKER; + if((!(self.realowner.items & IT_UNLIMITED_AMMO) && self.realowner.(thiswep.ammo_field) < WEP_CVAR(seeker, missile_ammo)) || (self.cnt <= -1) || (self.realowner.deadflag != DEAD_NO) || (PS(self.realowner).m_switchweapon != WEP_SEEKER)) { remove(self); return; @@ -434,17 +438,17 @@ void W_Seeker_Vollycontroller_Think(void) // TODO: Merge this with W_Seeker_Atta switch(c) { case 0: - W_Seeker_Fire_Missile('-1.25 -3.75 0', self.enemy); + W_Seeker_Fire_Missile(WEP_SEEKER, '-1.25 -3.75 0', self.enemy); break; case 1: - W_Seeker_Fire_Missile('+1.25 -3.75 0', self.enemy); + W_Seeker_Fire_Missile(WEP_SEEKER, '+1.25 -3.75 0', self.enemy); break; case 2: - W_Seeker_Fire_Missile('-1.25 +3.75 0', self.enemy); + W_Seeker_Fire_Missile(WEP_SEEKER, '-1.25 +3.75 0', self.enemy); break; case 3: default: - W_Seeker_Fire_Missile('+1.25 +3.75 0', self.enemy); + W_Seeker_Fire_Missile(WEP_SEEKER, '+1.25 +3.75 0', self.enemy); break; } @@ -452,10 +456,10 @@ void W_Seeker_Vollycontroller_Think(void) // TODO: Merge this with W_Seeker_Atta setself(this); } -void W_Seeker_Tracker_Think(void) +void W_Seeker_Tracker_Think() {SELFPARAM(); // commit suicide if: You die OR target dies OR you switch away from the seeker OR commit suicide if lifetime is up - if((self.realowner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (self.realowner.switchweapon != WEP_SEEKER.m_id) + if((self.realowner.deadflag != DEAD_NO) || (self.tag_target.deadflag != DEAD_NO) || (PS(self.realowner).m_switchweapon != WEP_SEEKER) || (time > self.tag_time + WEP_CVAR(seeker, tag_tracker_lifetime))) { if(self) @@ -473,7 +477,7 @@ void W_Seeker_Tracker_Think(void) // ============================ // Begin: Tag projectile // ============================ -void W_Seeker_Tag_Explode(void) +void W_Seeker_Tag_Explode() {SELFPARAM(); //if(other==self.realowner) // return; @@ -491,7 +495,7 @@ void W_Seeker_Tag_Damage(entity inflictor, entity attacker, float damage, int de W_Seeker_Tag_Explode(); } -void W_Seeker_Tag_Touch(void) +void W_Seeker_Tag_Touch() {SELFPARAM(); vector dir; vector org2; @@ -522,9 +526,8 @@ void W_Seeker_Tag_Touch(void) else { //sprint(self.realowner, strcat("You just tagged ^2", other.netname, "^7 with a tracking device!\n")); - e = spawn(); + e = new(tag_tracker); e.cnt = WEP_CVAR(seeker, missile_count); - e.classname = "tag_tracker"; e.owner = self.owner; e.realowner = self.realowner; @@ -554,20 +557,19 @@ void W_Seeker_Tag_Touch(void) return; } -void W_Seeker_Fire_Tag(void) +void W_Seeker_Fire_Tag(Weapon thiswep) {SELFPARAM(); entity missile; - W_DecreaseAmmo(WEP_CVAR(seeker, tag_ammo)); + W_DecreaseAmmo(thiswep, self, WEP_CVAR(seeker, tag_ammo)); W_SetupShot_ProjectileSize(self, '-2 -2 -2', '2 2 2', false, 2, SND(TAG_FIRE), CH_WEAPON_A, WEP_CVAR(seeker, missile_damage) * WEP_CVAR(seeker, missile_count)); - missile = spawn(); + missile = new(seeker_tag); missile.owner = missile.realowner = self; - missile.classname = "seeker_tag"; missile.bot_dodge = true; missile.bot_dodgerating = 50; missile.touch = W_Seeker_Tag_Touch; - missile.think = SUB_Remove; + missile.think = SUB_Remove_self; missile.nextthink = time + WEP_CVAR(seeker, tag_lifetime); missile.movetype = MOVETYPE_FLY; missile.solid = SOLID_BBOX; @@ -596,13 +598,7 @@ void W_Seeker_Fire_Tag(void) // Begin: Genereal weapon functions // ============================ -bool W_Seeker(int req) -{SELFPARAM(); - float ammo_amount; - - switch(req) - { - case WR_AIM: + METHOD(Seeker, wr_aim, void(entity thiswep)) { if(WEP_CVAR(seeker, type) == 1) if(W_Seeker_Tagged_Info(self, self.enemy) != world) @@ -611,119 +607,101 @@ bool W_Seeker(int req) self.BUTTON_ATCK2 = bot_aim(WEP_CVAR(seeker, tag_speed), 0, WEP_CVAR(seeker, tag_lifetime), false); else self.BUTTON_ATCK = bot_aim(WEP_CVAR(seeker, tag_speed), 0, WEP_CVAR(seeker, tag_lifetime), false); - return true; } - case WR_THINK: + METHOD(Seeker, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { - if(autocvar_g_balance_seeker_reload_ammo && self.clip_load < min(WEP_CVAR(seeker, missile_ammo), WEP_CVAR(seeker, tag_ammo))) // forced reload - WEP_ACTION(self.weapon, WR_RELOAD); - - else if(self.BUTTON_ATCK) + if(autocvar_g_balance_seeker_reload_ammo && actor.clip_load < min(WEP_CVAR(seeker, missile_ammo), WEP_CVAR(seeker, tag_ammo))) { // forced reload + thiswep.wr_reload(thiswep); + } else if(fire & 1) { if(WEP_CVAR(seeker, type) == 1) { - if(weapon_prepareattack(0, WEP_CVAR(seeker, missile_refire))) + if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR(seeker, missile_refire))) { W_Seeker_Attack(); - weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(seeker, missile_animtime), w_ready); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(seeker, missile_animtime), w_ready); } } else { - if(weapon_prepareattack(0, WEP_CVAR(seeker, tag_refire))) + if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR(seeker, tag_refire))) { - W_Seeker_Fire_Tag(); - weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(seeker, tag_animtime), w_ready); + W_Seeker_Fire_Tag(thiswep); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(seeker, tag_animtime), w_ready); } } } - else if(self.BUTTON_ATCK2) + else if(fire & 2) { if(WEP_CVAR(seeker, type) == 1) { - if(weapon_prepareattack(0, WEP_CVAR(seeker, tag_refire))) + if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR(seeker, tag_refire))) { - W_Seeker_Fire_Tag(); - weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(seeker, tag_animtime), w_ready); + W_Seeker_Fire_Tag(thiswep); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(seeker, tag_animtime), w_ready); } } else { - if(weapon_prepareattack(0, WEP_CVAR(seeker, flac_refire))) + if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR(seeker, flac_refire))) { - W_Seeker_Fire_Flac(); - weapon_thinkf(WFRAME_FIRE2, WEP_CVAR(seeker, flac_animtime), w_ready); + W_Seeker_Fire_Flac(thiswep); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR(seeker, flac_animtime), w_ready); } } } - - return true; - } - case WR_INIT: - { - SEEKER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP); - return true; } - case WR_CHECKAMMO1: + METHOD(Seeker, wr_checkammo1, bool(entity thiswep)) { + float ammo_amount; if(WEP_CVAR(seeker, type) == 1) { - ammo_amount = self.WEP_AMMO(SEEKER) >= WEP_CVAR(seeker, missile_ammo); + ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR(seeker, missile_ammo); ammo_amount += self.(weapon_load[WEP_SEEKER.m_id]) >= WEP_CVAR(seeker, missile_ammo); } else { - ammo_amount = self.WEP_AMMO(SEEKER) >= WEP_CVAR(seeker, tag_ammo); + ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR(seeker, tag_ammo); ammo_amount += self.(weapon_load[WEP_SEEKER.m_id]) >= WEP_CVAR(seeker, tag_ammo); } return ammo_amount; } - case WR_CHECKAMMO2: + METHOD(Seeker, wr_checkammo2, bool(entity thiswep)) { + float ammo_amount; if(WEP_CVAR(seeker, type) == 1) { - ammo_amount = self.WEP_AMMO(SEEKER) >= WEP_CVAR(seeker, tag_ammo); + ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR(seeker, tag_ammo); ammo_amount += self.(weapon_load[WEP_SEEKER.m_id]) >= WEP_CVAR(seeker, tag_ammo); } else { - ammo_amount = self.WEP_AMMO(SEEKER) >= WEP_CVAR(seeker, flac_ammo); + ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR(seeker, flac_ammo); ammo_amount += self.(weapon_load[WEP_SEEKER.m_id]) >= WEP_CVAR(seeker, flac_ammo); } return ammo_amount; } - case WR_CONFIG: + METHOD(Seeker, wr_reload, void(entity thiswep)) { - SEEKER_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS); - return true; + W_Reload(self, min(WEP_CVAR(seeker, missile_ammo), WEP_CVAR(seeker, tag_ammo)), SND(RELOAD)); } - case WR_RELOAD: - { - W_Reload(min(WEP_CVAR(seeker, missile_ammo), WEP_CVAR(seeker, tag_ammo)), SND(RELOAD)); - return true; - } - case WR_SUICIDEMESSAGE: + METHOD(Seeker, wr_suicidemessage, int(entity thiswep)) { return WEAPON_SEEKER_SUICIDE; } - case WR_KILLMESSAGE: + METHOD(Seeker, wr_killmessage, int(entity thiswep)) { if(w_deathtype & HITTYPE_SECONDARY) return WEAPON_SEEKER_MURDER_TAG; else return WEAPON_SEEKER_MURDER_SPRAY; } - } - return false; -} + #endif #ifdef CSQC -bool W_Seeker(int req) -{SELFPARAM(); - switch(req) - { - case WR_IMPACTEFFECT: + + METHOD(Seeker, wr_impacteffect, void(entity thiswep)) { vector org2; org2 = w_org + w_backoff * 6; @@ -736,7 +714,7 @@ bool W_Seeker(int req) } else { - pointparticles(particleeffectnum(EFFECT_HAGAR_EXPLODE), org2, '0 0 0', 1); + pointparticles(EFFECT_HAGAR_EXPLODE, org2, '0 0 0', 1); if(!w_issilent) { if(w_random<0.15) @@ -750,7 +728,7 @@ bool W_Seeker(int req) } else { - pointparticles(particleeffectnum(EFFECT_HAGAR_EXPLODE), org2, '0 0 0', 1); + pointparticles(EFFECT_HAGAR_EXPLODE, org2, '0 0 0', 1); if(!w_issilent) { if(w_random<0.15) @@ -761,19 +739,7 @@ bool W_Seeker(int req) sound(self, CH_SHOTS, SND_SEEKEREXP3, 1, ATTEN_NORM); } } - return true; - } - case WR_INIT: - { - return true; - } - case WR_ZOOMRETICLE: - { - // no weapon specific image for this weapon - return false; } - } - return false; -} + #endif #endif