public static byte[] playerIsntConnected(Character chr) { OutPacket p = new OutPacket(48); p.WriteInt(48); p.WriteShort(0x05); p.WriteShort(0x07); p.WriteInt(0x01); p.WriteInt(chr.getuID()); p.WriteZero(2); p.WriteShort(0x01); p.WriteZero(20); p.WriteInt(0x04); p.WriteByte(0x34); p.WriteByte(0x33); p.WriteByte(0x34); p.WriteByte(0x33); return p.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[] 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[] getInitialPacket() { OutPacket p = new OutPacket(608); p.WriteInt(608); p.WriteShort(0x05); p.WriteShort(0x03); p.WriteInt(0x02); p.WriteInt(uID); p.WriteZero(48); p.WriteInt(this.mController.getData().getmID()); p.WriteInt(); p.WriteInt(curHP); p.WriteZero(8); p.WriteFloat(positionX); p.WriteFloat(positionY); //Console.WriteLine("mobid {0} mobuid {1} xcord {2} ycord {3} hp {4}", this.mController.getData().getmID(), uID, positionX, positionY, curHP); return p.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 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()); }