]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blobdiff - qcsrc/common/turrets/turret/fusionreactor.qc
Turrets: cleanup
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / turret / fusionreactor.qc
diff --git a/qcsrc/common/turrets/turret/fusionreactor.qc b/qcsrc/common/turrets/turret/fusionreactor.qc
new file mode 100644 (file)
index 0000000..7d2f4f0
--- /dev/null
@@ -0,0 +1,117 @@
+#ifndef TUR_FUSIONREACTOR_H
+#define TUR_FUSIONREACTOR_H
+REGISTER_TURRET(
+/* TUR_##id   */ FUSIONREACTOR,
+/* function   */ t_fusionreactor,
+/* spawnflags */ TUR_FLAG_SUPPORT | TUR_FLAG_AMMOSOURCE,
+/* mins,maxs  */ '-34 -34 0', '34 34 90',
+/* model         */ "base.md3",
+/* head_model */ "reactor.md3",
+/* netname       */ "fusionreactor",
+/* fullname   */ _("Fusion Reactor")
+);
+#endif
+
+#ifdef IMPLEMENTATION
+#ifdef SVQC
+bool turret_fusionreactor_firecheck()
+{SELFPARAM();
+    if (self.attack_finished_single > time)
+        return false;
+
+    if (self.enemy.deadflag != DEAD_NO)
+        return false;
+
+    if (self.enemy == world)
+        return false;
+
+    if (self.ammo < self.shot_dmg)
+        return false;
+
+    if (self.enemy.ammo >= self.enemy.ammo_max)
+        return false;
+
+    if (vlen(self.enemy.origin - self.origin) > self.target_range)
+        return false;
+
+    if(self.team != self.enemy.team)
+        return false;
+
+    if(!(self.enemy.ammo_flags & TFL_AMMO_ENERGY))
+        return false;
+
+    return true;
+}
+
+void spawnfunc_turret_fusionreactor() { SELFPARAM(); if(!turret_initialize(TUR_FUSIONREACTOR.m_id)) remove(self); }
+
+float t_fusionreactor(float req)
+{SELFPARAM();
+    switch(req)
+    {
+        case TR_ATTACK:
+        {
+            vector fl_org;
+
+            self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
+            fl_org = 0.5 * (self.enemy.absmin + self.enemy.absmax);
+            te_smallflash(fl_org);
+
+            return true;
+        }
+        case TR_THINK:
+        {
+            self.tur_head.avelocity = '0 250 0' * (self.ammo / self.ammo_max);
+
+            return true;
+        }
+        case TR_DEATH:
+        {
+            return true;
+        }
+        case TR_SETUP:
+        {
+            self.ammo_flags                            = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
+            self.target_select_flags   = TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_OWNTEAM | TFL_TARGETSELECT_RANGELIMITS;
+            self.firecheck_flags               = TFL_FIRECHECK_AMMO_OWN | TFL_FIRECHECK_AMMO_OTHER | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_DEAD;
+            self.shoot_flags                   = TFL_SHOOT_HITALLVALID;
+            self.aim_flags                             = TFL_AIM_NO;
+            self.track_flags                   = TFL_TRACK_NO;
+
+            self.tur_head.scale = 0.75;
+            self.tur_head.avelocity = '0 50 0';
+
+            self.turret_firecheckfunc = turret_fusionreactor_firecheck;
+
+            return true;
+        }
+        case TR_PRECACHE:
+        {
+            return true;
+        }
+    }
+
+    return true;
+}
+
+#endif // SVQC
+#ifdef CSQC
+float t_fusionreactor(float req)
+{
+    switch(req)
+    {
+        case TR_SETUP:
+        {
+            return true;
+        }
+        case TR_PRECACHE:
+        {
+            return true;
+        }
+    }
+
+    return true;
+}
+
+#endif // CSQC
+#endif // REGISTER_TURRET