コード例 #1
0
        private static void InternalHandle(User user, ushort opcode, byte[] dec)
        {
            Program.logger.Info("Opcode: {0}. Packet: {1}", Util.ByteToHex(opcode), Util.ByteToHex(dec));
            switch (opcode)
            {
            // Login
            case 0x04:
                Login.Handle(user, new InPacket(dec));
                break;

            // Login, part 2
            case 0x05:
                Login.HandleSelect2(user, dec);
                break;

            // Movement
            case 0x18:
                CharacterMove.Handle(user, dec);
                break;

            // Portal usage
            case 0x1D4:
                Portal.RequestMove(user, new InPacket(dec));
                break;

            // Portal usage
            case 0x9C:
                Portal.EnterMap(user, new InPacket(dec));
                break;

            // Chat
            case 0x36:
                CharacterChat.Handle(user, new InPacket(dec));
                break;

            // Disconnect
            case 0x194:
                Disconnect.Handle(user, dec);
                break;

            default:
                Program.logger.Warn("Unhandled packet received. Opcode: {0}", Util.ByteToHex(opcode));
                //Program.logger.Warn("Unhandled packet: {0}", Util.ByteToHex(full));
                Program.logger.Warn("Unhandled packet data: {0}", Util.ByteToHex(dec));
                break;
            }
        }
コード例 #2
0
ファイル: Portal.cs プロジェクト: tousuke/TrickEmuS2
        public static void RequestMove(User user, InPacket inPacket)
        {
            var character = user.Character;
            var x         = inPacket.ReadUInt16();
            var y         = inPacket.ReadUInt16();

            var enterMap = -1;
            var enterX   = 0;
            var enterY   = 0;

            var portalX = 0;
            var portalY = 0;

            if (Data.Maps.ContainsKey(character.Map))
            {
                // Iterate through the RangeObjects
                foreach (var obj in Data.Maps[character.Map].RangeObjects)
                {
                    if (x >= obj.X1 && x <= obj.X2 && y >= obj.Y1 && y <= obj.Y2)
                    {
                        enterMap = obj.Destination;

                        var destPoint = Data.Maps[obj.Destination].PointObjects.Where(po => po.MapId == character.Map).FirstOrDefault();
                        if (destPoint != null)
                        {
                            enterX  = destPoint.X;
                            enterY  = destPoint.Y;
                            portalX = Math.Max(obj.X1, obj.X2);
                            portalY = Math.Max(obj.Y1, obj.Y2);
                            Program.logger.Info("X: {0} / Y: {1}");
                        }

                        Program.logger.Info("{0} - Leave Zone {0} ({1}) => {2} ({3}) / X: {4}, Y: {5}", character.Name, character.Map, Data.Maps[obj.Destination].Name, obj.Destination, enterX, enterY);

                        break;
                    }
                }
            }

            CharacterMove.StartMoveB(
                user,
                new Coordinate()
            {
                X = character.X,
                Y = character.Y
            },
                new Coordinate()
            {
                X = x,
                Y = y
            },
                new Task(() =>
            {
                if (Pathfinder.Distance(
                        new Coordinate()
                {
                    X = character.X,
                    Y = character.Y
                },
                        new Coordinate()
                {
                    X = x,
                    Y = y
                }) > 150
                    )
                {
                    Program.logger.Info("{0} - Too far from portal to leave zone.", character.Name);
                    return;
                }

                if (enterMap > 0)
                {
                    {
                        var move = new PacketBuffer(0x18, user);
                        move.WriteUInt16(character.EntityId);
                        move.WriteUInt16(character.X);
                        move.WriteUInt16(character.Y);
                        move.WriteUInt16(x);
                        move.WriteUInt16(y);
                        move.WriteByte(0x03);
                        move.Send();
                    }

                    {
                        var p1 = new PacketBuffer(0x1D8, user);
                        p1.WriteUInt16(character.EntityId);
                        p1.WriteByte(0x2E);
                        p1.Send();
                    }


                    long moveStep = new Random().Next(1, 1400000000);
                    user.Character.Mover.MoveStep = moveStep;


                    // Change the things
                    character.Map = (ushort)enterMap;
                    character.X   = (ushort)enterX;
                    character.Y   = (ushort)enterY;

                    var serverInfo = new List <byte>();

                    {
                        var p2 = new PacketBuffer(0x1B, user);
                        p2.WriteUInt16(character.EntityId);

                        // D8 05 87 03
                        p2.WriteUInt16(character.X);
                        p2.WriteUInt16(character.Y);

                        p2.WriteHexString("03");
                        serverInfo.AddRange(p2.GetPacket());
                    }

                    {
                        var notifyMap = new PacketBuffer(0x99, user);
                        notifyMap.WriteUInt32(character.Map);
                        serverInfo.AddRange(notifyMap.GetPacket());
                    }

                    {
                        var p3 = new PacketBuffer(0x15, user);
                        p3.WriteUInt16(character.EntityId);
                        serverInfo.AddRange(p3.GetPacket());
                    }

                    {
                        var serverIp = new PacketBuffer(0x9A, user);
                        serverIp.WriteHexString("5D 52 37 D4");
                        serverIp.WriteUInt64(character.Id);
                        serverIp.WriteString(Program.config.Server["GameIP"]);
                        serverIp.WriteByte(0x00);
                        serverIp.WriteUInt32(uint.Parse(Program.config.Server["GamePort"]));
                        // ?
                        serverIp.WriteHexString("C3 61 00 00");
                        serverIp.WriteUInt16(character.Map);
                        serverIp.WriteUInt16(character.X);
                        serverIp.WriteUInt16(character.Y);
                        serverIp.WriteByte(0x02);

                        serverInfo.AddRange(serverIp.GetPacket());
                    }

                    user.Socket.Send(serverInfo.ToArray());
                }
            })
                );
        }