X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Fcommon%2Ftriggers%2Ffunc%2Ftrain.qc;h=ead086708196889075c18ae958df185dccb02606;hb=05d2779856eda44ed6c8779ab55380fa006cfcb4;hp=dd9eaac860a5efe24dc0f7d09b71569b356f5fc2;hpb=65e9ceb03c81bc515d090a54f65dd620c8c6dc43;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/common/triggers/func/train.qc b/qcsrc/common/triggers/func/train.qc index dd9eaac86..ead086708 100644 --- a/qcsrc/common/triggers/func/train.qc +++ b/qcsrc/common/triggers/func/train.qc @@ -1,5 +1,6 @@ #include "train.qh" .float train_wait_turning; +.entity future_target; void train_next(entity this); #ifdef SVQC void train_use(entity this, entity actor, entity trigger); @@ -14,7 +15,7 @@ void train_wait(entity this) { entity targ, cp; vector ang; - targ = find(NULL, targetname, this.target); + targ = this.future_target; if((this.spawnflags & 1) && targ.curvetarget) cp = find(NULL, targetname, targ.curvetarget); else @@ -28,7 +29,7 @@ void train_wait(entity this) ang_x = -ang_x; // flip up / down orientation if(this.wait > 0) // slow turning - SUB_CalcAngleMove(this, ang, TSPEED_TIME, this.SUB_LTIME - time + this.wait, train_wait); + SUB_CalcAngleMove(this, ang, TSPEED_TIME, this.ltime - time + this.wait, train_wait); else // instant turning SUB_CalcAngleMove(this, ang, TSPEED_TIME, 0.0000001, train_wait); this.train_wait_turning = true; @@ -41,12 +42,12 @@ void train_wait(entity this) #endif #ifdef SVQC - entity tg = find(NULL, targetname, this.target); + entity tg = this.future_target; if(tg.spawnflags & 4) { this.use = train_use; - SUB_THINK(this, func_null); - this.SUB_NEXTTHINK = 0; + setthink(this, func_null); + this.nextthink = 0; } else #endif @@ -57,18 +58,39 @@ void train_wait(entity this) } else { - SUB_THINK(this, train_next); - this.SUB_NEXTTHINK = this.SUB_LTIME + this.wait; + setthink(this, train_next); + this.nextthink = this.ltime + this.wait; + } +} + +entity train_next_find(entity this) +{ + if(this.target_random) + { + RandomSelection_Init(); + for(entity t = NULL; (t = find(t, targetname, this.target));) + { + RandomSelection_AddEnt(t, 1, 0); + } + return RandomSelection_chosen_ent; + } + else + { + return find(NULL, targetname, this.target); } } void train_next(entity this) { - entity targ, cp = NULL; + entity targ = NULL, cp = NULL; vector cp_org = '0 0 0'; - targ = find(NULL, targetname, this.target); + targ = this.future_target; + this.target = targ.target; + this.target_random = targ.target_random; + this.future_target = train_next_find(targ); + if (this.spawnflags & 1) { if(targ.curvetarget) @@ -135,20 +157,12 @@ float train_send(entity this, entity to, float sf) WriteString(MSG_ENTITY, this.curvetarget); - WriteCoord(MSG_ENTITY, this.pos1_x); - WriteCoord(MSG_ENTITY, this.pos1_y); - WriteCoord(MSG_ENTITY, this.pos1_z); - WriteCoord(MSG_ENTITY, this.pos2_x); - WriteCoord(MSG_ENTITY, this.pos2_y); - WriteCoord(MSG_ENTITY, this.pos2_z); + WriteVector(MSG_ENTITY, this.pos1); + WriteVector(MSG_ENTITY, this.pos2); - WriteCoord(MSG_ENTITY, this.size_x); - WriteCoord(MSG_ENTITY, this.size_y); - WriteCoord(MSG_ENTITY, this.size_z); + WriteVector(MSG_ENTITY, this.size); - WriteCoord(MSG_ENTITY, this.view_ofs_x); - WriteCoord(MSG_ENTITY, this.view_ofs_y); - WriteCoord(MSG_ENTITY, this.view_ofs_z); + WriteVector(MSG_ENTITY, this.view_ofs); WriteAngle(MSG_ENTITY, this.mangle_x); WriteAngle(MSG_ENTITY, this.mangle_y); @@ -179,24 +193,28 @@ void train_link(entity this) void train_use(entity this, entity actor, entity trigger) { - this.SUB_NEXTTHINK = this.SUB_LTIME + 1; - SUB_THINK(this, train_next); + this.nextthink = this.ltime + 1; + setthink(this, train_next); this.use = func_null; // not again + if(trigger.target2 && trigger.target2 != "") + this.future_target = find(NULL, targetname, trigger.target2); } void func_train_find(entity this) { - entity targ; - targ = find(NULL, targetname, this.target); + entity targ = train_next_find(this); this.target = targ.target; + this.target_random = targ.target_random; + // save the future target for later + this.future_target = train_next_find(targ); if (this.target == "") objerror(this, "func_train_find: no next target"); - SUB_SETORIGIN(this, targ.origin - this.view_ofs); + setorigin(this, targ.origin - this.view_ofs); if(!(this.spawnflags & 4)) { - this.SUB_NEXTTHINK = this.SUB_LTIME + 1; - SUB_THINK(this, train_next); + this.nextthink = this.ltime + 1; + setthink(this, train_next); } train_link(this); @@ -278,20 +296,12 @@ NET_HANDLE(ENT_CLIENT_TRAIN, bool isnew) this.curvetarget = strzone(ReadString()); - this.pos1_x = ReadCoord(); - this.pos1_y = ReadCoord(); - this.pos1_z = ReadCoord(); - this.pos2_x = ReadCoord(); - this.pos2_y = ReadCoord(); - this.pos2_z = ReadCoord(); + this.pos1 = ReadVector(); + this.pos2 = ReadVector(); - this.size_x = ReadCoord(); - this.size_y = ReadCoord(); - this.size_z = ReadCoord(); + this.size = ReadVector(); - this.view_ofs_x = ReadCoord(); - this.view_ofs_y = ReadCoord(); - this.view_ofs_z = ReadCoord(); + this.view_ofs = ReadVector(); this.mangle_x = ReadAngle(); this.mangle_y = ReadAngle();