public override void HandleLogin(ClientConnection pConnection, MaplePacket pPacket) { byte error = pPacket.ReadByte(); if (error != 0) { pConnection.Logger_WriteLine("Got Status: {0}", error); if (error == 0x07) { pConnection.Logger_WriteLine("Already logged in?"); } return; } int userid = pPacket.ReadInt(); pPacket.ReadByte(); // Gender or GenderSelect/PinSelect pPacket.ReadByte(); pPacket.ReadByte(); // Admin? Has bitflag 5 string username = pPacket.ReadString(); // Username pPacket.ReadByte(); pPacket.ReadByte(); DateTime creationtime = DateTime.FromFileTime(pPacket.ReadLong()); // Incorrect :/. Nowhere to be found if (pPacket.ReadBool() == false) pPacket.ReadString(); // Username, with astriks as protection: 'd**mondo2*' pPacket.ReadString(); // wat. if (pPacket.ReadBool()) pPacket.ReadBytes(15); // Every job that can be chosen pPacket.ReadInt(); // YYYYMMDDHH, as in character info -.-? ParseLogin(pConnection, userid, username, creationtime); }
public virtual void Decode(ClientConnection pConnection, MaplePacket pPacket) { ItemID = pPacket.ReadInt(); if (pPacket.ReadBool()) { CashID = pPacket.ReadLong(); } else { CashID = 0; } Expires = pPacket.ReadLong(); BagID = pPacket.ReadInt(); }
public void Decode(MaplePacket pPacket) { ChosenCardID = pPacket.ReadInt(); if (pPacket.ReadBool() == false) { for (short cards = pPacket.ReadShort(); cards > 0; cards--) { pPacket.ReadShort(); // CardID pPacket.ReadByte(); // Level } } else { // Unknown stuff... pPacket.ReadShort(); short size = pPacket.ReadShort(); pPacket.Skip(size); // Card block size = pPacket.ReadShort(); pPacket.Skip(size); // Levels } }
public void Decode(ClientConnection pConnection, MaplePacket pPacket) { pPacket.Skip(8); // Flag #if LOCALE_GMS pPacket.Skip(1); #endif { // Added GMS V.132 pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); } #if LOCALE_EMS pPacket.Skip(1); #endif int tmp = pPacket.ReadByte(); pPacket.Skip(tmp * 4); tmp = pPacket.ReadInt(); pPacket.Skip(tmp * (4 + 8)); #if LOCALE_GMS pPacket.Skip(1); #endif if (pPacket.ReadBool()) { tmp = pPacket.ReadInt(); pPacket.Skip(tmp * 8); tmp = pPacket.ReadInt(); pPacket.Skip(tmp * 8); } Stats = new GW_CharacterStat(); Stats.Decode(pPacket); this.BuddylistSize = pPacket.ReadByte(); #if LOCALE_EMS pPacket.ReadByte(); #endif if (pPacket.ReadBool()) BlessingOfTheFairy = pPacket.ReadString(); else BlessingOfTheFairy = null; if (pPacket.ReadBool()) BlessingOfEmpress = pPacket.ReadString(); else BlessingOfEmpress = null; if (pPacket.ReadBool()) UltimateExplorer = pPacket.ReadString(); else UltimateExplorer = null; Stats.DecodeMesos(pPacket); // .-. #if LOCALE_EMS pPacket.ReadByte(); // Bool check pPacket.ReadInt(); #endif // Unknown stuff here for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadLong(); } #if LOCALE_GMS // Magical potion pots!!! for (int i = pPacket.ReadInt(); i > 0; i--) // V.126 { pPacket.ReadInt(); // Potion pot ID pPacket.ReadInt(); // Max value pPacket.ReadInt(); // HP pPacket.ReadInt(); // ??? (Not max value of MP) pPacket.ReadInt(); // MP pPacket.ReadLong(); // Start date O.o? pPacket.ReadLong(); // End date O.o? } #endif #if LOCALE_GMS // V.142 - RED stuff? for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadInt(); } { pPacket.ReadInt(); for (int i = 3; i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); } } for (int i = pPacket.ReadInt(); i > 0; i--) pPacket.ReadInt(); if (pPacket.ReadBool()) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadLong(); pPacket.ReadLong(); pPacket.ReadLong(); } for (int j = 0; j < 2; j++) // called 2 times under each other! { for (int i = pPacket.ReadByte(); i > 0; i--) { pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadString(); } } #endif #if LOCALE_EMS // REMOVED GMS V.141?! for (int i = pPacket.ReadInt(); i > 0; i--) // V.137 { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); } pPacket.ReadInt(); for (int i = 6; i > 0; i--) { pPacket.ReadInt(); } for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadInt(); } for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadString(); } for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadString(); } #endif Inventory = new CharacterInventory(); Inventory.Decode(pConnection, pPacket); //UnknownIntegerListNumber3 = new Dictionary<int, long>(); for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadLong(); //UnknownIntegerListNumber3.Add(pPacket.ReadInt(), pPacket.ReadLong()); } //UnknownIntegerListNumber4 = new Dictionary<long, long>(); for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadLong(); pPacket.ReadLong(); //UnknownIntegerListNumber4.Add(pPacket.ReadLong(), pPacket.ReadLong()); } while (true) { byte val = pPacket.ReadByte(); if (val == 0) break; { pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadLong(); pPacket.ReadLong(); pPacket.ReadLong(); pPacket.ReadLong(); } } Skills = new CharacterSkills(); Skills.Decode(pConnection, pPacket); Quests = new CharacterQuests(); Quests.Decode(pConnection, pPacket); // Match for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); } { Rings = new List<Ring>(); MarriedWith = null; // Couple for (int i = pPacket.ReadShort(); i > 0; i--) { Rings.Add(new Ring(Ring.Type.Couple, pPacket)); } // Friend for (int i = pPacket.ReadShort(); i > 0; i--) { Rings.Add(new Ring(Ring.Type.Friend, pPacket)); } // Marriage for (int i = pPacket.ReadShort(); i > 0; i--) { Ring ring = new Ring(Ring.Type.Marriage, pPacket, Stats.Name); Rings.Add(ring); MarriedWith = ring.FriendName; } } Inventory.DecodeTeleportRocks(pPacket); #if LOCALE_GMS Monsterbook = new CharacterMonsterBook(); Monsterbook.Decode(pPacket); pPacket.ReadInt(); // -1? for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadShort(); } { // Newyear cards... meh // WHAT MEH, SOMEONE HAS THIS FFS D:!!! for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); // Card ID? pPacket.ReadInt(); // Sender ID pPacket.ReadString(); // Sender name pPacket.ReadByte(); // GENDER..? pPacket.ReadLong(); // Sent at? pPacket.ReadInt(); // Receiver ID pPacket.ReadString(); // Receiver name pPacket.ReadByte(); pPacket.ReadByte(); pPacket.ReadLong(); // Receive date? pPacket.ReadString(); // Message } } #else for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadShort(); pPacket.ReadString(); } #endif Quests.DecodePQ(pConnection, pPacket); if (GameHelper.IsWildHunter(Stats.JobID)) { pPacket.ReadByte(); // Level pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); // Caught mob } Quests.DecodePQDone(pConnection, pPacket); for (int i = pPacket.ReadShort(); i > 0; i--) { short cnt = pPacket.ReadShort(); int unk = pPacket.ReadInt(); // 9010040 | Conor (NPC) if (cnt > 0 && unk > 0) { for (short j = 0; j < cnt; j++) { pPacket.ReadInt(); // 9010040 | Conor (NPC) pPacket.ReadShort(); pPacket.ReadInt(); // 4330019 | Pink Coin Purse pPacket.ReadShort(); } } } for (int i = 13; i > 0; i--) { pPacket.ReadInt(); // Stolen Skills } for (int i = 4; i > 0; i--) { pPacket.ReadInt(); // Chosen Skills? } // Inner Stats Abilities = new List<Tuple<byte, int, byte>>(); for (int i = pPacket.ReadShort(); i > 0; i--) { byte id = pPacket.ReadByte(); // 'ID' int skillid = pPacket.ReadInt(); // Skill ID byte level = pPacket.ReadByte(); // Level pPacket.ReadByte(); // Rank Abilities.Add(new Tuple<byte, int, byte>(id, skillid, level)); } #if LOCALE_GMS { // V.134 for (int i = pPacket.ReadInt(); i > 0; i--) { pPacket.ReadString(); pPacket.ReadInt(); pPacket.ReadString(); for (int j = pPacket.ReadInt(); j > 0; j--) { pPacket.ReadByte(); } } pPacket.ReadByte(); } #endif Stats.HonourLevel = pPacket.ReadInt(); Stats.HonourExp = pPacket.ReadInt(); { byte unk = pPacket.ReadByte(); if (unk == 1) { while (true) { tmp = pPacket.ReadUShort(); if (tmp <= 0) break; while (true) { ushort tmp2 = pPacket.ReadUShort(); if (tmp2 <= 0) break; pPacket.ReadInt(); pPacket.ReadInt(); } } } else { while (true) { tmp = pPacket.ReadUShort(); if (tmp <= 0) break; pPacket.ReadUShort(); pPacket.ReadInt(); pPacket.ReadInt(); } } } if (pPacket.ReadBool()) { // Wat. ItemBase.DecodeItemData(pConnection, pPacket); pPacket.ReadInt(); } { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadByte(); } { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadLong(); } #if LOCALE_EMS pPacket.ReadBool(); pPacket.ReadBool(); #endif { EvolutionCards = new List<EvolutionCard>(); for (short i = pPacket.ReadShort(); i > 0; i--) { var card = new EvolutionCard(); card.Decode(pConnection, pPacket); card.Block = 1; EvolutionCards.Add(card); } for (short i = pPacket.ReadShort(); i > 0; i--) { var card = new EvolutionCard(); card.Decode(pConnection, pPacket); card.Block = 2; EvolutionCards.Add(card); } } #if LOCALE_EMS if (pPacket.ReadBool()) { // Wat. ItemBase.DecodeItemData(pConnection, pPacket); pPacket.ReadInt(); pPacket.ReadInt(); } #endif #if LOCALE_EMS // No farm info for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.Skip(20); } #else { // V.134 for (byte i = pPacket.ReadByte(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadLong(); } } { // V.134 // FARM INFO. Creating... = not yet created farm. Else: farmname pPacket.ReadString(); // Creating... pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); } #if LOCALE_GMS if (pPacket.ReadBool()) { // Wat. ItemBase.DecodeItemData(pConnection, pPacket); pPacket.ReadInt(); pPacket.ReadInt(); } #endif { // V.141 pPacket.ReadInt(); pPacket.ReadLong(); // A bit off here, should be filetime value pPacket.ReadInt(); } pPacket.Skip(84); // I don't even pPacket.ReadByte(); { for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadShort(); pPacket.ReadShort(); } } { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.Skip(32); } { if (pPacket.ReadInt() > 0) { for (int i = 0; i < 3; i++) { pPacket.Skip(4 + 4 + 4); pPacket.ReadString(); pPacket.Skip(4 * 7); pPacket.Skip(8 * 4); pPacket.Skip(4 * 4); pPacket.Skip(1 * 5); pPacket.Skip(4 * 3); pPacket.ReadString(); pPacket.Skip(4 * 2); pPacket.ReadByte(); byte tmptmp = pPacket.ReadByte(); if ((tmptmp & 0x01) != 0) { pPacket.ReadInt(); pPacket.ReadString(); pPacket.Skip(24); } for (int j = pPacket.ReadInt(); j > 0; j++) { pPacket.Skip(4 * 9); } } } } // Removed in V.141 //pPacket.ReadInt(); // I DONT EVEN D: #endif }
public void Decode(ClientConnection pConnection, MaplePacket pPacket) { InventorySlots = new byte[INVENTORIES]; for (int i = 0; i < INVENTORIES; i++) InventorySlots[i] = pPacket.ReadByte(); pPacket.ReadLong(); // 94354848000000000 | 1-1-1900 EquipmentItems = new Dictionary<short, ItemEquip>[EQUIP_INVENTORIES]; #if LOCALE_EMS for (byte i = 0; i < 3; i++) { EquipmentItems[i] = new Dictionary<short, ItemEquip>(); while (true) { short slot = pPacket.ReadShort(); if (slot == 0) break; slot = CharacterInventory.CorrectEquipSlot(i, slot); ItemEquip equip = (ItemEquip)ItemBase.DecodeItemData(pConnection, pPacket); EquipmentItems[i].Add(slot, equip); } } pPacket.ReadBool(); // EMS only -.- for (byte i = 3; i < EQUIP_INVENTORIES; i++) { EquipmentItems[i] = new Dictionary<short, ItemEquip>(); while (true) { short slot = pPacket.ReadShort(); if (slot == 0) break; slot = CharacterInventory.CorrectEquipSlot(i, slot); ItemEquip equip = (ItemEquip)ItemBase.DecodeItemData(pConnection, pPacket); EquipmentItems[i].Add(slot, equip); } } #else for (byte i = 0; i < EQUIP_INVENTORIES; i++) { EquipmentItems[i] = new Dictionary<short, ItemEquip>(); while (true) { short slot = pPacket.ReadShort(); if (slot == 0) break; slot = CharacterInventory.CorrectEquipSlot(i, slot); ItemEquip equip = (ItemEquip)ItemBase.DecodeItemData(pConnection, pPacket); EquipmentItems[i].Add(slot, equip); } } #endif InventoryItems = new Dictionary<byte, ItemBase>[NORMAL_INVENTORIES]; BagItems = new Dictionary<int, BagItem>(); for (byte i = 0; i < NORMAL_INVENTORIES; i++) { InventoryItems[i] = new Dictionary<byte, ItemBase>(); while (true) { byte slot = pPacket.ReadByte(); if (slot == 0) break; ItemBase item = ItemBase.DecodeItemData(pConnection, pPacket); InventoryItems[i].Add(slot, item); if (item.BagID != -1) { // Update BagID... O.o item.BagID = GameHelper.GetBagID(item.BagID, i); BagItem bi = new BagItem(item); BagItems.Add(item.BagID, bi); } } } // Bagzzz for (int inv = 3; inv <= 4; inv++) { var bags = pPacket.ReadInt(); for (int i = 0; i < bags; i++) { int bagid = pPacket.ReadInt(); int bagitemid = pPacket.ReadInt(); BagItem bi = BagItems[GameHelper.GetBagID(bagid, inv - 2)]; // No addition to inv...! while (true) { int slotid = pPacket.ReadInt(); if (slotid == -1) break; ItemBase item = ItemBase.DecodeItemData(pConnection, pPacket); bi.Items.Add((byte)slotid, item); } } } }
public virtual void Decode(MaplePacket pPacket) { ItemID = pPacket.ReadInt(); if (pPacket.ReadBool()) { CashID = pPacket.ReadLong(); } else { CashID = 0; } Expires = pPacket.ReadLong(); pPacket.ReadInt(); // -1? }
public static void HandleServerConnectionStatus(ClientConnection pConnection, MaplePacket pPacket) { if (pPacket.ReadBool()) { string ip = pPacket.ReadString(); ushort port = pPacket.ReadUShort(); pConnection.Logger_WriteLine("- Client got connection with MapleStory server @ {0}:{1}", ip, port); pConnection.ConnectedToIP = ip; pConnection.ConnectedToPort = port; if (port == 8484) { pConnection.SendInfoText("Mapler.me is awaiting account check! Happy mapling!"); var info = SessionRestartCache.Instance.GetInfoForConnection(pConnection); if (info != null) SessionRestartCache.Instance.RemoveInfo(info); pConnection.ChannelID = 255; } else { pConnection.SendInfoText("You successfully connected, or are in the Cash Shop!"); } pConnection.ConnectedTimeToServer = MasterThread.CurrentDate; } else { pConnection.Logger_WriteLine("- Client lost connection with MapleStory server"); pConnection.SendInfoText("Maplestory is closed, or not connected properly."); pConnection.ConnectedToIP = "0.0.0.0"; pConnection.ConnectedToPort = 0; if (pConnection.ConnectedTimeToServer != DateTime.MinValue) { var timespan = MasterThread.CurrentDate - pConnection.ConnectedTimeToServer; pConnection.Logger_WriteLine("Player was connected for {0}", timespan); if (timespan.TotalSeconds < 5) { pConnection.Logger_WriteLine("CLIENT PROBABLY FAILED TO CONNECT!!!"); } if (pConnection.CharData != null) { // Probably CC-ing or something. record MySQL_Connection.Instance.RunQuery("INSERT INTO connection_log VALUES " + MySQL_Connection.BuildValuesRow(pConnection.AccountID, pConnection.CharacterInternalID, pConnection.ChannelID, pConnection.ConnectedTimeToServer, new MySQL_Connection.NowType())); } } // Delete if there's session info var info = SessionRestartCache.Instance.GetInfoForConnection(pConnection); if (info != null) SessionRestartCache.Instance.RemoveInfo(info); pConnection.CharData = null; pConnection.CharacterInternalID = -1; pConnection.CharacterID = -1; pConnection.ChannelID = 255; } }
public override void OnPacket(MaplePacket pPacket) { byte type = pPacket.ReadByte(); ushort header = pPacket.ReadUShort(); if (header >= 0xEE00) { if (header == 0xEEFF) { string version = pPacket.ReadString(); if (version != Logger.Version) { if (frmMain.Instance != null) { frmMain.Instance.Invoke((System.Windows.Forms.MethodInvoker)delegate { System.Windows.Forms.MessageBox.Show(frmMain.Instance, "You are using an outdated version of Mapler.me! Check the site for the latest updates.", "Mapler.me server connection error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); }); } else { System.Windows.Forms.MessageBox.Show("You are using an outdated version of Mapler.me! Check the site for the latest updates.", "Mapler.me server connection error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Error); } Environment.Exit(3); return; } // Crypto byte[] sendkey = pPacket.ReadBytes(32), recvkey = pPacket.ReadBytes(32); SetKeys(sendkey, recvkey); _validHeaders = new List<ushort>[(byte)MaplePacket.CommunicationType.AMOUNT]; for (byte i = 0; i < (byte)MaplePacket.CommunicationType.AMOUNT; i++) { _validHeaders[i] = new List<ushort>(); for (ushort j = pPacket.ReadUShort(); j > 0; j--) { ushort tmp = pPacket.ReadUShort(); // Logger.WriteLine("{0} accepts 0x{1:X4}", (MaplePacket.CommunicationType)i, tmp); _validHeaders[i].Add(tmp); } } for (byte j = pPacket.ReadByte(); j > 0; j--) { string ip = pPacket.ReadString(); AcceptedIPs.Add(ip); } if (pPacket.ReadBool()) MapleStoryCryptoKey = pPacket.ReadBytes(32); AcceptedMapleStoryLocale = pPacket.ReadByte(); AcceptedMapleStoryVersion = pPacket.ReadUShort(); Logger.WriteLine("Initialized keys and valid headers"); SendToken(Program.Token); } else if (header == 0xEEFE) { // Create screenshot and send to server string url = pPacket.ReadString(); string data = pPacket.ReadString(); string filename = System.IO.Path.GetTempFileName(); bool done = Screenshot.MakeScreenshotOfMaple(filename); if (done) { Screenshot.Upload(url, data, filename); } } else if (header == 0xEEFD) { string charname = pPacket.ReadString(); frmMain.Instance.Invoke((System.Windows.Forms.MethodInvoker)delegate { frmMain.Instance.lblLastUpdate.Text = string.Format("{0} (Character: {1})", DateTime.Now, charname); }); } else if (header == 0xEEFC) { frmMain.Instance.Invoke((System.Windows.Forms.MethodInvoker)delegate { frmMain.Instance.lblInfo.Text = pPacket.ReadString(); }); } else if (header == 0xEE01) { // Pingpong using (MaplePacket mp = new MaplePacket(MaplePacket.CommunicationType.ClientPacket, 0xEE01)) { SendPacket(mp); } } } pPacket.Dispose(); pPacket = null; }
public virtual void HandleAbilityInfoUpdate(ClientConnection pConnection, MaplePacket pPacket) { pPacket.ReadByte(); // Unlock if (pPacket.ReadBool() == false) return; var stat = new Tuple<byte, int, byte>((byte)pPacket.ReadShort(), pPacket.ReadInt(), (byte)pPacket.ReadShort()); pPacket.ReadShort(); using (InsertQueryBuilder table = new InsertQueryBuilder("character_abilities")) { table.OnDuplicateUpdate = true; table.AddColumn("character_id"); table.AddColumn("id"); table.AddColumn("skill_id", true); table.AddColumn("level", true); table.AddRow( pConnection.CharacterInternalID, stat.Item1, stat.Item2, stat.Item3 ); table.RunQuery(); } }
public virtual void HandleSkillMacros(ClientConnection pConnection, MaplePacket pPacket) { byte count = pPacket.ReadByte(); if (count == 0) return; string q = string.Format("DELETE FROM skillmacros WHERE character_id = {0};\r\n", pConnection.CharacterInternalID); q += "INSERT INTO skillmacros VALUES \r\n"; for (int i = 0; i < count; i++) { string name = pPacket.ReadString(); bool shout = pPacket.ReadBool(); int skill1 = pPacket.ReadInt(); int skill2 = pPacket.ReadInt(); int skill3 = pPacket.ReadInt(); q += string.Format("({0}, {1}, '{2}', {3}, {4}, {5}, {6}),", pConnection.CharacterInternalID, i, MySql.Data.MySqlClient.MySqlHelper.EscapeString(name), shout, skill1, skill2, skill3); } q = q.TrimEnd(','); MySQL_Connection.Instance.RunQuery(q); }
public virtual void HandleAlliance(ClientConnection pConnection, MaplePacket pPacket) { byte type = pPacket.ReadByte(); if (type == 0x0C) { bool hasAlliance = pPacket.ReadBool(); if (hasAlliance) { Alliance alliance = new Alliance(); alliance.Decode(pPacket); alliance.Save(pConnection.WorldID); pConnection.Logger_WriteLine("{0} must be in Alliance {1}", pConnection.LastLoggedCharacterName, alliance.Name); } } else if (type == 0x0D) { Alliance.DecodeGuilds(pPacket, pConnection.WorldID); } }
public virtual void HandleGuild(ClientConnection pConnection, MaplePacket pPacket) { byte type = pPacket.ReadByte(); if (type == 0x20) { bool hasGuild = pPacket.ReadBool(); if (hasGuild) { Guild guild = new Guild(); guild.Decode(pPacket); guild.Save(pConnection.WorldID); pConnection.Logger_WriteLine("{0} must be in Guild {1}", pConnection.LastLoggedCharacterName, guild.Name); } else { // Not in a guild, anymore? MySQL_Connection.Instance.RunQuery("DELETE FROM guild_members WHERE character_id = " + pConnection.CharacterInternalID + " AND world_id = " + GameHelper.GetAllianceWorldID(pConnection.WorldID)); } } }
public virtual void HandleCharacterDeletion(ClientConnection pConnection, MaplePacket pPacket) { int id = pPacket.ReadInt(); bool notok = pPacket.ReadBool(); if (!notok && pConnection.UserID != -1) { pConnection.Logger_WriteLine("Deleting character with ID {0}", id); // Oh jolly... // *crosses fingers* // Delete from local cache int internalid = 0; if (AccountDataCache.Instance.DeleteCharacterInfo(id, pConnection.WorldID, pConnection.AccountID, out internalid)) { MySQL_Connection.Instance.RunQuery("DELETE FROM characters WHERE internal_id = " + internalid); } else { Logger.WriteLine("Failed to delete character. Invalid accountid, worldid, characterid or maybe not stored?"); } } else { pConnection.Logger_WriteLine("Account failed deleting ID {0}", id); } }
public virtual void HandleChangeMap(ClientConnection pConnection, MaplePacket pPacket) { int tmp = pPacket.ReadShort(); pPacket.Skip(tmp * (4 + 4)); int channelid = pPacket.ReadInt(); pConnection.ChannelID = (byte)channelid; #if LOCALE_EMS pPacket.ReadByte(); #endif pPacket.Skip(1 + 4); pPacket.Skip(1); // Portals taken pPacket.Skip(4); bool isConnecting = pPacket.ReadBool(); if (!isConnecting && pConnection.CharData == null) { return; } pConnection._CharactersInMap.Clear(); tmp = pPacket.ReadShort(); // Contains Message (Not used anymore lol.) if (tmp > 0) { pPacket.ReadString(); // Title for (int i = 0; i < tmp; i++) { pPacket.ReadString(); // Line N } } if (isConnecting) { pPacket.Skip(12); // RNGs pConnection.Logger_WriteLine("--------- Started parsing Character Info ----------"); CharacterData data = new CharacterData(); data.Decode(pConnection, pPacket); pConnection.Logger_WriteLine("--------- Done parsing Character Info ----------"); // Quick duplicate check Tuple<int, byte, byte, ushort> conflicted = null; using (var reader = MySQL_Connection.Instance.RunQuery("SELECT id, level, world_id, job FROM characters WHERE id <> " + data.Stats.ID + " AND name = " + MySQL_Connection.Escape(data.Stats.Name)) as MySql.Data.MySqlClient.MySqlDataReader) { if (reader.Read()) { // CONFLICTS conflicted = new Tuple<int, byte, byte, ushort>(reader.GetInt32(0), reader.GetByte(1), reader.GetByte(2), reader.GetUInt16(3)); } } if (conflicted == null) { if (!data.SaveData(pConnection)) return; pConnection.CharData = data; pConnection.Logger_WriteLine("--------- Saved parsed Character Info ----------"); pConnection.LastLoggedCharacterName = pConnection.CharData.Stats.Name; pConnection.LastLoggedDate = pConnection.CharData.Stats.DateThing.ToString(); pConnection.LogFilename += "-" + pConnection.CharacterInternalID; pConnection.LastExpPoint = (byte)EXPTable.GetLevelPercentage(data.Stats.Level, data.Stats.EXP); pConnection.SendInfoText("Your character {0} has been saved!", pConnection.CharData.Stats.Name); // Save SessionRestart Info SessionRestartCache.Instance.StoreInfo(pConnection.IP, pConnection.MachineID, pConnection.CharacterID, pConnection.WorldID); } else { pConnection.LogFilename += "-(CONFLICT)" + data.Stats.Name; pConnection.Logger_WriteLine("!!!!!! FOUND CHARACTER NAME CONFLICT ! Expected Character ID {0}, found Character ID {1} in database!", data.Stats.ID, conflicted.Item1); pConnection.Logger_WriteLine("Level diff: {0} - {1}", data.Stats.Level, conflicted.Item3); pConnection.Logger_WriteLine("Job diff: {0} - {1}", data.Stats.JobID, conflicted.Item4); pConnection.Logger_WriteLine("World diff: {0} - {1}", pConnection.WorldID, conflicted.Item2); pConnection.SendInfoText("A different character has already this name! Delete this character via the website first!"); } Queries.SaveServerIP(pConnection.ConnectedToIP, pConnection.ConnectedToPort, GameHelper.GetAllianceWorldID(pConnection.WorldID), pConnection.ChannelID); } else { pPacket.ReadByte(); int mapid = pPacket.ReadInt(); byte mappos = pPacket.ReadByte(); pConnection.Logger_WriteLine("New MapID: {0} ({1})", mapid, mappos); pConnection.CharData.Stats.MapID = mapid; pConnection.CharData.Stats.MapPos = mappos; int hp = pPacket.ReadInt(); pConnection.CharData.Stats.HP = hp; if (pPacket.ReadBool()) { pPacket.ReadInt(); pPacket.ReadInt(); } MySQL_Connection.Instance.RunQuery(string.Format("UPDATE characters SET chp = {0}, map = {1}, pos = {2} WHERE internal_id = {3}", hp, mapid, mappos, pConnection.CharacterInternalID)); } pPacket.ReadLong(); //DateTime servertime = DateTime.FromFileTime(pPacket.ReadLong()); pPacket.ReadInt(); // 100? pPacket.ReadByte(); // 0 pPacket.ReadByte(); // 0 pPacket.ReadByte(); // 1 if (pPacket.Position != pPacket.Length) { pConnection.Logger_WriteLine("Data not fully read. Halp.: {0} of {1} read", pPacket.Position, pPacket.Length); } pConnection.SendTimeUpdate(); }
public void Decode(MaplePacket pPacket) { Stats = new GW_CharacterStat(); Stats.Decode(pPacket); this.BuddylistSize = pPacket.ReadByte(); if (pPacket.ReadBool()) BlessingOfTheFairy = pPacket.ReadString(); else BlessingOfTheFairy = null; if (pPacket.ReadBool()) BlessingOfEmpress = pPacket.ReadString(); else BlessingOfEmpress = null; if (pPacket.ReadBool()) UltimateExplorer = pPacket.ReadString(); else UltimateExplorer = null; Stats.DecodeMesos(pPacket); // .-. // Unknown stuff here int amount = pPacket.ReadInt(); UnknownIntegerList = new List<UnknownListOfIntegers>(); for (int i = 0; i < amount; i++) { UnknownListOfIntegers vals = new UnknownListOfIntegers(); vals.Decode(pPacket); UnknownIntegerList.Add(vals); } Inventory = new CharacterInventory(); Inventory.Decode(pPacket); UnknownIntegerListNumber2 = new List<int>(); while (true) { int unkval = pPacket.ReadInt(); if (unkval == -1) break; UnknownIntegerListNumber2.Add(unkval); } UnknownIntegerListNumber3 = new Dictionary<int, long>(); amount = pPacket.ReadInt(); for (int i = 0; i < amount; i++) { UnknownIntegerListNumber3.Add(pPacket.ReadInt(), pPacket.ReadLong()); } { UnknownIntegerListNumber4 = new Dictionary<long, long>(); amount = pPacket.ReadInt(); for (int i = 0; i < amount; i++) { UnknownIntegerListNumber4.Add(pPacket.ReadLong(), pPacket.ReadLong()); } while (true) { byte val = pPacket.ReadByte(); if (val == 0) break; { pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadByte(); pPacket.ReadInt(); pPacket.ReadLong(); pPacket.ReadLong(); pPacket.ReadLong(); pPacket.ReadLong(); } } } Skills = new CharacterSkills(); Skills.Decode(pPacket); Quests = new CharacterQuests(); Quests.Decode(pPacket); // Match for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); pPacket.ReadInt(); } // Couple for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadBytes(33); } // Friend for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadBytes(37); } // Marriage for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadBytes(48); } Inventory.DecodeTeleportRocks(pPacket); }
public void Decode(ClientConnection pConnection, MaplePacket pPacket) { if (pPacket.ReadBool()) { for (short i = pPacket.ReadShort(); i > 0; i--) { Skill skill = new Skill(); skill.ID = pPacket.ReadInt(); skill.Level = pPacket.ReadInt(); skill.Expiration = pPacket.ReadLong(); if (GameHelper.is_skill_need_master_level(skill.ID)) skill.MasterLevel = pPacket.ReadInt(); else skill.MasterLevel = -1; if (SkillList.ContainsKey(skill.ID)) // NEXON pConnection.Logger_WriteLine("Found duplicate skill {0}", skill.ID); else SkillList.Add(skill.ID, skill); } // Link skills for (int i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadShort(); } } else { pConnection.Logger_WriteLine("Character has 'new' skilllist!"); // 0.0 for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); } for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); } for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadLong(); } for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); } for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); pPacket.ReadInt(); } for (short i = pPacket.ReadShort(); i > 0; i--) { pPacket.ReadInt(); } } short amnt = pPacket.ReadShort(); for (short i = 0; i < amnt; i++) { Cooldowns.Add(pPacket.ReadInt(), pPacket.ReadInt()); } }