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."); }
// 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 ); }
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(); } }
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); }
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); }
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()); } }) ); }
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(); } }