]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/client/casings.qc
cl_gibs_maxcount and cl_casings_maxcount
[divverent/nexuiz.git] / data / qcsrc / client / casings.qc
1 float  casecount;\r
2 entity caselist;\r
3 \r
4 void Casing_Delete()\r
5 {\r
6     --casecount;\r
7     remove(self);\r
8 }\r
9 \r
10 void Casing_Draw()
11 {
12         if(self.move_flags & FL_ONGROUND)
13         {
14                 self.move_angles_x = 0;
15                 self.move_angles_z = 0;
16                 self.flags &~= FL_ONGROUND;
17         }
18
19         Movetype_Physics(FALSE);
20
21         self.renderflags = 0;
22         self.alpha = bound(0, self.cnt - time, 1);
23
24         if(self.alpha < ALPHA_MIN_VISIBLE)
25                 Casing_Delete();
26         else
27                 R_AddEntity(self);
28 }
29
30 void Casing_Touch()
31 {
32         if(trace_dphitq3surfaceflags & Q3SURFACEFLAG_NOIMPACT)
33         {
34                 Casing_Delete();
35                 return;
36         }
37
38         if(!trace_ent || trace_ent.solid == SOLID_BSP)
39         {
40                 if(vlen(self.velocity) > 50)
41                 {
42                         if(time >= self.nextthink)
43                         {
44                                 string s;
45                                 float f;
46
47                                 f = floor(prandom() * 3) + 1;
48                                 switch(self.state)
49                                 {
50                                         case 1:
51                                                 s = strcat("weapons/casings", ftos(f), ".wav");
52                                                 break;
53                                         default:
54                                                 s = strcat("weapons/brass", ftos(f), ".wav");
55                                                 break;
56                                 }
57
58                                 sound (self, CHAN_PROJECTILE, s, VOL_BASE, ATTN_NORM);
59                         }
60                 }
61         }
62
63         self.nextthink = time + 0.2;
64 }
65
66 void Casing_Damage(float thisdmg, float hittype, vector org, vector thisforce)
67 {
68         if(thisforce_z < 0)
69                 thisforce_z = 0;
70         self.move_velocity = self.move_velocity + thisforce + '0 0 100';
71         self.move_flags &~= FL_ONGROUND;
72 }
73
74 void Ent_Casing()
75 {
76         entity casing;
77 \r
78         if not(caselist)\r
79         caselist = spawn();\r
80
81         casing = RubbleNew(caselist);\r
82         ++casecount;\r
83         if(casecount >= cvar_or("cl_casings_maxcount",100))\r
84         RubbleDrop(caselist,Casing_Delete);\r
85
86         casing.state = ReadByte();
87         casing.origin_x = ReadCoord();
88         casing.origin_y = ReadCoord();
89         casing.origin_z = ReadCoord();
90         casing.velocity = decompressShortVector(ReadShort());
91         casing.angles_x = ReadByte() * 360 / 256;
92         casing.angles_y = ReadByte() * 360 / 256;
93         casing.angles_z = ReadByte() * 360 / 256;
94
95         if(cvar("cl_casings")) {
96                 casing.draw = Casing_Draw;
97                 casing.move_origin = casing.origin;
98                 casing.move_velocity = casing.velocity + 2 * prandomvec();
99                 casing.move_angles = casing.angles;
100                 casing.move_avelocity = '0 250 0' + 100 * prandomvec();
101                 casing.move_movetype = MOVETYPE_BOUNCE;
102                 casing.move_touch = Casing_Touch;
103                 casing.move_time = time;
104                 casing.event_damage = Casing_Damage;
105                 casing.solid = SOLID_TRIGGER;
106
107                 switch(casing.state)
108                 {
109                         case 1:
110                                 setmodel(casing, "models/casing_shell.mdl");
111                                 casing.cnt = time + cvar("cl_casings_shell_time");
112                                 break;
113                         default:
114                                 setmodel(casing, "models/casing_bronze.mdl");
115                                 casing.cnt = time + cvar("cl_casings_bronze_time");
116                                 break;
117                 }
118
119                 setsize(casing, '0 0 -1', '0 0 -1');
120         }\r
121     else\r
122         Casing_Delete();
123 }
124
125 void Casings_Precache()
126 {
127         precache_model("models/casing_shell.mdl");
128         precache_model("models/casing_bronze.mdl");
129         precache_sound("weapons/brass1.wav");
130         precache_sound("weapons/brass2.wav");
131         precache_sound("weapons/brass3.wav");
132         precache_sound("weapons/casings1.wav");
133         precache_sound("weapons/casings2.wav");
134         precache_sound("weapons/casings3.wav");
135 }