///////////////////////////////////////////////////////////////////////// // // www.ultima.smoce.net // Name: TreasureMaps // ///////////////////////////////////////////////////////////////////////// using System; using Phoenix.Communication; namespace Phoenix.Scripts { public class Tracker { private const float MapSizeMultiplier = 3f; private const ushort MapZoom = 720; [Command] public void Track() { Track(false, 0, 0); } [Command] public void Track(ushort x, ushort y) { Track(true, x, y); } private void Track(bool enable, ushort x, ushort y) { PacketWriter writer = new PacketWriter(0xba); writer.Write(enable ? (byte)0x1 : (byte)0x0); writer.Write(x); writer.Write(y); Core.SendToClient(writer.GetBytes()); } [ServerMessageHandler(0x90)] public CallbackResult OnMapInfo(byte[] data, CallbackResult prevResult) { PacketReader reader = new PacketReader(data); reader.Skip(1); // opcode uint serial = reader.ReadUInt32(); ushort gump = reader.ReadUInt16(); ushort ux = reader.ReadUInt16(); ushort uy = reader.ReadUInt16(); ushort lx = reader.ReadUInt16(); ushort ly = reader.ReadUInt16(); ushort width = reader.ReadUInt16(); ushort height = reader.ReadUInt16(); ushort x = (ushort)(ux + 180 * (lx - ux > 361 ? -1 : 1)); ushort y = (ushort)(uy + 180 * (ly - uy > 361 ? -1 : 1)); UO.PrintInformation("Map is located at {0},{1}", x, y); Track(x, y); PacketWriter writer = new PacketWriter(0x90); writer.Write(serial); writer.Write(gump); writer.Write((ushort)(x - MapZoom)); writer.Write((ushort)(y - MapZoom)); writer.Write((ushort)(x + MapZoom)); writer.Write((ushort)(y + MapZoom)); writer.Write((ushort)(width * MapSizeMultiplier)); writer.Write((ushort)(height * MapSizeMultiplier)); Core.SendToClient(writer.GetBytes()); return CallbackResult.Sent; } [ServerMessageHandler(0x56)] public CallbackResult OnPinInfo(byte[] data, CallbackResult prevResult) { if (data[5] > 4) return prevResult; ushort x = ByteConverter.BigEndian.ToUInt16(data, 7); ushort y = ByteConverter.BigEndian.ToUInt16(data, 9); Array.Copy(ByteConverter.BigEndian.GetBytes((ushort)(x * MapSizeMultiplier)), 0, data, 7, 2); Array.Copy(ByteConverter.BigEndian.GetBytes((ushort)(y * MapSizeMultiplier)), 0, data, 9, 2); return prevResult; } [ClientMessageHandler(0x56)] public CallbackResult OnPinAction(byte[] data, CallbackResult prevResult) { if (data[5] > 4) return prevResult; ushort x = ByteConverter.BigEndian.ToUInt16(data, 7); ushort y = ByteConverter.BigEndian.ToUInt16(data, 9); Array.Copy(ByteConverter.BigEndian.GetBytes((ushort)(x / MapSizeMultiplier)), 0, data, 7, 2); Array.Copy(ByteConverter.BigEndian.GetBytes((ushort)(y / MapSizeMultiplier)), 0, data, 9, 2); return prevResult; } } }