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=e21e4cab4942029f951c755498b06c2a758785ec;hb=011d15f2cf0d2fe859534a29f87ba3e0c8695424;hpb=9dd43f196ca7bc0979f94a0fb0f87cdd82a951c7 diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index e21e4cab49..4540dab4f2 100644 --- a/qcsrc/lib/warpzone/server.qc +++ b/qcsrc/lib/warpzone/server.qc @@ -30,43 +30,67 @@ 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(); - WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_TELEPORTED); + WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE_TELEPORTED); WriteCoord(MSG_ENTITY, self.angles.x); WriteCoord(MSG_ENTITY, self.angles.y); 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)) @@ -137,25 +164,29 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1) // instead of fixangle, send the transform to the client for smoother operation player.fixangle = false; - entity ts = spawn(); + entity ts = new(warpzone_teleported); setmodel(ts, MDL_Null); 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.classname = "warpzone_teleported"; 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; } -void WarpZone_Touch (void) +void WarpZone_Touch () {SELFPARAM(); if(other.classname == "trigger_warpzone") return; @@ -164,13 +195,21 @@ void WarpZone_Touch (void) 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; @@ -187,11 +226,16 @@ void WarpZone_Touch (void) 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; @@ -208,6 +252,7 @@ void WarpZone_Touch (void) if (!self.target) self.target = save1; if (!self.target2) self.target2 = save2; setself(this); +#endif } else { @@ -215,9 +260,10 @@ void WarpZone_Touch (void) } } +#ifdef SVQC bool WarpZone_Send(entity to, int sendflags) {SELFPARAM(); - WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE); + WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE); // we must send this flag for clientside to match properly too int f = 0; @@ -272,7 +318,7 @@ bool WarpZone_Send(entity to, int sendflags) bool WarpZone_Camera_Send(entity to, int sendflags) {SELFPARAM(); int f = 0; - WriteByte(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA); + WriteHeader(MSG_ENTITY, ENT_CLIENT_WARPZONE_CAMERA); if(self.warpzone_fadestart) BITSET_ASSIGN(f, 2); @@ -319,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) @@ -338,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; @@ -374,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(); @@ -396,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 { @@ -446,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 != "") @@ -486,7 +550,7 @@ void WarpZonePosition_InitStep_FindTarget() self.enemy.aiment = self; } -void WarpZoneCamera_Think(void) +void WarpZoneCamera_Think() {SELFPARAM(); if(self.warpzone_save_origin != self.origin || self.warpzone_save_angles != self.angles @@ -783,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; } @@ -841,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(); @@ -885,7 +945,7 @@ spawnfunc(target_warpzone_reconnect) spawnfunc_trigger_warpzone_reconnect(this); // both names make sense here :( } -void WarpZone_PlayerPhysics_FixVAngle(void) +void WarpZone_PlayerPhysics_FixVAngle() {SELFPARAM(); #ifndef WARPZONE_DONT_FIX_VANGLE if(IS_REAL_CLIENT(self)) @@ -897,3 +957,5 @@ void WarpZone_PlayerPhysics_FixVAngle(void) } #endif } + +#endif