]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/damage.qc
fix the weapons/rick1.wav sounds (instant rickroll... sorry, ricochets)
[divverent/nexuiz.git] / data / qcsrc / client / damage.qc
1 void Ent_DamageInfo()
2 {
3         float hittype, dmg, rad, edge, thisdmg;
4         vector force, org, thisforce;
5         entity oldself;
6
7         oldself = self;
8
9         hittype = ReadShort();
10         org_x = ReadCoord();
11         org_y = ReadCoord();
12         org_z = ReadCoord();
13
14         dmg = ReadByte();
15         rad = ReadByte();
16         edge = ReadByte();
17         force = decompressShortVector(ReadShort());
18
19         for(self = findradius(org, rad); self; self = self.chain)
20         {
21                 if(rad)
22                 {
23                         thisdmg = vlen(self.origin - org) / rad;
24                         if(thisdmg >= 1)
25                                 continue;
26                         if(dmg)
27                         {
28                                 thisdmg = dmg + (edge - dmg) * thisdmg;
29                                 thisforce = vlen(force) * (thisdmg / dmg) * normalize(self.origin - org);
30                         }
31                         else
32                         {
33                                 thisdmg = 0;
34                                 thisforce = vlen(force) * normalize(self.origin - org);
35                         }
36                 }
37                 else
38                 {
39                         thisdmg = dmg;
40                         thisforce = force;
41                 }
42
43                 if(self.damageforcescale)
44                         if(vlen(thisforce))
45                         {
46                                 self.move_velocity = self.move_velocity + self.damageforcescale * thisforce;
47                                 self.move_flags &~= FL_ONGROUND;
48                         }
49
50                 if(self.event_damage)
51                         self.event_damage(thisdmg, hittype, org, thisforce);
52         }
53
54         self = oldself;
55
56         setorigin(self, org); // for sound() calls
57
58         // TODO spawn particle effects and sounds based on hittype
59         
60         if(!DEATH_ISSPECIAL(hittype))
61         {
62                 float hitwep, secondary, bounce, headshot;
63                 vector org2, backoff;
64                 float r;
65
66                 hitwep = DEATH_WEAPONOFWEAPONDEATH(hittype);
67                 secondary = hittype & HITTYPE_SECONDARY;
68                 bounce = hittype & HITTYPE_BOUNCE;
69                 headshot = hittype & HITTYPE_HEADSHOT;
70                 r = random();
71
72                 traceline(org - normalize(force) * 16, org + normalize(force) * 16, MOVE_NOMONSTERS, world);
73                 if(trace_fraction < 1)
74                         backoff = trace_plane_normal;
75                 else
76                         backoff = -1 * normalize(force);
77
78                 switch(hitwep)
79                 {
80                         case WEP_LASER:
81                                 org2 = org + backoff * 8;
82                                 sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
83                                 pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
84                                 break;
85                         case WEP_SHOTGUN:
86                                 pointparticles(particleeffectnum("shotgun_impact"), org, backoff * 1000, 1);
87                                 if(r < 0.05)
88                                         sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
89                                 else if(r < 0.1)
90                                         sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
91                                 else if(r < 0.2)
92                                         sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
93                                 break;
94                         case WEP_UZI:
95                                 pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
96                                 if(r < 0.05)
97                                         sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
98                                 else if(r < 0.1)
99                                         sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
100                                 else if(r < 0.2)
101                                         sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
102                                 break;
103                         case WEP_GRENADE_LAUNCHER:
104                                 org2 = org + backoff * 12;
105                                 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
106                                 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
107                                 break;
108                         case WEP_ELECTRO:
109                                 org2 = org + backoff * 8;
110                                 if(secondary)
111                                 {
112                                         sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
113                                         pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
114                                 }
115                                 else
116                                 {
117                                         if(bounce)
118                                         {
119                                                 // this is sent as "primary bounce" to distinguish it from secondary bounced balls
120                                                 sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
121                                                 pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
122                                         }
123                                         else
124                                         {
125                                                 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
126                                                 pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
127                                         }
128                                 }
129                         case WEP_CRYLINK:
130                                 if(secondary)
131                                 {
132                                         sound (self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
133                                         pointparticles(particleeffectnum("crylink_impact"), org, '0 0 0', 1);
134                                 }
135                                 else
136                                 {
137                                         sound (self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
138                                         pointparticles(particleeffectnum("crylink_impactbig"), org, '0 0 0', 1);
139                                 }
140                                 break;
141                         case WEP_NEX:
142                                 sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
143                                 pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
144                                 break;
145                         case WEP_HAGAR:
146                                 org2 = org + backoff * 12;
147                                 if (r<0.15)
148                                         sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
149                                 else if (r<0.7)
150                                         sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
151                                 else
152                                         sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
153                                 pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
154                                 break;
155                         case WEP_ROCKET_LAUNCHER:
156                                 org2 = org + backoff * 16;
157                                 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
158                                 pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
159                                 break;
160                         case WEP_PORTO:
161                                 print("Since when does Porto send DamageInfo?\n");
162                                 break;
163                         case WEP_MINSTANEX:
164                                 sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
165                                 pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
166                                 break;
167                         case WEP_HOOK:
168                                 org2 = org + backoff * 12;
169                                 sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
170                                 pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
171                                 break;
172                         case WEP_SEEKER:
173                                 org2 = org + backoff * 12;
174                                 if(secondary)
175                                 {
176                                         if (r<0.15)
177                                                 sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
178                                         else if (r<0.7)
179                                                 sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
180                                         else
181                                                 sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
182                                         pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
183                                 }
184                                 else
185                                 {
186                                         if(bounce)
187                                         {
188                                                 if (r<0.15)
189                                                         sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
190                                                 else if (r<0.7)
191                                                         sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
192                                                 else
193                                                         sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
194                                                 pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
195                                         }
196                                         else if(headshot)
197                                         {
198                                                 sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
199                                         }
200                                         else
201                                         {
202                                                 if (r<0.15)
203                                                         sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
204                                                 else if (r<0.7)
205                                                         sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
206                                                 else
207                                                         sound (self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
208                                                 pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
209                                         }
210                                 }
211                                 break;
212                         case WEP_HLAC:
213                                 org2 = org + backoff * 12;
214                                 sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
215                                 pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
216                                 break;
217                         case WEP_CAMPINGRIFLE:
218                                 pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
219                                 if(r < 0.2)
220                                         sound(self, CHAN_PROJECTILE, "weapons/ric1.wav", VOL_BASE, ATTN_NORM);
221                                 else if(r < 0.4)
222                                         sound(self, CHAN_PROJECTILE, "weapons/ric2.wav", VOL_BASE, ATTN_NORM);
223                                 else if(r < 0.5)
224                                         sound(self, CHAN_PROJECTILE, "weapons/ric3.wav", VOL_BASE, ATTN_NORM);
225                                 break;
226                         default:
227                                 dprint("Unhandled damage of weapon ", ftos(hitwep), "\n");
228                                 break;
229                 }
230         }
231 }
232
233 void DamageInfo_Precache()
234 {
235         precache_sound("weapons/crylink_impact2.wav");
236         precache_sound("weapons/crylink_impact.wav");
237         precache_sound("weapons/electro_impact.wav");
238         precache_sound("weapons/flacexp1.wav");
239         precache_sound("weapons/flacexp2.wav");
240         precache_sound("weapons/flacexp3.wav");
241         precache_sound("weapons/grenade_impact.wav");
242         precache_sound("weapons/hagexp1.wav");
243         precache_sound("weapons/hagexp2.wav");
244         precache_sound("weapons/hagexp3.wav");
245         precache_sound("weapons/hookbomb_impact.wav");
246         precache_sound("weapons/laserimpact.wav");
247         precache_sound("weapons/neximpact.wav");
248         precache_sound ("weapons/ric1.wav");
249         precache_sound ("weapons/ric2.wav");
250         precache_sound ("weapons/ric3.wav");
251         precache_sound("weapons/rocket_impact.wav");
252         precache_sound("weapons/seekerexp1.wav");
253         precache_sound("weapons/seekerexp2.wav");
254         precache_sound("weapons/seekerexp3.wav");
255         precache_sound("weapons/tagexp1.wav");
256         precache_sound("weapons/tagexp2.wav");
257         precache_sound("weapons/tagexp3.wav");
258         precache_sound("weapons/tag_impact.wav");
259 }