]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/damage.qc
csqc casings
[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                                 pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
83                                 sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
84                                 break;
85                         case WEP_SHOTGUN:
86                                 pointparticles(particleeffectnum("shotgun_impact"), org, backoff * 1000, 1);
87                                 break;
88                         case WEP_UZI:
89                                 pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
90                                 break;
91                         case WEP_GRENADE_LAUNCHER:
92                                 org2 = org + backoff * 12;
93                                 pointparticles(particleeffectnum("grenade_explode"), org2, '0 0 0', 1);
94                                 sound (self, CHAN_PROJECTILE, "weapons/grenade_impact.wav", VOL_BASE, ATTN_NORM);
95                                 break;
96                         case WEP_ELECTRO:
97                                 org2 = org + backoff * 8;
98                                 if(secondary)
99                                 {
100                                         sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
101                                         pointparticles(particleeffectnum("electro_ballexplode"), org2, '0 0 0', 1);
102                                 }
103                                 else
104                                 {
105                                         if(bounce)
106                                         {
107                                                 // this is sent as "primary bounce" to distinguish it from secondary bounced balls
108                                                 sound (self, CHAN_PROJECTILE, "weapons/electro_impact_combo.wav", VOL_BASE, ATTN_NORM);
109                                                 pointparticles(particleeffectnum("electro_combo"), org2, '0 0 0', 1);
110                                         }
111                                         else
112                                         {
113                                                 sound (self, CHAN_PROJECTILE, "weapons/electro_impact.wav", VOL_BASE, ATTN_NORM);
114                                                 pointparticles(particleeffectnum("electro_impact"), org2, '0 0 0', 1);
115                                         }
116                                 }
117                         case WEP_CRYLINK:
118                                 if(secondary)
119                                 {
120                                         sound (self, CHAN_PROJECTILE, "weapons/crylink_impact2.wav", VOL_BASE, ATTN_NORM);
121                                         pointparticles(particleeffectnum("crylink_impact"), org, '0 0 0', 1);
122                                 }
123                                 else
124                                 {
125                                         sound (self, CHAN_PROJECTILE, "weapons/crylink_impact.wav", VOL_BASE, ATTN_NORM);
126                                         pointparticles(particleeffectnum("crylink_impactbig"), org, '0 0 0', 1);
127                                 }
128                                 break;
129                         case WEP_NEX:
130                                 sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
131                                 pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
132                                 break;
133                         case WEP_HAGAR:
134                                 org2 = org + backoff * 12;
135                                 if (r<0.15)
136                                         sound (self, CHAN_PROJECTILE, "weapons/hagexp1.wav", VOL_BASE, ATTN_NORM);
137                                 else if (r<0.7)
138                                         sound (self, CHAN_PROJECTILE, "weapons/hagexp2.wav", VOL_BASE, ATTN_NORM);
139                                 else
140                                         sound (self, CHAN_PROJECTILE, "weapons/hagexp3.wav", VOL_BASE, ATTN_NORM);
141                                 pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
142                                 break;
143                         case WEP_ROCKET_LAUNCHER:
144                                 org2 = org + backoff * 16;
145                                 sound (self, CHAN_PROJECTILE, "weapons/rocket_impact.wav", VOL_BASE, ATTN_NORM);
146                                 pointparticles(particleeffectnum("rocket_explode"), org2, '0 0 0', 1);
147                                 break;
148                         case WEP_PORTO:
149                                 print("Since when does Porto send DamageInfo?\n");
150                                 break;
151                         case WEP_MINSTANEX:
152                                 sound(self, CHAN_PROJECTILE, "weapons/neximpact.wav", VOL_BASE, ATTN_NORM);
153                                 pointparticles(particleeffectnum("nex_impact"), org - normalize(force) * 6, '0 0 0', 1);
154                                 break;
155                         case WEP_HOOK:
156                                 org2 = org + backoff * 12;
157                                 sound (self, CHAN_PROJECTILE, "weapons/hookbomb_impact.wav", VOL_BASE, ATTN_NORM);
158                                 pointparticles(particleeffectnum("hookbomb_explode"), org2, '0 0 0', 1);
159                                 break;
160                         case WEP_SEEKER:
161                                 org2 = org + backoff * 12;
162                                 if(secondary)
163                                 {
164                                         if (r<0.15)
165                                                 sound (self, CHAN_PROJECTILE, "weapons/flacexp1.wav", 1, ATTN_NORM);
166                                         else if (r<0.7)
167                                                 sound (self, CHAN_PROJECTILE, "weapons/flacexp2.wav", 1, ATTN_NORM);
168                                         else
169                                                 sound (self, CHAN_PROJECTILE, "weapons/flacexp3.wav", 1, ATTN_NORM);
170                                         pointparticles(particleeffectnum("flac_explode"), org2, '0 0 0', 1);
171                                 }
172                                 else
173                                 {
174                                         if(bounce)
175                                         {
176                                                 if (r<0.15)
177                                                         sound (self, CHAN_PROJECTILE, "weapons/tagexp1.wav", 1, ATTN_NORM);
178                                                 else if (r<0.7)
179                                                         sound (self, CHAN_PROJECTILE, "weapons/tagexp2.wav", 1, ATTN_NORM);
180                                                 else
181                                                         sound (self, CHAN_PROJECTILE, "weapons/tagexp3.wav", 1, ATTN_NORM);
182                                                 pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
183                                         }
184                                         else if(headshot)
185                                         {
186                                                 sound (self, CHAN_PROJECTILE, "weapons/tag_impact.wav", 1, ATTN_NORM);
187                                         }
188                                         else
189                                         {
190                                                 if (r<0.15)
191                                                         sound (self, CHAN_PROJECTILE, "weapons/seekerexp1.wav", 1, ATTN_NORM);
192                                                 else if (r<0.7)
193                                                         sound (self, CHAN_PROJECTILE, "weapons/seekerexp2.wav", 1, ATTN_NORM);
194                                                 else
195                                                         sound (self, CHAN_PROJECTILE, "weapons/seekerexp3.wav", 1, ATTN_NORM);
196                                                 pointparticles(particleeffectnum("hagar_explode"), org2, '0 0 0', 1);
197                                         }
198                                 }
199                                 break;
200                         case WEP_HLAC:
201                                 org2 = org + backoff * 12;
202                                 sound (self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);
203                                 pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);
204                                 break;
205                         case WEP_CAMPINGRIFLE:
206                                 pointparticles(particleeffectnum("machinegun_impact"), org, backoff * 1000, 1);
207                                 break;
208                         default:
209                                 dprint("Unhandled damage of weapon ", ftos(hitwep), "\n");
210                                 break;
211                 }
212         }
213 }