public static void CrashReport(NetState state, CircularBufferReader reader) { var clientMaj = reader.ReadByte(); var clientMin = reader.ReadByte(); var clientRev = reader.ReadByte(); var clientPat = reader.ReadByte(); var x = reader.ReadUInt16(); var y = reader.ReadUInt16(); var z = reader.ReadSByte(); var map = reader.ReadByte(); var account = reader.ReadAscii(32); var character = reader.ReadAscii(32); var ip = reader.ReadAscii(15); var unk1 = reader.ReadInt32(); var exception = reader.ReadInt32(); var process = reader.ReadAscii(100); var report = reader.ReadAscii(100); reader.ReadByte(); // 0x00 var offset = reader.ReadInt32(); int count = reader.ReadByte(); for (var i = 0; i < count; i++) { var address = reader.ReadInt32(); } }
public static void EncodedCommand(NetState state, CircularBufferReader reader) { var e = World.FindEntity(reader.ReadUInt32()); int packetId = reader.ReadUInt16(); var ph = IncomingPackets.GetEncodedHandler(packetId); if (ph == null) { reader.Trace(state); return; } if (ph.Ingame && state.Mobile == null) { state.WriteConsole( "Sent ingame packet (0xD7x{0:X2}) before having been attached to a mobile", packetId ); state.Dispose(); } else if (ph.Ingame && state.Mobile.Deleted) { state.Dispose(); } else { ph.OnReceive(state, e, new EncodedReader(reader)); } }
public static void MenuResponse(NetState state, CircularBufferReader reader) { var serial = reader.ReadUInt32(); int menuID = reader.ReadInt16(); // unused in our implementation int index = reader.ReadInt16(); int itemID = reader.ReadInt16(); int hue = reader.ReadInt16(); index -= 1; // convert from 1-based to 0-based foreach (var menu in state.Menus) { if (menu.Serial == serial) { state.RemoveMenu(menu); if (index >= 0 && index < menu.EntryLength) { menu.OnResponse(state, index); } else { menu.OnCancel(state); } break; } } }
public static void AsciiPromptResponse(NetState state, CircularBufferReader reader) { var from = state.Mobile; if (from == null) { return; } var serial = reader.ReadUInt32(); var prompt = reader.ReadInt32(); var type = reader.ReadInt32(); var text = reader.ReadAsciiSafe(); if (text.Length > 128) { return; } var p = from.Prompt; if (p?.Serial == serial && p.Serial == prompt) { from.Prompt = null; if (type == 0) { p.OnCancel(from); } else { p.OnResponse(from, text); } } }
public static void PollInfo(NetState ns, CircularBufferReader reader, ref int packetLength) { var version = reader.ReadByte(); if (_token != null) { unsafe { byte *tok = stackalloc byte[_token.Length]; var span = new Span <byte>(tok, _token.Length); reader.Read(span); if (!span.SequenceEqual(_token)) { ns.Disconnect("Invalid token sent for ConnectUO"); return; } } } ns.LogInfo($"ConnectUO (v{version}) is requesting stats."); if (version > ConnectUOProtocolVersion) { Utility.PushColor(ConsoleColor.Yellow); ns.LogInfo("Warning! ConnectUO (v{version}) is newer than what is supported."); Utility.PopColor(); } ns.SendServerPollInfo(); }
public static void DecodeBundledPacket(NetState state, CircularBufferReader reader) { int packetID = reader.ReadByte(); PacketHandler ph = GetHandler(packetID); if (ph == null) { return; } if (ph.Ingame && state.Mobile == null) { state.WriteConsole("Sent in-game packet (0xBFx{0:X2}) before having been attached to a mobile", packetID); state.Dispose(); } else if (ph.Ingame && state.Mobile.Deleted) { state.Dispose(); } else { ph.OnReceive(state, reader); } }
public static void LiftReq(NetState state, CircularBufferReader reader, ref int packetLength) { var serial = (Serial)reader.ReadUInt32(); int amount = reader.ReadUInt16(); var item = World.FindItem(serial); state.Mobile.Lift(item, amount, out _, out _); }
public static void LiftReq(NetState state, CircularBufferReader reader) { Serial serial = reader.ReadUInt32(); int amount = reader.ReadUInt16(); var item = World.FindItem(serial); state.Mobile.Lift(item, amount, out _, out _); }
public static void MobileNameRequest(NetState state, CircularBufferReader reader) { var m = World.FindMobile(reader.ReadUInt32()); if (m != null && Utility.InUpdateRange(state.Mobile, m) && state.Mobile.CanSee(m)) { state.Send(new MobileName(m)); } }
public static void MobileNameRequest(NetState state, CircularBufferReader reader, ref int packetLength) { var m = World.FindMobile((Serial)reader.ReadUInt32()); if (m != null && Utility.InUpdateRange(state.Mobile.Location, m.Location) && state.Mobile.CanSee(m)) { state.SendMobileName(m); } }
public static void BBRequestHeader(Mobile from, BaseBulletinBoard board, CircularBufferReader reader) { if (World.FindItem((Serial)reader.ReadUInt32()) is not BulletinMessage msg || msg.Parent != board) { return; } from.NetState.SendBBMessage(board, msg); }
public static void BBPostMessage(Mobile from, BaseBulletinBoard board, CircularBufferReader reader) { var thread = World.FindItem(reader.ReadUInt32()) as BulletinMessage; if (thread != null && thread.Parent != board) { thread = null; } var breakout = 0; while (thread?.Thread != null && breakout++ < 10) { thread = thread.Thread; } var lastPostTime = DateTime.MinValue; if (board.GetLastPostTime(from, thread == null, ref lastPostTime)) { if (thread == null) { if (!BulletinBoardSystem.CheckCreateTime(lastPostTime)) { from.SendMessage($"You must wait {FormatTS(BulletinBoardSystem.ThreadCreateTime)} before creating a new thread."); return; } } else if (!BulletinBoardSystem.CheckReplyTime(lastPostTime)) { from.SendMessage($"You must wait {FormatTS(BulletinBoardSystem.ThreadReplyTime)} before replying to another thread."); return; } } var subject = reader.ReadUTF8Safe(reader.ReadByte()); if (subject.Length == 0) { return; } var lines = new string[reader.ReadByte()]; if (lines.Length == 0) { return; } for (var i = 0; i < lines.Length; ++i) { lines[i] = reader.ReadUTF8Safe(reader.ReadByte()); } board.PostMessage(from, thread, subject, lines); }
public static void QueryPartyMemberLocations(NetState state, CircularBufferReader reader, int packetLength) { Mobile from = state.Mobile; var party = Party.Get(from); if (party != null) { state.SendPartyMemberLocations(from, party); } }
public static void QueryPartyMemberLocations(NetState ns, CircularBufferReader reader) { Mobile from = ns.Mobile; var party = Party.Get(from); if (party != null) { ns.SendPartyMemberLocations(from, party); } }
public static void RenameRequest(NetState state, CircularBufferReader reader, ref int packetLength) { var from = state.Mobile; var targ = World.FindMobile((Serial)reader.ReadUInt32()); if (targ != null) { EventSink.InvokeRenameRequest(from, targ, reader.ReadAsciiSafe()); } }
public static void QueryCompactShardStats(NetState state, CircularBufferReader reader, int packetLength) { state.SendCompactShardStats( (uint)(Core.TickCount / 1000), TcpServer.Instances.Count - 1, // Shame if you modify this! World.Items.Count, World.Mobiles.Count, GC.GetTotalMemory(false) ); }
public static void QueryExtendedShardStats(NetState state, CircularBufferReader reader, int packetLength) { const long ticksInHour = 1000 * 60 * 60; state.SendExtendedShardStats( ServerList.ServerName, (int)(Core.TickCount / ticksInHour), TcpServer.Instances.Count - 1, // Shame if you modify this! World.Items.Count, World.Mobiles.Count, (int)(GC.GetTotalMemory(false) / 1024) ); }
public static void BBRemoveMessage(Mobile from, BaseBulletinBoard board, CircularBufferReader reader) { if (World.FindItem((Serial)reader.ReadUInt32()) is not BulletinMessage msg || msg.Parent != board) { return; } if (from.AccessLevel < AccessLevel.GameMaster && msg.Poster != from) { return; } msg.Delete(); }
public static void SystemInfo(NetState state, CircularBufferReader reader) { int v1 = reader.ReadByte(); int v2 = reader.ReadUInt16(); int v3 = reader.ReadByte(); var s1 = reader.ReadAscii(32); var s2 = reader.ReadAscii(32); var s3 = reader.ReadAscii(32); var s4 = reader.ReadAscii(32); int v4 = reader.ReadUInt16(); int v5 = reader.ReadUInt16(); var v6 = reader.ReadInt32(); var v7 = reader.ReadInt32(); var v8 = reader.ReadInt32(); }
// TODO: Throttle/make this more safe public static void Resynchronize(NetState state, CircularBufferReader reader, ref int packetLength) { var from = state.Mobile; if (from == null) { return; } state.SendMobileUpdate(from); state.SendMobileIncoming(from, from); from.SendEverything(); state.Sequence = 0; }
public static void AttackReq(NetState state, CircularBufferReader reader) { var from = state.Mobile; if (from == null) { return; } var m = World.FindMobile(reader.ReadUInt32()); if (m != null) { from.Attack(m); } }
// TODO: Throttle/make this more safe public static void Resynchronize(NetState state, CircularBufferReader reader) { var from = state.Mobile; if (from == null) { return; } state.Send(new MobileUpdate(from, state.StygianAbyss)); state.Send(new MobileIncoming(state, from, from)); from.SendEverything(); state.Sequence = 0; }
public static void VendorBuyReply(NetState state, CircularBufferReader reader) { var vendor = World.FindMobile(reader.ReadUInt32()); var flag = reader.ReadByte(); if (vendor == null) { return; } if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10)) { state.Send(new EndVendorBuy(vendor)); return; } if (flag == 0x02) { var msgSize = reader.Remaining; if (msgSize / 7 > 100) { return; } var buyList = new List <BuyItemResponse>(msgSize / 7); while (msgSize > 0) { var layer = reader.ReadByte(); Serial serial = reader.ReadUInt32(); int amount = reader.ReadInt16(); buyList.Add(new BuyItemResponse(serial, amount)); msgSize -= 7; } if (buyList.Count > 0 && vendor is IVendor v && v.OnBuyItems(state.Mobile, buyList)) { state.Send(new EndVendorBuy(vendor)); } } else { state.Send(new EndVendorBuy(vendor)); } }
public static void HuePickerResponse(NetState state, CircularBufferReader reader) { var serial = reader.ReadUInt32(); _ = reader.ReadInt16(); // Item ID var hue = Utility.ClipDyedHue(reader.ReadInt16() & 0x3FFF); foreach (var huePicker in state.HuePickers) { if (huePicker.Serial == serial) { state.RemoveHuePicker(huePicker); huePicker.OnResponse(hue); break; } } }
private static void OnMapCommand(NetState state, CircularBufferReader reader, int packetLength) { var from = state.Mobile; if (World.FindItem((Serial)reader.ReadUInt32()) is not MapItem map) { return; } int command = reader.ReadByte(); int number = reader.ReadByte(); int x = reader.ReadInt16(); int y = reader.ReadInt16(); switch (command) { case 1: map.OnAddPin(from, x, y); break; case 2: map.OnInsertPin(from, number, x, y); break; case 3: map.OnChangePin(from, number, x, y); break; case 4: map.OnRemovePin(from, number); break; case 5: map.OnClearPins(from); break; case 6: map.OnToggleEditable(from); break; } }
public static void VendorSellReply(NetState state, CircularBufferReader reader) { Serial serial = reader.ReadUInt32(); var vendor = World.FindMobile(serial); if (vendor == null) { return; } if (vendor.Deleted || !Utility.RangeCheck(vendor.Location, state.Mobile.Location, 10)) { state.SendEndVendorSell(vendor.Serial); return; } int count = reader.ReadUInt16(); if (count >= 100 || reader.Remaining != count * 6) { return; } var sellList = new List <SellItemResponse>(count); for (var i = 0; i < count; i++) { var item = World.FindItem(reader.ReadUInt32()); int amount = reader.ReadInt16(); if (item != null && amount > 0) { sellList.Add(new SellItemResponse(item, amount)); } } if (sellList.Count > 0 && vendor is IVendor v && v.OnSellItems(state.Mobile, sellList)) { state.SendEndVendorSell(vendor.Serial); } }
public static void DropReq(NetState state, CircularBufferReader reader, ref int packetLength) { reader.ReadInt32(); // serial, ignored int x = reader.ReadInt16(); int y = reader.ReadInt16(); int z = reader.ReadSByte(); if (state.ContainerGridLines) { reader.ReadByte(); // Grid Location? } else { packetLength -= 1; } Serial dest = (Serial)reader.ReadUInt32(); var loc = new Point3D(x, y, z); var from = state.Mobile; if (dest.IsMobile) { from.Drop(World.FindMobile(dest), loc); } else if (dest.IsItem) { var item = World.FindItem(dest); if (item is BaseMulti multi && multi.AllowsRelativeDrop) { loc.m_X += multi.X; loc.m_Y += multi.Y; from.Drop(loc); } else { from.Drop(item, loc); } }
public static void ProfileReq(NetState state, CircularBufferReader reader, ref int packetLength) { int type = reader.ReadByte(); var serial = (Serial)reader.ReadUInt32(); var beholder = state.Mobile; var beheld = World.FindMobile(serial); if (beheld == null) { return; } switch (type) { case 0x00: // display request { EventSink.InvokeProfileRequest(beholder, beheld); break; } case 0x01: // edit request { reader.ReadInt16(); // Skip int length = reader.ReadUInt16(); if (length > 511) { return; } var text = reader.ReadBigUni(length); EventSink.InvokeChangeProfileRequest(beholder, beheld, text); break; } } }
public static void VendorBuyReply(NetState state, CircularBufferReader reader, ref int packetLength) { var vendor = World.FindMobile((Serial)reader.ReadUInt32()); if (vendor == null) { return; } var flag = reader.ReadByte(); if (!vendor.Deleted && Utility.InRange(vendor.Location, state.Mobile.Location, 10) && flag == 0x02) { var msgSize = packetLength - 8; // Remaining bytes if (msgSize / 7 > 100) { return; } var buyList = new List <BuyItemResponse>(msgSize / 7); while (msgSize > 0) { var layer = reader.ReadByte(); var serial = (Serial)reader.ReadUInt32(); int amount = reader.ReadInt16(); buyList.Add(new BuyItemResponse(serial, amount)); msgSize -= 7; } if (buyList.Count <= 0 || (vendor as IVendor)?.OnBuyItems(state.Mobile, buyList) != true) { return; } } state.SendEndVendorBuy(vendor.Serial); }
public static void MobileQuery(NetState state, CircularBufferReader reader) { var from = state.Mobile; if (from == null) { return; } reader.ReadInt32(); // 0xEDEDEDED int type = reader.ReadByte(); var m = World.FindMobile(reader.ReadUInt32()); if (m == null) { return; } switch (type) { case 0x04: // Stats { m.OnStatsQuery(from); break; } case 0x05: { m.OnSkillsQuery(from); break; } default: { reader.Trace(state); break; } } }