]> de.git.xonotic.org Git - voretournament/voretournament.git/blob - data/qcsrc/server/ent_cs.qc
Send / receive the predator entnum instead
[voretournament/voretournament.git] / data / qcsrc / server / ent_cs.qc
1 /**\r
2  * The point of these entities is to avoid the problems\r
3  * with clientprediction.\r
4  * If you add SendEntity to players, the engine will not\r
5  * do any prediction anymore, and you'd have to write the whole\r
6  * prediction code in CSQC, you want that? :P\r
7  * Data can depend on gamemode. For now, it serves as GPS entities\r
8  * in onslaught... YAY ;)\r
9  */\r
10 \r
11 // Beware: do not redefine those in other files\r
12 // and NO, you cannot use ".version", which already exists (at least\r
13 // it did when I added this) But you have to use .Version\r
14 // Capital V\r
15 \r
16 .entity entcs;\r
17 \r
18 void entcs_init()\r
19 {\r
20         print("Initializing ClientSide information entities\n");\r
21 };\r
22 \r
23 float entcs_customize()\r
24 {\r
25         entity o;\r
26         o = self.owner;\r
27         if(o.deadflag != DEAD_NO)\r
28                 return FALSE;\r
29         if(o.classname != "player")\r
30                 return FALSE;\r
31         if(other == o)\r
32                 return FALSE;\r
33         if(other.classname == "player")\r
34                 if(!teamplay || o.team != other.team)\r
35                         if not (radar_showennemies)\r
36                                 return FALSE;\r
37         return TRUE;\r
38 }\r
39 \r
40 float entcs_send(entity to, float sf)\r
41 {\r
42         WriteByte(MSG_ENTITY, ENT_CLIENT_ENTCS);\r
43         WriteByte(MSG_ENTITY, sf);\r
44         if(sf & 1)\r
45                 WriteByte(MSG_ENTITY, num_for_edict(self.owner)-1);\r
46         if(sf & 2)\r
47         {\r
48                 WriteShort(MSG_ENTITY, self.origin_x);\r
49                 WriteShort(MSG_ENTITY, self.origin_y);\r
50                 WriteShort(MSG_ENTITY, self.origin_z);\r
51         }\r
52         if(sf & 4)\r
53                 WriteByte(MSG_ENTITY, self.angles_y * 256.0 / 360);\r
54         if(sf & 8)\r
55                 WriteByte(MSG_ENTITY, self.health / 10); // FIXME use a better scale?\r
56         if(sf & 16)\r
57                 WriteByte(MSG_ENTITY, self.armorvalue / 10); // FIXME use a better scale?\r
58         if(sf & 32)\r
59                 WriteByte(MSG_ENTITY, num_for_edict(self.predator));\r
60         return TRUE;\r
61 };\r
62 \r
63 void entcs_think()\r
64 {\r
65         self.nextthink = time + 0.01;\r
66 \r
67         entity o;\r
68         o = self.owner;\r
69 \r
70         if(o.origin != self.origin)\r
71         {\r
72                 setorigin(self, o.origin);\r
73                 self.SendFlags |= 2;\r
74         }\r
75         if(o.angles_y != self.angles_y)\r
76         {\r
77                 self.angles = o.angles;\r
78                 self.SendFlags |= 4;\r
79         }\r
80         if(o.health != self.health)\r
81         {\r
82                 self.health = o.health;\r
83                 self.SendFlags |= 8;\r
84         }\r
85         if(o.armorvalue != self.armorvalue)\r
86         {\r
87                 self.armorvalue = o.armorvalue;\r
88                 self.SendFlags |= 16;\r
89         }\r
90         if(o.predator != self.predator)\r
91         {\r
92                 self.predator = o.predator;\r
93                 self.SendFlags |= 32;\r
94         }\r
95 };\r
96 \r
97 entity attach_entcs()\r
98 {\r
99         local entity ent;\r
100 \r
101         ent = spawn();\r
102         ent.classname = "entcs_sender_v2";\r
103         ent.owner = self;\r
104         ent.think = entcs_think;\r
105         ent.nextthink = time;\r
106 \r
107         Net_LinkEntity(ent, FALSE, 0, entcs_send);\r
108         ent.customizeentityforclient = entcs_customize;\r
109 \r
110         self.entcs = ent;\r
111 \r
112         return ent;\r
113 };\r
114 \r
115 void detach_entcs()\r
116 {\r
117         remove(self.entcs);\r
118         self.entcs = world;\r
119 };\r