X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Flib%2Fwarpzone%2Fserver.qc;h=4540dab4f2eb6194144c33b355e2ef01d671bca5;hp=27640770a1b5ea1ff88a9fbb58b43dd0fd669d86;hb=011d15f2cf0d2fe859534a29f87ba3e0c8695424;hpb=317ec3eb27ada1c4668876e9499136125acb7984 diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index 27640770a..4540dab4f 100644 --- a/qcsrc/lib/warpzone/server.qc +++ b/qcsrc/lib/warpzone/server.qc @@ -30,27 +30,44 @@ void WarpZone_StoreProjectileData(entity e) { +#ifdef SVQC e.warpzone_oldorigin = e.origin; e.warpzone_oldvelocity = e.velocity; e.warpzone_oldangles = e.angles; +#elif defined(CSQC) + e.warpzone_oldorigin = e.move_origin; + e.warpzone_oldvelocity = e.move_velocity; + e.warpzone_oldangles = e.move_angles; +#endif } 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 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 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); } +#ifdef SVQC bool WarpZone_Teleported_Send(entity to, int sf) {SELFPARAM(); WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE_TELEPORTED); @@ -59,14 +76,21 @@ bool WarpZone_Teleported_Send(entity to, int sf) WriteCoord(MSG_ENTITY, self.angles.z); return true; } +#endif 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); @@ -124,12 +148,15 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1) player.warpzone_teleport_finishtime = time; player.warpzone_teleport_zone = wz; +#ifdef SVQC // prevent further teleports back float dt = (o1 - o10) * v1 * (1 / (v1 * v1)); - if(dt < sys_frametime) - player.warpzone_teleport_finishtime += sys_frametime - dt; + if(dt < PHYS_INPUT_FRAMETIME) + player.warpzone_teleport_finishtime += PHYS_INPUT_FRAMETIME - dt; +#endif #ifndef WARPZONE_USE_FIXANGLE + #ifdef SVQC if(IS_VEHICLE(player) && player.owner) player = player.owner; // hax if(IS_PLAYER(player)) @@ -142,13 +169,18 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1) ts.SendEntity = WarpZone_Teleported_Send; ts.SendFlags = 0xFFFFFF; ts.drawonlytoclient = player; - ts.think = SUB_Remove; + ts.think = SUB_Remove_self; ts.nextthink = time + 1; ts.owner = player; ts.enemy = wz; ts.effects = EF_NODEPTHTEST; ts.angles = wz.warpzone_transform; } + #elif defined(CSQC) + setproperty(VF_CL_VIEWANGLES, WarpZone_TransformVAngles(wz, getpropertyvec(VF_CL_VIEWANGLES))); + if(checkextension("DP_CSQC_ROTATEMOVES")) + CL_RotateMoves(wz.warpzone_transform); + #endif #endif return 1; @@ -163,13 +195,21 @@ void WarpZone_Touch () return; // FIXME needs a better check to know what is safe to teleport and what not +#ifdef SVQC if(other.movetype == MOVETYPE_NONE || other.movetype == MOVETYPE_FOLLOW || other.tag_entity) +#elif defined(CSQC) + if(other.move_movetype == MOVETYPE_NONE || other.move_movetype == MOVETYPE_FOLLOW || other.tag_networkentity) +#endif return; if(WarpZoneLib_ExactTrigger_Touch()) return; +#ifdef SVQC if(WarpZone_PlaneDist(self, other.origin + other.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet) +#elif defined(CSQC) + if(WarpZone_PlaneDist(self, other.move_origin + other.view_ofs) >= 0) // wrong side of the trigger_warpzone (don't teleport yet) +#endif return; float f; @@ -186,11 +226,16 @@ void WarpZone_Touch () float d; d = 24 + max(vlen(other.mins), vlen(other.maxs)); if(IS_NOT_A_CLIENT(other)) + #ifdef SVQC f = -d / bound(frametime * d * 1, frametime * vlen(other.velocity), d); + #elif defined(CSQC) + f = -d / bound(frametime * d * 1, frametime * vlen(other.move_velocity), d); + #endif else f = -1; if(WarpZone_Teleport(self, other, f, 0)) { +#ifdef SVQC string save1, save2; activator = other; @@ -207,6 +252,7 @@ void WarpZone_Touch () if (!self.target) self.target = save1; if (!self.target2) self.target2 = save2; setself(this); +#endif } else { @@ -214,6 +260,7 @@ void WarpZone_Touch () } } +#ifdef SVQC bool WarpZone_Send(entity to, int sendflags) {SELFPARAM(); WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE); @@ -318,8 +365,17 @@ float WarpZone_CheckProjectileImpact(entity player) {SELFPARAM(); vector o0, v0; - o0 = player.origin + player.view_ofs; - v0 = player.velocity; + .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; // if we teleported shortly before, abort if(time <= player.warpzone_teleport_finishtime + 0.1) @@ -337,15 +393,19 @@ 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.origin), "\n"); - LOG_INFO("Velocity: ", vtos(player.velocity), "\n"); + LOG_INFO("Origin: ", vtos(player.orgvec), "\n"); + LOG_INFO("Velocity: ", vtos(player.velvec), "\n"); #ifdef WARPZONELIB_REMOVEHACK return 0; #else // retry previous move +#ifdef SVQC setorigin(player, player.warpzone_oldorigin); - player.velocity = player.warpzone_oldvelocity; +#elif defined(CSQC) + player.move_origin = player.warpzone_oldorigin; +#endif + player.velvec = player.warpzone_oldvelocity; if(WarpZone_Teleport(wz, player, 0, 1)) { entity oldself; @@ -373,13 +433,14 @@ float WarpZone_CheckProjectileImpact(entity player) else { setorigin(player, o0 - player.view_ofs); - player.velocity = v0; + player.velvec = v0; } return +1; #endif } #endif +#endif float WarpZone_Projectile_Touch() {SELFPARAM(); @@ -395,6 +456,7 @@ float WarpZone_Projectile_Touch() if(time == self.warpzone_teleport_time) return true; +#ifdef SVQC #ifdef WARPZONELIB_KEEPDEBUG // this SEEMS to not happen at the moment, but if it did, it would be more reliable { @@ -445,10 +507,13 @@ float WarpZone_Projectile_Touch() if(WarpZone_Projectile_Touch_ImpactFilter_Callback()) return true; +#endif return false; } +#ifdef SVQC + void WarpZone_InitStep_FindOriginTarget() {SELFPARAM(); if(self.killtarget != "") @@ -782,55 +847,53 @@ void WarpZone_Think() } void WarpZone_StartFrame() -{SELFPARAM(); - entity e; - if(warpzone_initialized == 0) +{ + SELFPARAM(); + if (!warpzone_initialized) { - warpzone_initialized = 1; - for(setself(warpzone_first); self; setself(self.warpzone_next)) + warpzone_initialized = true; + for (setself(warpzone_first); self; setself(self.warpzone_next)) WarpZone_InitStep_FindOriginTarget(); - for(setself(warpzone_position_first); self; setself(self.warpzone_next)) + for (setself(warpzone_position_first); self; setself(self.warpzone_next)) WarpZonePosition_InitStep_FindTarget(); - for(setself(warpzone_first); self; setself(self.warpzone_next)) + for (setself(warpzone_first); self; setself(self.warpzone_next)) WarpZone_InitStep_UpdateTransform(); setself(this); WarpZones_Reconnect(); WarpZone_PostInitialize_Callback(); } - entity oldother; - oldother = other; - for(e = world; (e = nextent(e)); ) + entity oldother = other; + for (entity e = world; (e = nextent(e)); ) { - if(warpzone_warpzones_exist) { WarpZone_StoreProjectileData(e); } - - if(IS_REAL_CLIENT(e)) + if (warpzone_warpzones_exist) WarpZone_StoreProjectileData(e); + if (IS_REAL_CLIENT(e)) { - if(e.solid == SOLID_NOT) // not spectating? - if(e.movetype == MOVETYPE_NOCLIP || e.movetype == MOVETYPE_FLY || e.movetype == MOVETYPE_FLY_WORLDONLY) // not spectating? (this is to catch observers) + if (e.solid == SOLID_NOT) // not spectating? + if (e.movetype == MOVETYPE_NOCLIP || e.movetype == MOVETYPE_FLY || e.movetype == MOVETYPE_FLY_WORLDONLY) // not spectating? (this is to catch observers) { other = e; // player // warpzones - if(warpzone_warpzones_exist) { - setself(WarpZone_Find(e.origin + e.mins, e.origin + e.maxs)); - if(self) - if(!WarpZoneLib_ExactTrigger_Touch()) - if(WarpZone_PlaneDist(self, e.origin + e.view_ofs) <= 0) - WarpZone_Teleport(self, e, -1, 0); } // NOT triggering targets by this! + if (warpzone_warpzones_exist) { + setself(WarpZone_Find(e.origin + e.mins, e.origin + e.maxs)); + if (self) + if (!WarpZoneLib_ExactTrigger_Touch()) + if (WarpZone_PlaneDist(self, e.origin + e.view_ofs) <= 0) + WarpZone_Teleport(self, e, -1, 0); // NOT triggering targets by this! + } // teleporters setself(Teleport_Find(e.origin + e.mins, e.origin + e.maxs)); - if(self) - if(!WarpZoneLib_ExactTrigger_Touch()) + if (self) + if (!WarpZoneLib_ExactTrigger_Touch()) Simple_TeleportPlayer(self, other); // NOT triggering targets by this! } } - - if(IS_NOT_A_CLIENT(e)) + else if (IS_NOT_A_CLIENT(e)) { - if(warpzone_warpzones_exist) - for (; (e = nextent(e)); ) + if (warpzone_warpzones_exist) + while ((e = nextent(e))) WarpZone_StoreProjectileData(e); break; } @@ -840,14 +903,12 @@ void WarpZone_StartFrame() } .float warpzone_reconnecting; -float visible_to_some_client(entity ent) +bool visible_to_some_client(entity ent) { - entity e; - for(e = nextent(world); !IS_NOT_A_CLIENT(e); e = nextent(e)) - if(IS_PLAYER(e) && IS_REAL_CLIENT(e)) - if(checkpvs(e.origin + e.view_ofs, ent)) - return 1; - return 0; + 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; + )); + return false; } void trigger_warpzone_reconnect_use() {SELFPARAM(); @@ -896,3 +957,5 @@ void WarpZone_PlayerPhysics_FixVAngle() } #endif } + +#endif