/// <summary>Processes each client update packet sent from the client, updating internal state.</summary> internal void ProcessClientUpdate(PlayerPositionUpdateClient ppuc, out SpawnAppearance sa, out PlayerPositionUpdateServer ppus) { float dist = 0, tmp; tmp = this.X - ppuc.XPos; dist += tmp * tmp; tmp = this.Y - ppuc.YPos; dist += tmp * tmp; dist = (float)Math.Sqrt(dist); // TODO: Perhaps a warp check in the future, for now just log stuff if (dist > 50.0f * 50.0f) { _log.WarnFormat("{0}: Large position change: {1} units", this.Name, Math.Sqrt(dist)); _log.WarnFormat("Coords: ({0:F4}, {1:F4}, {2:F4}) -> ({3:F4}, {4:F4}, {5:F4})", this.X, this.Y, this.Z, ppuc.XPos, ppuc.YPos, ppuc.ZPos); _log.WarnFormat("Deltas: ({0:F2}, {1:F2}, {2:F2}) -> ({3:F2}, {4:F2}, {5:F2})", _deltaX, _deltaY, _deltaZ, ppuc.DeltaX, ppuc.DeltaY, ppuc.DeltaZ); } // TODO: proximity timer? _deltaX = ppuc.DeltaX; _deltaY = ppuc.DeltaY; _deltaZ = ppuc.DeltaZ; _deltaHeading = ppuc.DeltaHeading; this.Heading = ppuc.Heading; // TODO: tracking skill increase check sa = new SpawnAppearance(); if (ppuc.YPos != this.Y || ppuc.XPos != this.X) { if (!_sneaking && !_invis) { _hidden = false; _improvedHidden = false; sa = new SpawnAppearance((ushort)this.ID, 0x03, 0); } } ppus = new PlayerPositionUpdateServer(); if (ppuc.YPos != this.Y || ppuc.XPos != this.X || ppuc.Heading != this.Heading || ppuc.Animation != this.Animation) ppus = GetSpawnUpdate(); this.X = ppuc.XPos; this.Y = ppuc.YPos; this.Z = ppuc.ZPos; this.Animation = ppuc.Animation; }
internal virtual PlayerPositionUpdateServer GetSpawnUpdateNoDelta() { PlayerPositionUpdateServer ppus = new PlayerPositionUpdateServer(); ppus.SpawnId = (ushort)this.ID; ppus.XPos = this.X; ppus.YPos = this.Y; ppus.ZPos = this.Z; ppus.DeltaX = 0; ppus.DeltaY = 0; ppus.DeltaZ = 0; ppus.Heading = this.Heading; ppus.Animation = 0; ppus.DeltaHeading = 0; ppus.Padding0002 = 0; ppus.Padding0006 = 7; ppus.Padding0014 = 0x7f; ppus.Padding0018 = 0x5df27; return ppus; }