]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/turrets/turret/fusionreactor.qc
Turrets: upgrade fusion reactor
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / turret / fusionreactor.qc
1 #ifndef TUR_FUSIONREACTOR_H
2 #define TUR_FUSIONREACTOR_H
3
4 CLASS(FusionReactor, Turret)
5 /* spawnflags */ ATTRIB(FusionReactor, spawnflags, int, TUR_FLAG_SUPPORT | TUR_FLAG_AMMOSOURCE);
6 /* mins       */ ATTRIB(FusionReactor, mins, vector, '-34 -34 0');
7 /* maxs       */ ATTRIB(FusionReactor, maxs, vector, '34 34 90');
8 /* modelname  */ ATTRIB(FusionReactor, mdl, string, "base.md3");
9 /* model      */ ATTRIB(FusionReactor, model, string, strzone(strcat("models/turrets/", this.mdl)));
10 /* head_model */ ATTRIB(FusionReactor, head_model, string, strzone(strcat("models/turrets/", "reactor.md3")));
11 /* netname    */ ATTRIB(FusionReactor, netname, string, "fusionreactor");
12 /* fullname   */ ATTRIB(FusionReactor, turret_name, string, _("Fusion Reactor"));
13 ENDCLASS(FusionReactor)
14
15 REGISTER_TURRET(FUSIONREACTOR, NEW(FusionReactor));
16
17 #endif
18
19 #ifdef IMPLEMENTATION
20 #ifdef SVQC
21 bool turret_fusionreactor_firecheck()
22 {SELFPARAM();
23     if (self.attack_finished_single > time)
24         return false;
25
26     if (self.enemy.deadflag != DEAD_NO)
27         return false;
28
29     if (self.enemy == world)
30         return false;
31
32     if (self.ammo < self.shot_dmg)
33         return false;
34
35     if (self.enemy.ammo >= self.enemy.ammo_max)
36         return false;
37
38     if (vlen(self.enemy.origin - self.origin) > self.target_range)
39         return false;
40
41     if(self.team != self.enemy.team)
42         return false;
43
44     if(!(self.enemy.ammo_flags & TFL_AMMO_ENERGY))
45         return false;
46
47     return true;
48 }
49
50 void spawnfunc_turret_fusionreactor() { SELFPARAM(); if(!turret_initialize(TUR_FUSIONREACTOR.m_id)) remove(self); }
51
52         METHOD(FusionReactor, tr_attack, bool(FusionReactor thistur))
53         {
54             vector fl_org;
55
56             self.enemy.ammo = min(self.enemy.ammo + self.shot_dmg,self.enemy.ammo_max);
57             fl_org = 0.5 * (self.enemy.absmin + self.enemy.absmax);
58             te_smallflash(fl_org);
59
60             return true;
61         }
62         METHOD(FusionReactor, tr_think, bool(FusionReactor thistur))
63         {
64             self.tur_head.avelocity = '0 250 0' * (self.ammo / self.ammo_max);
65
66             return true;
67         }
68         METHOD(FusionReactor, tr_death, bool(FusionReactor thistur))
69         {
70             return true;
71         }
72         METHOD(FusionReactor, tr_setup, bool(FusionReactor thistur))
73         {
74             self.ammo_flags                             = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE;
75             self.target_select_flags    = TFL_TARGETSELECT_TEAMCHECK | TFL_TARGETSELECT_OWNTEAM | TFL_TARGETSELECT_RANGELIMITS;
76             self.firecheck_flags                = TFL_FIRECHECK_AMMO_OWN | TFL_FIRECHECK_AMMO_OTHER | TFL_FIRECHECK_DISTANCES | TFL_FIRECHECK_DEAD;
77             self.shoot_flags                    = TFL_SHOOT_HITALLVALID;
78             self.aim_flags                              = TFL_AIM_NO;
79             self.track_flags                    = TFL_TRACK_NO;
80
81             self.tur_head.scale = 0.75;
82             self.tur_head.avelocity = '0 50 0';
83
84             self.turret_firecheckfunc = turret_fusionreactor_firecheck;
85
86             return true;
87         }
88         METHOD(FusionReactor, tr_precache, bool(FusionReactor thistur))
89         {
90             return true;
91         }
92
93 #endif // SVQC
94 #ifdef CSQC
95         METHOD(FusionReactor, tr_setup, bool(FusionReactor thistur))
96         {
97             return true;
98         }
99         METHOD(FusionReactor, tr_precache, bool(FusionReactor thistur))
100         {
101             return true;
102         }
103
104 #endif // CSQC
105 #endif // REGISTER_TURRET