Merge branch 'master' into terencehill/menu_hudskin_selector
[xonotic/xonotic-data.pk3dir.git] / qcsrc / common / ent_cs.qh
1 #ifndef ENT_CS_H
2 #define ENT_CS_H
3
4 REGISTER_NET_LINKED(ENT_CLIENT_ENTCS)
5 REGISTER_NET_TEMP(CLIENT_ENTCS)
6
7 /** True when private information such as origin is available */
8 .bool m_entcs_private;
9 /** True when origin is available */
10 .bool has_origin;
11 /** True when a recent server sent origin has been received */
12 .bool has_sv_origin;
13
14 #ifdef SVQC
15 /*
16  * The point of these entities is to avoid the problems
17  * with clientprediction.
18  * If you add SendEntity to players, the engine will not
19  * do any prediction anymore, and you'd have to write the whole
20  * prediction code in CSQC, you want that? :P
21  * Data can depend on gamemode. For now, it serves as GPS entities
22  * in onslaught... YAY ;)
23  */
24
25         .entity entcs;
26
27         bool entcs_send(entity this, entity to, int sf);
28
29         void entcs_think();
30
31         void entcs_attach(entity e);
32
33         void entcs_detach(entity e);
34
35         .int m_forceupdate;
36
37 /** Force an origin update, for player sounds */
38         #define entcs_force_origin(e) ((e).entcs.m_forceupdate = BIT(2))
39
40 #endif
41
42 #ifdef CSQC
43
44         ArrayList _entcs;
45         STATIC_INIT(_entcs)
46         {
47                 AL_NEW(_entcs, 255, NULL, e);  // 255 is the engine limit on maxclients
48         }
49         SHUTDOWN(_entcs)
50         {
51                 AL_DELETE(_entcs);
52         }
53         #define entcs_receiver(...) EVAL(OVERLOAD(entcs_receiver, __VA_ARGS__))
54         #define entcs_receiver_1(i) AL_gete(_entcs, i)
55         #define entcs_receiver_2(i, v) AL_sete(_entcs, i, v)
56         #define entcs_is_self(e) ((e).sv_entnum == player_localentnum - 1)
57
58         /**
59      * @param i zero indexed player
60      */
61         bool entcs_IsSpectating(int i)
62         {
63                 bool unconnected = !playerslots[i].gotscores;
64                 return unconnected || stof(getplayerkeyvalue(i, "frags")) == FRAGS_SPECTATOR;
65         }
66
67         /**
68         * @param i zero indexed player
69         * @returns 0 if not teamplay
70         */
71         int entcs_GetTeamColor(int i)
72         {
73                 return (!teamplay) ? 0 : stof(getplayerkeyvalue(i, "colors")) & 15;
74         }
75
76         /**
77         * @param i zero indexed player
78         * @returns 0 if not teamplay | NUM_TEAM_##N | NUM_SPECTATOR
79         */
80         int entcs_GetTeam(int i)
81         {
82                 return entcs_IsSpectating(i) ? NUM_SPECTATOR : entcs_GetTeamColor(i);
83         }
84
85         /**
86         * @param i zero indexed player
87         */
88         string entcs_GetName(int i)
89         {
90                 return ColorTranslateRGB(getplayerkeyvalue(i, "name"));
91         }
92
93     /**
94      * @param i zero indexed player
95      */
96         entity CSQCModel_server2csqc(int i);
97
98     .float alpha;
99
100     /**
101      * @param i zero indexed player
102      */
103         float entcs_GetAlpha(int i)
104         {
105                 entity e = CSQCModel_server2csqc(i);
106                 return e ? e.alpha : 1;
107         }
108
109     /**
110      * @param i zero indexed player
111      */
112         vector entcs_GetColor(int i)
113         {
114                 entity e = CSQCModel_server2csqc(i);
115                 return (!e || e.colormap <= 0)
116                        ? '1 1 1'
117                            : colormapPaletteColor(((e.colormap >= 1024)
118                         ? e.colormap
119                         : stof(getplayerkeyvalue(e.colormap - 1, "colors"))) & 15, true)
120                 ;
121         }
122
123     /**
124      * @param i zero indexed player
125      */
126         bool entcs_IsDead(int i)
127         {
128                 entity e = CSQCModel_server2csqc(i);
129                 return e ? e.csqcmodel_isdead : false;
130         }
131
132 #endif
133
134 #endif