]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/g_casings.qc
do less audio spam for triggers that don't even respond to players
[divverent/nexuiz.git] / data / qcsrc / server / g_casings.qc
1 void casingtouch()
2 {
3         PROJECTILE_TOUCH;
4
5         if (other.solid == SOLID_BSP)
6         if (vlen(self.velocity) >= 50)
7         if (time >= self.attack_finished_single)
8         {
9                 string s;
10                 float f;
11
12                 f = floor(random() * 3) + 1;
13                 if(self.state == 1)
14                         s = strcat("weapons/casings", ftos(f), ".wav");
15                 else if(self.state == 2)
16                         s = strcat("weapons/steel", ftos(f), ".wav");
17                 else
18                         s = strcat("weapons/brass", ftos(f), ".wav");
19                 sound (self, CHAN_PROJECTILE, s, VOL_BASE, ATTN_NORM);
20         }
21         self.attack_finished_single = time + 0.2;
22         //self.touch = SUB_Null; // one tink is enough
23         //self.dest = self.origin - self.groundentity.origin;
24 };
25
26 void casingthink()
27 {
28         local   float   p;
29         self.nextthink = time + 0.1;
30         if (self.flags & FL_ONGROUND)
31         {
32         // just keep the yaw angle
33                 self.angles_x = 0;
34                 self.angles_z = 0;
35                 self.flags = self.flags - FL_ONGROUND;
36                 self.nextthink = time + 0.5;
37         }
38         p = pointcontents(self.origin);
39         if (p == CONTENT_SOLID || p == CONTENT_LAVA || p == CONTENT_SKY)
40         {
41                 removedecor(self);
42                 return;
43         }
44         if (time > self.cnt)
45         {
46                 self.nextthink = time;
47                 self.alpha = self.alpha - frametime;
48                 if (self.alpha < 0.0625)
49                         removedecor(self);
50         }
51 };
52
53 // knock loose the casing when disturbed
54 void casingknockedloosefunc()
55 {
56         self.movetype = MOVETYPE_BOUNCE;
57         self.flags = self.flags - (self.flags & FL_ONGROUND);
58         self.avelocity = randomvec() * 300;
59         self.nextthink = time + 0.1;
60         self.touch = casingtouch;
61 };
62
63 void SpawnCasing(vector org, vector vel, float randomvel, vector ang, vector avel, float randomavel, float casingtype)
64 {
65         local entity e;
66         if (cvar("temp1") & 2048)
67                 return;
68
69         e = newdecor();
70         e.isdecor = TRUE;
71         e.alpha = 1;
72         e.state = casingtype;
73         //e.forcescale = 15;
74         e.movetype = MOVETYPE_BOUNCE;
75         e.solid = SOLID_TRIGGER;
76         e.velocity = vel + randomvec() * randomvel;
77         e.angles = ang;
78         e.avelocity = avel + randomvec() * randomavel;
79         e.nextthink = time;
80         e.think = casingthink;
81         e.touch = casingtouch;
82         //e.knockedloosefunc = casingknockedloosefunc;
83         e.effects = EF_LOWPRECISION;
84         e.createdtime = time;
85         if (casingtype == 1)
86         {
87                 setmodel (e, "models/casing_shell.mdl"); // precision set above
88                 e.cnt = time + 30;
89                 // bias to make these be considered more important than other things
90                 e.createdtime = time + 1;
91         }
92         else if (casingtype == 2)
93         {
94                 // FIXME: this is not used and not precached, uncomment if you need it
95                 //setmodel (e, "models/casing_steel.mdl"); // precision set above
96                 e.cnt = time + 10;
97         }
98         else
99         {
100                 setmodel (e, "models/casing_bronze.mdl"); // precision set above
101                 e.cnt = time + 10;
102         }
103         if (maxclients == 1)
104                 e.cnt = time + 3000;
105         setsize (e, '0 0 -1', '0 0 -1');
106         setorigin (e, org);
107 };