]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/tturrets/units/unit_plasma.qc
fix the fly sounds
[divverent/nexuiz.git] / data / qcsrc / server / tturrets / units / unit_plasma.qc
1 void spawnfunc_turret_plasma();\r
2 void spawnfunc_turret_plasma_dual();\r
3 \r
4 void turret_plasma_std_init();\r
5 void turret_plasma_dual_init();\r
6 \r
7 void turret_plasma_attack();\r
8 void turret_plasma_projectile_explode();\r
9 \r
10 void turret_plasma_postthink()\r
11 {\r
12     if (self.tur_head.frame != 0)\r
13         self.tur_head.frame = self.tur_head.frame + 1;\r
14 \r
15     if (self.tur_head.frame >= 5)\r
16         self.tur_head.frame = 0;\r
17 \r
18 }\r
19 \r
20 void turret_plasma_dualpostthink()\r
21 {\r
22     if (self.tur_head.frame != 0)\r
23         self.tur_head.frame = self.tur_head.frame + 1;\r
24 \r
25     if (self.tur_head.frame >= 6)\r
26         self.tur_head.frame = 0;\r
27 }\r
28 \r
29 void turret_plasma_attack()\r
30 {\r
31     entity proj;\r
32 \r
33     turret_tag_fire_update();\r
34 \r
35     sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);\r
36     pointparticles(particleeffectnum("laser_muzzleflash"), self.tur_shotorg_updated, self.tur_shotdir_updated * 1000, 1);\r
37 \r
38     proj                    = spawn ();\r
39     setorigin(proj, self.tur_shotorg_updated);\r
40     setsize(proj, '-0.5 -0.5 -0.5', '0.5 0.5 0.5');\r
41     setmodel(proj, "models/elaser.mdl"); // precision set above\r
42     proj.classname       = "plasmabomb";\r
43     proj.owner           = self;\r
44     proj.bot_dodge       = FALSE;\r
45     //proj.bot_dodgerating = self.shot_dmg;\r
46     proj.think           = turret_plasma_projectile_explode;\r
47     proj.nextthink       = time + 9;\r
48     proj.solid           = SOLID_BBOX;\r
49     proj.movetype        = MOVETYPE_FLYMISSILE;\r
50     proj.velocity        = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;\r
51     proj.angles          = vectoangles(proj.velocity);\r
52     proj.touch           = turret_plasma_projectile_explode;\r
53     proj.flags           = FL_PROJECTILE;\r
54     proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;\r
55     proj.enemy           = self.enemy;\r
56     proj.flags           = FL_PROJECTILE | FL_NOTARGET;\r
57 \r
58     if(self.tur_head.frame )\r
59         self.tur_head.frame = 0;\r
60 \r
61 }\r
62 \r
63 void turret_plasma_dual_attack()\r
64 {\r
65     entity proj;\r
66 \r
67     if (self.tur_head.frame > 2)\r
68         self.tur_head.frame = 1;\r
69 \r
70     turret_tag_fire_update();\r
71 \r
72     sound (self, CHAN_WEAPON, "weapons/hagar_fire.wav", VOL_BASE, ATTN_NORM);\r
73     proj                    = spawn ();\r
74     setorigin(proj, self.tur_shotorg_updated);\r
75     setsize(proj, '0 0 0', '0 0 0');\r
76     setmodel(proj, "models/elaser.mdl"); // precision set above\r
77     proj.classname       = "plasmabomb";\r
78     proj.owner           = self;\r
79     proj.bot_dodge       = TRUE;\r
80     proj.bot_dodgerating = self.shot_dmg;\r
81     proj.think           = turret_plasma_projectile_explode;\r
82     proj.nextthink       = time + 9;\r
83     proj.solid           = SOLID_BBOX;\r
84     proj.movetype        = MOVETYPE_FLYMISSILE;\r
85     proj.velocity        = (self.tur_shotdir_updated + randomvec() * self.shot_spread) * self.shot_speed;\r
86     proj.angles          = vectoangles(proj.velocity);\r
87     proj.touch           = turret_plasma_projectile_explode;\r
88     proj.flags           = FL_PROJECTILE;\r
89     proj.effects         = EF_LOWPRECISION |  EF_BRIGHTFIELD;\r
90     proj.enemy           = self.enemy;\r
91     proj.flags           = FL_PROJECTILE | FL_NOTARGET;\r
92 \r
93     if (self.tur_head.frame == 0)\r
94         self.tur_head.frame = 1;\r
95 \r
96     // Snapback the head\r
97     // self.tur_head.angles_x = self.tur_head.angles_x + min((self.shot_dmg * 0.05),self.aim_maxpitch);\r
98 \r
99 }\r
100 \r
101 void turret_plasma_projectile_explode()\r
102 {\r
103     vector org2;\r
104 \r
105     org2 = findbetterlocation (self.origin, 8);\r
106     WriteByte (MSG_BROADCAST, SVC_TEMPENTITY);\r
107     WriteByte (MSG_BROADCAST, 79);\r
108     WriteCoord (MSG_BROADCAST, org2_x);\r
109     WriteCoord (MSG_BROADCAST, org2_y);\r
110     WriteCoord (MSG_BROADCAST, org2_z);\r
111     WriteCoord (MSG_BROADCAST, 0);              // SeienAbunae: groan... Useless clutter\r
112     WriteCoord (MSG_BROADCAST, 0);\r
113     WriteCoord (MSG_BROADCAST, 0);\r
114     WriteByte (MSG_BROADCAST, 155);\r
115 \r
116     self.event_damage = SUB_Null;\r
117 \r
118 \r
119 #ifdef TURRET_DEBUG\r
120     float d;\r
121 \r
122     d = RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
123     self.owner.tur_dbg_dmg_t_h = self.owner.tur_dbg_dmg_t_h + d; //self.owner.shot_dmg;\r
124     self.owner.tur_dbg_dmg_t_f = self.owner.tur_dbg_dmg_t_f + self.owner.shot_dmg;\r
125 #else\r
126     RadiusDamage (self, self.owner, self.owner.shot_dmg, 0, self.owner.shot_radius, world, self.owner.shot_force, DEATH_TURRET, world);\r
127 #endif\r
128     sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);\r
129 \r
130     remove (self);\r
131 }\r
132 \r
133 void turret_plasma_std_init()\r
134 {\r
135     if (self.netname == "")      self.netname     = "Plasma Cannon";\r
136 \r
137     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;\r
138     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;\r
139 \r
140     if (turret_stdproc_init("plasma_std") == 0)\r
141     {\r
142         remove(self);\r
143         return;\r
144     }\r
145 \r
146     setmodel(self,"models/turrets/base.md3");\r
147     setmodel(self.tur_head,"models/turrets/plasma.md3");\r
148 \r
149 \r
150     if (!turret_tag_setup(0))\r
151         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");\r
152 \r
153     // Our fire routine\r
154     self.turret_firefunc  = turret_plasma_dual_attack;\r
155 \r
156     // re-color badge & handle recoil effect\r
157     self.turret_postthink = turret_plasma_dualpostthink;\r
158 }\r
159 \r
160 \r
161 void turret_plasma_dual_init()\r
162 {\r
163     if (self.netname == "")      self.netname     = "Dual Plasma Cannon";\r
164 \r
165     self.ammo_flags = TFL_AMMO_ENERGY | TFL_AMMO_RECHARGE | TFL_AMMO_RECIVE;\r
166 \r
167     if (turret_stdproc_init("plasma_dual") == 0)\r
168     {\r
169         remove(self);\r
170         return;\r
171     }\r
172 \r
173     setmodel(self,"models/turrets/base.md3");\r
174     setmodel(self.tur_head,"models/turrets/plasmad.md3");\r
175 \r
176     if (!turret_tag_setup(0))\r
177         dprint("Warning: Turret ",self.classname, " faild to initialize md3 tags\n");\r
178 \r
179     // select aim\r
180     self.aim_flags = TFL_AIM_LEAD | TFL_AIM_SHOTTIMECOMPENSATE | TFL_AIM_ZEASE | TFL_AIM_GROUND2;\r
181 \r
182     // Our fire routine\r
183     self.turret_firefunc  = turret_plasma_attack;\r
184 \r
185     // re-color badge & handle recoil effect\r
186     self.turret_postthink = turret_plasma_postthink;\r
187 }\r
188 \r
189 \r
190 /*\r
191 * Basic moderate (std) or fast (dual) fireing, short-mid range energy cannon.\r
192 * Not too mutch of a therat on its own, but can be rather dangerous in groups.\r
193 * Regenerates ammo slowly, support with a fusionreactor(s) to do some real damage.\r
194 */\r
195 \r
196 /*QUAKED turret_plasma (0 .5 .8) ?\r
197 */\r
198 void spawnfunc_turret_plasma()\r
199 {\r
200     //precache_model ("models/turrets/plasma.md3");\r
201     //precache_model ("models/turrets/base.md3");\r
202 \r
203     self.think = turret_plasma_std_init;\r
204     self.nextthink = time + 0.5;\r
205 }\r
206 \r
207 /*QUAKED turret_plasma_dual (0 .5 .8) ?\r
208 */\r
209 void spawnfunc_turret_plasma_dual()\r
210 {\r
211     //precache_model ("models/turrets/plasmad.md3");\r
212     //precache_model ("models/turrets/base.md3");\r
213 \r
214     self.think = turret_plasma_dual_init;\r
215     self.nextthink = time + 0.5;\r
216 }\r
217 \r