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);
22 FOREACH_ENTITY_RADIUS((this.absmin + this.absmax) * 0.5, vlen(this.absmax - this.absmin) * 0.5 + 1, !it.conveyor.active && isPushable(it),
24 vector emin = it.absmin;
25 vector emax = it.absmax;
26 if(this.solid == SOLID_BSP)
31 if(boxesoverlap(emin, emax, this.absmin, this.absmax)) // quick
32 if(WarpZoneLib_BoxTouchesBrush(emin, emax, this, it)) // accurate
35 IL_PUSH(g_conveyed, it);
40 IL_EACH(g_conveyed, it.conveyor == this,
42 if(IS_CLIENT(it)) // doing it via velocity has quite some advantages
43 continue; // done in SV_PlayerPhysics continue;
45 setorigin(it, it.origin + this.movedir * PHYS_INPUT_FRAMETIME);
46 move_out_of_solid(it);
48 UpdateCSQCProjectile(it);
51 // stupid conveyor code
52 tracebox(it.origin, it.mins, it.maxs, it.origin + this.movedir * sys_frametime, MOVE_NORMAL, it);
53 if(trace_fraction > 0)
54 setorigin(it, trace_endpos);
60 this.nextthink = time;
66 void conveyor_setactive(entity this, int act)
68 int old_status = this.active;
69 if(act == ACTIVE_TOGGLE)
71 if(this.active == ACTIVE_ACTIVE)
73 this.active = ACTIVE_NOT;
77 this.active = ACTIVE_ACTIVE;
85 if (this.active != old_status)
87 this.SendFlags |= SF_TRIGGER_UPDATE;
91 // Compatibility with old maps
92 void conveyor_use(entity this, entity actor, entity trigger)
94 conveyor_setactive(this, ACTIVE_TOGGLE);
97 void conveyor_reset(entity this)
101 if(this.spawnflags & CONVEYOR_START_ENABLED)
103 this.active = ACTIVE_ACTIVE;
108 this.active = ACTIVE_ACTIVE;
111 this.SendFlags |= SF_TRIGGER_UPDATE;
114 bool conveyor_send(entity this, entity to, int sendflags)
116 WriteHeader(MSG_ENTITY, ENT_CLIENT_CONVEYOR);
117 WriteByte(MSG_ENTITY, sendflags);
119 if(sendflags & SF_TRIGGER_INIT)
121 WriteByte(MSG_ENTITY, this.warpzone_isboxy);
122 WriteVector(MSG_ENTITY, this.origin);
124 WriteVector(MSG_ENTITY, this.mins);
125 WriteVector(MSG_ENTITY, this.maxs);
127 WriteVector(MSG_ENTITY, this.movedir);
129 WriteByte(MSG_ENTITY, this.speed);
130 WriteByte(MSG_ENTITY, this.active);
132 WriteString(MSG_ENTITY, this.targetname);
133 WriteString(MSG_ENTITY, this.target);
136 if(sendflags & SF_TRIGGER_UPDATE)
137 WriteByte(MSG_ENTITY, this.active);
142 void conveyor_init(entity this)
144 if (!this.speed) this.speed = 200;
145 this.movedir *= this.speed;
146 setthink(this, conveyor_think);
147 this.nextthink = time;
148 this.setactive = conveyor_setactive;
151 // backwards compatibility
152 this.use = conveyor_use;
154 this.reset = conveyor_reset;
159 Net_LinkEntity(this, 0, false, conveyor_send);
161 this.SendFlags |= SF_TRIGGER_INIT;
164 spawnfunc(trigger_conveyor)
171 spawnfunc(func_conveyor)
174 InitMovingBrushTrigger(this);
175 set_movetype(this, MOVETYPE_NONE);
181 void conveyor_draw(entity this) { conveyor_think(this); }
183 void conveyor_init(entity this, bool isnew)
186 IL_PUSH(g_drawables, this);
187 this.draw = conveyor_draw;
188 this.drawmask = MASK_NORMAL;
190 set_movetype(this, MOVETYPE_NONE);
192 this.solid = SOLID_TRIGGER;
193 this.move_time = time;
196 NET_HANDLE(ENT_CLIENT_CONVEYOR, bool isnew)
198 int sendflags = ReadByte();
200 if(sendflags & SF_TRIGGER_INIT)
202 this.warpzone_isboxy = ReadByte();
203 this.origin = ReadVector();
204 setorigin(this, this.origin);
206 this.mins = ReadVector();
207 this.maxs = ReadVector();
208 setsize(this, this.mins, this.maxs);
210 this.movedir = ReadVector();
212 this.speed = ReadByte();
213 this.active = ReadByte();
215 this.targetname = strzone(ReadString());
216 this.target = strzone(ReadString());
218 conveyor_init(this, isnew);
221 if(sendflags & SF_TRIGGER_UPDATE)
222 this.active = ReadByte();