X-Git-Url: http://de.git.xonotic.org/?p=xonotic%2Fxonotic-data.pk3dir.git;a=blobdiff_plain;f=qcsrc%2Flib%2Fwarpzone%2Fserver.qc;h=936d075da8f69e2b3057d965dc35029b57b1cf23;hp=34ea2610dedd7afa60e30ce6bab89f7df643940a;hb=504f56fdc7f827a61fe8b89357208ed66435e86e;hpb=e424ba544c41fc40b241b17bd7c1d9c2fc930705 diff --git a/qcsrc/lib/warpzone/server.qc b/qcsrc/lib/warpzone/server.qc index 34ea2610d..936d075da 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 @@ -37,6 +37,10 @@ void WarpZone_TeleportPlayer(entity teleporter, entity player, vector to, vector to_angles, vector to_velocity) { +#ifdef SVQC + player.lastteleport_origin = player.origin; + player.lastteleporttime = time; +#endif setorigin(player, to); // NOTE: this also aborts the move, when this is called by touch #ifdef SVQC player.oldorigin = to; // for DP's unsticking @@ -114,7 +118,7 @@ float WarpZone_Teleport(entity wz, entity player, float f0, float f1) } else { - LOG_INFO("would have to put player in solid, won't do that\n"); + LOG_INFO("would have to put player in solid, won't do that"); setorigin(player, o0 - player.view_ofs); return 0; } @@ -348,13 +352,13 @@ float WarpZone_CheckProjectileImpact(entity player) return 0; #ifdef WARPZONELIB_REMOVEHACK - LOG_INFO("impactfilter found something - and it no longer gets handled correctly - please tell divVerent whether anything behaves broken now\n"); + LOG_INFO("impactfilter found something - and it no longer gets handled correctly - please tell divVerent whether anything behaves broken now"); #else - LOG_INFO("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again\n"); + LOG_INFO("impactfilter found something - and it even gets handled correctly - please tell divVerent that this code apparently gets triggered again"); #endif - LOG_INFO("Entity type: ", player.classname, "\n"); - LOG_INFO("Origin: ", vtos(player.origin), "\n"); - LOG_INFO("Velocity: ", vtos(player.velocity), "\n"); + LOG_INFO("Entity type: ", player.classname); + LOG_INFO("Origin: ", vtos(player.origin)); + LOG_INFO("Velocity: ", vtos(player.velocity)); #ifdef WARPZONELIB_REMOVEHACK return 0; @@ -583,7 +587,7 @@ void WarpZone_InitStep_UpdateTransform(entity this) point = point * (1 / (3 * area)); if(vdist(norm, <, 0.99)) { - LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " is nonplanar. BEWARE.\n"); + LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " is nonplanar. BEWARE."); area = 0; // no autofixing in this case } norm = normalize(norm); @@ -600,15 +604,15 @@ void WarpZone_InitStep_UpdateTransform(entity this) makevectors(ang); if(norm * v_forward < 0) { - LOG_INFO("Position target of trigger_warpzone near ", vtos(this.aiment.origin), " points into trigger_warpzone. BEWARE.\n"); + LOG_INFO("Position target of trigger_warpzone near ", vtos(this.aiment.origin), " points into trigger_warpzone. BEWARE."); norm = -1 * norm; } ang = vectoangles2(norm, v_up); // keep rotation, but turn exactly against plane ang.x = -ang.x; if(norm * v_forward < 0.99) - LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been turned to match plane orientation (", vtos(this.aiment.angles), " -> ", vtos(ang), "\n"); + LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been turned to match plane orientation (", vtos(this.aiment.angles), " -> ", vtos(ang)); if(vdist(org - this.aiment.origin, >, 0.5)) - LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been moved to match the plane (", vtos(this.aiment.origin), " -> ", vtos(org), ").\n"); + LOG_INFO("trigger_warpzone near ", vtos(this.aiment.origin), " has been moved to match the plane (", vtos(this.aiment.origin), " -> ", vtos(org), ")."); } } else if(area > 0) @@ -631,7 +635,6 @@ void WarpZone_InitStep_ClearTarget(entity this) this.enemy = NULL; } -entity warpzone_first; .entity warpzone_next; void WarpZone_InitStep_FindTarget(entity this) { float i; @@ -731,6 +734,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) { @@ -803,10 +808,19 @@ void WarpZone_StartFrame() WarpZone_PostInitialize_Callback(); } - FOREACH_ENTITY_FLOAT(pure_data, false, + 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 @@ -878,7 +892,7 @@ void WarpZone_PlayerPhysics_FixVAngle(entity this) #ifndef WARPZONE_DONT_FIX_VANGLE if(IS_REAL_CLIENT(this)) if(this.v_angle.z <= 360) // if not already adjusted - if(time - this.ping * 0.001 < this.warpzone_teleport_time) + if(time - CS(this).ping * 0.001 < this.warpzone_teleport_time) { this.v_angle = WarpZone_TransformVAngles(this.warpzone_teleport_zone, this.v_angle); this.v_angle_z += 720; // mark as adjusted