]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/client/damage.qc
Grabber casing sounds
[voretournament/voretournament.git] / data / qcsrc / client / damage.qc
1 .float silent;\r
2 \r
3 void Ent_DamageInfo(float isNew)\r
4 {\r
5         float hittype, dmg, rad, edge, thisdmg, forcemul;\r
6         float issilent;\r
7         vector force, org, thisforce;\r
8         entity oldself;\r
9 \r
10         oldself = self;\r
11 \r
12         hittype = ReadShort();\r
13 \r
14         issilent = (hittype & 0x8000);\r
15         hittype = (hittype & 0x7FFF);\r
16 \r
17         org_x = ReadCoord();\r
18         org_y = ReadCoord();\r
19         org_z = ReadCoord();\r
20 \r
21         dmg = ReadByte();\r
22         rad = ReadByte();\r
23         edge = ReadByte();\r
24         force = decompressShortVector(ReadShort());\r
25 \r
26         if not(isNew)\r
27                 return;\r
28 \r
29         if(rad < 0)\r
30         {\r
31                 rad = -rad;\r
32                 forcemul = -1;\r
33         }\r
34         else\r
35                 forcemul = 1;\r
36         \r
37         for(self = findradius(org, rad); self; self = self.chain)\r
38         {\r
39                 if(rad)\r
40                 {\r
41                         thisdmg = vlen(self.origin - org) / rad;\r
42                         if(thisdmg >= 1)\r
43                                 continue;\r
44                         if(dmg)\r
45                         {\r
46                                 thisdmg = dmg + (edge - dmg) * thisdmg;\r
47                                 thisforce = forcemul * vlen(force) * (thisdmg / dmg) * normalize(self.origin - org);\r
48                         }\r
49                         else\r
50                         {\r
51                                 thisdmg = 0;\r
52                                 thisforce = forcemul * vlen(force) * normalize(self.origin - org);\r
53                         }\r
54                 }\r
55                 else\r
56                 {\r
57                         thisdmg = dmg;\r
58                         thisforce = forcemul * force;\r
59                 }\r
60 \r
61                 //print("check ", ftos(num_for_edict(self)), " ", self.classname, "\n");\r
62                 //print(ftos(self.damageforcescale), "\n");\r
63                 //print(vtos(thisforce), "\n");\r
64                 if(self.damageforcescale)\r
65                         if(vlen(thisforce))\r
66                         {\r
67                                 self.move_velocity = self.move_velocity + self.damageforcescale * thisforce;\r
68                                 self.move_flags &~= FL_ONGROUND;\r
69                                 //print("pushed ", ftos(num_for_edict(self)), " loose\n");\r
70                         }\r
71 \r
72                 if(issilent)\r
73                         self.silent = 1;\r
74 \r
75                 if(self.event_damage)\r
76                         self.event_damage(thisdmg, hittype, org, thisforce);\r
77         }\r
78 \r
79         self = oldself;\r
80 \r
81         // TODO spawn particle effects and sounds based on hittype\r
82         \r
83         if(!DEATH_ISSPECIAL(hittype))\r
84         {\r
85                 float hitwep, secondary, bounce, headshot;\r
86                 vector org2, backoff;\r
87                 float r;\r
88 \r
89                 hitwep = DEATH_WEAPONOFWEAPONDEATH(hittype);\r
90                 secondary = hittype & HITTYPE_SECONDARY;\r
91                 bounce = hittype & HITTYPE_BOUNCE;\r
92                 headshot = hittype & HITTYPE_HEADSHOT;\r
93                 r = prandom();\r
94 \r
95                 traceline(org - normalize(force) * 16, org + normalize(force) * 16, MOVE_NOMONSTERS, world);\r
96                 if(trace_fraction < 1)\r
97                         backoff = trace_plane_normal;\r
98                 else\r
99                         backoff = -1 * normalize(force);\r
100 \r
101                 setorigin(self, org + backoff * 2); // for sound() calls\r
102 \r
103                 switch(hitwep)\r
104                 {\r
105                         case WEP_GRABBER:\r
106                                 org2 = org + backoff * 6;\r
107                                 pointparticles(particleeffectnum("laser_impact"), org2, backoff * 1000, 1);\r
108                                 if(!issilent)\r
109                                         sound(self, CHAN_PROJECTILE, "weapons/laserimpact.wav", VOL_BASE, ATTN_NORM);\r
110                                 break;\r
111                         default:\r
112                                 dprint("Unhandled damage of weapon ", ftos(hitwep), "\n");\r
113                                 break;\r
114                 }\r
115         }\r
116 }\r
117 \r
118 void DamageInfo_Precache()\r
119 {\r
120 \r
121 }\r