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