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