]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/turrets/turret/phaser_weapon.qc
Hook: merge offhand and weapon behaviour
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / turret / phaser_weapon.qc
index ac817703e8f9282e0443c3f9ead699ddabe314fc..2cb036bc557582cc1dca9ef80da2c21f0f7f5d77 100644 (file)
@@ -2,7 +2,7 @@
 #define TURRET_PHASER_WEAPON_H
 
 CLASS(PhaserTurretAttack, PortoLaunch)
-/* flags     */ ATTRIB(PhaserTurretAttack, spawnflags, int, WEP_TYPE_OTHER);
+/* flags     */ ATTRIB(PhaserTurretAttack, spawnflags, int, WEP_TYPE_OTHER | WEP_FLAG_HIDDEN | WEP_FLAG_MUTATORBLOCKED);
 /* impulse   */ ATTRIB(PhaserTurretAttack, impulse, int, 9);
 /* refname   */ ATTRIB(PhaserTurretAttack, netname, string, "turret_phaser");
 /* wepname   */ ATTRIB(PhaserTurretAttack, message, string, _("Phaser"));
@@ -18,20 +18,19 @@ void beam_think();
 
 .int fireflag;
 
-METHOD(PhaserTurretAttack, wr_think, bool(entity thiswep, bool fire1, bool fire2))
+METHOD(PhaserTurretAttack, wr_think, void(entity thiswep, entity actor, bool fire1, bool fire2))
 {
-    SELFPARAM();
-    bool isPlayer = IS_PLAYER(self);
+    bool isPlayer = IS_PLAYER(actor);
     if (fire1)
-    if (!isPlayer || weapon_prepareattack(false, WEP_CVAR_PRI(electro, refire))) {
+    if (!isPlayer || weapon_prepareattack(thiswep, actor, false, WEP_CVAR_PRI(electro, refire))) {
         if (isPlayer) {
-            turret_initparams(self);
-            W_SetupShot_Dir(self, v_forward, false, 0, W_Sound("electro_fire"), CH_WEAPON_B, 0);
-            self.tur_shotdir_updated = w_shotdir;
-            self.tur_shotorg = w_shotorg;
-            self.tur_head = self;
-            self.shot_speed = 1;
-            weapon_thinkf(WFRAME_FIRE1, WEP_CVAR_PRI(electro, animtime), w_ready);
+            turret_initparams(actor);
+            W_SetupShot_Dir(actor, v_forward, false, 0, W_Sound("electro_fire"), CH_WEAPON_B, 0);
+            actor.tur_shotdir_updated = w_shotdir;
+            actor.tur_shotorg = w_shotorg;
+            actor.tur_head = actor;
+            actor.shot_speed = 1;
+            weapon_thinkf(actor, WFRAME_FIRE1, WEP_CVAR_PRI(electro, animtime), w_ready);
         }
         entity beam = spawn();
         beam.ticrate = 0.1; //autocvar_sys_ticrate;
@@ -39,30 +38,29 @@ METHOD(PhaserTurretAttack, wr_think, bool(entity thiswep, bool fire1, bool fire2
         beam.effects = EF_LOWPRECISION;
         beam.solid = SOLID_NOT;
         beam.think = beam_think;
-        beam.cnt = time + self.shot_speed;
+        beam.cnt = time + actor.shot_speed;
         beam.shot_spread = time + 2;
         beam.nextthink = time;
-        beam.owner = self;
-        beam.shot_dmg = self.shot_dmg / (self.shot_speed / beam.ticrate);
-        beam.scale = self.target_range / 256;
+        beam.owner = actor;
+        beam.shot_dmg = actor.shot_dmg / (actor.shot_speed / beam.ticrate);
+        beam.scale = actor.target_range / 256;
         beam.movetype = MOVETYPE_NONE;
-        beam.enemy = self.enemy;
+        beam.enemy = actor.enemy;
         beam.bot_dodge = true;
         beam.bot_dodgerating = beam.shot_dmg;
         sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
-        self.fireflag = 1;
+        actor.fireflag = 1;
 
-        beam.attack_finished_single = self.attack_finished_single;
-        self.attack_finished_single = time; // + autocvar_sys_ticrate;
+        beam.attack_finished_single = actor.attack_finished_single;
+        actor.attack_finished_single = time; // + autocvar_sys_ticrate;
 
-        setattachment(beam,self.tur_head, "tag_fire");
+        setattachment(beam,actor.tur_head, "tag_fire");
 
-        soundat (self, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM);
+        soundat (actor, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM);
         if (!isPlayer)
-        if (self.tur_head.frame == 0)
-            self.tur_head.frame = 1;
+        if (actor.tur_head.frame == 0)
+            actor.tur_head.frame = 1;
     }
-    return true;
 }
 
 void beam_think()