]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/common/turrets/turret/phaser.qc
Turrets: prepare for upgrade
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / turrets / turret / phaser.qc
1 #ifndef TUR_PHASER_H
2 #define TUR_PHASER_H
3 REGISTER_TURRET(
4 /* TUR_##id   */ PHASER,
5 /* function   */ t_phaser,
6 /* spawnflags */ TUR_FLAG_SNIPER | TUR_FLAG_HITSCAN | TUR_FLAG_PLAYER,
7 /* mins,maxs  */ '-32 -32 0', '32 32 64',
8 /* model          */ "base.md3",
9 /* head_model */ "phaser.md3",
10 /* netname        */ "phaser",
11 /* fullname   */ _("Phaser Cannon")
12 );
13 #endif
14
15 #ifdef IMPLEMENTATION
16 #ifdef SVQC
17 .float fireflag;
18
19 float turret_phaser_firecheck()
20 {SELFPARAM();
21     if (self.fireflag != 0) return 0;
22     return turret_firecheck();
23 }
24
25 void beam_think()
26 {SELFPARAM();
27     if ((time > self.cnt) || (self.owner.deadflag != DEAD_NO))
28     {
29         self.owner.attack_finished_single = time + self.owner.shot_refire;
30         self.owner.fireflag = 2;
31         self.owner.tur_head.frame = 10;
32         sound (self, CH_SHOTS_SINGLE, SND_Null, VOL_BASE, ATTEN_NORM);
33         remove(self);
34         return;
35     }
36
37     turret_do_updates(self.owner);
38
39     if (time - self.shot_spread > 0)
40     {
41         self.shot_spread = time + 2;
42         sound (self, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
43     }
44
45
46     self.nextthink = time + self.ticrate;
47
48     self.owner.attack_finished_single = time + frametime;
49     setself(self.owner);
50     FireImoBeam (   self.tur_shotorg,
51                     self.tur_shotorg + self.tur_shotdir_updated * self.target_range,
52                     '-1 -1 -1' * self.shot_radius,
53                     '1 1 1' * self.shot_radius,
54                     self.shot_force,
55                     this.shot_dmg,
56                     0.75,
57                     DEATH_TURRET_PHASER);
58     setself(this);
59     self.scale = vlen(self.owner.tur_shotorg - trace_endpos) / 256;
60
61 }
62
63 void spawnfunc_turret_phaser() { SELFPARAM(); if(!turret_initialize(TUR_PHASER.m_id)) remove(self); }
64
65 float t_phaser(Turret thistur, float req)
66 {SELFPARAM();
67     switch(req)
68     {
69         case TR_ATTACK:
70         {
71             entity beam;
72
73             beam = spawn();
74             beam.ticrate = 0.1; //autocvar_sys_ticrate;
75             setmodel(beam, MDL_TUR_PHASER_BEAM);
76             beam.effects = EF_LOWPRECISION;
77             beam.solid = SOLID_NOT;
78             beam.think = beam_think;
79             beam.cnt = time + self.shot_speed;
80             beam.shot_spread = time + 2;
81             beam.nextthink = time;
82             beam.owner = self;
83             beam.shot_dmg = self.shot_dmg / (self.shot_speed / beam.ticrate);
84             beam.scale = self.target_range / 256;
85             beam.movetype = MOVETYPE_NONE;
86             beam.enemy = self.enemy;
87             beam.bot_dodge = true;
88             beam.bot_dodgerating = beam.shot_dmg;
89             sound (beam, CH_SHOTS_SINGLE, SND_TUR_PHASER, VOL_BASE, ATTEN_NORM);
90             self.fireflag = 1;
91
92             beam.attack_finished_single = self.attack_finished_single;
93             self.attack_finished_single = time; // + autocvar_sys_ticrate;
94
95             setattachment(beam,self.tur_head,"tag_fire");
96
97             soundat (self, trace_endpos, CH_SHOTS, SND(NEXIMPACT), VOL_BASE, ATTEN_NORM);
98
99             if (self.tur_head.frame == 0)
100                 self.tur_head.frame = 1;
101
102             return true;
103         }
104         case TR_THINK:
105         {
106             if (self.tur_head.frame != 0)
107             {
108                 if (self.fireflag == 1)
109                 {
110                     if (self.tur_head.frame == 10)
111                         self.tur_head.frame = 1;
112                     else
113                         self.tur_head.frame = self.tur_head.frame +1;
114                 }
115                 else if (self.fireflag == 2 )
116                 {
117                     self.tur_head.frame = self.tur_head.frame +1;
118                     if (self.tur_head.frame == 15)
119                     {
120                         self.tur_head.frame = 0;
121                         self.fireflag = 0;
122                     }
123                 }
124             }
125
126             return true;
127         }
128         case TR_DEATH:
129         {
130             return true;
131         }
132         case TR_SETUP:
133         {
134             self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIEVE;
135             self.aim_flags = TFL_AIM_LEAD;
136
137             self.turret_firecheckfunc = turret_phaser_firecheck;
138
139             return true;
140         }
141         case TR_PRECACHE:
142         {
143             return true;
144         }
145     }
146
147     return true;
148 }
149
150 #endif // SVQC
151 #ifdef CSQC
152 float t_phaser(Turret thistur, float req)
153 {
154     switch(req)
155     {
156         case TR_SETUP:
157         {
158             return true;
159         }
160         case TR_PRECACHE:
161         {
162             return true;
163         }
164     }
165
166     return true;
167 }
168
169 #endif // CSQC
170 #endif // REGISTER_TURRET