]> icculus.org git repositories - divverent/nexuiz.git/blob - data/qcsrc/server/csqcprojectile.qc
Reverted the changes in tracewalk calls introduced in r6891 as it breaks the CTF...
[divverent/nexuiz.git] / data / qcsrc / server / csqcprojectile.qc
1 .float csqcprojectile_type;
2
3 float CSQCProjectile_SendEntity(entity to, float sf)
4 {
5         sf = sf & 0x3F;
6
7         if(self.csqcprojectile_clientanimate)
8                 sf |= 0x80; // client animated, not interpolated
9
10         if(self.flags & FL_ONGROUND)
11                 sf |= 0x40;
12
13         WriteByte(MSG_ENTITY, ENT_CLIENT_PROJECTILE);
14         WriteByte(MSG_ENTITY, sf);
15
16         if(sf & 1)
17         {
18                 WriteCoord(MSG_ENTITY, self.origin_x);
19                 WriteCoord(MSG_ENTITY, self.origin_y);
20                 WriteCoord(MSG_ENTITY, self.origin_z);
21
22                 if(sf & 0x80)
23                 {
24                         WriteCoord(MSG_ENTITY, self.velocity_x);
25                         WriteCoord(MSG_ENTITY, self.velocity_y);
26                         WriteCoord(MSG_ENTITY, self.velocity_z);
27                         WriteCoord(MSG_ENTITY, self.gravity);
28                 }
29         }
30
31         if(sf & 2)
32                 WriteByte(MSG_ENTITY, self.csqcprojectile_type); // TODO maybe put this into sf?
33
34         return 1;
35 }
36
37 .vector csqcprojectile_oldorigin;
38 void CSQCProjectile_Check(entity e)
39 {
40         if(e.csqcprojectile_clientanimate)
41         if(e.flags & FL_ONGROUND)
42         if(e.origin != e.csqcprojectile_oldorigin)
43                 UpdateCSQCProjectile(e);
44         e.csqcprojectile_oldorigin = e.origin;
45 }
46
47 void CSQCProjectile(entity e, float clientanimate, float type, float docull)
48 {
49         Net_LinkEntity(e, docull, 0, CSQCProjectile_SendEntity);
50         
51         e.csqcprojectile_clientanimate = clientanimate;
52         
53         if(e.movetype == MOVETYPE_TOSS || e.movetype == MOVETYPE_BOUNCE)
54         {
55                 if(e.gravity == 0)
56                         e.gravity = 1;
57         }
58         else
59                 e.gravity = 0;
60
61         e.csqcprojectile_type = type;
62 }
63
64 void UpdateCSQCProjectile(entity e)
65 {
66         if(e.SendEntity == CSQCProjectile_SendEntity)
67         {
68                 // send new origin data
69                 e.SendFlags |= 1;
70         }
71 }
72
73 .void(void) csqcprojectile_oldthink;
74 .float csqcprojectile_oldnextthink;
75
76 void CSQCProjectile_Update_Think()
77 {
78         UpdateCSQCProjectile(self);
79         self.think = self.csqcprojectile_oldthink;
80         self.nextthink = max(time, self.csqcprojectile_oldnextthink);
81 }
82
83 void UpdateCSQCProjectileNextFrame(entity e)
84 {
85         if(e.SendEntity == CSQCProjectile_SendEntity)
86         if(e.think != CSQCProjectile_Update_Think)
87         {
88                 e.csqcprojectile_oldthink = e.think;
89                 e.csqcprojectile_oldnextthink = e.nextthink;
90                 e.think = CSQCProjectile_Update_Think;
91                 e.nextthink = time;
92         }
93 }