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