X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ffunc%2Fconveyor.qc;h=1802a75db4a96a74ab2b56eb9531a748923bfa91;hb=1b0decb9afb829407eae763b3053a122e2ae3de6;hp=a4be9fe0538dd1ffad145f2beba54765025de6af;hpb=74cebbb48d9481bb83eccb4438283f319352cb74;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/func/conveyor.qc b/qcsrc/common/triggers/func/conveyor.qc index a4be9fe05..1802a75db 100644 --- a/qcsrc/common/triggers/func/conveyor.qc +++ b/qcsrc/common/triggers/func/conveyor.qc @@ -1,58 +1,63 @@ +#include "conveyor.qh" REGISTER_NET_LINKED(ENT_CLIENT_CONVEYOR) void conveyor_think(entity this) { #ifdef CSQC // TODO: check if this is what is causing the glitchiness when switching between them - float dt = time - self.move_time; - self.move_time = time; + float dt = time - this.move_time; + this.move_time = time; if(dt <= 0) { return; } #endif - entity e; // set myself as current conveyor where possible - for(e = world; (e = findentity(e, conveyor, self)); ) - e.conveyor = world; + IL_EACH(g_conveyed, it.conveyor == this, + { + it.conveyor = NULL; + IL_REMOVE(g_conveyed, it); + }); - if(self.state) + if(this.state) { - for(e = findradius((self.absmin + self.absmax) * 0.5, vlen(self.absmax - self.absmin) * 0.5 + 1); e; e = e.chain) - if(!e.conveyor.state) - if(isPushable(e)) + FOREACH_ENTITY_RADIUS((this.absmin + this.absmax) * 0.5, vlen(this.absmax - this.absmin) * 0.5 + 1, !it.conveyor.state && isPushable(it), + { + vector emin = it.absmin; + vector emax = it.absmax; + if(this.solid == SOLID_BSP) + { + emin -= '1 1 1'; + emax += '1 1 1'; + } + if(boxesoverlap(emin, emax, this.absmin, this.absmax)) // quick + if(WarpZoneLib_BoxTouchesBrush(emin, emax, this, it)) // accurate { - vector emin = e.absmin; - vector emax = e.absmax; - if(self.solid == SOLID_BSP) - { - emin -= '1 1 1'; - emax += '1 1 1'; - } - if(boxesoverlap(emin, emax, self.absmin, self.absmax)) // quick - if(WarpZoneLib_BoxTouchesBrush(emin, emax, self, e)) // accurate - e.conveyor = self; + if(!it.conveyor) + IL_PUSH(g_conveyed, it); + it.conveyor = this; } + }); - for(e = world; (e = findentity(e, conveyor, self)); ) + IL_EACH(g_conveyed, it.conveyor == this, { - if(IS_CLIENT(e)) // doing it via velocity has quite some advantages + if(IS_CLIENT(it)) // doing it via velocity has quite some advantages continue; // done in SV_PlayerPhysics continue; - setorigin(e, e.origin + self.movedir * PHYS_INPUT_FRAMETIME); - move_out_of_solid(e); + setorigin(it, it.origin + this.movedir * PHYS_INPUT_FRAMETIME); + move_out_of_solid(it); #ifdef SVQC - UpdateCSQCProjectile(e); + UpdateCSQCProjectile(it); #endif /* // stupid conveyor code - tracebox(e.origin, e.mins, e.maxs, e.origin + self.movedir * sys_frametime, MOVE_NORMAL, e); + tracebox(it.origin, it.mins, it.maxs, it.origin + this.movedir * sys_frametime, MOVE_NORMAL, it); if(trace_fraction > 0) - setorigin(e, trace_endpos); + setorigin(it, trace_endpos); */ - } + }); } #ifdef SVQC - self.nextthink = time; + this.nextthink = time; #endif } @@ -79,31 +84,23 @@ bool conveyor_send(entity this, entity to, int sf) if(sf & 1) { - WriteByte(MSG_ENTITY, self.warpzone_isboxy); - WriteCoord(MSG_ENTITY, self.origin_x); - WriteCoord(MSG_ENTITY, self.origin_y); - WriteCoord(MSG_ENTITY, self.origin_z); - - WriteCoord(MSG_ENTITY, self.mins_x); - WriteCoord(MSG_ENTITY, self.mins_y); - WriteCoord(MSG_ENTITY, self.mins_z); - WriteCoord(MSG_ENTITY, self.maxs_x); - WriteCoord(MSG_ENTITY, self.maxs_y); - WriteCoord(MSG_ENTITY, self.maxs_z); - - WriteCoord(MSG_ENTITY, self.movedir_x); - WriteCoord(MSG_ENTITY, self.movedir_y); - WriteCoord(MSG_ENTITY, self.movedir_z); - - WriteByte(MSG_ENTITY, self.speed); - WriteByte(MSG_ENTITY, self.state); - - WriteString(MSG_ENTITY, self.targetname); - WriteString(MSG_ENTITY, self.target); + WriteByte(MSG_ENTITY, this.warpzone_isboxy); + WriteVector(MSG_ENTITY, this.origin); + + WriteVector(MSG_ENTITY, this.mins); + WriteVector(MSG_ENTITY, this.maxs); + + WriteVector(MSG_ENTITY, this.movedir); + + WriteByte(MSG_ENTITY, this.speed); + WriteByte(MSG_ENTITY, this.state); + + WriteString(MSG_ENTITY, this.targetname); + WriteString(MSG_ENTITY, this.target); } if(sf & 2) - WriteByte(MSG_ENTITY, self.state); + WriteByte(MSG_ENTITY, this.state); return true; } @@ -141,23 +138,24 @@ spawnfunc(func_conveyor) { SetMovedir(this); InitMovingBrushTrigger(this); - this.movetype = MOVETYPE_NONE; + set_movetype(this, MOVETYPE_NONE); conveyor_init(this); } #elif defined(CSQC) -void conveyor_draw(entity this) { WITHSELF(this, conveyor_think(this)); } +void conveyor_draw(entity this) { conveyor_think(this); } -void conveyor_init(entity this) +void conveyor_init(entity this, bool isnew) { + if(isnew) + IL_PUSH(g_drawables, this); this.draw = conveyor_draw; this.drawmask = MASK_NORMAL; - this.movetype = MOVETYPE_NONE; + set_movetype(this, MOVETYPE_NONE); this.model = ""; this.solid = SOLID_TRIGGER; - this.move_origin = this.origin; this.move_time = time; } @@ -168,22 +166,14 @@ NET_HANDLE(ENT_CLIENT_CONVEYOR, bool isnew) if(sf & 1) { this.warpzone_isboxy = ReadByte(); - this.origin_x = ReadCoord(); - this.origin_y = ReadCoord(); - this.origin_z = ReadCoord(); + this.origin = ReadVector(); setorigin(this, this.origin); - this.mins_x = ReadCoord(); - this.mins_y = ReadCoord(); - this.mins_z = ReadCoord(); - this.maxs_x = ReadCoord(); - this.maxs_y = ReadCoord(); - this.maxs_z = ReadCoord(); + this.mins = ReadVector(); + this.maxs = ReadVector(); setsize(this, this.mins, this.maxs); - this.movedir_x = ReadCoord(); - this.movedir_y = ReadCoord(); - this.movedir_z = ReadCoord(); + this.movedir = ReadVector(); this.speed = ReadByte(); this.state = ReadByte(); @@ -191,7 +181,7 @@ NET_HANDLE(ENT_CLIENT_CONVEYOR, bool isnew) this.targetname = strzone(ReadString()); this.target = strzone(ReadString()); - conveyor_init(this); + conveyor_init(this, isnew); } if(sf & 2)