2 REGISTER_NET_LINKED(ENT_CLIENT_CONVEYOR)
4 void conveyor_think(entity this)
7 // TODO: check if this is what is causing the glitchiness when switching between them
8 float dt = time - this.move_time;
10 if (dt <= 0) { return; }
13 // set myself as current conveyor where possible
14 IL_EACH(g_conveyed, it.conveyor == this,
17 IL_REMOVE(g_conveyed, it);
21 FOREACH_ENTITY_RADIUS((this.absmin + this.absmax) * 0.5, vlen(this.absmax - this.absmin) * 0.5 + 1, !it.conveyor.state && isPushable(it),
23 vector emin = it.absmin;
24 vector emax = it.absmax;
25 if (this.solid == SOLID_BSP) {
29 if (boxesoverlap(emin, emax, this.absmin, this.absmax)) { // quick
30 if (WarpZoneLib_BoxTouchesBrush(emin, emax, this, it)) { // accurate
32 IL_PUSH(g_conveyed, it);
39 IL_EACH(g_conveyed, it.conveyor == this,
41 if (IS_CLIENT(it)) { // doing it via velocity has quite some advantages
42 continue; // done in SV_PlayerPhysics continue;
44 setorigin(it, it.origin + this.movedir * PHYS_INPUT_FRAMETIME);
45 move_out_of_solid(it);
47 UpdateCSQCProjectile(it);
50 // stupid conveyor code
51 tracebox(it.origin, it.mins, it.maxs, it.origin + this.movedir * sys_frametime, MOVE_NORMAL, it);
52 if(trace_fraction > 0)
53 setorigin(it, trace_endpos);
59 this.nextthink = time;
65 void conveyor_use(entity this, entity actor, entity trigger)
67 this.state = !this.state;
72 void conveyor_reset(entity this)
74 this.state = (this.spawnflags & 1);
79 bool conveyor_send(entity this, entity to, int sf)
81 WriteHeader(MSG_ENTITY, ENT_CLIENT_CONVEYOR);
82 WriteByte(MSG_ENTITY, sf);
85 WriteByte(MSG_ENTITY, this.warpzone_isboxy);
86 WriteCoord(MSG_ENTITY, this.origin_x);
87 WriteCoord(MSG_ENTITY, this.origin_y);
88 WriteCoord(MSG_ENTITY, this.origin_z);
90 WriteCoord(MSG_ENTITY, this.mins_x);
91 WriteCoord(MSG_ENTITY, this.mins_y);
92 WriteCoord(MSG_ENTITY, this.mins_z);
93 WriteCoord(MSG_ENTITY, this.maxs_x);
94 WriteCoord(MSG_ENTITY, this.maxs_y);
95 WriteCoord(MSG_ENTITY, this.maxs_z);
97 WriteCoord(MSG_ENTITY, this.movedir_x);
98 WriteCoord(MSG_ENTITY, this.movedir_y);
99 WriteCoord(MSG_ENTITY, this.movedir_z);
101 WriteByte(MSG_ENTITY, this.speed);
102 WriteByte(MSG_ENTITY, this.state);
104 WriteString(MSG_ENTITY, this.targetname);
105 WriteString(MSG_ENTITY, this.target);
109 WriteByte(MSG_ENTITY, this.state);
115 void conveyor_init(entity this)
117 if (!this.speed) { this.speed = 200; }
118 this.movedir *= this.speed;
119 setthink(this, conveyor_think);
120 this.nextthink = time;
122 this.use = conveyor_use;
123 this.reset = conveyor_reset;
131 Net_LinkEntity(this, 0, false, conveyor_send);
136 spawnfunc(trigger_conveyor)
143 spawnfunc(func_conveyor)
146 InitMovingBrushTrigger(this);
147 set_movetype(this, MOVETYPE_NONE);
153 void conveyor_draw(entity this) { conveyor_think(this); }
155 void conveyor_init(entity this, bool isnew)
158 IL_PUSH(g_drawables, this);
160 this.draw = conveyor_draw;
161 this.drawmask = MASK_NORMAL;
163 set_movetype(this, MOVETYPE_NONE);
165 this.solid = SOLID_TRIGGER;
166 this.move_time = time;
169 NET_HANDLE(ENT_CLIENT_CONVEYOR, bool isnew)
174 this.warpzone_isboxy = ReadByte();
175 this.origin_x = ReadCoord();
176 this.origin_y = ReadCoord();
177 this.origin_z = ReadCoord();
178 setorigin(this, this.origin);
180 this.mins_x = ReadCoord();
181 this.mins_y = ReadCoord();
182 this.mins_z = ReadCoord();
183 this.maxs_x = ReadCoord();
184 this.maxs_y = ReadCoord();
185 this.maxs_z = ReadCoord();
186 setsize(this, this.mins, this.maxs);
188 this.movedir_x = ReadCoord();
189 this.movedir_y = ReadCoord();
190 this.movedir_z = ReadCoord();
192 this.speed = ReadByte();
193 this.state = ReadByte();
195 this.targetname = strzone(ReadString());
196 this.target = strzone(ReadString());
198 conveyor_init(this, isnew);
202 this.state = ReadByte();