]> de.git.xonotic.org Git - xonotic/xonotic-data.pk3dir.git/blob - qcsrc/server/tturrets/units/unit_tessla.qc
Get rid of TNSF_FAR, short is good enougth. Hide server based turret head from client.
[xonotic/xonotic-data.pk3dir.git] / qcsrc / server / tturrets / units / unit_tessla.qc
1 void spawnfunc_turret_tesla();
2 void turret_tesla_dinit();
3 void turret_tesla_fire();
4
5 entity toast(entity from, float range, float damage)
6 {
7     entity e;
8     entity etarget;
9     float d,dd;
10     float r;
11
12     dd = range + 1;
13
14     e = findradius(from.origin,range);
15     while (e)
16     {
17         if ((e.railgunhit != 1) && (e != from))
18         {
19             r = turret_validate_target(self,e,self.target_validate_flags);
20             if (r > 0)
21             {
22                 traceline(from.origin,0.5 * (e.absmin + e.absmax),MOVE_WORLDONLY,from);
23                 if (trace_fraction == 1.0)
24                 {
25                     d = vlen(e.origin - from.origin);
26                     if (d < dd)
27                     {
28                         dd = d;
29                         etarget = e;
30                     }
31                 }
32             }
33         }
34         e = e.chain;
35     }
36
37     if (etarget)
38     {
39         te_smallflash(etarget.origin);
40         te_csqc_lightningarc(from.origin,etarget.origin);
41         dprint("DMG:",ftos(damage),"\n");
42         Damage(etarget, self, self, damage, DEATH_TURRET, etarget.origin, '0 0 0');
43         etarget.railgunhit = 1;
44     }
45
46     return etarget;
47 }
48
49 float turret_tesla_firecheck()
50 {
51     if not (turret_stdproc_firecheck())
52         return 0;
53
54     self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
55
56     self.enemy = turret_select_target();
57
58     if(self.enemy)
59         return 1;
60
61     return 0;
62
63 }
64
65 void turret_tesla_fire()
66 {
67     entity e,t;
68     float d,r,i;
69
70     //w_deathtypestring = "discoverd how a tesla coil works";
71
72     d = self.shot_dmg;
73     r = self.target_range;
74     e = spawn();
75     setorigin(e,self.tur_shotorg);
76
77     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
78
79     t = toast(e,r,d);
80     remove(e);
81
82     if (t == world) return;
83
84     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES | TFL_TARGETSELECT_TEAMCHECK;
85
86     self.attack_finished_single = time + self.shot_refire;
87     for (i = 0; i < 10; ++i)
88     {
89         d *= 0.75;
90         r *= 0.85;
91         t = toast(t, r, d);
92         if (t == world) break;
93
94     }
95
96     e = findchainfloat(railgunhit, 1);
97     while (e)
98     {
99         e.railgunhit = 0;
100         e = e.chain;
101     }
102 }
103
104 void turret_tesla_postthink()
105 {
106     if not (self.tur_active)
107     {
108         self.tur_head.avelocity = '0 0 0';
109         return;
110     }
111
112     if(self.ammo < self.shot_dmg)
113     {
114         self.tur_head.avelocity = '0 45 0' * (self.ammo / self.shot_dmg);
115     }
116     else
117     {
118         self.tur_head.avelocity = '0 180 0' * (self.ammo / self.shot_dmg);
119
120         if(self.attack_finished_single > time)
121             return;
122
123         float f;
124         f = (self.ammo / self.ammo_max);
125         f = f * f;
126         if(f > random())
127             if(random() < 0.1)
128                 te_csqc_lightningarc(self.tur_shotorg,self.tur_shotorg + (randomvec() * 350));
129     }
130 }
131
132
133 void turret_tesla_dinit()
134 {
135     if (self.netname == "")      self.netname     = "Tesla Coil";
136
137     self.turrcaps_flags      = TFL_TURRCAPS_HITSCAN | TFL_TURRCAPS_PLAYERKILL | TFL_TURRCAPS_MISSILEKILL;
138
139     self.target_select_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
140                                TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
141
142     self.firecheck_flags     = TFL_FIRECHECK_REFIRE | TFL_FIRECHECK_OWM_AMMO;
143     self.shoot_flags         = TFL_SHOOT_CUSTOM;
144     self.ammo_flags          = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;
145     self.aim_flags           = TFL_AIM_NO;
146     self.track_flags         = TFL_TRACK_NO;
147
148     if (turret_stdproc_init("tesla_std", TRUE, "models/turrets/tesla_base.md3", "models/turrets/tesla_head.md3", TID_TESLA) == 0)
149     {
150         remove(self);
151         return;
152     }
153     setsize(self,'-60 -60 0','60 60 128');
154
155     self.target_validate_flags = TFL_TARGETSELECT_PLAYERS | TFL_TARGETSELECT_MISSILES |
156                                  TFL_TARGETSELECT_RANGELIMTS | TFL_TARGETSELECT_TEAMCHECK;
157
158     if (!turret_tag_fire_update())
159         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");
160
161     self.turret_firefunc      = turret_tesla_fire;
162     self.turret_postthink     = turret_tesla_postthink;
163     self.turret_firecheckfunc = turret_tesla_firecheck;
164 }
165
166 /*QUAKED turret_tesla (0 .5 .8) ?
167 */
168 void spawnfunc_turret_tesla()
169 {
170     precache_model ("models/turrets/tesla_head.md3");
171     precache_model ("models/turrets/tesla_base.md3");
172
173
174     self.think = turret_tesla_dinit;
175     self.nextthink = time + 0.5;
176 }
177