]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/projectile.qc
only do the sound in somewhat current engines
[divverent/nexuiz.git] / data / qcsrc / client / projectile.qc
1 .float itime;
2 .float count; // set if clientside projectile
3 .float cnt; // sound index
4 .float gravity;
5
6 void Projectile_Draw()
7 {
8         float dt;
9         vector oldorg, org;
10
11         oldorg = self.origin;
12
13         if(self.count & 0x80)
14         {
15                 dt = time - self.itime;
16                 self.velocity_z -= dt * self.gravity * getstatf(242); // STAT_MOVEVARS_GRAVITY
17                 org = self.origin + dt * self.velocity;
18                 self.itime = time;
19                 tracebox(self.origin, self.mins, self.maxs, org, MOVE_NORMAL, self);
20                 self.origin = trace_endpos;
21                 self.angles = vectoangles(self.velocity);
22         }
23         else
24         {
25                 InterpolateOrigin_Do();
26         }
27
28         switch(self.cnt)
29         {
30                 default:
31                 case 0:
32                         break;
33                 case 1:
34                         break; // electro uses no trail
35                 case 2:
36                         trailparticles(self, particleeffectnum("TR_ROCKET"), oldorg, self.origin); // rocket
37                         break;
38                 case 3:
39                         trailparticles(self, particleeffectnum("TR_VORESPIKE"), oldorg, self.origin); // seeker
40                         break;
41         }
42
43         self.renderflags = 0;
44
45         if(self.count & 0x80 || self.iflags & IFLAG_VALID)
46                 R_AddEntity(self);
47 }
48
49 void Ent_RemoveProjectile()
50 {
51         if(self.cnt)
52                 if(csqc_flags & CSQC_FLAG_COLORCODES)
53                         sound(self, CHAN_PAIN, "misc/null.wav", VOL_BASE, ATTN_NORM);
54 }
55
56 void Ent_Projectile()
57 {
58         float f;
59         float sz;
60
61         InterpolateOrigin_Undo();
62
63         // projectile properties:
64         //   kind (interpolated, or clientside)
65         //
66         //   modelindex
67         //   origin
68         //   scale
69         //   if clientside:
70         //     velocity
71         //     gravity
72         //   soundindex (hardcoded list)
73         //   effects
74         //
75         // projectiles don't send angles, because they always follow the velocity
76         
77         f = ReadByte();
78         self.count = (f & 0xC0);
79         self.iflags = IFLAG_AUTOANGLES | IFLAG_ANGLES;
80
81         if(self.count & 0x80)
82                 InterpolateOrigin_Undo();
83
84         if(f & 1)
85         {
86                 self.origin_x = ReadCoord();
87                 self.origin_y = ReadCoord();
88                 self.origin_z = ReadCoord();
89                 if(self.count & 0x80)
90                 {
91                         self.itime = time;
92                         self.velocity_x = ReadCoord();
93                         self.velocity_y = ReadCoord();
94                         self.velocity_z = ReadCoord();
95                         self.gravity = ReadCoord();
96                 }
97         }
98
99         if(f & 2)
100         {
101                 self.modelindex = ReadShort();
102                 if(f & 0x40)
103                 {
104                         self.scale = ReadByte() / 16.0;
105                         self.effects = ReadShort();
106                         self.effects |= 65536 * ReadByte();
107                 }
108                 else
109                 {
110                         self.scale = 1;
111                         self.effects = 0;
112                 }
113
114                 self.cnt = ReadShort();
115                 switch(self.cnt)
116                 {
117                         case 1:
118                                 // only new engines support sound moving with object
119                                 if(csqc_flags & CSQC_FLAG_COLORCODES)
120                                         sound(self, CHAN_PAIN, "weapons/electro_fly.wav", VOL_BASE, ATTN_NORM);
121                                 break;
122                         case 2:
123                                 if(csqc_flags & CSQC_FLAG_COLORCODES)
124                                         sound(self, CHAN_PAIN, "weapons/rocket_fly.wav", VOL_BASE, ATTN_NORM);
125                                 break;
126                         case 3:
127                                 if(csqc_flags & CSQC_FLAG_COLORCODES)
128                                         sound(self, CHAN_PAIN, "weapons/tag_rocket_fly.wav", VOL_BASE, ATTN_NORM);
129                                 break;
130                         default:
131                                 break;
132                 }
133
134                 sz = ReadByte();
135                 switch(sz)
136                 {
137                         case 0:
138                         default:
139                                 self.mins = self.maxs = '0 0 0';
140                                 break;
141                 }
142         }
143
144         if(self.count)
145                 InterpolateOrigin_Note();
146         
147         self.draw = Projectile_Draw;
148 }