X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fminelayer.qc;h=17ef5847ae0cc6990fa50298cf14b22321759163;hb=1ea8c661cdeaf9f56c9088c64dd3a7e8384cb6b0;hp=0ca67ab9a98bfba6778a9ef97f8b988a30767e86;hpb=be91ef701b96453388cdcfb40f561281076ef52d;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapon/minelayer.qc b/qcsrc/common/weapons/weapon/minelayer.qc index 0ca67ab9a..17ef5847a 100644 --- a/qcsrc/common/weapons/weapon/minelayer.qc +++ b/qcsrc/common/weapons/weapon/minelayer.qc @@ -13,45 +13,47 @@ CLASS(MineLayer, Weapon) /* crosshair */ ATTRIB(MineLayer, w_crosshair_size, float, 0.9); /* wepimg */ ATTRIB(MineLayer, model2, string, "weaponminelayer"); /* refname */ ATTRIB(MineLayer, netname, string, "minelayer"); -/* wepname */ ATTRIB(MineLayer, message, string, _("Mine Layer")); +/* wepname */ ATTRIB(MineLayer, m_name, string, _("Mine Layer")); + +#define X(BEGIN, P, END, class, prefix) \ + BEGIN(class) \ + P(class, prefix, ammo, float, NONE) \ + P(class, prefix, animtime, float, NONE) \ + P(class, prefix, damageforcescale, float, NONE) \ + P(class, prefix, damage, float, NONE) \ + P(class, prefix, detonatedelay, float, NONE) \ + P(class, prefix, edgedamage, float, NONE) \ + P(class, prefix, force, float, NONE) \ + P(class, prefix, health, float, NONE) \ + P(class, prefix, lifetime, float, NONE) \ + P(class, prefix, lifetime_countdown, float, NONE) \ + P(class, prefix, limit, float, NONE) \ + P(class, prefix, protection, float, NONE) \ + P(class, prefix, proximityradius, float, NONE) \ + P(class, prefix, radius, float, NONE) \ + P(class, prefix, refire, float, NONE) \ + P(class, prefix, reload_ammo, float, NONE) \ + P(class, prefix, reload_time, float, NONE) \ + P(class, prefix, remote_damage, float, NONE) \ + P(class, prefix, remote_edgedamage, float, NONE) \ + P(class, prefix, remote_force, float, NONE) \ + P(class, prefix, remote_radius, float, NONE) \ + P(class, prefix, speed, float, NONE) \ + P(class, prefix, switchdelay_drop, float, NONE) \ + P(class, prefix, switchdelay_raise, float, NONE) \ + P(class, prefix, time, 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, MineLayer, minelayer) +#undef X ENDCLASS(MineLayer) -REGISTER_WEAPON(MINE_LAYER, NEW(MineLayer)); - -#define MINELAYER_SETTINGS(w_cvar,w_prop) MINELAYER_SETTINGS_LIST(w_cvar, w_prop, MINE_LAYER, minelayer) -#define MINELAYER_SETTINGS_LIST(w_cvar,w_prop,id,sn) \ - w_cvar(id, sn, NONE, ammo) \ - w_cvar(id, sn, NONE, animtime) \ - w_cvar(id, sn, NONE, damage) \ - w_cvar(id, sn, NONE, damageforcescale) \ - w_cvar(id, sn, NONE, detonatedelay) \ - w_cvar(id, sn, NONE, edgedamage) \ - w_cvar(id, sn, NONE, force) \ - w_cvar(id, sn, NONE, health) \ - w_cvar(id, sn, NONE, lifetime) \ - w_cvar(id, sn, NONE, lifetime_countdown) \ - w_cvar(id, sn, NONE, limit) \ - w_cvar(id, sn, NONE, protection) \ - w_cvar(id, sn, NONE, proximityradius) \ - w_cvar(id, sn, NONE, radius) \ - w_cvar(id, sn, NONE, refire) \ - w_cvar(id, sn, NONE, remote_damage) \ - w_cvar(id, sn, NONE, remote_edgedamage) \ - w_cvar(id, sn, NONE, remote_force) \ - w_cvar(id, sn, NONE, remote_radius) \ - w_cvar(id, sn, NONE, speed) \ - w_cvar(id, sn, NONE, time) \ - 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) +REGISTER_WEAPON(MINE_LAYER, minelayer, NEW(MineLayer)); #ifdef SVQC -MINELAYER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) -void W_MineLayer_Think(void); +void W_MineLayer_Think(); .float minelayer_detonate, mine_explodeanyway; .float mine_time; .vector mine_orientation; @@ -59,7 +61,7 @@ void W_MineLayer_Think(void); #endif #ifdef IMPLEMENTATION #ifdef SVQC -void spawnfunc_weapon_minelayer(void) { weapon_defaultspawnfunc(WEP_MINE_LAYER.m_id); } +spawnfunc(weapon_minelayer) { weapon_defaultspawnfunc(this, WEP_MINE_LAYER); } void W_MineLayer_Stick(entity to) {SELFPARAM(); @@ -67,8 +69,7 @@ void W_MineLayer_Stick(entity to) // in order for mines to face properly when sticking to the ground, they must be a server side entity rather than a csqc projectile - entity newmine; - newmine = spawn(); + entity newmine = spawn(); newmine.classname = self.classname; newmine.bot_dodge = self.bot_dodge; @@ -108,7 +109,7 @@ void W_MineLayer_Stick(entity to) SetMovetypeFollow(self, to); } -void W_MineLayer_Explode(void) +void W_MineLayer_Explode() {SELFPARAM(); if(other.takedamage == DAMAGE_AIM) if(IS_PLAYER(other)) @@ -122,15 +123,16 @@ void W_MineLayer_Explode(void) RadiusDamage(self, self.realowner, WEP_CVAR(minelayer, damage), WEP_CVAR(minelayer, edgedamage), WEP_CVAR(minelayer, radius), world, world, WEP_CVAR(minelayer, force), self.projectiledeathtype, other); - if(self.realowner.weapon == WEP_MINE_LAYER.m_id) + if(PS(self.realowner).m_weapon == WEP_MINE_LAYER) { setself(self.realowner); Weapon w = WEP_MINE_LAYER; if(!w.wr_checkammo1(w)) { self.cnt = WEP_MINE_LAYER.m_id; - ATTACK_FINISHED(self) = time; - self.switchweapon = w_getbestweapon(self); + int slot = 0; // TODO: unhardcode + ATTACK_FINISHED(self, slot) = time; + PS(self).m_switchweapon = w_getbestweapon(self); } setself(this); } @@ -138,7 +140,7 @@ void W_MineLayer_Explode(void) remove(self); } -void W_MineLayer_DoRemoteExplode(void) +void W_MineLayer_DoRemoteExplode() {SELFPARAM(); self.event_damage = func_null; self.takedamage = DAMAGE_NO; @@ -148,15 +150,16 @@ void W_MineLayer_DoRemoteExplode(void) RadiusDamage(self, self.realowner, WEP_CVAR(minelayer, remote_damage), WEP_CVAR(minelayer, remote_edgedamage), WEP_CVAR(minelayer, remote_radius), world, world, WEP_CVAR(minelayer, remote_force), self.projectiledeathtype | HITTYPE_BOUNCE, world); - if(self.realowner.weapon == WEP_MINE_LAYER.m_id) + if(PS(self.realowner).m_weapon == WEP_MINE_LAYER) { setself(self.realowner); Weapon w = WEP_MINE_LAYER; if(!w.wr_checkammo1(w)) { self.cnt = WEP_MINE_LAYER.m_id; - ATTACK_FINISHED(self) = time; - self.switchweapon = w_getbestweapon(self); + int slot = 0; // TODO: unhardcode + ATTACK_FINISHED(self, slot) = time; + PS(self).m_switchweapon = w_getbestweapon(self); } setself(this); } @@ -164,7 +167,7 @@ void W_MineLayer_DoRemoteExplode(void) remove(self); } -void W_MineLayer_RemoteExplode(void) +void W_MineLayer_RemoteExplode() {SELFPARAM(); if(self.realowner.deadflag == DEAD_NO) if((self.spawnshieldtime >= 0) @@ -176,7 +179,7 @@ void W_MineLayer_RemoteExplode(void) } } -void W_MineLayer_ProximityExplode(void) +void W_MineLayer_ProximityExplode() {SELFPARAM(); // make sure no friend is in the mine's radius. If there is any, explosion is delayed until he's at a safe distance if(WEP_CVAR(minelayer, protection) && self.mine_explodeanyway == 0) @@ -205,7 +208,7 @@ int W_MineLayer_Count(entity e) return minecount; } -void W_MineLayer_Think(void) +void W_MineLayer_Think() {SELFPARAM(); entity head; @@ -262,13 +265,13 @@ void W_MineLayer_Think(void) } // remote detonation - if(self.realowner.weapon == WEP_MINE_LAYER.m_id) + if(PS(self.realowner).m_weapon == WEP_MINE_LAYER) if(self.realowner.deadflag == DEAD_NO) if(self.minelayer_detonate) W_MineLayer_RemoteExplode(); } -void W_MineLayer_Touch(void) +void W_MineLayer_Touch() {SELFPARAM(); if(self.movetype == MOVETYPE_NONE || self.movetype == MOVETYPE_FOLLOW) return; // we're already a stuck mine, why do we get called? TODO does this even happen? @@ -325,7 +328,7 @@ void W_MineLayer_Attack(Weapon thiswep) } } - W_DecreaseAmmo(thiswep, WEP_CVAR(minelayer, ammo)); + W_DecreaseAmmo(thiswep, self, WEP_CVAR(minelayer, ammo)); W_SetupShot_ProjectileSize(self, '-4 -4 -4', '4 4 4', false, 5, SND(MINE_FIRE), CH_WEAPON_A, WEP_CVAR(minelayer, damage)); Send_Effect(EFFECT_ROCKET_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); @@ -371,7 +374,7 @@ void W_MineLayer_Attack(Weapon thiswep) setmodel(flash, MDL_MINELAYER_MUZZLEFLASH); // precision set below SUB_SetFade(flash, time, 0.1); flash.effects = EF_ADDITIVE | EF_FULLBRIGHT | EF_LOWPRECISION; - W_AttachToShotorg(flash, '5 0 0'); + W_AttachToShotorg(self, flash, '5 0 0'); // common properties @@ -499,41 +502,37 @@ float W_MineLayer_PlacedMines(float detonate) if(self.BUTTON_ATCK2 == true) self.BUTTON_ATCK = false; } } - METHOD(MineLayer, wr_think, void(entity thiswep, bool fire1, bool fire2)) + METHOD(MineLayer, wr_think, void(entity thiswep, entity actor, .entity weaponentity, int fire)) { - if(autocvar_g_balance_minelayer_reload_ammo && self.clip_load < WEP_CVAR(minelayer, ammo)) // forced reload + if(autocvar_g_balance_minelayer_reload_ammo && actor.clip_load < WEP_CVAR(minelayer, ammo)) // forced reload { // not if we're holding the minelayer without enough ammo, but can detonate existing mines - if(!(W_MineLayer_PlacedMines(false) && self.WEP_AMMO(MINE_LAYER) < WEP_CVAR(minelayer, ammo))) { - Weapon w = get_weaponinfo(self.weapon); - w.wr_reload(w); + if(!(W_MineLayer_PlacedMines(false) && actor.(thiswep.ammo_field) < WEP_CVAR(minelayer, ammo))) { + thiswep.wr_reload(thiswep, actor, weaponentity); } } - else if(fire1) + else if(fire & 1) { - if(weapon_prepareattack(false, WEP_CVAR(minelayer, refire))) + if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR(minelayer, refire))) { W_MineLayer_Attack(thiswep); - weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(minelayer, animtime), w_ready); + weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR(minelayer, animtime), w_ready); } } - if(fire2) + if(fire & 2) { if(W_MineLayer_PlacedMines(true)) - sound(self, CH_WEAPON_B, SND_MINE_DET, VOL_BASE, ATTN_NORM); + sound(actor, CH_WEAPON_B, SND_MINE_DET, VOL_BASE, ATTN_NORM); } } - METHOD(MineLayer, wr_init, void(entity thiswep)) - { - MINELAYER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP); - } METHOD(MineLayer, wr_checkammo1, bool(entity thiswep)) { + int slot = 0; // TODO: unhardcode // don't switch while placing a mine - if(ATTACK_FINISHED(self) <= time || self.weapon != WEP_MINE_LAYER.m_id) + if(ATTACK_FINISHED(self, slot) <= time || PS(self).m_weapon != WEP_MINE_LAYER) { - float ammo_amount = self.WEP_AMMO(MINE_LAYER) >= WEP_CVAR(minelayer, ammo); + float ammo_amount = self.(thiswep.ammo_field) >= WEP_CVAR(minelayer, ammo); ammo_amount += self.(weapon_load[WEP_MINE_LAYER.m_id]) >= WEP_CVAR(minelayer, ammo); return ammo_amount; } @@ -546,17 +545,13 @@ float W_MineLayer_PlacedMines(float detonate) else return false; } - METHOD(MineLayer, wr_config, void(entity thiswep)) - { - MINELAYER_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS); - } METHOD(MineLayer, wr_resetplayers, void(entity thiswep)) { self.minelayer_mines = 0; } - METHOD(MineLayer, wr_reload, void(entity thiswep)) + METHOD(MineLayer, wr_reload, void(entity thiswep, entity actor, .entity weaponentity)) { - W_Reload(WEP_CVAR(minelayer, ammo), SND(RELOAD)); + W_Reload(self, WEP_CVAR(minelayer, ammo), SND(RELOAD)); } METHOD(MineLayer, wr_suicidemessage, int(entity thiswep)) { @@ -574,7 +569,7 @@ float W_MineLayer_PlacedMines(float detonate) { vector org2; org2 = w_org + w_backoff * 12; - pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), org2, '0 0 0', 1); + pointparticles(EFFECT_ROCKET_EXPLODE, org2, '0 0 0', 1); if(!w_issilent) sound(self, CH_SHOTS, SND_MINE_EXP, VOL_BASE, ATTN_NORM); }