X-Git-Url: https://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fminelayer.qc;h=75cc7e4d706a2ef5b5e85ec647549f07d6f630fc;hp=40866970fb3438d3fd2fcd83cdc0bfeaccc05b76;hb=a8cc9eb71b0d0e44e9a968a9cf5554f6226cc838;hpb=1af8ea71282d19f66c96622815c68943eaa36aba diff --git a/qcsrc/common/weapons/weapon/minelayer.qc b/qcsrc/common/weapons/weapon/minelayer.qc index 40866970fb..75cc7e4d70 100644 --- a/qcsrc/common/weapons/weapon/minelayer.qc +++ b/qcsrc/common/weapons/weapon/minelayer.qc @@ -1,19 +1,21 @@ #ifndef IMPLEMENTATION -REGISTER_WEAPON( -/* WEP_##id */ MINE_LAYER, -/* function */ W_MineLayer, -/* ammotype */ ammo_rockets, -/* impulse */ 4, -/* flags */ WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH, -/* rating */ BOT_PICKUP_RATING_HIGH, -/* color */ '0.75 1 0', -/* modelname */ "minelayer", -/* simplemdl */ "foobar", -/* crosshair */ "gfx/crosshairminelayer 0.9", -/* wepimg */ "weaponminelayer", -/* refname */ "minelayer", -/* wepname */ _("Mine Layer") -); +CLASS(MineLayer, Weapon) +/* ammotype */ ATTRIB(MineLayer, ammo_field, .int, ammo_rockets) +/* impulse */ ATTRIB(MineLayer, impulse, int, 4) +/* flags */ ATTRIB(MineLayer, spawnflags, int, WEP_FLAG_MUTATORBLOCKED | WEP_FLAG_RELOADABLE | WEP_TYPE_SPLASH); +/* rating */ ATTRIB(MineLayer, bot_pickupbasevalue, float, BOT_PICKUP_RATING_HIGH); +/* color */ ATTRIB(MineLayer, wpcolor, vector, '0.75 1 0'); +/* modelname */ ATTRIB(MineLayer, mdl, string, "minelayer"); +#ifndef MENUQC +/* model */ ATTRIB(MineLayer, m_model, Model, MDL_MINELAYER_ITEM); +#endif +/* crosshair */ ATTRIB(MineLayer, w_crosshair, string, "gfx/crosshairminelayer"); +/* 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")); +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) \ @@ -123,7 +125,8 @@ void W_MineLayer_Explode(void) if(self.realowner.weapon == WEP_MINE_LAYER.m_id) { setself(self.realowner); - if(!WEP_ACTION(WEP_MINE_LAYER.m_id, WR_CHECKAMMO1)) + Weapon w = WEP_MINE_LAYER; + if(!w.wr_checkammo1(w)) { self.cnt = WEP_MINE_LAYER.m_id; ATTACK_FINISHED(self) = time; @@ -148,7 +151,8 @@ void W_MineLayer_DoRemoteExplode(void) if(self.realowner.weapon == WEP_MINE_LAYER.m_id) { setself(self.realowner); - if(!WEP_ACTION(WEP_MINE_LAYER.m_id, WR_CHECKAMMO1)) + Weapon w = WEP_MINE_LAYER; + if(!w.wr_checkammo1(w)) { self.cnt = WEP_MINE_LAYER.m_id; ATTACK_FINISHED(self) = time; @@ -304,7 +308,7 @@ void W_MineLayer_Damage(entity inflictor, entity attacker, float damage, int dea W_PrepareExplosionByDamage(attacker, W_MineLayer_Explode); } -void W_MineLayer_Attack(void) +void W_MineLayer_Attack(Weapon thiswep) {SELFPARAM(); entity mine; entity flash; @@ -321,7 +325,7 @@ void W_MineLayer_Attack(void) } } - W_DecreaseAmmo(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); @@ -367,7 +371,7 @@ void W_MineLayer_Attack(void) 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 @@ -397,13 +401,7 @@ float W_MineLayer_PlacedMines(float detonate) return minfound; } -bool W_MineLayer(int req) -{SELFPARAM(); - entity mine; - float ammo_amount; - switch(req) - { - case WR_AIM: + METHOD(MineLayer, wr_aim, void(entity thiswep)) { // aim and decide to fire if appropriate if(self.minelayer_mines >= WEP_CVAR(minelayer, limit)) @@ -424,7 +422,7 @@ bool W_MineLayer(int req) teamdamage = 0; enemydamage = 0; targetlist = findchainfloat(bot_attack, true); - mine = find(world, classname, "mine"); + entity mine = find(world, classname, "mine"); while(mine) { if(mine.realowner != self) @@ -500,110 +498,86 @@ bool W_MineLayer(int req) // dprint(ftos(desirabledamage),"\n"); if(self.BUTTON_ATCK2 == true) self.BUTTON_ATCK = false; } - - return true; } - case WR_THINK: + METHOD(MineLayer, wr_think, void(entity thiswep, entity actor, bool fire1, bool fire2)) { - 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))) - WEP_ACTION(self.weapon, WR_RELOAD); + if(!(W_MineLayer_PlacedMines(false) && actor.WEP_AMMO(MINE_LAYER) < WEP_CVAR(minelayer, ammo))) { + Weapon w = get_weaponinfo(actor.weapon); + w.wr_reload(w); + } } - else if(self.BUTTON_ATCK) + else if(fire1) { - if(weapon_prepareattack(0, WEP_CVAR(minelayer, refire))) + if(weapon_prepareattack(actor, false, WEP_CVAR(minelayer, refire))) { - W_MineLayer_Attack(); - weapon_thinkf(WFRAME_FIRE1, WEP_CVAR(minelayer, animtime), w_ready); + W_MineLayer_Attack(thiswep); + weapon_thinkf(actor, WFRAME_FIRE1, WEP_CVAR(minelayer, animtime), w_ready); } } - if(self.BUTTON_ATCK2) + if(fire2) { 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); } - - return true; } - case WR_INIT: + METHOD(MineLayer, wr_init, void(entity thiswep)) { MINELAYER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP); - return true; } - case WR_CHECKAMMO1: + METHOD(MineLayer, wr_checkammo1, bool(entity thiswep)) { // don't switch while placing a mine if(ATTACK_FINISHED(self) <= time || self.weapon != WEP_MINE_LAYER.m_id) { - ammo_amount = self.WEP_AMMO(MINE_LAYER) >= WEP_CVAR(minelayer, ammo); + float ammo_amount = self.WEP_AMMO(MINE_LAYER) >= WEP_CVAR(minelayer, ammo); ammo_amount += self.(weapon_load[WEP_MINE_LAYER.m_id]) >= WEP_CVAR(minelayer, ammo); return ammo_amount; } return true; } - case WR_CHECKAMMO2: + METHOD(MineLayer, wr_checkammo2, bool(entity thiswep)) { if(W_MineLayer_PlacedMines(false)) return true; else return false; } - case WR_CONFIG: + METHOD(MineLayer, wr_config, void(entity thiswep)) { MINELAYER_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS); - return true; } - case WR_RESETPLAYER: + METHOD(MineLayer, wr_resetplayers, void(entity thiswep)) { self.minelayer_mines = 0; - return true; } - case WR_RELOAD: + METHOD(MineLayer, wr_reload, void(entity thiswep)) { - W_Reload(WEP_CVAR(minelayer, ammo), SND(RELOAD)); - return true; + W_Reload(self, WEP_CVAR(minelayer, ammo), SND(RELOAD)); } - case WR_SUICIDEMESSAGE: + METHOD(MineLayer, wr_suicidemessage, int(entity thiswep)) { return WEAPON_MINELAYER_SUICIDE; } - case WR_KILLMESSAGE: + METHOD(MineLayer, wr_killmessage, int(entity thiswep)) { return WEAPON_MINELAYER_MURDER; } - } - return false; -} + #endif #ifdef CSQC -bool W_MineLayer(int req) -{SELFPARAM(); - switch(req) - { - case WR_IMPACTEFFECT: + + METHOD(MineLayer, wr_impacteffect, void(entity thiswep)) { vector org2; org2 = w_org + w_backoff * 12; pointparticles(particleeffectnum(EFFECT_ROCKET_EXPLODE), org2, '0 0 0', 1); if(!w_issilent) sound(self, CH_SHOTS, SND_MINE_EXP, VOL_BASE, ATTN_NORM); - - return true; } - case WR_INIT: - { - return true; - } - case WR_ZOOMRETICLE: - { - // no weapon specific image for this weapon - return false; - } - } - return false; -} + #endif #endif