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