]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/weapons/weapon/blaster.qc
Clean up ammo_field handling
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / weapons / weapon / blaster.qc
index 1d76279f33a9e09bab8178a8e8f7723c367f0f68..29e9c2a570cd50ca532b6bcccef2ce20760edae1 100644 (file)
@@ -1,12 +1,13 @@
+#include "blaster.qh"
 #ifndef IMPLEMENTATION
 CLASS(Blaster, Weapon)
-/* ammotype  */ //ATTRIB(Blaster, ammo_field, .int, ammo_none)
-/* impulse   */ ATTRIB(Blaster, impulse, int, 1)
+/* 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
+#ifdef GAMEQC
 /* model     */ ATTRIB(Blaster, m_model, Model, MDL_BLASTER_ITEM);
 #endif
 /* crosshair */ ATTRIB(Blaster, w_crosshair, string, "gfx/crosshairlaser");
@@ -56,38 +57,39 @@ REGISTER_WEAPON(BLASTER, blaster, NEW(Blaster));
 spawnfunc(weapon_blaster) { weapon_defaultspawnfunc(this, WEP_BLASTER); }
 spawnfunc(weapon_laser) { spawnfunc_weapon_blaster(this); }
 
-void W_Blaster_Touch()
-{SELFPARAM();
-       PROJECTILE_TOUCH;
+void W_Blaster_Touch(entity this, entity toucher)
+{
+       PROJECTILE_TOUCH(this, toucher);
 
-       self.event_damage = func_null;
+       this.event_damage = func_null;
 
        RadiusDamage(
-               self,
-               self.realowner,
-               self.blaster_damage,
-               self.blaster_edgedamage,
-               self.blaster_radius,
-               world,
-               world,
-               self.blaster_force,
-               self.projectiledeathtype,
-               other
+               this,
+               this.realowner,
+               this.blaster_damage,
+               this.blaster_edgedamage,
+               this.blaster_radius,
+               NULL,
+               NULL,
+               this.blaster_force,
+               this.projectiledeathtype,
+               toucher
        );
 
-       remove(self);
+       delete(this);
 }
 
-void W_Blaster_Think()
-{SELFPARAM();
-       this.movetype = MOVETYPE_FLY;
-       this.think = SUB_Remove_self;
+void W_Blaster_Think(entity this)
+{
+       set_movetype(this, MOVETYPE_FLY);
+       setthink(this, SUB_Remove);
        this.nextthink = time + this.blaster_lifetime;
        CSQCProjectile(this, true, PROJECTILE_BLASTER, true);
 }
 
 void W_Blaster_Attack(
        entity actor,
+       .entity weaponentity,
        float atk_deathtype,
        float atk_shotangle,
        float atk_damage,
@@ -98,10 +100,10 @@ void W_Blaster_Attack(
        float atk_spread,
        float atk_delay,
        float atk_lifetime)
-{SELFPARAM();
+{
        vector s_forward = v_forward * cos(atk_shotangle * DEG2RAD) + v_up * sin(atk_shotangle * DEG2RAD);
 
-       W_SetupShot_Dir(actor, s_forward, false, 3, SND(LASERGUN_FIRE), CH_WEAPON_B, atk_damage);
+       W_SetupShot_Dir(actor, weaponentity, 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 = new(blasterbolt);
@@ -135,128 +137,127 @@ void W_Blaster_Attack(
        //missile.glow_color = 250; // 244, 250
        //missile.glow_size = 120;
 
-       missile.touch = W_Blaster_Touch;
+       settouch(missile, W_Blaster_Touch);
        missile.flags = FL_PROJECTILE;
+       IL_PUSH(g_projectiles, missile);
+       IL_PUSH(g_bot_dodge, missile);
        missile.missile_flags = MIF_SPLASH;
        missile.projectiledeathtype = atk_deathtype;
-       missile.think = W_Blaster_Think;
+       setthink(missile, W_Blaster_Think);
        missile.nextthink = time + atk_delay;
 
        MUTATOR_CALLHOOK(EditProjectile, actor, missile);
 
        if (time >= missile.nextthink)
        {
-               WITH(entity, self, missile, missile.think());
+               getthink(missile)(missile);
        }
 }
 
-               METHOD(Blaster, wr_aim, void(entity thiswep))
-               {
-                       if(WEP_CVAR(blaster, secondary))
-                       {
-                               if((random() * (WEP_CVAR_PRI(blaster, damage) + WEP_CVAR_SEC(blaster, damage))) > WEP_CVAR_PRI(blaster, damage))
-                                       { self.BUTTON_ATCK2 = bot_aim(WEP_CVAR_SEC(blaster, speed), 0, WEP_CVAR_SEC(blaster, lifetime), false); }
-                               else
-                                       { self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(blaster, speed), 0, WEP_CVAR_PRI(blaster, lifetime), false); }
-                       }
-                       else
-                               { self.BUTTON_ATCK = bot_aim(WEP_CVAR_PRI(blaster, speed), 0, WEP_CVAR_PRI(blaster, lifetime), false); }
-               }
-
-               METHOD(Blaster, wr_think, void(Blaster thiswep, entity actor, .entity weaponentity, int fire))
-               {
-                       if(fire & 1)
-                       {
-                               if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(blaster, refire)))
-                               {
-                                       W_Blaster_Attack(
-                                               actor,
-                                               WEP_BLASTER.m_id,
-                                               WEP_CVAR_PRI(blaster, shotangle),
-                                               WEP_CVAR_PRI(blaster, damage),
-                                               WEP_CVAR_PRI(blaster, edgedamage),
-                                               WEP_CVAR_PRI(blaster, radius),
-                                               WEP_CVAR_PRI(blaster, force),
-                                               WEP_CVAR_PRI(blaster, speed),
-                                               WEP_CVAR_PRI(blaster, spread),
-                                               WEP_CVAR_PRI(blaster, delay),
-                                               WEP_CVAR_PRI(blaster, lifetime)
-                                       );
-                                       weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(blaster, animtime), w_ready);
-                               }
-                       }
-                       else if(fire & 2)
-                       {
-                               switch(WEP_CVAR(blaster, secondary))
-                               {
-                                       case 0: // switch to last used weapon
-                                       {
-                                               if(PS(actor).m_switchweapon == WEP_BLASTER) // don't do this if already switching
-                                                       W_LastWeapon(actor);
-                                               break;
-                                       }
+METHOD(Blaster, wr_aim, void(entity thiswep, entity actor))
+{
+    if(WEP_CVAR(blaster, secondary))
+    {
+        if((random() * (WEP_CVAR_PRI(blaster, damage) + WEP_CVAR_SEC(blaster, damage))) > WEP_CVAR_PRI(blaster, damage))
+            { PHYS_INPUT_BUTTON_ATCK2(actor) = bot_aim(actor, WEP_CVAR_SEC(blaster, speed), 0, WEP_CVAR_SEC(blaster, lifetime), false); }
+        else
+            { PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, WEP_CVAR_PRI(blaster, speed), 0, WEP_CVAR_PRI(blaster, lifetime), false); }
+    }
+    else
+        { PHYS_INPUT_BUTTON_ATCK(actor) = bot_aim(actor, WEP_CVAR_PRI(blaster, speed), 0, WEP_CVAR_PRI(blaster, lifetime), false); }
+}
 
-                                       case 1: // normal projectile secondary
-                                       {
-                                               if(weapon_prepareattack(thiswep, actor, weaponentity, 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),
-                                                               WEP_CVAR_SEC(blaster, edgedamage),
-                                                               WEP_CVAR_SEC(blaster, radius),
-                                                               WEP_CVAR_SEC(blaster, force),
-                                                               WEP_CVAR_SEC(blaster, speed),
-                                                               WEP_CVAR_SEC(blaster, spread),
-                                                               WEP_CVAR_SEC(blaster, delay),
-                                                               WEP_CVAR_SEC(blaster, lifetime)
-                                                       );
-                                                       weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(blaster, animtime), w_ready);
-                                               }
+METHOD(Blaster, wr_think, void(Blaster thiswep, entity actor, .entity weaponentity, int fire))
+{
+    if(fire & 1)
+    {
+        if(weapon_prepareattack(thiswep, actor, weaponentity, false, WEP_CVAR_PRI(blaster, refire)))
+        {
+            W_Blaster_Attack(
+                actor,
+                weaponentity,
+                WEP_BLASTER.m_id,
+                WEP_CVAR_PRI(blaster, shotangle),
+                WEP_CVAR_PRI(blaster, damage),
+                WEP_CVAR_PRI(blaster, edgedamage),
+                WEP_CVAR_PRI(blaster, radius),
+                WEP_CVAR_PRI(blaster, force),
+                WEP_CVAR_PRI(blaster, speed),
+                WEP_CVAR_PRI(blaster, spread),
+                WEP_CVAR_PRI(blaster, delay),
+                WEP_CVAR_PRI(blaster, lifetime)
+            );
+            weapon_thinkf(actor, weaponentity, WFRAME_FIRE1, WEP_CVAR_PRI(blaster, animtime), w_ready);
+        }
+    }
+    else if(fire & 2)
+    {
+        switch(WEP_CVAR(blaster, secondary))
+        {
+            case 0: // switch to last used weapon
+            {
+                if(actor.(weaponentity).m_switchweapon == WEP_BLASTER) // don't do this if already switching
+                    W_LastWeapon(actor, weaponentity);
+                break;
+            }
 
-                                               break;
-                                       }
-                               }
-                       }
-               }
+            case 1: // normal projectile secondary
+            {
+                if(weapon_prepareattack(thiswep, actor, weaponentity, true, WEP_CVAR_SEC(blaster, refire)))
+                {
+                    W_Blaster_Attack(
+                        actor,
+                        weaponentity,
+                        WEP_BLASTER.m_id | HITTYPE_SECONDARY,
+                        WEP_CVAR_SEC(blaster, shotangle),
+                        WEP_CVAR_SEC(blaster, damage),
+                        WEP_CVAR_SEC(blaster, edgedamage),
+                        WEP_CVAR_SEC(blaster, radius),
+                        WEP_CVAR_SEC(blaster, force),
+                        WEP_CVAR_SEC(blaster, speed),
+                        WEP_CVAR_SEC(blaster, spread),
+                        WEP_CVAR_SEC(blaster, delay),
+                        WEP_CVAR_SEC(blaster, lifetime)
+                    );
+                    weapon_thinkf(actor, weaponentity, WFRAME_FIRE2, WEP_CVAR_SEC(blaster, animtime), w_ready);
+                }
 
-               METHOD(Blaster, wr_setup, void(entity thiswep))
-               {
-                       self.ammo_field = ammo_none;
-               }
+                break;
+            }
+        }
+    }
+}
 
-               METHOD(Blaster, wr_checkammo1, bool(entity thiswep))
-               {
-                       return true; // infinite ammo
-               }
+METHOD(Blaster, wr_checkammo1, bool(entity thiswep, entity actor, .entity weaponentity))
+{
+    return true; // infinite ammo
+}
 
-               METHOD(Blaster, wr_checkammo2, bool(entity thiswep))
-               {
-                       return true; // blaster has infinite ammo
-               }
+METHOD(Blaster, wr_checkammo2, bool(entity thiswep, entity actor, .entity weaponentity))
+{
+    return true; // blaster has infinite ammo
+}
 
-               METHOD(Blaster, wr_suicidemessage, int(entity thiswep))
-               {
-                       return WEAPON_BLASTER_SUICIDE;
-               }
+METHOD(Blaster, wr_suicidemessage, Notification(entity thiswep))
+{
+    return WEAPON_BLASTER_SUICIDE;
+}
 
-               METHOD(Blaster, wr_killmessage, int(entity thiswep))
-               {
-                       return WEAPON_BLASTER_MURDER;
-               }
+METHOD(Blaster, wr_killmessage, Notification(entity thiswep))
+{
+    return WEAPON_BLASTER_MURDER;
+}
 
 #endif
 #ifdef CSQC
 
-               METHOD(Blaster, wr_impacteffect, void(entity thiswep))
-               {
-                       vector org2;
-                       org2 = w_org + w_backoff * 6;
-                       pointparticles(EFFECT_BLASTER_IMPACT, org2, w_backoff * 1000, 1);
-                       if(!w_issilent) { sound(self, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM); }
-               }
+METHOD(Blaster, wr_impacteffect, void(entity thiswep, entity actor))
+{
+    vector org2;
+    org2 = w_org + w_backoff * 6;
+    pointparticles(EFFECT_BLASTER_IMPACT, org2, w_backoff * 1000, 1);
+    if(!w_issilent) { sound(actor, CH_SHOTS, SND_LASERIMPACT, VOL_BASE, ATTN_NORM); }
+}
 
 #endif
 #endif