public static void releaseGeneralQuestPacket(Character chr, byte karma = 0x0, byte penance = 0x0, int fame = 0x0, long exp = 0x0, long money = 0x0, byte guildPos = 0x0, byte faction = 0x0) { OutPacket op = new OutPacket(64); op.WriteInt(64); op.WriteShort(0x05); op.WriteShort(0x3b); op.WriteInt(715218689); op.WriteInt(chr.getuID()); op.WriteByte(0x0); // karma op.WriteByte(0x0); // penance op.WriteShort(); // ? op.WriteByte(FameNickNames.Instance.getFameNickID(fame != 0x0 ? fame : chr.getFame()) > 0 ? (byte)1 : (byte)0); // appear player name above the head op.WriteByte(FameNickNames.Instance.getFameNickID(fame != 0x0 ? fame : chr.getFame())); // fame nickname op.WriteByte(chr.getAccount().gmLvl > 0 ? (byte)1 : (byte)0); // blue nickname?? op.WriteByte(4); // ? op.WriteByte(4); // ? op.WriteByte(4); // ? op.WriteByte(4); // ? op.WriteByte(4); // ? op.WriteInt(fame != 0x0 ? fame : chr.getFame()); // fame op.WriteReversedLong(exp != 0x0 ? exp : chr.getExp()); // exp op.WriteLong(money != 0x0 ? money : chr.getCoin()); // money op.WriteByte(guildPos != 0x0 ? guildPos : (byte)0x0); // Guild Pos | TODO op.WriteByte(faction != 0x0 ? faction : chr.getFaction()); // Faction op.WriteByte(2); // 0 - gives an yellow message (?) | 1 - hides inventory Console.WriteLine(BitConverter.ToString(op.ToArray())); chr.getAccount().mClient.WriteRawPacket(op.ToArray()); }
public static byte[] refreshGuild(Character chr) { Guild guild = chr.getGuild(); OutPacket op = new OutPacket(1644); op.WriteInt (32); op.WriteShort (4); op.WriteShort (97); op.WriteInt (1); op.WriteInt (chr.getuID()); op.Skip (16); op.WriteInt (1612); op.WriteShort (4); op.WriteShort (65); op.WriteInt (1); op.WriteInt (chr.getuID()); op.WriteShort (1); op.WritePaddedString(guild.guildName, 18); op.WriteShort (guild.guildIcon); op.WriteShort (guild.guildType); op.WriteInt ((guild.guildFame / 100) + (guild.guildGold / 10)); op.WriteInt (guild.guildFame); op.WriteLong (guild.guildGold); op.WriteInt (guild.guildHat); for(int i = 0;i < 50;i++) { op.WriteInt(guild.guildMembers.ElementAt(i) == null ? 0 : guild.guildMembers.ElementAt(i).getuID()); } // 60 - 259 for(int i = 0;i < 50;i++) { op.WriteByte(guild.guildMembers.ElementAt(i) == null ? (byte)0 : guild.guildMembers.ElementAt(i).getGuildRank()); } // 260 - 309 for(int i = 0;i < 50;i++) { if(guild.guildMembers.ElementAt(i) == null) { op.Skip(17); continue; } if(guild.guildMembers.ElementAt(i).getOnlineCharacter() == null) { op.Skip(17); continue; } Character tmp = guild.guildMembers.ElementAt(i).getOnlineCharacter(); op.WritePaddedString(tmp.getName(), 17); } // 310 - 1159 for(int i = 0;i < 50;i++) { if(guild.guildMembers.ElementAt(i) == null) { op.Skip(1); continue; } if(guild.guildMembers.ElementAt(i).getOnlineCharacter() == null) { op.Skip(1); continue; } Character tmp = guild.guildMembers.ElementAt(i).getOnlineCharacter(); op.WriteByte(tmp.getcClass()); } return op.ToArray(); }
public static byte[] initAccount(Account acc) { OutPacket op = new OutPacket(52); op.WriteInt(52); op.WriteShort(3); op.WriteShort(5); op.WritePaddedString(acc.name, 24); op.WriteInt(109); op.WriteInt(acc.MHPoints); op.WriteLong(); op.WriteInt(acc.characters != null ? acc.characters.Count : 0); return op.ToArray(); }
public static byte[] getIncomingMessagePacket(Message msg, Character chr) { string message = msg.getMessage(); int messageLength = message.Length; OutPacket op = new OutPacket(messageLength + 91); op.WriteInt (); op.WriteShort (1); op.WriteShort (20); op.WriteInt (358585); op.WritePaddedString(msg.getDateTimeString(), 20); op.WriteInt (12); op.WriteInt (4); op.WriteLong (4479951538479293); op.WritePaddedString(chr.getName(), 17); op.WritePaddedString("BrightMH", 17); op.WriteShort (2080); op.WriteInt (messageLength); op.WriteString (message); return op.ToArray(); }
public static byte[] createGuildResponse(Character chr, byte managementType, byte managementArg = 0, string guildName = null) { OutPacket op = new OutPacket(88); // 32 & 56 op.WriteInt (32); op.WriteShort (4); op.WriteShort (97); op.WriteInt (1); op.WriteInt (chr.getuID()); // 12-15 op.Skip (16); // 16-31 op.WriteInt (56); op.WriteShort (4); op.WriteShort (61); op.WriteInt (1); op.WriteInt (chr.getuID()); op.WriteShort (1); op.WriteByte (managementType); op.WriteByte (managementArg); op.WritePaddedString(guildName ?? "", 20); op.WriteInt (chr.getFame()); op.WriteInt (/* 344 ?? */); op.WriteLong (chr.getCoin()); return op.ToArray(); }
public static byte[] initCharPacket(Character chr) { OutPacket op = new OutPacket(653); op.WritePaddedString(chr.getName(), 17); // 0-16 op.WriteRepeatedByte(0x30, 16); // 17-32 op.WriteByte(); op.WriteShort(chr.getFaction()); // 34-35 op.WriteInt(chr.getFame()); // 36-39 op.WriteShort(chr.getcClass() == 2 ? (byte)0x02 : (byte)0x01); // 40-41 op.WriteShort(chr.getFace()); // 42-43 op.WriteInt(1); op.WriteShort(chr.getcClass()); // 48-49 op.WriteShort(157); // 50-51 ; 1 -> hide player nick above the head & toggles guild on [1] / off [0] | 157 for random 154 warrior [probably guildType or guildIcon!! (important!!)] op.WriteShort(2); // 52-53 ; 7 -> 137 monk // your guild pos master/member etc. op.WriteShort(chr.getLevel()); // 54-55 op.WriteInt(chr.getCurHP()); // 56-59 op.WriteInt(chr.getCurMP()); // 60-63 but wtf.. mana is short o.o op.WriteInt(chr.getMap()); // 64-67 let's guess.. a map? op.WriteFloat(chr.getPosition()[0]); // 68-71 op.WriteFloat(chr.getPosition()[1]); // 72-75 for(byte i = 0;i < 17;i++) { if(chr.getEquipment().getEquipments().ContainsKey(i)) { op.WriteByte(); op.WriteByte(chr.getEquipment().getEquipments()[i].getEnding() > 0 ? (byte)0xff : (byte)0); op.WriteShort(); op.WriteInt(chr.getEquipment().getEquipments()[i].getItemID()); op.WriteInt(chr.getEquipment().getEquipments()[i].getEnding() > 0 ? (int)chr.getEquipment().getEquipments()[i].getEnding() / 1000 : 1); } else op.WriteZero(12); } op.Position = 465; op.WriteByte(70); op.Position = 314; for(byte i = 0;i < 16;i++) { /*if(character.getBuffs().getBuffs().ContainsKey(i)) { op.WriteShort(character.getBuffs().getBuffs()[i].getBuffSlot()); op.WriteShort(character.getBuffs().getBuffs()[i].getBuffID()); op.WriteShort(character.getBuffs().getBuffs()[i].getBuffTime()); op.WriteShort(character.getBuffs().getBuffs()[i].getBuffValue()); } else*/ op.Skip(8); } op.Skip(16); op.WriteByte(0); // no explanation op.WriteByte(0); // no explanation op.WriteByte(/*character.getKao()*/); op.WriteByte(/*character.getPenance()*/); op.WriteByte(chr.getEffect()); op.WriteByte(0); // no explanation op.WriteByte(FameNickNames.Instance.getFameNickID(chr.getFame())); op.WriteByte(chr.getVp()); // 465 op.WriteByte((byte)chr.getAccount().gmLvl); // 466 op.WriteByte(0); // no explanation op.WriteByte(0); // -> 1 -> tells the client that UI mutation effect should be toggled off | 468 op.WriteByte((byte)(chr.getInvPages() - 3)); // inventory pages | 469 op.WriteByte(0); // no explanation op.WriteByte(0); // no explanation op.WriteShort(0); /*weird PK thing*/ // 472 - 473 but in fact.. it has some date time etc. op.WriteLong(0); // 474 - 481 op.Position = 560; op.WriteInt(1); // ok.. so this is kinda weird - last place where you've leveled / died with your character? op.WriteFloat(-2558); // unknown posX op.WriteFloat(8950); // unknown posY op.WriteByte(0); // no explanation op.WriteByte(0); // no explanation op.WriteByte(0); // no explanation op.WriteByte(0); // no explanation for(int i = 0;i < chr.getCStats().Length;i++) op.WriteShort(chr.getCStats()[i]); // 576-577 / 578-579 / 580-581 / 582-583 / 584-585 op.WriteShort(chr.getCurSP()); op.WriteInt(); op.WriteInt(); op.WriteLong(); op.WriteShort(chr.getStatPoints()); op.WriteShort(chr.getSkillPoints()); // 606-607 op.Position = 648; op.WriteByte(Convert.ToByte(chr.getDeleteState())); return op.ToArray(); }
public static void Refresh(MartialClient c, InPacket p) { if(c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Hooked guild.Refresh with null of activeCharacter"); c.Close(); return; } Character chr = c.getAccount().activeCharacter; OutPacket op = new OutPacket(40); op.WriteInt(40); op.WriteShort(5); op.WriteShort(0x41); op.WriteInt(1); op.WriteShort(13413); c.WriteRawPacket(op.ToArray()); op = new OutPacket(32); op.WriteInt(32); op.WriteShort(4); op.WriteShort(97); op.WriteInt(1); op.WriteShort(-15349); op.WriteShort((short)chr.getuID()); op.WriteLong(); op.WriteLong(); c.WriteRawPacket(op.ToArray()); op = new OutPacket(136); op.WriteInt(136); op.WriteShort(4); op.WriteShort(81); op.WriteInt(1); op.WriteShort(-15349); op.WriteShort((short)chr.getuID()); op.WriteShort(1); op.WriteShort(30726); op.WriteString("PolishPoverty"); c.WriteRawPacket(op.ToArray()); op = new OutPacket(20); op.WriteInt(20); op.WriteInt(5); op.WriteInt(937683714); // those values.. lelellele op.WriteInt(680); op.WriteInt(939117056); c.WriteRawPacket(op.ToArray()); }
public static void setPlayerPosition(Character chr, float goX, float goY, short map) { MartialClient c = chr.getAccount().mClient; Logger.WriteLog(Logger.LogTypes.Debug, goX + " | " + goY + " | " + map); Area lastArea = chr.getArea(); Area newArea = WMap.Instance.getGrid(map).getAreaByRound(goX, goY); if(newArea == null) { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "The position " + goX + "|" + goY + "|" + map + " can't be reached."); Waypoint closestTown = TownCoordsCache.Instance.getClosestWaypointForMap(map, new Waypoint(goX, goY)); if(closestTown == null) { Area vvArea = WMap.Instance.getGrid(1).getAreaByRound(-1660, 2344); if(vvArea == null) { Logger.WriteLog(Logger.LogTypes.Error, "Pure setPlayerPosition error {0}|{1}|{2}", goX, goY, map); StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "We're sorry, but an hard error has occured. Please report it to an admin."); c.Close(); return; } else { goX = -1660; goY = 2344; map = 1; newArea = vvArea; } } else { goX = closestTown.getX(); goY = closestTown.getY(); newArea = WMap.Instance.getGrid(map).getAreaByRound(goX, goY); } } if(lastArea != null) { WMap.Instance.getGrid(chr.getMap()).sendTo3x3AreaLeave(chr, lastArea); lastArea.removeCharacter(chr); } if(newArea != null) chr.setArea(newArea); else { chr.getAccount().mClient.Close(); return; } newArea.addCharacter(chr); chr.setMap(map); chr.setPosition(new float[] { goX, goY }); OutPacket op = new OutPacket(5840); op.WriteInt(5824); op.WriteShort(4); // 4 - 5 op.WriteShort(1); // 6 - 7 op.WriteInt(1); // 8 - 11 op.WriteInt(chr.getuID()); // 12 - 15 op.WriteShort(1); // 16 - 19 op.WriteShort(1); // 16 - 19 op.WriteInt(chr.getMap()); // 20 - 23 op.WriteInt(DateTime.Now.Year - 2000); // 24 - 27 op.WriteByte((byte)DateTime.Now.Month); // 28 op.WriteByte(DateTime.Now.Day > 30 ? (byte)0x1e : (byte)DateTime.Now.Day); // 29 op.WriteInt(DateTime.Now.Hour); // 30 - 37 for(int i=0;i<120;i++) { if(chr.getCargo().getSeqSaved()[i] != -1 && chr.getCargo().getCargoSaved()[chr.getCargo().getSeqSaved()[i]] != null) { op.WriteInt(); op.WriteByte((byte)(chr.getCargo().getSeqSaved()[i] / 100)); op.WriteByte((byte)(chr.getCargo().getSeqSaved()[i] % 100)); Item item = chr.getCargo().getCargoSaved()[chr.getCargo().getSeqSaved()[i]]; op.WriteInt(item.getItemID()); ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID()); if(itemData.getTimeToExpire() > 0) { } op.WriteShort(item.getQuantity()); } else op.WriteZero(12); } // 38 - 1477 op.Position = 1476; for(int i=0;i<chr.getCommunity().getFriendsList().Capacity;i++) { if(chr.getCommunity().getFriendsList().ElementAtOrDefault(i) != null) { op.WritePaddedString(chr.getCommunity().getFriendsList()[i], 17); } else op.WriteZero(17); } // 1476 - 1934 op.WriteRepeatedByte(0x58, 40); op.Position = 1986; for(int i = 0;i < chr.getCommunity().getIgnoresList().Capacity;i++) { if(chr.getCommunity().getIgnoresList().ElementAtOrDefault(i) != null) { op.WritePaddedString(chr.getCommunity().getIgnoresList()[i], 17); } else op.WriteZero(17); } // 1987 - 2157 op.WriteInt(363); // questsy op.WriteLong(); op.WriteLong(138769276674441706); op.WriteLong(21692910); op.WriteShort(); op.WriteShort(1); op.Position = 2248; for(byte i=0;i<240;i++) { if(chr.getInventory().getSeqSaved()[i] != -1 && chr.getInventory().getInvSaved()[chr.getInventory().getSeqSaved()[i]] != null) { op.WriteShort(); op.WriteByte((byte)(chr.getInventory().getSeqSaved()[i] / 100)); op.WriteByte((byte)(chr.getInventory().getSeqSaved()[i] % 100)); Item item = chr.getInventory().getInvSaved()[chr.getInventory().getSeqSaved()[i]]; op.WriteInt(item.getItemID()); op.WriteInt(item.getQuantity()); } else op.WriteZero(12); } // 2252 - 5133 op.WriteLong(chr.getCoin()); op.Position = 5140; for(byte i=0;i<21;i++) { if(chr.getSkillBar().getSkillBar().ContainsKey(i)) { int barID = chr.getSkillBar().getSkillBar()[i]; if(barID > 200000000) op.WriteInt(1); else if(barID > 511) { op.WriteInt(5); barID -= 512; } else if(barID > 255) { op.WriteInt(6); barID -= 256; } else { SkillData skill = SkillDataCache.Instance.getSkill(chr.getSkills().getLearnedSkills().ElementAtOrDefault(barID)); if(skill == null) op.WriteInt(0); else if(skill.getTypeSpecific() == 6) op.WriteInt(3); else if(skill.getTypeSpecific() == 7) op.WriteInt(4); else op.WriteInt(2); } op.WriteInt(barID); } else op.WriteZero(8); } // 5140 - 5299 op.Position = 5320; for(int i = 0;i < 60;i++) { if(chr.getSkills().getLearnedSkills().Count > i && chr.getSkills().getLearnedSkills()[i] != 0) { op.WriteInt(chr.getSkills().getLearnedSkills()[i]); op.WriteInt(SkillDataCache.Instance.getSkill(chr.getSkills().getLearnedSkills()[i]).getSkillPoints()); } else op.WriteLong(); } // 5320 - 5799 op.WriteFloat(chr.getPosition()[0]); op.WriteFloat(chr.getPosition()[1]); op.WriteInt(0x0c); op.WriteInt(140338688); op.WriteInt(); op.WriteShort(); op.WriteShort(10962); //s3c0nd p4ck3t op.WriteInt(16); op.WriteInt(7929861); op.WriteInt(chr.getuID()); c.WriteRawPacket(op.ToArray()); WMap.Instance.getGrid(chr.getMap()).sendTo3x3AreaSpawn(chr, chr.getArea()); }
public static void SellToNPC(MartialClient c, InPacket p) { if(c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook sellToNPC while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte[] decrypted = p.ReadBytes(9); Item item = new Item(); if(!chr.getInventory().sellItem(decrypted[5], decrypted[8], item)) { Console.WriteLine("sell to npc teh problemz"); return; } if(payedItems.Contains(item.getItemID())) { ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID()); int itemPrice = itemData.getNpcPrice() * decrypted[8]; chr.setCoin(chr.getCoin() + itemPrice); } OutPacket op = new OutPacket(32); op.WriteInt(32); op.WriteShort(0x04); op.WriteShort(0x14); op.WriteInt(0x01); op.WriteInt(chr.getuID()); op.WriteShort(0x01); op.WriteByte(0x01); op.WriteByte(decrypted[5]); op.WriteInt(decrypted[8]); op.WriteLong(chr.getCoin()); c.WriteRawPacket(op.ToArray()); }
public static void BuyFromNPC(MartialClient c, InPacket p) { if(c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.CreateCharacter, c, "Attempted to hook a NPC open while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte[] decrypted = p.ReadBytes(9); int npcID = BitConverter.ToInt32(decrypted, 0); if(WMap.Instance.getNpcs().ElementAtOrDefault(npcID) == null) { Logger.LogCheat(Logger.HackTypes.NPC, c, "Tried to hook NPC of uID {0}", npcID); return; } NPC npc = WMap.Instance.getNpcs()[npcID]; OutPacket op = new OutPacket(56); op.WriteInt(56); op.WriteShort(4); op.WriteShort(19); op.WriteInt(1); op.WriteInt(c.getAccount().activeCharacter.getuID()); if(decrypted[8] != 0) { int itemID = NPCDataCache.Instance.getNPCDataByuID(npcID, chr.getMap()).getItemFromSlot(decrypted[4]); if(itemID == -1) { Console.WriteLine("Somebody tried to buy not existing item"); return; } ItemData itemData = ItemDataCache.Instance.getItemData(itemID); if(itemData == null) { Console.WriteLine("Tried to buy not existing item"); return; } Item item = new Item(itemID, decrypted[8]); int itemPrice = 0; if(payedItems.Contains(itemData.getID())) { itemPrice = itemData.getNpcPrice() * decrypted[8]; if(chr.getCoin() < itemPrice) { Console.WriteLine("Tried to buy free Gold Bars :3"); return; } } Console.WriteLine("line {0} row {1}", decrypted[7], decrypted[6]); if(!chr.getInventory().buyItem(item, decrypted[7], decrypted[6])) { Console.WriteLine("npc.. something went wrong"); return; } chr.setCoin(chr.getCoin() - itemPrice); op.WriteLong(chr.getCoin()); op.WriteShort(0x01); op.WriteByte(decrypted[5]); op.WriteByte(decrypted[6]); op.WriteByte(decrypted[7]); op.WriteByte(chr.getVp()); // vending points (?) op.WriteZero(18); op.WriteInt(itemID); op.WriteByte(decrypted[8]); } else { op.WriteInt(npcID); op.WriteInt(); op.WriteInt(0x01); op.WriteInt(); op.WriteInt(); op.WriteInt(0); // -100% extra charge => free buying op.WriteInt(8388608); // -100% discount => free selling op.WriteByte(0x80); op.WriteByte(0x3f); //op.WriteLong(1294138); // looks like.. areaID? for sure not modelID, or other shit, just the second short looks familiar //op.WriteLong(1); // must be 1 to open the shop o.o //op.WriteInt(64); // 0% ? //op.WriteInt(1065353216); // -100% extra charge => free buying //op.WriteInt(1065353216); // -100% discount => free selling /* IN TWO WORDS -> WEIRD SHIT HERE */ } c.WriteRawPacket(op.ToArray()); }