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