]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/projectile.qc
make the remainign weapons csqc projectiles
[divverent/nexuiz.git] / data / qcsrc / client / projectile.qc
1 .float count; // set if clientside projectile
2 .float cnt; // sound index
3 .float gravity;
4
5 void Projectile_Draw()
6 {
7         vector oldorg;
8
9         oldorg = self.origin;
10
11         if(self.count & 0x80)
12         {
13                 //self.move_flags &~= FL_ONGROUND;
14                 Movetype_Physics(TRUE);
15                 self.angles = vectoangles(self.velocity);
16         }
17         else
18         {
19                 InterpolateOrigin_Do();
20         }
21
22         switch(self.cnt)
23         {
24                 case PROJECTILE_ROCKET:
25                         trailparticles(self, particleeffectnum("TR_ROCKET"), oldorg, self.origin);
26                         break;
27                 case PROJECTILE_TAG:
28                         trailparticles(self, particleeffectnum("TR_VORESPIKE"), oldorg, self.origin);
29                         break;
30                 case PROJECTILE_ELECTRO_BEAM:
31                         trailparticles(self, particleeffectnum("TR_NEXUIZPLASMA"), oldorg, self.origin);
32                         break;
33                 case PROJECTILE_GRENADE:
34                         trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), oldorg, self.origin);
35                         self.angles -= '750 0 0' * time;
36                         break;
37                 case PROJECTILE_GRENADE_BOUNCING:
38                         trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), oldorg, self.origin);
39                         if(!(self.move_flags & FL_ONGROUND))
40                                 self.angles += '100 150 100' * time;
41                         break;
42                 case PROJECTILE_PORTO_RED:
43                         // TODO add red dynamic light
44                         trailparticles(self, particleeffectnum("TR_WIZSPIKE"), oldorg, self.origin);
45                         break;
46                 case PROJECTILE_PORTO_BLUE:
47                         // TODO add blue dynamic light
48                         trailparticles(self, particleeffectnum("TR_WIZSPIKE"), oldorg, self.origin);
49                         break;
50                 case PROJECTILE_FLAC:
51                         trailparticles(self, particleeffectnum("TR_VORESPIKE"), oldorg, self.origin);
52                         break;
53                 case PROJECTILE_SEEKER:
54                         trailparticles(self, particleeffectnum("TR_ROCKET"), oldorg, self.origin);
55                         break;
56                 case PROJECTILE_HOOKBOMB:
57                         trailparticles(self, particleeffectnum("TR_KNIGHTSPIKE"), oldorg, self.origin);
58                         self.angles = '0 500 0' * time;
59                         break;
60                 case PROJECTILE_HAGAR:
61                         trailparticles(self, particleeffectnum("TR_GRENADE"), oldorg, self.origin);
62                         break;
63                 case PROJECTILE_HAGAR_BOUNCING:
64                         trailparticles(self, particleeffectnum("TR_GRENADE"), oldorg, self.origin);
65                         break;
66                 default:
67                         break;
68         }
69
70         self.renderflags = 0;
71
72         if((self.count & 0x80) || (self.iflags & IFLAG_VALID))
73                 R_AddEntity(self);
74 }
75
76 void loopsound(entity e, float ch, string samp, float vol, float attn)
77 {
78         if(csqc_flags & CSQC_FLAG_COLORCODES)
79                 sound(e, ch, samp, vol, attn);
80 }
81
82 void Ent_RemoveProjectile()
83 {
84         if(self.cnt)
85                 loopsound(self, CHAN_PAIN, "misc/null.wav", VOL_BASE, ATTN_NORM);
86 }
87
88 void Ent_Projectile()
89 {
90         float f;
91
92         InterpolateOrigin_Undo();
93
94         // projectile properties:
95         //   kind (interpolated, or clientside)
96         //
97         //   modelindex
98         //   origin
99         //   scale
100         //   if clientside:
101         //     velocity
102         //     gravity
103         //   soundindex (hardcoded list)
104         //   effects
105         //
106         // projectiles don't send angles, because they always follow the velocity
107         
108         f = ReadByte();
109         self.count = (f & 0x80);
110         self.iflags = (self.iflags & IFLAG_INTERNALMASK) | IFLAG_AUTOANGLES | IFLAG_ANGLES;
111         self.move_flags &~= FL_ONGROUND;
112         self.solid = SOLID_TRIGGER;
113         //self.effects = EF_NOMODELFLAGS;
114
115         // sv_gameplayfix_delayprojectiles
116         if(!self.move_time)
117                 self.move_time = time + ticrate;
118         else
119                 self.move_time = max(self.move_time, time);
120
121         if(!(self.count & 0x80))
122                 InterpolateOrigin_Undo();
123
124         if(f & 1)
125         {
126                 self.origin_x = ReadCoord();
127                 self.origin_y = ReadCoord();
128                 self.origin_z = ReadCoord();
129                 if(self.count & 0x80)
130                 {
131                         self.velocity_x = ReadCoord();
132                         self.velocity_y = ReadCoord();
133                         self.velocity_z = ReadCoord();
134                         self.gravity = ReadCoord();
135
136                         self.move_origin = self.origin;
137                         self.move_velocity = self.velocity;
138                 }
139         }
140
141         if(f & 2)
142         {
143                 self.cnt = ReadByte();
144
145                 self.scale = 1;
146                 switch(self.cnt)
147                 {
148                         case PROJECTILE_ELECTRO: setmodel(self, "models/ebomb.mdl"); break;
149                         case PROJECTILE_ROCKET: setmodel(self, "models/rocket.md3"); break;
150                         case PROJECTILE_TAG: setmodel(self, "models/laser.mdl"); break;
151                         case PROJECTILE_BULLET: setmodel(self, "models/tracer.mdl"); break;
152                         case PROJECTILE_CRYLINK: setmodel(self, "models/plasmatrail.mdl"); break;
153                         case PROJECTILE_ELECTRO_BEAM: setmodel(self, "models/elaser.mdl"); break;
154                         case PROJECTILE_GRENADE: setmodel(self, "models/grenademodel.md3"); break;
155                         case PROJECTILE_GRENADE_BOUNCING: setmodel(self, "models/grenademodel.md3"); break;
156                         case PROJECTILE_LASER: setmodel(self, "models/laser.mdl"); break;
157                         case PROJECTILE_HLAC: setmodel(self, "models/hlac_bullet.md3"); break;
158                         case PROJECTILE_SEEKER: setmodel(self, "models/tagrocket.md3"); self.scale = 2; break;
159                         case PROJECTILE_FLAC: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break;
160                         case PROJECTILE_PORTO_RED: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break;
161                         case PROJECTILE_PORTO_BLUE: setmodel(self, "models/grenademodel.md3"); self.scale = 4; break;
162                         case PROJECTILE_HOOKBOMB: setmodel(self, "models/grenademodel.md3"); break;
163                         case PROJECTILE_HAGAR: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break;
164                         case PROJECTILE_HAGAR_BOUNCING: setmodel(self, "models/hagarmissile.mdl"); self.scale = 0.4; break;
165                         default:
166                                 error("Received invalid CSQC projectile, can't work with this!");
167                                 break;
168                 }
169
170                 self.mins = '0 0 0';
171                 self.maxs = '0 0 0';
172                 self.colormod = '0 0 0';
173                 self.move_movetype = MOVETYPE_TOSS;
174                 self.move_moveflags = MOVEFLAG_STOPONIMPACT;
175
176                 switch(self.cnt)
177                 {
178                         case PROJECTILE_ELECTRO:
179                                 // only new engines support sound moving with object
180                                 loopsound(self, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
181                                 self.mins = '0 0 -3';
182                                 self.maxs = '0 0 -3';
183                                 self.move_movetype = MOVETYPE_BOUNCE;
184                                 self.move_moveflags = 0;
185                                 break;
186                         case PROJECTILE_ROCKET:
187                                 loopsound(self, CHAN_PAIN, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
188                                 self.mins = '-3 -3 -3';
189                                 self.maxs = '3 3 3';
190                                 break;
191                         case PROJECTILE_TAG:
192                                 loopsound(self, CHAN_PAIN, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
193                                 self.mins = '-2 -2 -2';
194                                 self.maxs = '2 2 2';
195                                 break;
196                         case PROJECTILE_GRENADE_BOUNCING:
197                                 self.mins = '0 0 -3';
198                                 self.maxs = '0 0 -3';
199                                 self.move_movetype = MOVETYPE_BOUNCE;
200                                 self.move_moveflags = 0;
201                                 break;
202                         case PROJECTILE_SEEKER:
203                                 self.mins = '-2 -2 -2';
204                                 self.maxs = '2 2 2';
205                                 break;
206                         case PROJECTILE_PORTO_RED:
207                                 self.colormod = '2 1 1';
208                                 break;
209                         case PROJECTILE_PORTO_BLUE:
210                                 self.colormod = '1 1 2';
211                                 break;
212                         case PROJECTILE_HAGAR_BOUNCING:
213                                 self.move_movetype = MOVETYPE_BOUNCE;
214                                 self.move_moveflags = 0;
215                                 break;
216                         default:
217                                 break;
218                 }
219         }
220
221         if(!(self.count & 0x80))
222                 InterpolateOrigin_Note();
223         
224         self.draw = Projectile_Draw;
225 }
226
227 void Projectile_Precache()
228 {
229         precache_model("models/ebomb.mdl");
230         precache_model("models/rocket.md3");
231         precache_model("models/laser.mdl");
232         precache_model("models/tracer.mdl");
233         precache_model("models/plasmatrail.mdl");
234         precache_model("models/elaser.mdl");
235         precache_model("models/grenademodel.md3");
236         precache_model("models/grenademodel.md3");
237         precache_model("models/laser.mdl");
238         precache_model("models/hlac_bullet.md3");
239         precache_model("models/hlac_bullet.md3");
240         precache_model("models/tagrocket.md3");
241         precache_model("models/hagarmissile.mdl");
242         precache_model("models/grenademodel.md3");
243         precache_model("models/grenademodel.md3");
244         precache_model("models/grenademodel.md3");
245         precache_model("models/hagarmissile.mdl");
246         precache_model("models/hagarmissile.mdl");
247 }