X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fwarpzone%2Fserver.qc;h=66ee6b133c22b2ef98cc1e1e4aae614ed21ae79d;hb=43c9e02033d4b7b2100df527fb8ea5ab8e439e14;hp=1f2470948740146e1b389f6328a07a2bc7a17834;hpb=407a44c63b08ce91c669b5ff346f4ea54267e3e3;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index 1f2470948..66ee6b133 100644 --- a/qcsrc/lib/warpzone/server.qc +++ b/qcsrc/lib/warpzone/server.qc @@ -10,6 +10,11 @@ #include #include #include + #include +#endif + +#ifdef SVQC +bool autocvar_sv_warpzone_allow_selftarget; #endif #ifdef WARPZONELIB_KEEPDEBUG @@ -28,12 +33,12 @@ .float warpzone_teleport_finishtime; .entity warpzone_teleport_zone; -#define WarpZone_StoreProjectileData(e_) MACRO_BEGIN { \ +#define WarpZone_StoreProjectileData(e_) MACRO_BEGIN \ entity e = e_; \ e.warpzone_oldorigin = e.origin; \ e.warpzone_oldvelocity = e.velocity; \ e.warpzone_oldangles = e.angles; \ - } MACRO_END + MACRO_END void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity) { @@ -42,11 +47,17 @@ void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector player.lastteleporttime = time; #endif setorigin(player, to); // NOTE: this also aborts the move, when this is called by touch + player.angles = to_angles; #ifdef SVQC player.oldorigin = to; // for DP's unsticking player.fixangle = true; + if (IS_BOT_CLIENT(player)) + { + // FIXME find a way to smooth view's angles change for bots too + player.v_angle = player.angles; + bot_aim_reset(player); + } #endif - player.angles = to_angles; player.velocity = to_velocity; BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT); @@ -206,19 +217,8 @@ void WarpZone_Touch(entity this, entity toucher) if(WarpZone_Teleport(this, toucher, f, 0)) { #ifdef SVQC - string save1, save2; - - save1 = this.target; this.target = string_null; - save2 = this.target3; this.target3 = string_null; - SUB_UseTargets(this, toucher, toucher); // use toucher too? - if (!this.target) this.target = save1; - if (!this.target3) this.target3 = save2; - - save1 = this.target; this.target = string_null; - save2 = this.target2; this.target2 = string_null; - SUB_UseTargets(this.enemy, toucher, toucher); // use toucher too? - if (!this.target) this.target = save1; - if (!this.target2) this.target2 = save2; + SUB_UseTargets_SkipTargets(this, toucher, toucher, BIT(1) | BIT(3)); // use toucher too? + SUB_UseTargets_SkipTargets(this.enemy, toucher, toucher, BIT(1) | BIT(2)); // use toucher too? #endif } else @@ -362,19 +362,8 @@ float WarpZone_CheckProjectileImpact(entity player) player.velocity = player.warpzone_oldvelocity; if(WarpZone_Teleport(wz, player, 0, 1)) { - string save1, save2; - - save1 = wz.target; wz.target = string_null; - save2 = wz.target3; wz.target3 = string_null; - SUB_UseTargets(wz, player, player); - if (!wz.target) wz.target = save1; - if (!wz.target3) wz.target3 = save2; - - save1 = wz.enemy.target; wz.enemy.target = string_null; - save2 = wz.enemy.target2; wz.enemy.target2 = string_null; - SUB_UseTargets(wz.enemy, player, player); - if (!wz.enemy.target) wz.enemy.target = save1; - if (!wz.enemy.target2) wz.enemy.target2 = save2; + SUB_UseTargets_SkipTargets(wz, player, player, BIT(1) | BIT(3)); + SUB_UseTargets_SkipTargets(wz.enemy, player, player, BIT(1) | BIT(2)); } else { @@ -595,7 +584,8 @@ void WarpZone_InitStep_UpdateTransform(entity this) if(area > 0) { org = org - ((org - point) * norm) * norm; // project to plane - MAKE_VECTORS_NEW(ang, forward, right, up); + vector forward, right, up; + MAKE_VECTORS(ang, forward, right, up); if(norm * forward < 0) { LOG_INFO("Position target of trigger_warpzone near ", vtos(this.aiment.origin), " points into trigger_warpzone. BEWARE."); @@ -640,7 +630,8 @@ void WarpZone_InitStep_FindTarget(entity this) // this way only one of the two ents needs to target if(this.target != "") { - this.enemy = this; // so the if(!e.enemy) check also skips this, saves one IF + if(!autocvar_sv_warpzone_allow_selftarget) + this.enemy = this; // so the if(!e.enemy) check also skips this, saves one IF e2 = NULL; for(e = NULL, i = 0; (e = find(e, targetname, this.target)); )