public void tellPosition(Vector3 setPosition, NetworkMessageInfo info) { if (info.sender == base.networkView.owner) { if (!Network.isServer || !(base.tag == "Player") && !(base.tag == "Enemy") || !(this.lastTele != Vector3.zero) || this.timeTele == 0f || !(base.transform.parent != null) || !(base.transform.parent.name == "models")) { this.passedDistance = 0f; this.passedHeight = 0f; this.timeBuffer = 0f; } else { NetworkInterpolation networkInterpolation = this; networkInterpolation.passedDistance = networkInterpolation.passedDistance + Mathf.Sqrt(Mathf.Pow(setPosition.x - this.lastTele.x, 2f) + Mathf.Pow(setPosition.z - this.lastTele.z, 2f)); NetworkInterpolation networkInterpolation1 = this; networkInterpolation1.passedHeight = networkInterpolation1.passedHeight + (setPosition.y - this.lastTele.y); NetworkInterpolation networkInterpolation2 = this; networkInterpolation2.timeBuffer = networkInterpolation2.timeBuffer + (Time.realtimeSinceStartup - this.timeTele); if (this.timeBuffer > 3f) { if (this.passedDistance / this.timeBuffer > 13f || this.passedHeight / this.timeBuffer < -12f || this.passedHeight / this.timeBuffer > 5f) { NetworkTools.kick(base.networkView.owner, string.Concat("Kicking ", base.name, " for suspected teleport.")); } else { this.passedDistance = 0f; this.passedHeight = 0f; this.timeBuffer = 0f; } } } this.lastTele = setPosition; this.timeTele = Time.realtimeSinceStartup; this.position = setPosition; } }
internal void InterpolatePositions(Game game, float dt) { for (int i = 0; i < game.entitiesCount; i++) { Entity e = game.entities[i]; if (e == null) { continue; } if (e.networkPosition == null) { continue; } if (i == game.LocalPlayerId) { continue; } if (!e.networkPosition.PositionLoaded) { continue; } if (e.playerDrawInfo == null) { e.playerDrawInfo = new PlayerDrawInfo(); } if (e.playerDrawInfo.interpolation == null) { NetworkInterpolation n = new NetworkInterpolation(); PlayerInterpolate playerInterpolate = new PlayerInterpolate(); playerInterpolate.platform = game.platform; n.req = playerInterpolate; n.DELAYMILLISECONDS = 500; n.EXTRAPOLATE = false; n.EXTRAPOLATION_TIMEMILLISECONDS = 300; e.playerDrawInfo.interpolation = n; } e.playerDrawInfo.interpolation.DELAYMILLISECONDS = MathCi.MaxInt(100, game.ServerInfo.ServerPing.RoundtripTimeTotalMilliseconds()); Entity p = e; PlayerDrawInfo info = p.playerDrawInfo; float networkposX = p.networkPosition.x; float networkposY = p.networkPosition.y; float networkposZ = p.networkPosition.z; if ((!game.Vec3Equal(networkposX, networkposY, networkposZ, info.lastnetworkposX, info.lastnetworkposY, info.lastnetworkposZ)) || p.networkPosition.rotx != info.lastnetworkrotx || p.networkPosition.roty != info.lastnetworkroty || p.networkPosition.rotz != info.lastnetworkrotz) { PlayerInterpolationState state = new PlayerInterpolationState(); state.positionX = networkposX; state.positionY = networkposY; state.positionZ = networkposZ; state.rotx = p.networkPosition.rotx; state.roty = p.networkPosition.roty; state.rotz = p.networkPosition.rotz; info.interpolation.AddNetworkPacket(state, game.totaltimeMilliseconds); } PlayerInterpolationState curstate = game.platform.CastToPlayerInterpolationState(info.interpolation.InterpolatedState(game.totaltimeMilliseconds)); if (curstate == null) { curstate = new PlayerInterpolationState(); } //do not interpolate player position if player is controlled by game world if (game.EnablePlayerUpdatePositionContainsKey(i) && !game.EnablePlayerUpdatePosition(i)) { curstate.positionX = p.networkPosition.x; curstate.positionY = p.networkPosition.y; curstate.positionZ = p.networkPosition.z; } float curposX = curstate.positionX; float curposY = curstate.positionY; float curposZ = curstate.positionZ; info.velocityX = curposX - info.lastcurposX; info.velocityY = curposY - info.lastcurposY; info.velocityZ = curposZ - info.lastcurposZ; info.moves = (!game.Vec3Equal(curposX, curposY, curposZ, info.lastcurposX, info.lastcurposY, info.lastcurposZ)); info.lastcurposX = curposX; info.lastcurposY = curposY; info.lastcurposZ = curposZ; info.lastnetworkposX = networkposX; info.lastnetworkposY = networkposY; info.lastnetworkposZ = networkposZ; info.lastnetworkrotx = p.networkPosition.rotx; info.lastnetworkroty = p.networkPosition.roty; info.lastnetworkrotz = p.networkPosition.rotz; p.position.x = curposX; p.position.y = curposY; p.position.z = curposZ; p.position.rotx = curstate.rotx; p.position.roty = curstate.roty; p.position.rotz = curstate.rotz; } }