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