public static void MoveFromInv(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook cargo -> inv while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte managementType = p.ReadByte(); byte fromInvIndex = p.ReadByte(); byte toCargoSlot = p.ReadByte(); byte toCargoLine = p.ReadByte(); byte toCargoRow = p.ReadByte(); Cargo cargo = chr.getCargo(); Console.WriteLine("Cargo > {0} | {1} | {2} | {3} | {4}", managementType, fromInvIndex, toCargoSlot, toCargoLine, toCargoRow); if (!cargo.insertItemFromInventory(chr.getInventory(), fromInvIndex, toCargoRow, toCargoLine)) { Console.WriteLine("da fuaaark"); return; } OutPacket op = new OutPacket(24); op.WriteInt(24); op.WriteShort(4); op.WriteShort(44); op.WriteInt(1); op.WriteInt(chr.getuID()); op.WriteShort(1); op.WriteByte(managementType); op.WriteByte(fromInvIndex); op.WriteByte(toCargoSlot); op.WriteByte(toCargoLine); op.WriteByte(toCargoRow); op.WriteByte(42); c.WriteRawPacket(op.ToArray()); }
public static void InvenUseSpendShout_Req(InPacket lea, Client gc) { byte Slot = lea.ReadByte(); string Message = lea.ReadString(60); lea.ReadInt(); lea.ReadByte(); lea.ReadByte(); var chr = gc.Character; if (Slot >= 0 && Slot < 24 && Message.Length <= 60) { gc.Character.Items.Remove((byte)InventoryType.ItemType.Spend3, Slot, 1); foreach (Character All in MapFactory.AllCharacters) { GamePacket.InvenUseSpendShout(All.Client, chr, Message); } InventoryPacket.getInvenSpend3(gc); } }
public static void HandleSpawnCharacter(MapleConnection connection, InPacket packet) { Character character = new Character(); character.ID = packet.ReadInt(); character.Level = packet.ReadByte(); packet.ReadShort(); character.Name = packet.ReadString(); Main.Instance.DrawCharacterObject(character); }
public static void HandleCheckUserLimit(MapleClient client, InPacket iPacket) { byte worldID = iPacket.ReadByte(); WorldServer world = MasterServer.Instance.Worlds[worldID]; using (OutPacket oPacket = new OutPacket(SendOps.CheckUserLimitResult)) { oPacket.WriteShort((short)world.Status); client.Send(oPacket); } }
protected void HandleLogoutResponse(InPacket packet) { bool logoutOk = packet.ReadUInt32() == 0; bool instant = packet.ReadByte() != 0; if (instant || !logoutOk) { Connected = false; LoggedIn = false; Running = false; } }
public override void Handle(User sender, InPacket packetReader) { if (sender.Authenticated && sender.Room != null) { // [0] = ROOM SLOT // [1] = ROOM ID byte roomSlot = packetReader.ReadByte(0); if (roomSlot < sender.Room.MaximumPlayers) { ushort roomId = packetReader.ReadUshort(1); if (roomId == sender.Room.ID) { byte unknown = packetReader.ReadByte(2); // Seems to be 2 or 0? ushort subType = packetReader.ReadUshort(3); // HANDLE PACKET IN A SEPERATED CLASS // GameDataHandler handler = NetworkTable.Instance.GetHandler(subType); if (handler != null) { try { handler.Process(sender, packetReader); } catch { /* error? */ } } else { Log.Instance.WriteLine("UNKNOWN SUBPACKET :: " + packetReader); } } else { sender.Disconnect(); // Wrong room targeted - Cheating? } } else { sender.Disconnect(); // Room slot over maximum players - Cheating? } } }
public static void Move(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook cargo movement while not being ingame."); c.Close(); return; } byte fromCargoIndex = p.ReadByte(); short unknownMovement = p.ReadShort(); byte toCargoSlot = p.ReadByte(); byte toCargoLine = p.ReadByte(); byte toCargoRow = p.ReadByte(); Character chr = c.getAccount().activeCharacter; Cargo cargo = chr.getCargo(); Console.WriteLine("Cargo > {0} | {1} | {2} | {3}", fromCargoIndex, toCargoSlot, toCargoLine, toCargoRow); if (!cargo.moveItem(fromCargoIndex, toCargoSlot, toCargoRow, toCargoLine)) { Console.WriteLine("problem with move item"); return; } OutPacket op = new OutPacket(24); op.WriteInt(24); op.WriteShort(4); op.WriteShort(46); op.WriteInt(1); op.WriteInt(chr.getuID()); op.WriteShort(1); op.WriteByte(fromCargoIndex); op.WriteShort(unknownMovement); op.WriteByte(toCargoSlot); op.WriteByte(toCargoLine); op.WriteByte(toCargoRow); c.WriteRawPacket(op.ToArray()); }
public static void Equip(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook equip while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte changeType = p.ReadByte(); byte[] swapSlots = p.ReadBytes(2); if (changeType == (byte)0x00) { if (!chr.getEquipment().swapEquips(swapSlots[0], swapSlots[1])) { Logger.LogCheat(Logger.HackTypes.Equip, c, "Attempted to swap weapons, while one of them or even both are null."); c.Close(); return; } WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), CharacterPackets.getExtEquipPacket(chr, swapSlots[0], chr.getEquipment().getEquipments()[swapSlots[0]].getItemID())); WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), CharacterPackets.getExtEquipPacket(chr, swapSlots[1], chr.getEquipment().getEquipments()[swapSlots[1]].getItemID())); } else { if (!chr.getInventory().equipItem(swapSlots[0], swapSlots[1], chr.getEquipment())) { Console.WriteLine("so sorz : >"); return; } WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), CharacterPackets.getExtEquipPacket(chr, swapSlots[1], chr.getEquipment().getEquipments()[swapSlots[1]].getItemID())); } OutPacket op = new OutPacket(24); op.WriteInt(24); op.WriteShort(0x04); op.WriteShort(0x0c); op.WriteInt(135593729); op.WriteInt(c.getAccount().activeCharacter.getuID()); op.WriteShort(0x01); op.WriteByte(changeType); op.WriteBytes(swapSlots); c.WriteRawPacket(op.ToArray()); CharacterFunctions.calculateCharacterStatistics(chr); }
protected void HandleCharCreate(InPacket packet) { var response = (CommandDetail)packet.ReadByte(); if (response == CommandDetail.CHAR_CREATE_SUCCESS) { SendPacket(new OutPacket(WorldCommand.CMSG_CHAR_ENUM)); } else { NoCharactersFound(); } }
public static void HandleLogin(MapleConnection connection, InPacket packet) { LoginStatus status = (LoginStatus)packet.ReadByte(); if (status == LoginStatus.Valid) { packet.Reset(packet.Length - 8); MapleConnection.User.SessionID = packet.ReadLong(); connection.Send(LoginPacket.RequestWorldList()); } }
protected override void OnPacket(byte[] packet) { var p = new InPacket(packet); PacketHandler handler = m_processor[p.ReadByte()]; if (handler != null) { handler(this, p); } else { MainForm.Instance.Log(BitConverter.ToString(packet).Replace('-', ' ')); } }
private void OnRegistrationResponse(InPacket inPacket) { ServerRegistrationResponse response = (ServerRegistrationResponse)inPacket.ReadByte(); switch (response) { case ServerRegistrationResponse.Valid: { GameServer.WorldID = inPacket.ReadByte(); GameServer.ChannelID = inPacket.ReadByte(); GameServer.ScrollingHeader = inPacket.ReadString(); GameServer.Rates = new Rates() { Experience = inPacket.ReadInt(), QuestExperience = inPacket.ReadInt(), PartyQuestExperience = inPacket.ReadInt(), Meso = inPacket.ReadInt(), Loot = inPacket.ReadInt(), }; Log.Success("Registered Game as {0}-{1} at {2}.", WorldNameResolver.GetName(GameServer.WorldID), GameServer.ChannelID, GameServer.RemoteEndPoint); Log.Inform("Rates: {0}x / {1}x / {2}x / {3}x / {4}x.", GameServer.Rates.Experience, GameServer.Rates.QuestExperience, GameServer.Rates.PartyQuestExperience, GameServer.Rates.Meso, GameServer.Rates.Loot); } break; default: throw new NetworkException(RegistrationResponseResolver.Explain(response)); } }
public static void HandleWorldInformation(MapleConnection connection, InPacket packet) { byte worldId = packet.ReadByte(); if (worldId == byte.MaxValue) { Main.Instance.SetTab(Indexer.WorldSelect); } else { string name = packet.ReadString(); Main.Instance.DrawWorldTile(worldId, name); } }
protected override void Dispatch(InPacket inPacket) { try { if (inPacket.OperationCode == (ushort)ClientOpcode.LOGIN_SERVER) { inPacket.ReadUShort(); // 原始長度 var Header = inPacket.ReadByte(); // Read header #if DEBUG Log.Hex("Received (0x{0:X2}) packet from {1}: ", inPacket.Content, Header, this.Title); #endif switch ((LoginClientOpcode)Header) { case LoginClientOpcode.LOGIN_REQ: LoginHandler.Login_Req(inPacket, this); break; case LoginClientOpcode.SERVERLIST_REQ: LoginHandler.ServerList_Req(inPacket, this); break; case LoginClientOpcode.GAME_REQ: LoginHandler.Game_Req(inPacket, this); break; case LoginClientOpcode.WORLD_REQ: LoginHandler.World_Req(inPacket, this); break; case LoginClientOpcode.GAME_VERSIONINFO_REQ: LoginHandler.PatchVersion_Req(inPacket, this); break; case LoginClientOpcode.TWOFACTOR_REQ: LoginHandler.TWOFACTOR_REQ(inPacket, this); break; } } } catch (Exception e) { Log.Error("Unhandled Packet Exception from {0}: \n{1}", this.Title, e.ToString()); } }
public static void UseItem(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook useItem while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; p.Skip(1); byte usingIndex = p.ReadByte(); Item item = chr.getInventory().getItemBySeqIndexing(usingIndex); if (item == null) { Logger.LogCheat(Logger.HackTypes.Items, c, "Tried to use not existing item."); return; } ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID()); if (!itemData.getClassUsable()[chr.getcClass() - 1]) { Console.WriteLine("not for teh class.."); return; } if (itemData.getMinLvl() > chr.getLevel() || itemData.getMaxLvl() < chr.getLevel()) { Console.WriteLine("not for yar level.."); return; } if (itemData.getFaction() != 0 && chr.getFaction() != itemData.getFaction()) { Console.WriteLine("not for yah faction.."); return; } p.Skip(2); MainItemUsage.useItem(chr, item, usingIndex, p); }
public static void Movement(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked Movement with null of activeCharacter"); c.Close(); return; } Character chr = c.getAccount().activeCharacter; p.Skip(4); byte[] locationToX = p.ReadBytes(4); byte[] locationToY = p.ReadBytes(4); p.Skip(1); byte movingMode = p.ReadByte(); MoveCharacterPacket.HandleMovement(chr, locationToX, locationToY, movingMode); }
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(); } }
public void OnChat(ClientSession cs, InPacket ip) { ip.ReadByte(); // 01 ip.ReadInt(); // 00 00 00 00 int WhereLen = ip.ReadInt(); string Where = ip.ReadUnicodeString(WhereLen); ip.ReadInt(); // 00 00 00 00 ip.ReadInt(); // 00 00 00 00 ip.ReadInt(); // FF FF FF FF int ChatLen = ip.ReadInt(); string Chat = ip.ReadUnicodeString(ChatLen); //LogFactory.GetLog("Main").LogInfo("Chat: {0}", Chat); using (OutPacket op = new OutPacket(GameOpcodes.EVENT_CHAT_NOT)) { op.WriteByte(1); op.WriteInt(cs.LoginUID); op.WriteInt(cs.Nick.Length * 2); op.WriteUnicodeString(cs.Nick); op.WriteInt(0); op.WriteInt(0); op.WriteInt(-1); op.WriteInt(ChatLen); op.WriteUnicodeString(Chat); op.WriteInt(0); op.WriteInt(0); // 채널에 있는 모든 유저중 같은 방 (null이면 로비실이니까.) foreach (ClientSession u in UsersList) { if (u.CurrentRoom == cs.CurrentRoom) { op.Assemble(u.CRYPT_KEY, u.CRYPT_HMAC, u.CRYPT_PREFIX, u.CRYPT_COUNT); u.Send(op); op.CancelAssemble(); // 버퍼 되돌리기 } } } }
private void ReadValuesUpdateData(InPacket packet) { byte blockCount = packet.ReadByte(); int[] updateMask = new int[blockCount]; for (var i = 0; i < blockCount; i++) { updateMask[i] = packet.ReadInt32(); } var mask = new BitArray(updateMask); for (var i = 0; i < mask.Count; ++i) { if (!mask[i]) { continue; } updateFields[i] = packet.ReadUInt32(); } }
private void OnGamePortRequest(InPacket inPacket) { byte id = inPacket.ReadByte(); using (OutPacket outPacket = new OutPacket(InteroperabilityMessage.GamePortResponse)) { outPacket.WriteByte(id); if (this.World.Contains(id)) { InteroperabilityClient game = this.World[id]; outPacket.WriteUShort((ushort)game.RemoteEndPoint.Port); } else { outPacket.WriteUShort(); } this.Send(outPacket); } }
public static void OnSelectWorld(MapleClient c, InPacket p) { p.Skip(1); // world id c.Channel = p.ReadByte(); using (OutPacket packet = new OutPacket(SendOps.SelectWorldResult)) { packet.WriteByte(); //some error packet.WriteByte((byte)c.Characters.Count); foreach (var character in c.Characters) { PacketCreator.Helper.AddCharacterData(packet, character); PacketCreator.Helper.AddCharaterLook(packet, character); packet.WriteBool(false); //rank } packet.WriteZero(64); //padding c.Send(packet); } }
public override void Handle(Server sender, InPacket packetReader) { uint ErrorCode = packetReader.ReadUint(); if (ErrorCode != 1) { sender.Disconnect(); return; } string globalKey = packetReader.ReadString(); string serverName = packetReader.ReadString(); string ipAddress = packetReader.ReadString(); int port = packetReader.ReadInt(); byte type = packetReader.ReadByte(); if (!Enum.IsDefined(typeof(ServerTypes), type)) { sender.Disconnect(); return; } ServerTypes enumType = (ServerTypes)type; byte serverId = Managers.ServerManager.Instance.Add(sender, serverName, ipAddress, port, enumType); if (serverId > 0) { Log.Instance.WriteLine($"Added Server: {serverName} @ {ipAddress}:{port} with Id: {serverId}"); sender.Send(new Packets.Internal.Authorize(serverId)); } else { Log.Instance.WriteError($"Failed to add Server: {serverName} @ {ipAddress}:{port}. Reason: Server Limit reached."); sender.Send(new Packets.Internal.Authorize(Core.Enums.Internal.AuthorizationErrorCodes.MaxServersReached)); sender.Disconnect(); } }
public static void StateVending(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook openVending while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte stateType = p.ReadByte(); string shopName = p.ReadString(30); if (stateType == 1) { if (chr.getVending() != null) { Console.WriteLine("u already have teh vending biach"); return; } chr.setVending(new Vending(chr, shopName)); c.WriteRawPacket(VendingPackets.createVendorFrame(chr, 1, shopName)); if (chr.getMap() == 1) { WMap.Instance.getGrid(1).addToVendings(chr); } } else { chr.getVending().deleteVendor(); chr.setVending(null); c.WriteRawPacket(VendingPackets.createVendorFrame(chr, 0)); } WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), VendingPackets.getExtVending(chr)); }
public void create_pet(ClientSession cs, InPacket ip) { byte Bind = ip.ReadByte(); int PetID = ip.ReadInt(); int Evo = ip.ReadInt(); int PetUID = ip.ReadInt(); DataSet ds = new DataSet(); Database.Query(ref ds, "INSERT INTO `gc`.`pet` ( `LoginUID`, `PetItemID`, `Exp`, `Health`, `Name`, `Slot1`, `Slot2`, `Level`, `Bind`, `Evo`) VALUES ( '{0}', '{1}', '0', '0', '', '0', '0', '0', '0', '0' )", cs.LoginUID, PetID); using (OutPacket oPacket = new OutPacket(GameOpcodes.EVENT_CREATE_PET_ACK)) { /*oPacket.WriteInt(0); * oPacket.WriteByte(0xFF); * oPacket.WriteInt(1); * oPacket.WriteInt(PetUID); * oPacket.WriteInt(PetID);*/ oPacket.WriteHexString("00 00 00 00 FF 00 00 00 01 35 3C CC AB 00 02 E4 82 00 00 00 1A 53 00 71 00 75 00 69 00 72 00 65 00 20 00 47 00 61 00 69 00 6B 00 6F 00 7A 00 00 00 00 03 00 00 00 00 64 01 00 00 00 64 02 00 00 00 64 00 00 00 64 00 00 00 00 00 FF FF FF FF 00 00 03 E8 00 00 03 E8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF FF 00 00 00 01 00 02 E4 8C 00 00 00 01 35 3C CC BF 00 00 00 64 00 00 00 64 00 00 FF FF 00 00 FF FF FF FF 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 FF 00 00 00 00 00 00 00 00"); oPacket.Assemble(cs.CRYPT_KEY, cs.CRYPT_HMAC, cs.CRYPT_PREFIX, ++cs.CRYPT_COUNT); cs.Send(oPacket); } }
public static void MoveToVV(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter != null) { Logger.LogCheat(Logger.HackTypes.CreateCharacter, c, "Attempted to create a character while being ingame."); c.Close(); return; } byte selected_character = p.ReadByte(); if (!c.getAccount().characters.ContainsKey(selected_character)) { Logger.LogCheat(Logger.HackTypes.CharacterSelection, c, "Wrong target '{0}' has been selected by packet", selected_character); c.Close(); return; } Character target = c.getAccount().characters[selected_character]; target.setPosition(new float[] { -1660, 2344 }); target.setMap(1); OutPacket op = new OutPacket(24); op.WriteInt(24); op.WriteShort(3); op.WriteShort(14); op.WriteByte(1); op.WriteByte(selected_character); op.WriteByte(6); op.WriteByte(8); op.WriteInt(1); // map op.WriteFloat(-1660); // X op.WriteFloat(2344); // Y c.WriteRawPacket(op.ToArray()); }
public static void ToggleMutationEffect(MartialClient c, InPacket p) { if (c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked toggleMutationEffect with null of activeCharacter"); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte toggleType = p.ReadByte(); OutPacket op = new OutPacket(20); op.WriteInt(20); op.WriteShort(0x05); op.WriteShort(0X7c); op.WriteInt(140235265); op.WriteInt(chr.getuID()); op.WriteInt(toggleType == 0 ? 716251136 : 716251314); WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr.getArea(), op.ToArray()); }
protected override void Dispatch(InPacket inPacket) { try { if (inPacket.OperationCode == (ushort)ClientOpcode.LOGIN_SERVER) { inPacket.ReadUShort(); // 原始長度 var Header = inPacket.ReadByte(); // 讀取包頭 Log.Hex("Received (0x{0:X2}) packet from {1}: ", inPacket.Content, Header, this.Title); switch ((LoginClientOpcode)Header) { case LoginClientOpcode.LOGIN_REQ: LoginHandler.Login_Req(inPacket, this); break; case LoginClientOpcode.SERVERLIST_REQ: LoginHandler.ServerList_Req(inPacket, this); break; case LoginClientOpcode.GAME_REQ: LoginHandler.Game_Req(inPacket, this); break; case LoginClientOpcode.CHAR_REQ: LoginHandler.Char_Req(inPacket, this); break; } } } catch (Exception e) { Log.Error("Unhandled Packet Exception from {0}: \n{1}", this.Title, e.ToString()); } }
public static void HandleItemMove(MapleClient client, InPacket iPacket) { iPacket.Skip(4); // NOTE: tRequestTime (ticks). InventoryType inventory = (InventoryType)iPacket.ReadByte(); short slot1 = iPacket.ReadShort(); short slot2 = iPacket.ReadShort(); short quantity = iPacket.ReadShort(); bool dropped = slot2 == 0; bool equippedSlot1 = slot1 < 0; bool equippedSlot2 = slot2 < 0; if (dropped) { } else { client.Character.Items.Swap(inventory, slot1, slot2); } if (equippedSlot1 || equippedSlot2) { } }
public Character(InPacket packet) { GUID = packet.ReadUInt64(); Name = packet.ReadCString(); Race = (Race)packet.ReadByte(); Class = (Class)packet.ReadByte(); Gender = (Gender)packet.ReadByte(); Bytes = packet.ReadBytes(5); Level = packet.ReadByte(); ZoneId = packet.ReadUInt32(); MapId = packet.ReadUInt32(); X = packet.ReadSingle(); Y = packet.ReadSingle(); Z = packet.ReadSingle(); GuildId = packet.ReadUInt32(); Flags = packet.ReadUInt32(); packet.ReadUInt32(); // customize (rename, etc) packet.ReadByte(); // first login PetInfoId = packet.ReadUInt32(); PetLevel = packet.ReadUInt32(); PetFamilyId = packet.ReadUInt32(); // read items for (int i = 0; i < 19; ++i) { packet.ReadUInt32(); packet.ReadByte(); packet.ReadUInt32(); // ??? } // read bags for (int i = 0; i < 4; ++i) { packet.ReadUInt32(); packet.ReadByte(); packet.ReadUInt32(); } }
public static void HandleCharacterCreation(MapleClient client, InPacket iPacket) { string name = iPacket.ReadMapleString(); int jobType = iPacket.ReadInt(); int face = iPacket.ReadInt(); int hair = iPacket.ReadInt(); int hairColor = iPacket.ReadInt(); byte skin = (byte)iPacket.ReadInt(); int topID = iPacket.ReadInt(); int bottomID = iPacket.ReadInt(); int shoesID = iPacket.ReadInt(); int weaponID = iPacket.ReadInt(); Gender gender = (Gender)iPacket.ReadByte(); bool error = false; // TODO: Validate name, beauty and equipment before creating the character. int id = Database.InsertAndReturnIdentifier("INSERT INTO `characters` (account_id, world_id, name, gender, skin, face, hair) " + "VALUES (@account_id, @world_id, @name, @gender, @skin, @face, @hair)", new MySqlParameter("account_id", client.Account.ID), new MySqlParameter("world_id", client.World), new MySqlParameter("name", name), new MySqlParameter("gender", gender), new MySqlParameter("skin", skin), new MySqlParameter("face", face), new MySqlParameter("hair", hair)); // TODO: Validate the default equipment statistics. I'm pretty sure some of them are untradable. Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, weapon_defense) " + "VALUES (@character_id, 0, -5, @maple_id, 3)", new MySqlParameter("character_id", id), new MySqlParameter("maple_id", topID)); Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, weapon_defense) " + "VALUES (@character_id, 0, -6, @maple_id, 2)", new MySqlParameter("character_id", id), new MySqlParameter("maple_id", bottomID)); Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, slots, weapon_defense) " + "VALUES (@character_id, 0, -7, @maple_id, 5, 3)", new MySqlParameter("character_id", id), new MySqlParameter("maple_id", shoesID)); Database.Execute("INSERT INTO `items` (character_id, inventory, slot, maple_id, slots, weapon_attack) " + "VALUES (@character_id, 0, -11, @maple_id, 7, 17)", new MySqlParameter("character_id", id), new MySqlParameter("maple_id", weaponID)); // TODO: Add beginner's guide (based on job). using (DatabaseQuery query = Database.Query("SELECT * FROM characters WHERE `character_id` = @character_id", new MySqlParameter("character_id", id))) { query.NextRow(); using (OutPacket oPacket = new OutPacket(SendOps.CreateNewCharacterResult)) { oPacket.WriteBool(error); LoginHandler.AddCharacterEntry(oPacket, query); client.Send(oPacket); } } }