public void sendCharaExpInfo() { if (lastStep == 0) { int maxLength; if ((sizeof(short) * charaWork.battleSave.skillLevel.Length) - lastPosition < 0x5E) { maxLength = (sizeof(short) * charaWork.battleSave.skillLevel.Length) - lastPosition; } else { maxLength = 0x5E; } byte[] skillLevelBuffer = new byte[maxLength]; Buffer.BlockCopy(charaWork.battleSave.skillLevel, 0, skillLevelBuffer, 0, skillLevelBuffer.Length); SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp"); charaInfo1.setIsArrayMode(true); if (maxLength == 0x5E) { charaInfo1.addBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x0); lastPosition += maxLength; } else { charaInfo1.addBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevel", 0), skillLevelBuffer, 0, skillLevelBuffer.Length, 0x3); lastPosition = 0; lastStep++; } charaInfo1.addTarget(); queuePacket(charaInfo1.buildPacket(actorId, actorId)); } else if (lastStep == 1) { int maxLength; if ((sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition < 0x5E) { maxLength = (sizeof(short) * charaWork.battleSave.skillLevelCap.Length) - lastPosition; } else { maxLength = 0x5E; } byte[] skillCapBuffer = new byte[maxLength]; Buffer.BlockCopy(charaWork.battleSave.skillLevelCap, lastPosition, skillCapBuffer, 0, skillCapBuffer.Length); SetActorPropetyPacket charaInfo1 = new SetActorPropetyPacket("charaWork/exp"); if (maxLength == 0x5E) { charaInfo1.setIsArrayMode(true); charaInfo1.addBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x1); lastPosition += maxLength; } else { charaInfo1.setIsArrayMode(false); charaInfo1.addBuffer(Utils.MurmurHash2("charaWork.battleSave.skillLevelCap", 0), skillCapBuffer, 0, skillCapBuffer.Length, 0x3); lastStep = 0; lastPosition = 0; } charaInfo1.addTarget(); queuePacket(charaInfo1.buildPacket(actorId, actorId)); } }