1#pragma once
2
3// define this if svqc code wants to use .frame2 and .lerpfrac
4//#define CSQCMODEL_HAVE_TWO_FRAMES
5
6// don't define this ever
7//#define CSQCMODEL_SUPPORT_GETTAGINFO_BEFORE_DRAW
8
9// server decides crouching, this lags, but so be it
10//#define CSQCMODEL_SERVERSIDE_CROUCH
11
12// a hack for Xonotic
13#ifdef CSQC
14# define TAG_ENTITY_NAME tag_networkentity
15# define TAG_ENTITY_TYPE float
16.float tag_networkentity;
17
18# define TAG_VIEWLOC_NAME tag_networkviewloc
19# define TAG_VIEWLOC_TYPE int
20.float tag_networkviewloc;
21#else
22# define TAG_ENTITY_NAME tag_entity
23# define TAG_ENTITY_TYPE entity
24
25# define TAG_VIEWLOC_NAME viewloc
26# define TAG_VIEWLOC_TYPE entity
27#endif
28
29// new fields
30.vector v_angle;
31
32// add properties you want networked to CSQC here
33#define CSQCMODEL_EXTRAPROPERTIES \
34	CSQCMODEL_PROPERTY(BIT(0), int, ReadShort, WriteShort, colormap) \
35	CSQCMODEL_PROPERTY(BIT(1), int, ReadInt24_t, WriteInt24_t, effects) \
36	CSQCMODEL_PROPERTY(BIT(2), int, ReadByte, WriteByte, modelflags) \
37	CSQCMODEL_PROPERTY_SCALED(BIT(3), float, ReadByte, WriteByte, alpha, 254, -1, 254) \
38	CSQCMODEL_PROPERTY(BIT(4), int, ReadByte, WriteByte, skin) \
39	CSQCMODEL_PROPERTY(BIT(5), float, ReadApproxPastTime, WriteApproxPastTime, death_time) \
40	CSQCMODEL_PROPERTY(BIT(6), float, ReadByte, WriteByte, solid) \
41	CSQCMODEL_IF(!isplayer) \
42		CSQCMODEL_PROPERTY(BIT(7), TAG_ENTITY_TYPE, ReadShort, WriteEntity, TAG_ENTITY_NAME) \
43		CSQCMODEL_PROPERTY_SCALED(BIT(8), float, ReadByte, WriteByte, glowmod_x, 254, -1, 254) \
44		CSQCMODEL_PROPERTY_SCALED(BIT(8), float, ReadByte, WriteByte, glowmod_y, 254, -1, 254) \
45		CSQCMODEL_PROPERTY_SCALED(BIT(8), float, ReadByte, WriteByte, glowmod_z, 254, -1, 254) \
46		CSQCMODEL_PROPERTY_SCALED(BIT(8), float, ReadByte, WriteByte, colormod_x, 254, -1, 254) \
47		CSQCMODEL_PROPERTY_SCALED(BIT(8), float, ReadByte, WriteByte, colormod_y, 254, -1, 254) \
48		CSQCMODEL_PROPERTY_SCALED(BIT(8), float, ReadByte, WriteByte, colormod_z, 254, -1, 254) \
49	CSQCMODEL_ENDIF \
50	CSQCMODEL_IF(isplayer) \
51		CSQCMODEL_PROPERTY(BIT(7), int, ReadByte, WriteByte, anim_state) \
52		CSQCMODEL_PROPERTY(BIT(7), float, ReadApproxPastTime, WriteApproxPastTime, anim_time) \
53		CSQCMODEL_IF(!islocalplayer) \
54			CSQCMODEL_PROPERTY(BIT(8), float, ReadChar, WriteChar, anim_lower_action) \
55			CSQCMODEL_PROPERTY(BIT(8), float, ReadApproxPastTime, WriteApproxPastTime, anim_lower_time) \
56		CSQCMODEL_ENDIF \
57		CSQCMODEL_PROPERTY(BIT(9), float, ReadChar, WriteChar, anim_upper_action) \
58		CSQCMODEL_PROPERTY(BIT(9), float, ReadApproxPastTime, WriteApproxPastTime, anim_upper_time) \
59	CSQCMODEL_ENDIF \
60	CSQCMODEL_PROPERTY(BIT(10), float, ReadAngle, WriteAngle, v_angle_x) \
61	CSQCMODEL_PROPERTY(BIT(11), int, ReadByte, WriteByte, traileffect) \
62	CSQCMODEL_PROPERTY_SCALED(BIT(12), float, ReadByte, WriteByte, scale, 16, 0, 255) \
63	CSQCMODEL_PROPERTY(BIT(13), int, ReadInt24_t, WriteInt24_t, dphitcontentsmask) \
64	CSQCMODEL_PROPERTY(BIT(14), TAG_VIEWLOC_TYPE, ReadShort, WriteEntity, TAG_VIEWLOC_NAME) \
65	CSQCMODEL_PROPERTY(BIT(15), int, ReadByte, WriteByte, multijump_count) \
66	CSQCMODEL_PROPERTY(BIT(16), int, ReadByte, WriteByte, move_movetype)
67// TODO get rid of colormod/glowmod here; also get rid of some useless properties on non-players that only exist for CopyBody
68
69// add hook function calls here
70#define CSQCPLAYER_HOOK_POSTCAMERASETUP() \
71	CSQCPlayer_SetViewLocation()
72
73// force updates of player entities this frequently (per second) even if unchanged
74#ifndef CSQCPLAYER_FORCE_UPDATES
75#define CSQCPLAYER_FORCE_UPDATES 4
76#endif
77
78// mod must define:
79//vector PL_MIN  = ...;
80//vector PL_MAX  = ...;
81//vector PL_VIEW_OFS  = ...;
82//vector PL_CROUCH_MIN  = ...;
83//vector PL_CROUCH_MAX  = ...;
84//vector PL_CROUCH_VIEW_OFS  = ...;
85
86#ifdef SVQC
87# define CSQCMODEL_AUTOINIT(e) CSQCModel_LinkEntity(e)
88# define CSQCMODEL_AUTOUPDATE(e) CSQCModel_CheckUpdate(e)
89#endif
90
91#define CSQCMODEL_EF_RESPAWNGHOST EF_SELECTABLE
92