]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/turrets/turret/tesla.qc
Merge branch 'terencehill/lms_itemtimes_fix' into 'master'
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / turret / tesla.qc
1 #ifndef TURRET_TESLA_H
2 #define TURRET_TESLA_H
3
4 #include "tesla_weapon.qc"
5
6 CLASS(TeslaCoil, Turret)
7 /* spawnflags */ ATTRIB(TeslaCoil, spawnflags, int, TUR_FLAG_HITSCAN | TUR_FLAG_PLAYER | TUR_FLAG_MISSILE);
8 /* mins       */ ATTRIB(TeslaCoil, mins, vector, '-60 -60 0');
9 /* maxs       */ ATTRIB(TeslaCoil, maxs, vector, '60 60 128');
10 /* modelname  */ ATTRIB(TeslaCoil, mdl, string, "tesla_base.md3");
11 /* model      */ ATTRIB_STRZONE(TeslaCoil, model, string, strcat("models/turrets/", this.mdl));
12 /* head_model */ ATTRIB_STRZONE(TeslaCoil, head_model, string, strcat("models/turrets/", "tesla_head.md3"));
13 /* netname    */ ATTRIB(TeslaCoil, netname, string, "tesla");
14 /* fullname   */ ATTRIB(TeslaCoil, turret_name, string, _("Tesla Coil"));
15     ATTRIB(TeslaCoil, m_weapon, Weapon, WEP_TESLA);
16 ENDCLASS(TeslaCoil)
17 REGISTER_TURRET(TESLA, NEW(TeslaCoil));
18
19 #endif
20
21 #ifdef IMPLEMENTATION
22
23 #include "tesla_weapon.qc"
24
25 #ifdef SVQC
26
27 spawnfunc(turret_tesla) { if (!turret_initialize(TUR_TESLA)) remove(self); }
28
29 METHOD(TeslaCoil, tr_think, void(TeslaCoil thistur, entity it))
30 {
31     if(!self.active)
32     {
33         self.tur_head.avelocity = '0 0 0';
34         return;
35     }
36
37     if(self.ammo < self.shot_dmg)
38     {
39         self.tur_head.avelocity = '0 45 0' * (self.ammo / self.shot_dmg);
40     }
41     else
42     {
43         self.tur_head.avelocity = '0 180 0' * (self.ammo / self.shot_dmg);
44
45         if(self.attack_finished_single[0] > time)
46             return;
47
48         float f;
49         f = (self.ammo / self.ammo_max);
50         f = f * f;
51         if(f > random())
52             if(random() < 0.1)
53                 te_csqc_lightningarc(self.tur_shotorg,self.tur_shotorg + (randomvec() * 350));
54     }
55 }
56
57 float turret_tesla_firecheck();
58 METHOD(TeslaCoil, tr_setup, void(TeslaCoil this, entity it))
59 {
60     it.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
61                          TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK;
62
63     it.turret_firecheckfunc = turret_tesla_firecheck;
64     it.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
65                        TFL_TARGETSELECT_RANGELIMITS | TFL_TARGETSELECT_TEAMCHECK;
66
67     it.firecheck_flags  = TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_AMMO_OWN;
68     it.shoot_flags              = TFL_SHOOT_CUSTOM;
69     it.ammo_flags                       = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE;
70     it.aim_flags                        = TFL_AIM_NO;
71     it.track_flags              = TFL_TRACK_NO;
72 }
73
74 float turret_tesla_firecheck()
75 {SELFPARAM();
76     // g_turrets_targetscan_maxdelay forces a target re-scan at least this often
77     float do_target_scan = 0;
78
79     if((self.target_select_time + autocvar_g_turrets_targetscan_maxdelay) < time)
80         do_target_scan = 1;
81
82     // Old target (if any) invalid?
83     if(self.target_validate_time < time)
84     if (turret_validate_target(self, self.enemy, self.target_validate_flags) <= 0)
85     {
86         self.enemy = world;
87         self.target_validate_time = time + 0.5;
88         do_target_scan = 1;
89     }
90
91     // But never more often then g_turrets_targetscan_mindelay!
92     if (self.target_select_time + autocvar_g_turrets_targetscan_mindelay > time)
93         do_target_scan = 0;
94
95     if(do_target_scan)
96     {
97         self.enemy = turret_select_target();
98         self.target_select_time = time;
99     }
100
101     if(!turret_firecheck())
102         return 0;
103
104     if(self.enemy)
105         return 1;
106
107     return 0;
108 }
109
110 #endif
111 #endif