public byte[] npcSpawn(Character character) { OutPacket initNPCData = new OutPacket(615); initNPCData.WriteInt(615); initNPCData.WriteShort(0x04); initNPCData.WriteShort(0x04); initNPCData.WriteByte(0x01); initNPCData.WriteInt(character.getuID()); initNPCData.WriteInt(character.getArea().getaID()); initNPCData.WriteFloat(character.getPosition()[0]); initNPCData.WriteFloat(character.getPosition()[1]); initNPCData.WriteByte(3); initNPCData.WriteInt(this.uID); initNPCData.WriteInt(); initNPCData.WritePaddedString(this.getName(), 16); initNPCData.Skip(18); initNPCData.WriteInt(this.getModule()); initNPCData.Skip(10); initNPCData.WriteInt(this.getmID()); initNPCData.Skip(16); initNPCData.WriteFloat(this.npcPosition[0]); initNPCData.WriteFloat(this.npcPosition[1]); initNPCData.Skip(502); initNPCData.WriteByte(0x22); initNPCData.WriteByte(0x08); return initNPCData.ToArray(); }
public static void HandleFriends(MartialClient c, InPacket p) { if(c.getAccount().activeCharacter == null) { Logger.LogCheat(Logger.HackTypes.NullActive, c, "Attempted to hook HandleFriends while not being ingame."); c.Close(); return; } Character chr = c.getAccount().activeCharacter; byte managementType = p.ReadByte(); byte communityIndex = p.ReadByte(); string personName = MiscFunctions.obscureString(p.ReadString(16)); Community com = chr.getCommunity(); switch(managementType) { case 0: case 1: { if(!com.addPersona(managementType, communityIndex, personName)) { StaticPackets.sendSystemMessageToClient(c, 1, "Sorry. Something went wrong!"); return; } break; } case 2: case 3: { if(!com.removePersona((byte)(managementType - 2), communityIndex)) { StaticPackets.sendSystemMessageToClient(c, 1, "Sorry. Something went wrong!"); return; } break; } default: { //tuffnucks you! return; } } OutPacket op = new OutPacket(40); op.WriteInt(40); op.WriteShort(0x04); op.WriteShort(0x31); op.WriteInt(134652417); op.WriteInt(chr.getuID()); op.WriteShort(1); op.WriteByte(managementType); op.WriteByte(communityIndex); op.WritePaddedString(personName, 16); op.WriteInt(-1089495552); c.WriteRawPacket(op.ToArray()); }
// Holy Grail ftw public static void useItem(Character chr, Item item, byte usingIndex, InPacket p) { MartialClient c = chr.getAccount().mClient; ItemData itemData = ItemDataCache.Instance.getItemData(item.getItemID()); Boolean shouldDecrease = false; string determined = null; int determiner = 0; if(itemData.getIsStackable()) shouldDecrease = true; else { if(itemData.getTimeToExpire() == 0) shouldDecrease = true; } // well.. we don't care if it's handled by server.. let's just remove them & f**k haterz! qq if(shouldDecrease) if(!chr.getInventory().decrementItem(usingIndex)) { Console.WriteLine("something went wrong with decrement.."); return; } switch(itemData.getCategory()) { case 1001: // healingz { if(itemData.getHealHP() > 0 || itemData.getHealMana() > 0 || itemData.getHealStamina() > 0) StaticPackets.releaseHealPacket(chr, (int)(chr.getCurHP() + itemData.getHealHP()), (short)(chr.getCurMP() + itemData.getHealMana()), (short)(chr.getCurSP() + itemData.getHealStamina())); break; } case 1002: // skillz o.o { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "If you'd like to learn any skill, go to skills list and press CTRL+LMB."); break; } case 1003: // teleport { if(chr.getMap() == itemData.getTeleportMap() || chr.getMap() != itemData.getTeleportMap() && itemData.getSpecialEffect() != 0) CharacterFunctions.setPlayerPosition(chr, itemData.getTeleportX(), itemData.getTeleportY(), (short)itemData.getTeleportMap()); break; } case 1007: // reset skills { chr.getSkills().resetAll(); chr.getSkillBar().getSkillBar().Clear(); break; } case 1011: // effect potions { chr.setEffect((byte)itemData.getSpecialEffect()); break; } case 1012: // tae potion { break; } case 1013: // faction change { if(chr.getFaction() == 0) return; chr.setFaction(chr.getFaction() == 1 ? (byte)2 : (byte)1); break; } case 1015: // chuk amulet { determiner = BitConverter.ToInt32(p.ReadBytes(4), 0); if(determiner == 0) return; ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner); if(determinedItem == null || determinedItem.getCategory() != 1003 || (determiner < 212100146 && determiner > 212100164 && determiner != 212100185 && determiner != 212100187)) { Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ"); return; } CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap()); break; } case 1016: // karma amulet { chr.setKarmaMessagingTimes((short)(chr.getKarmaMessagingTimes()+1)); break; } case 1020: // name changer { p.Skip(4); string charName = MiscFunctions.obscureString(p.ReadString(16)); if(charName.Length < 3 || Regex.Replace(charName, "[^A-Za-z0-9]+", "") != charName || MySQLTool.NameTaken(charName)) { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Wrong input " + charName + "."); return; } chr.setName(charName); determined = charName; CharacterFunctions.refreshCharacterForTheWorld(chr); break; } case 1021: // face changer { chr.setFace((byte)itemData.getSpecialEffect()); break; } case 1024: { // yy..? break; } case 1031: // red castle { determiner = BitConverter.ToInt32(p.ReadBytes(4), 0); if(determiner == 0) return; ItemData determinedItem = ItemDataCache.Instance.getItemData(determiner); if(determinedItem == null || determinedItem.getCategory() != 56 || ((determiner < 273001255 && determiner > 273001257) && determiner != 283000472 && determiner != 283000543 && determiner != 283000575 && determiner != 283000614 && determiner != 283000934 && determiner != 283001078 && determiner != 283001373 && determiner != 283001376)) { Console.WriteLine("I CAN'T TURN 10 INTO 20 CHICKENZ"); return; } CharacterFunctions.setPlayerPosition(chr, determinedItem.getTeleportX(), determinedItem.getTeleportY(), (short)determinedItem.getTeleportMap()); break; } default: { StaticPackets.sendSystemMessageToClient(chr.getAccount().mClient, 1, "Feature not implemented yet"); return; } } OutPacket op = new OutPacket(52); op.WriteInt(52); op.WriteShort(0x04); op.WriteShort(0x05); op.WriteInt(140328705); op.WriteInt(chr.getuID()); op.WriteShort(0x01); op.WriteByte(0x01); op.WriteByte(usingIndex); op.WriteInt(item.getQuantity()); op.WriteInt(793149441); op.WriteInt(/*determiner > 0 ? determiner : 0*/); op.WritePaddedString(determined, 17); op.WriteByte(0x90); op.WriteByte(0xd2); op.WriteByte(0x2a); c.WriteRawPacket(op.ToArray()); OutPacket ops = new OutPacket(40); ops.WriteInt(40); ops.WriteShort(0x05); ops.WriteShort(0x05); ops.WriteInt(779458561); ops.WriteInt(chr.getuID()); ops.WriteInt(item.getItemID()); ops.WritePaddedString(determined, 17); ops.WriteByte(0x9e); ops.WriteByte(0x0f); ops.WriteByte(0xbf); WMap.Instance.getGrid(chr.getMap()).sendTo3x3Area(chr, chr.getArea(), ops.ToArray()); }
public static void sendSystemMessageToClient(MartialClient c, byte messageType, string message, string sender = null) { OutPacket p = new OutPacket(45 + message.Length); p.WriteInt(45 + message.Length); p.WriteShort(0x05); p.WriteShort(0x07); p.WriteShort(0x01); p.WriteZero(7); p.WriteByte(0x01); p.WriteShort(messageType); if(sender == null) p.WritePaddedString("*", 20); else p.WritePaddedString(sender, 20); p.WriteInt(0x3e); p.WriteString(message); c.WriteRawPacket(p.ToArray()); }
public static byte[] chatRelay(Character chr, byte messageType, string message) { OutPacket p = new OutPacket(message.Length + 44); p.WriteInt(message.Length + 44); p.WriteShort(0x05); p.WriteShort(0x07); p.WriteInt(0x01); p.WriteInt(chr.getuID()); p.WriteZero(1); p.WriteByte(0x01); p.WriteShort(messageType); p.WritePaddedString(chr.getName(), 20); p.WriteInt(message.Length); p.WriteString(message); return p.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[] 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[] getRefreshNewsGuildPacket(string message) { OutPacket op = new OutPacket(212); op.WriteInt (212); op.WriteShort (4); op.WriteShort (103); op.WriteInt (1); op.WritePaddedString(message, 195); return op.ToArray(); }
public static byte[] extCharGuild(Character chr) { OutPacket op = new OutPacket(40); op.WriteInt (40); op.WriteShort (5); op.WriteShort (65); op.WriteInt (1); op.WriteInt (chr.getuID()); op.WriteByte (chr.getGuild().guildType); op.WritePaddedString(chr.getGuild().guildName, 17); op.WriteShort (chr.getGuild().guildIcon); 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[] 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[] 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 byte[] npcSpawnChained(Character chr) { OutPacket initNPCData = new OutPacket(589); initNPCData.WriteByte(3); initNPCData.WriteInt(this.uID); initNPCData.WriteInt(); initNPCData.WritePaddedString(this.getName(), 16); initNPCData.Skip(18); initNPCData.WriteInt(this.getModule()); initNPCData.Skip(10); initNPCData.WriteInt(this.getmID()); initNPCData.Skip(16); initNPCData.WriteFloat(this.npcPosition[0]); initNPCData.WriteFloat(this.npcPosition[1]); return initNPCData.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()); }