1#include "plat.qh"
2REGISTER_NET_LINKED(ENT_CLIENT_PLAT)
3
4#ifdef SVQC
5void plat_link(entity this);
6
7void plat_delayedinit(entity this)
8{
9	plat_link(this);
10	plat_spawn_inside_trigger(this); // the "start moving" trigger
11}
12
13float plat_send(entity this, entity to, float sf)
14{
15	WriteHeader(MSG_ENTITY, ENT_CLIENT_PLAT);
16	WriteByte(MSG_ENTITY, sf);
17
18	if(sf & SF_TRIGGER_INIT)
19	{
20		WriteByte(MSG_ENTITY, this.platmovetype_start);
21		WriteByte(MSG_ENTITY, this.platmovetype_turn);
22		WriteByte(MSG_ENTITY, this.platmovetype_end);
23		WriteByte(MSG_ENTITY, this.spawnflags);
24
25		WriteString(MSG_ENTITY, this.model);
26
27		trigger_common_write(this, true);
28
29		WriteCoord(MSG_ENTITY, this.pos1_x);
30		WriteCoord(MSG_ENTITY, this.pos1_y);
31		WriteCoord(MSG_ENTITY, this.pos1_z);
32		WriteCoord(MSG_ENTITY, this.pos2_x);
33		WriteCoord(MSG_ENTITY, this.pos2_y);
34		WriteCoord(MSG_ENTITY, this.pos2_z);
35
36		WriteCoord(MSG_ENTITY, this.size_x);
37		WriteCoord(MSG_ENTITY, this.size_y);
38		WriteCoord(MSG_ENTITY, this.size_z);
39
40		WriteAngle(MSG_ENTITY, this.mangle_x);
41		WriteAngle(MSG_ENTITY, this.mangle_y);
42		WriteAngle(MSG_ENTITY, this.mangle_z);
43
44		WriteShort(MSG_ENTITY, this.speed);
45		WriteShort(MSG_ENTITY, this.height);
46		WriteByte(MSG_ENTITY, this.lip);
47		WriteByte(MSG_ENTITY, this.state);
48
49		WriteShort(MSG_ENTITY, this.dmg);
50	}
51
52	if(sf & SF_TRIGGER_RESET)
53	{
54		// used on client
55	}
56
57	return true;
58}
59
60void plat_link(entity this)
61{
62	//Net_LinkEntity(this, 0, false, plat_send);
63}
64
65spawnfunc(func_plat)
66{
67	if (this.sounds == 0) this.sounds = 2;
68
69    if (this.spawnflags & 4) this.dmg = 10000;
70
71    if (this.dmg && (this.message == "")) this.message = "was squished";
72    if (this.dmg && (this.message2 == "")) this.message2 = "was squished by";
73
74	if (this.sounds == 1)
75	{
76		this.noise = "plats/plat1.wav";
77		this.noise1 = "plats/plat2.wav";
78	}
79
80	if (this.sounds == 2)
81	{
82		this.noise = "plats/medplat1.wav";
83		this.noise1 = "plats/medplat2.wav";
84	}
85
86	if (this.sound1)
87		this.noise = this.sound1;
88	if (this.sound2)
89		this.noise1 = this.sound2;
90
91	if(this.noise && this.noise != "") { precache_sound(this.noise); }
92	if(this.noise1 && this.noise1 != "") { precache_sound(this.noise1); }
93
94	this.mangle = this.angles;
95	this.angles = '0 0 0';
96
97	this.classname = "plat";
98	if (!InitMovingBrushTrigger(this))
99		return;
100	this.effects |= EF_LOWPRECISION;
101	setsize (this, this.mins , this.maxs);
102
103	setblocked(this, plat_crush);
104
105	if (!this.speed) this.speed = 150;
106	if (!this.lip) this.lip = 16;
107	if (!this.height) this.height = this.size.z - this.lip;
108
109	this.pos1 = this.origin;
110	this.pos2 = this.origin;
111	this.pos2_z = this.origin.z - this.height;
112
113	this.reset = plat_reset;
114	this.reset(this);
115
116	InitializeEntity(this, plat_delayedinit, INITPRIO_FINDTARGET);
117}
118#elif defined(CSQC)
119void plat_draw(entity this)
120{
121	Movetype_Physics_NoMatchServer(this);
122	//Movetype_Physics_MatchServer(autocvar_cl_projectiles_sloppy);
123}
124
125NET_HANDLE(ENT_CLIENT_PLAT, bool isnew)
126{
127	float sf = ReadByte();
128
129	if(sf & SF_TRIGGER_INIT)
130	{
131		this.platmovetype_start = ReadByte();
132		this.platmovetype_turn = ReadByte();
133		this.platmovetype_end = ReadByte();
134		this.spawnflags = ReadByte();
135
136		this.model = strzone(ReadString());
137		_setmodel(this, this.model);
138
139		trigger_common_read(this, true);
140
141		this.pos1_x = ReadCoord();
142		this.pos1_y = ReadCoord();
143		this.pos1_z = ReadCoord();
144		this.pos2_x = ReadCoord();
145		this.pos2_y = ReadCoord();
146		this.pos2_z = ReadCoord();
147
148		this.size_x = ReadCoord();
149		this.size_y = ReadCoord();
150		this.size_z = ReadCoord();
151
152		this.mangle_x = ReadAngle();
153		this.mangle_y = ReadAngle();
154		this.mangle_z = ReadAngle();
155
156		this.speed = ReadShort();
157		this.height = ReadShort();
158		this.lip = ReadByte();
159		this.state = ReadByte();
160
161		this.dmg = ReadShort();
162
163		this.classname = "plat";
164		this.solid = SOLID_BSP;
165		set_movetype(this, MOVETYPE_PUSH);
166		this.drawmask = MASK_NORMAL;
167		this.draw = plat_draw;
168		if (isnew) IL_PUSH(g_drawables, this);
169		this.use = plat_use;
170		this.entremove = trigger_remove_generic;
171
172		plat_reset(this); // also called here
173
174		set_movetype(this, MOVETYPE_PUSH);
175		this.move_time = time;
176
177		plat_spawn_inside_trigger(this);
178	}
179
180	if(sf & SF_TRIGGER_RESET)
181	{
182		plat_reset(this);
183
184		this.move_time = time;
185	}
186	return true;
187}
188#endif
189