Кому надо, вот набросок UI 24 протокола (одиссея). В мир не входил, просто проверил соответствие полей в пхаке. Еще там у меня сомнения по поводу 3 флагов (1-ый я пометил знаками вопроса, а 2 и 3 - baseClassId и classId - то ли у кого-то из них тип изменился, в чем я сомневаюсь, то ли добавились 1-2 новых флага в том районе. В общем, поправьте, если что.
Свернуть ↑
writeC(0x32);
writeD(_activeChar.getObjectId());
writeD(_initSize);
writeH(23);
writeC(_masks);
writeC(_masks);
writeC(_masks);
writeD(_relation);
writeH(16 + (_activeChar.getName().length() * 2));
writeH(nameLength);
writeCutS(_activeChar.getName());
writeC(_activeChar.isGM() ? 0x01 : 0x00);
writeC(_activeChar.getRace().ordinal());
writeC(_activeChar.getAppearance().getSex() ? 0x01 : 0x00);
writeD(_activeChar.getBaseClass());
writeD(_activeChar.getClassId().getId());
writeC(_activeChar.getLevel());
writeH(18);
writeH(_activeChar.getSTR());
writeH(_activeChar.getDEX());
writeH(_activeChar.getCON());
writeH(_activeChar.getINT());
writeH(_activeChar.getWIT());
writeH(_activeChar.getMEN());
writeH(_activeChar.getLUC());
writeH(_activeChar.getCHA());
writeH(14);
writeD(_activeChar.getMaxHp());
writeD(_activeChar.getMaxMp());
writeD(_activeChar.getMaxCp());
writeH(38);
writeD((int) Math.round(_activeChar.getCurrentHp()));
writeD((int) Math.round(_activeChar.getCurrentMp()));
writeD((int) Math.round(_activeChar.getCurrentCp()));
writeQ(_activeChar.getSp());
writeQ(_activeChar.getExp());
writeF((float) (_activeChar.getExp() - ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel())) / (ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel() + 1) - ExperienceData.getInstance().getExpForLevel(_activeChar.getLevel())));
writeH(4);
writeC(_enchantLevel);
writeC(_armorEnchant);
writeH(15);
writeD(_activeChar.getVisualHair());
writeD(_activeChar.getVisualHairColor());
writeD(_activeChar.getVisualFace());
writeC(_activeChar.isHairAccessoryEnabled() ? 0x01 : 0x00);
writeH(6);
writeC(_activeChar.getMountType().ordinal());
writeC(_activeChar.getPrivateStoreType().getId());
writeC(_activeChar.hasDwarvenCraft() ? 1 : 0);
writeC(_activeChar.getAbilityPointsUsed());
writeH(56);
writeH(_activeChar.getActiveWeaponItem() != null ? 40 : 20);
writeD(_activeChar.getPAtk(null));
writeD(_activeChar.getPAtkSpd());
writeD(_activeChar.getPDef(null));
writeD(_activeChar.getEvasionRate(null));
writeD(_activeChar.getAccuracy());
writeD(_activeChar.getCriticalHit(null, null));
writeD(_activeChar.getMAtk(null, null));
writeD(_activeChar.getMAtkSpd());
writeD(_activeChar.getPAtkSpd()); // Seems like atk speed - 1
writeD(_activeChar.getMagicEvasionRate(null));
writeD(_activeChar.getMDef(null, null));
writeD(_activeChar.getMagicAccuracy());
writeD(_activeChar.getMCriticalHit(null, null));
writeH(14);
writeH(_activeChar.getDefenseElementValue(Elementals.FIRE));
writeH(_activeChar.getDefenseElementValue(Elementals.WATER));
writeH(_activeChar.getDefenseElementValue(Elementals.WIND));
writeH(_activeChar.getDefenseElementValue(Elementals.EARTH));
writeH(_activeChar.getDefenseElementValue(Elementals.HOLY));
writeH(_activeChar.getDefenseElementValue(Elementals.DARK));
writeH(18);
writeD(_activeChar.getX());
writeD(_activeChar.getY());
writeD(_activeChar.getZ());
writeD(_activeChar.isInVehicle() ? _activeChar.getVehicle().getObjectId() : 0);
writeH(18);
writeH(_runSpd);
writeH(_walkSpd);
writeH(_swimRunSpd);
writeH(_swimWalkSpd);
writeH(_flRunSpd);
writeH(_flWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
writeH(18);
writeF(_moveMultiplier);
writeF(_activeChar.getAttackSpeedMultiplier());
writeH(18);
writeF(_activeChar.getCollisionRadius());
writeF(_activeChar.getCollisionHeight());
writeH(5);
writeC(attackAttribute);
writeH(_activeChar.getAttackElementValue(attackAttribute));
writeH(32 + (_title.length() * 2));
writeH(titleLength);
writeCutS(_title);
writeH(_activeChar.getPledgeType());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestLargeId());
writeD(_activeChar.getClanCrestId());
writeC(_activeChar.isClanLeader() ? -1 : 0x00);
writeD(_activeChar.getClanPrivileges().getBitmask());
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId());
writeC(_activeChar.isInPartyMatchRoom() ? 0x01 : 0x00);
writeH(22);
writeC(_activeChar.getPvpFlag());
writeD(_activeChar.getReputation());
writeC(_activeChar.isNoble() ? 0x01 : 0x00);
writeC(_activeChar.isHero() ? 0x01 : 0x00);
writeC(_activeChar.getPledgeClass());
writeD(_activeChar.getPkKills());
writeD(_activeChar.getPvpKills());
writeD(_activeChar.getRecomLeft());
writeH(15);
writeD(_activeChar.getVitalityPoints());
writeC(0x00); // Vita Bonus
writeD(_activeChar.getFame());
writeD(RaidBossPointsManager.getInstance().getPointsByOwnerId(_activeChar.getObjectId()));
writeH(9);
writeC(_activeChar.getInventory().getTalismanSlots()); // Confirmed
writeC(_activeChar.getInventory().getBroochJewelSlots()); // Confirmed
writeC(_activeChar.getTeam().getId()); // Confirmed
writeC(0x00); // (1 = Red, 2 = White, 3 = White Pink) dotted ring on the floor
writeC(0x00);
writeC(0x00);
writeC(0x00);
writeH(4);
writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
writeC(_activeChar.isRunning() ? 0x01 : 0x00);
writeH(10);
writeD(_activeChar.getAppearance().getNameColor());
writeD(_activeChar.getAppearance().getTitleColor());
writeH(9);
writeH(0x00);
writeH(0x00);
writeH(_activeChar.getInventoryLimit());
writeC(0x00); // if greater than 1 show the attack cursor when interacting
writeH(9);
writeC(0x00);
writeH(0x00);
writeD(0x00);Code: Java
Свернуть ↑Развернуть ↓
Добавлено через 17 часов 56 минут
Вот структура, взятая опираясь на снифф с евро
Свернуть ↑
writeC(0x09);
int _size = _characterPackages.size();
writeD(_size);
writeD(Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT);
writeC(_size == Config.MAX_CHARACTERS_NUMBER_PER_ACCOUNT ? 0x01 : 0x00);
writeC(0x02);
writeD(0x00);
writeC(0x00);
for (int i = 0; i < _size; i++)
{
writeS(charInfoPackage.getName());
writeD(charInfoPackage.getObjectId());
writeS(_loginName);
writeD(_sessionId);
writeD(0x00);
writeD(0x00);
writeD(charInfoPackage.getSex());
writeD(charInfoPackage.getRace());
writeD(charInfoPackage.getClassId());
writeD(0x11); //??
writeD(charInfoPackage.getX());
writeD(charInfoPackage.getY());
writeD(charInfoPackage.getZ());
writeF(charInfoPackage.getCurrentHp());
writeF(charInfoPackage.getCurrentMp());
writeQ(charInfoPackage.getSp());
writeQ(charInfoPackage.getExp());
writeF((float) (charInfoPackage.getExp() - ExperienceData.getInstance().getExpForLevel(charInfoPackage.getLevel())) / (ExperienceData.getInstance().getExpForLevel(charInfoPackage.getLevel() + 1) - ExperienceData.getInstance().getExpForLevel(charInfoPackage.getLevel()))); // High Five
writeD(charInfoPackage.getLevel());
writeD(charInfoPackage.getKarma() > 0 ? charInfoPackage.getKarma() * -1 : charInfoPackage.getReputation());
writeD(charInfoPackage.getPkKills());
writeD(charInfoPackage.getPvPKills());
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeD(charInfoPackage.getPaperdollItemVisualId(slot));
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeH(0x00);
writeD(charInfoPackage.getHairStyle());
writeD(charInfoPackage.getHairColor());
writeD(charInfoPackage.getFace());
writeF(charInfoPackage.getMaxHp());
writeF(charInfoPackage.getMaxMp());
writeD(charInfoPackage.getDeleteTimer() > 0 ? (int) ((charInfoPackage.getDeleteTimer() - System.currentTimeMillis()) / 1000) : 0);
writeD(charInfoPackage.getClassId());
writeD(i == _activeId ? 1 : 0);
writeC(charInfoPackage.getEnchantEffect() > 127 ? 127 : charInfoPackage.getEnchantEffect());
writeD(charInfoPackage.getAugmentationId());
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeF(0x00);
writeF(0x00);
writeD(charInfoPackage.getVitalityPoints());
writeD(200); //??? - vitality what
writeD(_vitalityItems);
writeD(1); //?? - maybe access type
writeC(0x00); //???
writeC(Hero.getInstance().isHero(charInfoPackage.getObjectId()) ? 0x01 : 0x00);
writeC(charInfoPackage.isHairAccessoryEnabled() ? 0x01 : 0x00);
}Code: Java
Свернуть ↑Развернуть ↓
В HEX виде:
Свернуть ↑
Код:
09 01 00 00 00 07 00 00 00 00 02 00 00 00 00 00 47 00 68 00 30 00 75 00 4C 00 00 00 20 C7 0D 00 5F 00 33 00 35 00 30 00 32 00 39 00 32 00 32 00 00 00 4A 73 35 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 11 00 00 00 38 42 02 00 0F 28 FF FF 58 F5 FF FF 43 65 F7 13 FB 04 B8 40 E5 A7 6B 3E 4A 41 A0 40 C6 92 00 00 00 00 00 00 BD DA DC 10 00 00 00 00 88 B6 EA FA 1D 52 D6 3F 42 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 76 3A 00 00 76 3A 00 00 77 3A 00 00 78 3A 00 00 78 3A 00 00 83 3A 00 00 C0 3A 00 00 FD 7D 00 00 96 3A 00 00 94 3A 00 00 95 3A 00 00 97 3A 00 00 00 00 00 00 C0 3A 00 00 C7 87 00 00 00 00 00 00 00 00 00 00 B1 56 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 46 36 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 43 65 F7 13 FB 04 B8 40 E5 A7 6B 3E 4A 41 A0 40 00 00 00 00 09 00 00 00 01 00 00 00 04 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 C8 00 00 00 E7 03 00 00 01 00 00 00 00 00 00
Свернуть ↑Развернуть ↓
Добавлено через 18 часов 9 минут
Свернуть ↑
writeC(0x31);
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_vehicleId);
writeD(_objId);
writeS(_activeChar.getAppearance().getVisibleName());
writeH(_activeChar.getRace().ordinal());
writeC(_activeChar.getAppearance().getSex() ? 0x01 : 0x00);
writeD(_activeChar.getBaseClass());
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollItemDisplayId(slot));
writeD(_activeChar.getInventory().getPaperdollAugmentationId(slot));
writeD(_activeChar.getInventory().getPaperdollAugmentationId(slot));
writeD(_activeChar.getInventory().getPaperdollAugmentationId(slot));
writeD(0x00);
writeD(0x00);
writeD(0x00);
writeC(_armorEnchant);
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeD(_activeChar.getInventory().getPaperdollItemVisualId(slot));
writeC(_activeChar.getPvpFlag());
writeD(_activeChar.getKarma());
writeD(_mAtkSpd);
writeD(_pAtkSpd);
writeH(_runSpd);
writeH(_walkSpd);
writeH(_swimRunSpd);
writeH(_swimWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
writeH(_flyRunSpd);
writeH(_flyWalkSpd);
writeF(_moveMultiplier);
writeF(_attackSpeedMultiplier);
writeF(_activeChar.getCollisionRadius());
writeF(_activeChar.getCollisionHeight());
writeD(_activeChar.getVisualHair());
writeD(_activeChar.getVisualHairColor());
writeD(_activeChar.getVisualFace());
writeS(gmSeeInvis ? "[Invisible]" : _activeChar.getAppearance().getVisibleTitle());
writeD(_activeChar.getClanId());
writeD(_activeChar.getClanCrestId());
writeD(_activeChar.getAllyId());
writeD(_activeChar.getAllyCrestId());
writeC(_activeChar.isSitting() ? 0x00 : 0x01);
writeC(_activeChar.isRunning() ? 0x01 : 0x00);
writeC(_activeChar.isInCombat() ? 0x01 : 0x00);
writeC(!_activeChar.isInOlympiadMode() && _activeChar.isAlikeDead() ? 0x01 : 0x00);
writeC(!gmSeeInvis && isInvisible() ? 0x01 : 0x00);
writeC(_activeChar.getMountType().ordinal());
writeC(_activeChar.getPrivateStoreType().getId());
short cubicSize = _activeChar.getCubics().size();
writeH(cubicSize);
for (short i=0;i<cubicSize;i++)
{
writeH(_cubicId);
}
writeC(_activeChar.isInPartyMatchRoom() ? 0x01 : 0x00);
writeC(_activeChar.isInsideZone(ZoneId.WATER) ? 1 : _activeChar.isFlyingMounted() ? 2 : 0);
writeH(_activeChar.getRecomHave());
writeD(_activeChar.getMountNpcId() == 0 ? 0 : _activeChar.getMountNpcId() + 1000000);
writeD(_activeChar.getClassId().getId());
writeD(0x00);
writeC(_activeChar.isMounted() ? 0 : _enchantLevel);
writeC(_activeChar.getTeam().getId());
writeD(_activeChar.getClanCrestLargeId());
writeC(_activeChar.isNoble() ? 1 : 0);
writeC(_activeChar.isHero() || (_activeChar.isGM() && Config.GM_HERO_AURA) ? 1 : 0);
writeC(_activeChar.isFishing() ? 1 : 0);
writeD(_activeChar.getFishx());
writeD(_activeChar.getFishy());
writeD(_activeChar.getFishz());
writeD(_activeChar.getAppearance().getNameColor());
writeD(_heading);
writeC(_activeChar.getPledgeClass());
writeH(_activeChar.getPledgeType());
writeD(_activeChar.getAppearance().getTitleColor());
writeC(_activeChar.isCursedWeaponEquipped() ? CursedWeaponsManager.getInstance().getLevel(_activeChar.getCursedWeaponEquippedId()) : 0);
writeD(_activeChar.getClanId() > 0 ? _activeChar.getClan().getReputationScore() : 0);
writeD(_activeChar.getTransformationDisplayId());
writeD(_activeChar.getAgathionId());
writeC(0x01);
writeD((int) Math.round(_activeChar.getCurrentCp()));
writeD(_activeChar.getMaxHp());
writeD((int) Math.round(_activeChar.getCurrentHp()));
writeD(_activeChar.getMaxMp());
writeD((int) Math.round(_activeChar.getCurrentMp()));
writeC(0x00);
int abnormalSize = abnormalVisualEffects.size();
writeD(abnormalSize);
for (int i=0;i<abnormalSize;i++)
{
writeH(abnormalVisualEffect.getClientId());
}
writeC(0x00);
writeC(_activeChar.isHairAccessoryEnabled() ? 0x01 : 0x00);
writeC(_activeChar.getAbilityPointsUsed());Code: Java
Свернуть ↑Развернуть ↓