Ejemplo n.º 1
0
        public async Task Handle(Client client, byte[] packet)
        {
            var p        = new InPacket(packet);
            var worldId  = p.ReadUInt16();
            var islandId = p.ReadUInt16();

            Island island;
            var    worlds = WorldState.GetWorlds();

            lock (worlds)
            {
                var world = worlds.FirstOrDefault(w => w.Id == worldId);
                if (world == null)
                {
                    Log.Error("Invalid world selected. world: {0}  island: {1}", worldId, islandId);
                    return;
                }

                island = world.Islands.FirstOrDefault(i => i.Id == islandId);
                if (island == null)
                {
                    Log.Error("Invalid island selected. world: {0}  island: {1}", worldId, islandId);
                    return;
                }
            }

            new OutPacket(OutOpcode.ChannelServerInfo, client)
            .WriteString(island.Ip, 15)     // max 15 len IP + \0
            .WriteUInt16((ushort)island.Port)
            .Send();

            Log.Verbose("User selected a server.");
        }
Ejemplo n.º 2
0
        // We don't need this, but this is useful for debugging.
        private void LoginServer_OnPacket(Client client, byte[] packetData)
        {
            var packet   = new InPacket(packetData);
            var length   = packet.ReadUInt16();
            var opcodeId = packet.ReadUInt16();
            var opcode   = (InOpcode)opcodeId;

            Log.Verbose(
                "Received packet from {0}: opcode {1} 0x{2:x}, length 0x{3:x} ({3})",
                client.Socket.RemoteEndPoint,
                opcode,
                opcodeId,
                length
                );
        }
Ejemplo n.º 3
0
        public MovementInfo(InPacket packet)
        {
            Flags    = (MovementFlags)packet.ReadUInt32();
            Flags2   = (MovementFlags2)packet.ReadUInt16();
            Time     = packet.ReadUInt32();
            Position = packet.ReadVector3();
            O        = packet.ReadSingle();

            if (Flags.HasFlag(MovementFlags.MOVEMENTFLAG_ONTRANSPORT))
            {
                TransportGuid     = packet.ReadPackedGuid();
                TransportPosition = packet.ReadVector3();
                TransportO        = packet.ReadSingle();
                TransportTime     = packet.ReadUInt32();
                TransportSeat     = packet.ReadByte();
                if (Flags2.HasFlag(MovementFlags2.MOVEMENTFLAG2_INTERPOLATED_MOVEMENT))
                {
                    TransportTime2 = packet.ReadUInt32();
                }
            }

            if (Flags.HasFlag(MovementFlags.MOVEMENTFLAG_SWIMMING) || Flags.HasFlag(MovementFlags.MOVEMENTFLAG_FLYING) ||
                Flags2.HasFlag(MovementFlags2.MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING))
            {
                Pitch = packet.ReadSingle();
            }

            FallTime = packet.ReadUInt32();

            if (Flags.HasFlag(MovementFlags.MOVEMENTFLAG_FALLING))
            {
                JumpZSpeed   = packet.ReadSingle();
                JumpSinAngle = packet.ReadSingle();
                JumpCosAngle = packet.ReadSingle();
                JumpXYSpeed  = packet.ReadSingle();
            }

            if (Flags.HasFlag(MovementFlags.MOVEMENTFLAG_SPLINE_ELEVATION))
            {
                SplineElevation = packet.ReadSingle();
            }
        }
Ejemplo n.º 4
0
        protected void HandleMoveTeleportAck(InPacket packet)
        {
            var packGuid = packet.ReadPackedGuid();

            packet.ReadUInt32();
            var movementFlags      = packet.ReadUInt32();
            var extraMovementFlags = packet.ReadUInt16();
            var time = packet.ReadUInt32();

            Player.X = packet.ReadSingle();
            Player.Y = packet.ReadSingle();
            Player.Z = packet.ReadSingle();
            Player.O = packet.ReadSingle();

            OutPacket result = new OutPacket(WorldCommand.MSG_MOVE_TELEPORT_ACK);

            result.WritePacketGuid(Player.GUID);
            result.Write((UInt32)0);
            result.Write(time);
            SendPacket(result);
        }
Ejemplo n.º 5
0
        protected void HandleMoveTeleportAck(InPacket packet)
        {
            var packGuid = packet.ReadPackedGuid();

            packet.ReadUInt32();
            var movementFlags      = packet.ReadUInt32();
            var extraMovementFlags = packet.ReadUInt16();
            var time = packet.ReadUInt32();

            Player.X = packet.ReadSingle();
            Player.Y = packet.ReadSingle();
            Player.Z = packet.ReadSingle();
            Player.O = packet.ReadSingle();

            CancelActionsByFlag(ActionFlag.Movement, false);

            OutPacket result = new OutPacket(NetworkOperationCode.MSG_MOVE_TELEPORT_ACK);

            result.WritePacketGuid(Player.GUID);
            result.Write((UInt32)0);
            result.Write(time);
            SendPacket(result);
        }
Ejemplo n.º 6
0
        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());
                }
            })
                );
        }
Ejemplo n.º 7
0
            void ReadMovementUpdateData(InPacket packet)
            {
                flags = (ObjectUpdateFlags)packet.ReadUInt16();
                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_LIVING))
                {
                    ReadMovementInfo(packet);

                    movementSpeeds = new Dictionary <UnitMoveType, float>();
                    movementSpeeds[UnitMoveType.MOVE_WALK]        = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_RUN]         = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_RUN_BACK]    = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_SWIM]        = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_SWIM_BACK]   = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_FLIGHT]      = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_FLIGHT_BACK] = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_TURN_RATE]   = packet.ReadSingle();
                    movementSpeeds[UnitMoveType.MOVE_PITCH_RATE]  = packet.ReadSingle();

                    if (movementInfo.Flags.HasFlag(MovementFlags.MOVEMENTFLAG_SPLINE_ENABLED))
                    {
                        splineFlags = (SplineFlags)packet.ReadUInt32();
                        if (splineFlags.HasFlag(SplineFlags.Final_Angle))
                        {
                            splineFacingAngle = packet.ReadSingle();
                        }
                        else if (splineFlags.HasFlag(SplineFlags.Final_Target))
                        {
                            splineFacingTargetGuid = packet.ReadUInt64();
                        }
                        else if (splineFlags.HasFlag(SplineFlags.Final_Point))
                        {
                            splineFacingPointX = packet.ReadVector3();
                        }

                        splineTimePassed = packet.ReadInt32();
                        splineDuration   = packet.ReadInt32();
                        splineId         = packet.ReadUInt32();
                        packet.ReadSingle();
                        packet.ReadSingle();
                        splineVerticalAcceleration = packet.ReadSingle();
                        splineEffectStartTime      = packet.ReadInt32();
                        uint splineCount = packet.ReadUInt32();
                        for (uint index = 0; index < splineCount; index++)
                        {
                            splinePoints.Add(packet.ReadVector3());
                        }
                        splineEvaluationMode = (SplineEvaluationMode)packet.ReadByte();
                        splineEndPoint       = packet.ReadVector3();
                    }
                }
                else if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_POSITION))
                {
                    transportGuid   = packet.ReadPackedGuid();
                    position        = packet.ReadVector3();
                    transportOffset = packet.ReadVector3();
                    o = packet.ReadSingle();
                    corpseOrientation = packet.ReadSingle();
                }
                else if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_STATIONARY_POSITION))
                {
                    position = packet.ReadVector3();
                    o        = packet.ReadSingle();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_UNKNOWN))
                {
                    packet.ReadUInt32();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_LOWGUID))
                {
                    lowGuid = packet.ReadUInt32();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_HAS_TARGET))
                {
                    targetGuid = packet.ReadPackedGuid();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_TRANSPORT))
                {
                    transportTimer = packet.ReadUInt32();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_VEHICLE))
                {
                    vehicledID         = packet.ReadUInt32();
                    vehicleOrientation = packet.ReadSingle();
                }

                if (flags.HasFlag(ObjectUpdateFlags.UPDATEFLAG_ROTATION))
                {
                    goRotation = packet.ReadInt64();
                }
            }