예제 #1
0
        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();
            }
        }
예제 #2
0
        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));
            }
        }
예제 #3
0
        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;
                }
            }
        }
예제 #4
0
        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);
                }
            }
        }
예제 #5
0
        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();
        }
예제 #6
0
        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);
            }
        }
예제 #7
0
        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 _);
        }
예제 #8
0
        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 _);
        }
예제 #9
0
        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));
            }
        }
예제 #10
0
        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);
            }
        }
예제 #11
0
        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);
        }
예제 #12
0
        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);
        }
예제 #13
0
        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);
            }
        }
예제 #14
0
        public static void QueryPartyMemberLocations(NetState ns, CircularBufferReader reader)
        {
            Mobile from  = ns.Mobile;
            var    party = Party.Get(from);

            if (party != null)
            {
                ns.SendPartyMemberLocations(from, party);
            }
        }
예제 #15
0
        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());
            }
        }
예제 #16
0
 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)
         );
 }
예제 #17
0
        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)
                );
        }
예제 #18
0
        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();
        }
예제 #19
0
 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();
 }
예제 #20
0
        // 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;
        }
예제 #21
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);
            }
        }
예제 #22
0
        // 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;
        }
예제 #23
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));
            }
        }
예제 #24
0
        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;
                }
            }
        }
예제 #25
0
        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;
            }
        }
예제 #26
0
        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);
            }
        }
예제 #27
0
        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);
                }
            }
예제 #28
0
        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;
            }
            }
        }
예제 #29
0
        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);
        }
예제 #30
0
        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;
            }
            }
        }