X-Git-Url: https://de.git.xonotic.org/?a=blobdiff_plain;f=qcsrc%2Flib%2Fwarpzone%2Fserver.qc;h=116ad00023ae98b1a4321c609698298a2dd46f0b;hb=753b7569cd6ccb5a6528aad2ecc374a68c962748;hp=6dd0ea3c7f357ad960a801de459c13812c1d1b17;hpb=2300937585fd409c578a516ed5e051ba389646d4;p=xonotic%2Fxonotic-data.pk3dir.git diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index 6dd0ea3c7..116ad0002 100644 --- a/qcsrc/lib/warpzone/server.qc +++ b/qcsrc/lib/warpzone/server.qc @@ -5,9 +5,9 @@ #elif defined(MENUQC) #elif defined(SVQC) #include + #include #include #include - #include #include #include #endif @@ -28,44 +28,27 @@ .float warpzone_teleport_finishtime; .entity warpzone_teleport_zone; -#ifdef SVQC - #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 -#elif defined(CSQC) - #define WarpZone_StoreProjectileData(e_) MACRO_BEGIN { \ - entity e = e_; \ - e.warpzone_oldorigin = e.move_origin; \ - e.warpzone_oldvelocity = e.move_velocity; \ - e.warpzone_oldangles = e.move_angles; \ - } MACRO_END -#endif +#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 void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity) { -#ifdef SVQC setorigin(player, to); // NOTE: this also aborts the move, when this is called by touch +#ifdef SVQC player.oldorigin = to; // for DP's unsticking - player.angles = to_angles; player.fixangle = true; - player.velocity = to_velocity; -#elif defined(CSQC) - player.move_origin = to; - player.move_angles = to_angles; - player.move_velocity = to_velocity; #endif + player.angles = to_angles; + player.velocity = to_velocity; BITXOR_ASSIGN(player.effects, EF_TELEPORT_BIT); if(IS_PLAYER(player)) -#ifdef SVQC BITCLR_ASSIGN(player.flags, FL_ONGROUND); -#elif defined(CSQC) - BITCLR_ASSIGN(player.move_flags, FL_ONGROUND); -#endif WarpZone_PostTeleportPlayer_Callback(player); } @@ -85,15 +68,9 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1) { vector o0, a0, v0, o1, a1, v1, o10; -#ifdef SVQC o0 = player.origin + player.view_ofs; v0 = player.velocity; a0 = player.angles; -#elif defined(CSQC) - o0 = player.move_origin + player.view_ofs; - v0 = player.move_velocity; - a0 = player.move_angles; -#endif o10 = o1 = WarpZone_TransformOrigin(wz, o0); v1 = WarpZone_TransformVelocity(wz, v0); @@ -198,21 +175,17 @@ void WarpZone_Touch(entity this, entity toucher) return; // FIXME needs a better check to know what is safe to teleport and what not -#ifdef SVQC - if(toucher.movetype == MOVETYPE_NONE || toucher.movetype == MOVETYPE_FOLLOW || toucher.tag_entity) -#elif defined(CSQC) - if(toucher.move_movetype == MOVETYPE_NONE || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_networkentity) + if((toucher.move_movetype == MOVETYPE_NONE && toucher.move_movetype == MOVETYPE_NONE) || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.move_movetype == MOVETYPE_FOLLOW || toucher.tag_entity +#ifdef CSQC + || tag_networkentity #endif + ) return; if(WarpZoneLib_ExactTrigger_Touch(this, toucher)) return; -#ifdef SVQC if(WarpZone_PlaneDist(this, toucher.origin + toucher.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet) -#elif defined(CSQC) - if(WarpZone_PlaneDist(this, toucher.move_origin + toucher.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet) -#endif return; float f; @@ -229,11 +202,7 @@ void WarpZone_Touch(entity this, entity toucher) float d; d = 24 + max(vlen(toucher.mins), vlen(toucher.maxs)); if(IS_NOT_A_CLIENT(toucher)) - #ifdef SVQC f = -d / bound(frametime * d * 1, frametime * vlen(toucher.velocity), d); - #elif defined(CSQC) - f = -d / bound(frametime * d * 1, frametime * vlen(toucher.move_velocity), d); - #endif else f = -1; if(WarpZone_Teleport(this, toucher, f, 0)) @@ -256,7 +225,7 @@ void WarpZone_Touch(entity this, entity toucher) } else { - LOG_TRACE("WARPZONE FAIL AHAHAHAHAH))\n"); + LOG_TRACE("WARPZONE FAIL AHAHAHAHAH))"); } } @@ -365,17 +334,8 @@ float WarpZone_CheckProjectileImpact(entity player) { vector o0, v0; - .vector orgvec, velvec; -#ifdef SVQC - orgvec = origin; - velvec = velocity; -#elif defined(CSQC) - orgvec = move_origin; - velvec = move_velocity; -#endif - - o0 = player.orgvec + player.view_ofs; - v0 = player.velvec; + o0 = player.origin + player.view_ofs; + v0 = player.velocity; // if we teleported shortly before, abort if(time <= player.warpzone_teleport_finishtime + 0.1) @@ -393,19 +353,15 @@ float WarpZone_CheckProjectileImpact(entity player) LOG_INFO("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n"); #endif LOG_INFO("Entity type: ", player.classname, "\n"); - LOG_INFO("Origin: ", vtos(player.orgvec), "\n"); - LOG_INFO("Velocity: ", vtos(player.velvec), "\n"); + LOG_INFO("Origin: ", vtos(player.origin), "\n"); + LOG_INFO("Velocity: ", vtos(player.velocity), "\n"); #ifdef WARPZONELIB_REMOVEHACK return 0; #else // retry previous move -#ifdef SVQC setorigin(player, player.warpzone_oldorigin); -#elif defined(CSQC) - player.move_origin = player.warpzone_oldorigin; -#endif - player.velvec = player.warpzone_oldvelocity; + player.velocity = player.warpzone_oldvelocity; if(WarpZone_Teleport(wz, player, 0, 1)) { string save1, save2; @@ -425,7 +381,7 @@ float WarpZone_CheckProjectileImpact(entity player) else { setorigin(player, o0 - player.view_ofs); - player.velvec = v0; + player.velocity = v0; } return +1; @@ -675,7 +631,6 @@ void WarpZone_InitStep_ClearTarget(entity this) this.enemy = NULL; } -entity warpzone_first; .entity warpzone_next; void WarpZone_InitStep_FindTarget(entity this) { float i; @@ -775,6 +730,8 @@ spawnfunc(trigger_warpzone) BITSET_ASSIGN(this.effects, EF_NODEPTHTEST); this.warpzone_next = warpzone_first; warpzone_first = this; + + IL_PUSH(g_warpzones, this); } spawnfunc(func_camera) { @@ -847,10 +804,19 @@ void WarpZone_StartFrame() WarpZone_PostInitialize_Callback(); } - FOREACH_ENTITY(!is_pure(it), + if(warpzone_warpzones_exist) { - if(warpzone_warpzones_exist) + IL_EACH(g_projectiles, true, + { WarpZone_StoreProjectileData(it); + }); + } + + + FOREACH_CLIENT(true, + { + if(warpzone_warpzones_exist) + WarpZone_StoreProjectileData(it); // TODO: not actually needed if(IS_OBSERVER(it) || it.solid == SOLID_NOT) if(IS_CLIENT(it)) // we don't care about it being a bot @@ -879,9 +845,10 @@ void WarpZone_StartFrame() .float warpzone_reconnecting; bool visible_to_some_client(entity ent) { - FOREACH_ENTITY(!IS_NOT_A_CLIENT(it), LAMBDA( - if (IS_PLAYER(it) && IS_REAL_CLIENT(it) && checkpvs(it.origin + it.view_ofs, ent)) return true; - )); + FOREACH_CLIENT(IS_PLAYER(it) && IS_REAL_CLIENT(it) && checkpvs(it.origin + it.view_ofs, ent), + { + return true; + }); return false; } void trigger_warpzone_reconnect_use(entity this, entity actor, entity trigger)