X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Fweapons%2Fweapon%2Fblaster.qc;h=0cb358b54779034939fbea552453378f9ee23e02;hb=b683bf23a495d3b1b3f6df3bda75bfe0f069ab05;hp=6b6d207bfada68b1d3a526c601b18f66c7290e45;hpb=c6437cd43edc4489ad69746a30b5532f18c1af74;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/weapons/weapon/blaster.qc b/qcsrc/common/weapons/weapon/blaster.qc index 6b6d207bf..0cb358b54 100644 --- a/qcsrc/common/weapons/weapon/blaster.qc +++ b/qcsrc/common/weapons/weapon/blaster.qc @@ -1,19 +1,21 @@ #ifndef IMPLEMENTATION -REGISTER_WEAPON( -/* WEP_##id */ BLASTER, -/* function */ W_Blaster, -/* ammotype */ ammo_none, -/* impulse */ 1, -/* flags */ WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH, -/* rating */ 0, -/* color */ '1 0.5 0.5', -/* modelname */ "laser", -/* simplemdl */ "foobar", -/* crosshair */ "gfx/crosshairlaser 0.5", -/* wepimg */ "weaponlaser", -/* refname */ "blaster", -/* wepname */ _("Blaster") -); +CLASS(Blaster, Weapon) +/* ammotype */ //ATTRIB(Blaster, ammo_field, .int, ammo_none) +/* impulse */ ATTRIB(Blaster, impulse, int, 1) +/* flags */ ATTRIB(Blaster, spawnflags, int, WEP_FLAG_NORMAL | WEP_FLAG_CANCLIMB | WEP_TYPE_SPLASH); +/* rating */ ATTRIB(Blaster, bot_pickupbasevalue, float, 0); +/* color */ ATTRIB(Blaster, wpcolor, vector, '1 0.5 0.5'); +/* modelname */ ATTRIB(Blaster, mdl, string, "laser"); +#ifndef MENUQC +/* model */ ATTRIB(Blaster, m_model, Model, MDL_BLASTER_ITEM); +#endif +/* crosshair */ ATTRIB(Blaster, w_crosshair, string, "gfx/crosshairlaser"); +/* crosshair */ ATTRIB(Blaster, w_crosshair_size, float, 0.5); +/* wepimg */ ATTRIB(Blaster, model2, string, "weaponlaser"); +/* refname */ ATTRIB(Blaster, netname, string, "blaster"); +/* wepname */ ATTRIB(Blaster, m_name, string, _("Blaster")); +ENDCLASS(Blaster) +REGISTER_WEAPON(BLASTER, NEW(Blaster)); #define BLASTER_SETTINGS(w_cvar,w_prop) BLASTER_SETTINGS_LIST(w_cvar, w_prop, BLASTER, blaster) #define BLASTER_SETTINGS_LIST(w_cvar,w_prop,id,sn) \ @@ -48,8 +50,8 @@ BLASTER_SETTINGS(WEP_ADD_CVAR, WEP_ADD_PROP) #endif #ifdef IMPLEMENTATION #ifdef SVQC -void spawnfunc_weapon_blaster(void) { weapon_defaultspawnfunc(WEP_BLASTER.m_id); } -void spawnfunc_weapon_laser(void) { spawnfunc_weapon_blaster(); } +spawnfunc(weapon_blaster) { weapon_defaultspawnfunc(this, WEP_BLASTER); } +spawnfunc(weapon_laser) { spawnfunc_weapon_blaster(this); } void W_Blaster_Touch(void) {SELFPARAM(); @@ -82,6 +84,7 @@ void W_Blaster_Think(void) } void W_Blaster_Attack( + entity actor, float atk_deathtype, float atk_shotangle, float atk_damage, @@ -95,12 +98,11 @@ void W_Blaster_Attack( {SELFPARAM(); vector s_forward = v_forward * cos(atk_shotangle * DEG2RAD) + v_up * sin(atk_shotangle * DEG2RAD); - W_SetupShot_Dir(self, s_forward, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_B, atk_damage); + W_SetupShot_Dir(actor, s_forward, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_B, atk_damage); Send_Effect(EFFECT_BLASTER_MUZZLEFLASH, w_shotorg, w_shotdir * 1000, 1); - entity missile = spawn(); - missile.owner = missile.realowner = self; - missile.classname = "blasterbolt"; + entity missile = new(blasterbolt); + missile.owner = missile.realowner = actor; missile.bot_dodge = true; missile.bot_dodgerating = atk_damage; PROJECTILE_MAKETRIGGER(missile); @@ -137,18 +139,15 @@ void W_Blaster_Attack( missile.think = W_Blaster_Think; missile.nextthink = time + atk_delay; - MUTATOR_CALLHOOK(EditProjectile, self, missile); + MUTATOR_CALLHOOK(EditProjectile, actor, missile); - if(time >= missile.nextthink) + if (time >= missile.nextthink) { WITH(entity, self, missile, missile.think()); } } -bool W_Blaster(int request) -{SELFPARAM(); - switch(request) - { - case WR_AIM: + + METHOD(Blaster, wr_aim, void(entity thiswep)) { if(WEP_CVAR(blaster, secondary)) { @@ -159,17 +158,16 @@ bool W_Blaster(int request) } else { self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(blaster, speed), 0, WEP_CVAR_PRI(blaster, lifetime), false); } - - return true; } - case WR_THINK: + METHOD(Blaster, wr_think, void(Blaster thiswep, entity actor, int slot, int fire)) { - if(self.BUTTON_ATCK) + if(fire & 1) { - if(weapon_prepareattack(0, WEP_CVAR_PRI(blaster, refire))) + if(weapon_prepareattack(thiswep, actor, slot, false, WEP_CVAR_PRI(blaster, refire))) { W_Blaster_Attack( + actor, WEP_BLASTER.m_id, WEP_CVAR_PRI(blaster, shotangle), WEP_CVAR_PRI(blaster, damage), @@ -181,25 +179,26 @@ bool W_Blaster(int request) WEP_CVAR_PRI(blaster, delay), WEP_CVAR_PRI(blaster, lifetime) ); - weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(blaster, animtime), w_ready); + weapon_thinkf(actor, slot, WFRAME_FIRE1, WEP_CVAR_PRI(blaster, animtime), w_ready); } } - else if(self.BUTTON_ATCK2) + else if(fire & 2) { switch(WEP_CVAR(blaster, secondary)) { case 0: // switch to last used weapon { - if(self.switchweapon == WEP_BLASTER.m_id) // don't do this if already switching + if(actor.switchweapon == WEP_BLASTER.m_id) // don't do this if already switching W_LastWeapon(); break; } case 1: // normal projectile secondary { - if(weapon_prepareattack(1, WEP_CVAR_SEC(blaster, refire))) + if(weapon_prepareattack(thiswep, actor, slot, true, WEP_CVAR_SEC(blaster, refire))) { W_Blaster_Attack( + actor, WEP_BLASTER.m_id | HITTYPE_SECONDARY, WEP_CVAR_SEC(blaster, shotangle), WEP_CVAR_SEC(blaster, damage), @@ -211,78 +210,60 @@ bool W_Blaster(int request) WEP_CVAR_SEC(blaster, delay), WEP_CVAR_SEC(blaster, lifetime) ); - weapon_thinkf(WFRAME_FIRE2, WEP_CVAR_SEC(blaster, animtime), w_ready); + weapon_thinkf(actor, slot, WFRAME_FIRE2, WEP_CVAR_SEC(blaster, animtime), w_ready); } break; } } } - return true; } - case WR_INIT: + METHOD(Blaster, wr_init, void(entity thiswep)) { BLASTER_SETTINGS(WEP_SKIP_CVAR, WEP_SET_PROP); - return true; } - case WR_SETUP: + METHOD(Blaster, wr_setup, void(entity thiswep)) { self.ammo_field = ammo_none; - return true; } - case WR_CHECKAMMO1: - case WR_CHECKAMMO2: + METHOD(Blaster, wr_checkammo1, bool(entity thiswep)) { - return true; // laser has infinite ammo + return true; // infinite ammo } - case WR_CONFIG: + METHOD(Blaster, wr_checkammo2, bool(entity thiswep)) + { + return true; // blaster has infinite ammo + } + + METHOD(Blaster, wr_config, void(entity thiswep)) { BLASTER_SETTINGS(WEP_CONFIG_WRITE_CVARS, WEP_CONFIG_WRITE_PROPS); - return true; } - case WR_SUICIDEMESSAGE: + METHOD(Blaster, wr_suicidemessage, int(entity thiswep)) { return WEAPON_BLASTER_SUICIDE; } - case WR_KILLMESSAGE: + METHOD(Blaster, wr_killmessage, int(entity thiswep)) { return WEAPON_BLASTER_MURDER; } - } - return false; -} + #endif #ifdef CSQC -bool W_Blaster(int request) -{SELFPARAM(); - switch(request) - { - case WR_IMPACTEFFECT: + + METHOD(Blaster, wr_impacteffect, void(entity thiswep)) { vector org2; org2 = w_org + w_backoff * 6; - pointparticles(particleeffectnum(EFFECT_BLASTER_IMPACT), org2, w_backoff * 1000, 1); + pointparticles(EFFECT_BLASTER_IMPACT, org2, w_backoff * 1000, 1); if(!w_issilent) { sound(self, CH_SHOTS, SND_LASERIMPACT, 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