Сообщений: 106
Тем: 3
Зарегистрирован: Jun 2014
08-06-2014, 12:40 AM
(Сообщение последний раз редактировалось: 08-06-2014, 01:46 AM TonsFun.)
полностью разобранный и 100% рабочий пакет CharSelectionInfo(603 протокол)
Код: writeD(size);
writeD(0x07); // Максимальное количество персонажей на сервере
writeC(0x00); // 0x00 - Разрешить, 0x01 - запретить. Разрешает или запрещает создание игроков
writeC(0x00);
writeD(0x02); // 0x01 - Выводит окно, что нужно купить игру, что создавать более 2х чаров. 0х02 - обычное лобби.
writeC(0x00); // 0x01 - Предлогает купить ПА.
long lastAccess = 0;
int lastUsed = -1;
for (CharSelectInfoPackage info : charSelectionInfo)
if (lastAccess < info.getLastAccess())
lastAccess = info.getLastAccess();
int i = 0;
for (CharSelectInfoPackage charInfoPackage : charSelectionInfo)
{
writeS(charInfoPackage.getName());
writeD(charInfoPackage.getCharId());
writeS(_loginName);
writeD(_sessionId);
writeD(charInfoPackage.getClanId());
writeD(0x00);
writeD(charInfoPackage.getSex());
writeD(charInfoPackage.getRace());
writeD(charInfoPackage.getBaseClassId());
writeD(0x01);
writeD(charInfoPackage.getX());
writeD(charInfoPackage.getY());
writeD(charInfoPackage.getZ());
writeF(charInfoPackage.getCurrentHp());
writeF(charInfoPackage.getCurrentMp());
writeQ(charInfoPackage.getSp());
writeQ(charInfoPackage.getExp());
int lvl = charInfoPackage.getLevel();
writeF(Experience.getExpPercent(lvl, charInfoPackage.getExp()));
writeD(lvl);
writeD(charInfoPackage.getKarma());
writeD(charInfoPackage.getPk());
writeD(charInfoPackage.getPvP());
for (int j = 0; j < 14; j++)
{
writeD(0x00);
}
writeD(0x32); // unk Ertheia
writeD(0x56); // unk Ertheia
for (int PAPERDOLL_ID : Inventory.PAPERDOLL_ORDER)
{
writeD(charInfoPackage.getPaperdollItemId(PAPERDOLL_ID));
}
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_RHAND));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_LHAND));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_GLOVES));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_CHEST));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_LEGS));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_FEET));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_BACK));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_HAIR));
writeD(charInfoPackage.getVisualItemId(Inventory.PAPERDOLL_DHAIR));
writeH(0x00); // unk Episodion
writeH(0x00); // unk Episodion
writeH(0x00); // unk Episodion
writeH(0x00); // unk Episodion
writeH(0x01); // unk Episodion
writeD(charInfoPackage.getHairStyle());
writeD(charInfoPackage.getHairColor());
writeD(charInfoPackage.getFace());
writeF(charInfoPackage.getMaxHp()); // hp max
writeF(charInfoPackage.getMaxMp()); // mp max
writeD(charInfoPackage.getAccessLevel() > -100 ? charInfoPackage.getDeleteTimer() : -1);
writeD(charInfoPackage.getClassId());
writeD(i == lastUsed ? 1 : 0);
writeC(Math.min(charInfoPackage.getPaperdollEnchantEffect(Inventory.PAPERDOLL_RHAND), 127));
writeH(charInfoPackage.getPaperdollAugmentationId(Inventory.PAPERDOLL_RHAND));
writeH(charInfoPackage.getPaperdollAugmentation2Id(Inventory.PAPERDOLL_RHAND));
int weaponId = charInfoPackage.getPaperdollItemId(Inventory.PAPERDOLL_RHAND);
if (weaponId == 8190)
{
writeD(301);
}
else if (weaponId == 8689)
{
writeD(302);
}
else
{
writeD(0x00);
}
for (int j = 0; j < 4; j++)
{
writeD(0x00);
}
for (int j = 0; j < 2; j++)
{
writeF(0x00);
}
writeD(charSelectionInfo.getVitalityPoints());
writeD(200); // Vitality percent
writeD(5); // Vitaliti items count
writeD(charInfoPackage.getAccessLevel() > -100 ? 0x01 : 0x00);
for (int j = 0; j < 3; j++)
{
writeC(0x00);
}
Сообщений: 466
Тем: 10
Зарегистрирован: Dec 2012
Репутация:
398
silvermain Написал:
ммм, в дампе после 575 протокола я не встретил ни одной строчки Substitute, подскажите и мне плиз+)
Его убрали.
Сообщений: 106
Тем: 3
Зарегистрирован: Jun 2014
08-06-2014, 04:28 PM
(Сообщение последний раз редактировалось: 08-06-2014, 06:46 PM TonsFun.)
Warencense Написал:Его убрали.
а что собсно случилось с полоской бафов? опкод или же структура пакета AbnormalStatusUpdate???
Сообщений: 122
Тем: 6
Зарегистрирован: Sep 2013
Репутация:
112
TonsFun Написал:а что собсно случилось с полоской бафов? опкод или же структура пакета AbnormalStatusUpdate???
ихзменилась структура
Сообщений: 106
Тем: 3
Зарегистрирован: Jun 2014
VenomRaider Написал:ихзменилась структура
вы не могли бы заделиться структурой? Ибо смотрю я дампы, а там про этот пакет пусто
Сообщений: 202
Тем: 2
Зарегистрирован: Jun 2008
Репутация:
783
TonsFun Написал:вы не могли бы заделиться структурой? Ибо смотрю я дампы, а там про этот пакет пусто
Код: writeH(_effects.size());
for(Effect temp : _effects)
{
writeD(temp.skillId);
writeH(temp.dat);
writeD(0x00); // UNK Ertheia
writeH(temp.duration);
}
Сообщений: 106
Тем: 3
Зарегистрирован: Jun 2014
Bonux Написал:Код: writeH(_effects.size());
for(Effect temp : _effects)
{
writeD(temp.skillId);
writeH(temp.dat);
writeD(0x00); // UNK Ertheia
writeH(temp.duration);
}
Спасибо, но один хрен, та же структура, и фактически половину не отображает((
Пы.Сы. ушел копать дальше
Сообщений: 202
Тем: 2
Зарегистрирован: Jun 2008
Репутация:
783
Разобранный блок ItemInfo.
Код: private static final int IS_AUGMENTED = 1 << 0;
private static final int IS_ELEMENTED = 1 << 1;
private static final int HAVE_ENCHANT_OPTIONS = 1 << 2;
private static final int VISUAL_CHANGED = 1 << 3;
protected void writeItemInfo(Player player, ItemInstance item, long count)
{
int flags = 0;
if(item.isAugmented())
flags |= IS_AUGMENTED;
if(item.getAttributeElementValue() > 0)
flags |= IS_ELEMENTED;
for(int enchantOption : item.getEnchantOptions())
{
if(enchantOption > 0)
{
flags |= HAVE_ENCHANT_OPTIONS;
break;
}
}
if(item.getVisualId() > 0)
flags |= VISUAL_CHANGED;
writeC(flags);
writeD(item.getObjectId());
writeD(item.getItemId());
writeC(item.getEquipSlot());
writeQ(count);
writeC(item.getTemplate().getType2ForPackets());
writeC(item.getCustomType1());
writeC(item.isEquipped() ? 1 : 0);
writeC(item.getCustomType2());
writeQ(item.getBodyPart());
writeH(item.getEnchantLevel());
writeD(item.getShadowLifeTime());
writeD(item.getTemporalLifeTime());
if(player != null)
writeC(!item.getTemplate().isBlocked(player, item));
else
writeC(0x01);
if((flags & IS_AUGMENTED) == IS_AUGMENTED)
{
writeH(item.getVariation1Id());
writeH(item.getVariation2Id());
}
if((flags & IS_ELEMENTED) == IS_ELEMENTED)
{
writeH(item.getAttackElement().getId());
writeH(item.getAttackElementValue());
writeH(item.getDefenceFire());
writeH(item.getDefenceWater());
writeH(item.getDefenceWind());
writeH(item.getDefenceEarth());
writeH(item.getDefenceHoly());
writeH(item.getDefenceUnholy());
}
if((flags & HAVE_ENCHANT_OPTIONS) == HAVE_ENCHANT_OPTIONS)
{
writeH(item.getEnchantOptions()[0]);
writeH(item.getEnchantOptions()[1]);
writeH(item.getEnchantOptions()[2]);
}
if((flags & VISUAL_CHANGED) == VISUAL_CHANGED)
writeD(item.getVisualId());
}
P.S. Кто может подсказать, в каком пакете указывается время действия визуального изменения предмета?
Сообщений: 106
Тем: 3
Зарегистрирован: Jun 2014
08-08-2014, 03:05 PM
(Сообщение последний раз редактировалось: 08-08-2014, 09:53 PM TonsFun.)
NpcInfo - под L2j
Код: public abstract class AbstractNpcInfo extends L2GameServerPacket
{
protected int _x, _y, _z, _heading;
protected int _idTemplate;
protected boolean _isAttackable, _isSummoned;
protected int _mAtkSpd, _pAtkSpd;
protected final int _runSpd, _walkSpd;
protected final int _swimRunSpd, _swimWalkSpd;
protected final int _flyRunSpd, _flyWalkSpd;
protected double _moveMultiplier;
protected int _rhand, _lhand, _chest, _enchantEffect;
protected double _collisionHeight, _collisionRadius;
protected String _name = "";
protected String _title = "";
public AbstractNpcInfo(L2Character cha)
{
_isSummoned = cha.isShowSummonAnimation();
_x = cha.getX();
_y = cha.getY();
_z = cha.getZ();
_heading = cha.getHeading();
_mAtkSpd = cha.getMAtkSpd();
_pAtkSpd = cha.getPAtkSpd();
_moveMultiplier = cha.getMovementSpeedMultiplier();
_runSpd = (int) Math.round(cha.getRunSpeed() / _moveMultiplier);
_walkSpd = (int) Math.round(cha.getWalkSpeed() / _moveMultiplier);
_swimRunSpd = (int) Math.round(cha.getSwimRunSpeed() / _moveMultiplier);
_swimWalkSpd = (int) Math.round(cha.getSwimWalkSpeed() / _moveMultiplier);
_flyRunSpd = cha.isFlying() ? _runSpd : 0;
_flyWalkSpd = cha.isFlying() ? _walkSpd : 0;
}
/**
* Packet for Npcs
*/
public static class NpcInfo extends AbstractNpcInfo
{
private final L2Npc _npc;
private int _clanCrest = 0;
private int _allyCrest = 0;
private int _allyId = 0;
private int _clanId = 0;
private int _displayEffect = 0;
public NpcInfo(L2Npc cha, L2Character attacker)
{
super(cha);
_npc = cha;
_idTemplate = cha.getTemplate().getDisplayId(); // On every subclass
_rhand = cha.getRightHandItem(); // On every subclass
_lhand = cha.getLeftHandItem(); // On every subclass
_enchantEffect = cha.getEnchantEffect();
_collisionHeight = cha.getCollisionHeight();// On every subclass
_collisionRadius = cha.getCollisionRadius();// On every subclass
_isAttackable = cha.isAutoAttackable(attacker);
if (cha.getTemplate().isUsingServerSideName())
{
_name = cha.getName();// On every subclass
}
if (_npc.isInvisible())
{
_title = "Invisible";
}
else if (Config.L2JMOD_CHAMPION_ENABLE && cha.isChampion())
{
/* MessageTable
_title = (Config.L2JMOD_CHAMP_TITLE); // On every subclass
*/
_title = MessageTable.Messages[1926].getMessage(); // On every subclass
}
else if (cha.getTemplate().isUsingServerSideTitle())
{
_title = cha.getTemplate().getTitle(); // On every subclass
}
else
{
_title = cha.getTitle(); // On every subclass
}
if (Config.SHOW_NPC_LVL && (_npc instanceof L2MonsterInstance))
{
/* MessageTable
String t = "Lv " + cha.getLevel() + (cha.isAggressive() ? "*" : "");
*/
String t = MessageTable.Messages[211].getExtra(1) + cha.getLevel() + (cha.isAggressive() ? MessageTable.Messages[211].getExtra(2) : "");
if (_title != null)
{
t += " " + _title;
}
_title = t;
}
// npc crest of owning clan/ally of castle
if ((cha instanceof L2NpcInstance) && cha.isInsideZone(ZoneId.TOWN) && (Config.SHOW_CREST_WITHOUT_QUEST || cha.getCastle().getShowNpcCrest()) && (cha.getCastle().getOwnerId() != 0))
{
int townId = TownManager.getTown(_x, _y, _z).getTownId();
if ((townId != 33) && (townId != 22))
{
L2Clan clan = ClanTable.getInstance().getClan(cha.getCastle().getOwnerId());
_clanCrest = clan.getCrestId();
_clanId = clan.getId();
_allyCrest = clan.getAllyCrestId();
_allyId = clan.getAllyId();
}
}
_displayEffect = cha.getDisplayEffect();
}
@Override
protected void writeImpl()
{
writeC(0x0C);
writeD(_npc.getObjectId());
writeC(0x00);
writeC(0x25);
writeC(0x00);
writeC(0xED);
if (_rhand > 0 || _chest > 0 || _lhand > 0)
writeC(0xFE);
else
writeC(0xBE);
writeC(0x4E);
writeC(0xA2);
writeC(0x0C);
int len_npc_title = 0; // 603
if (_title != null)
len_npc_title = _title.length(); // 603
writeC(7 + len_npc_title*2); // 603
writeC(_isAttackable ? 1 : 0);
writeH(0);
writeH(0);
writeS(_title);
if (_rhand > 0 || _chest > 0 || _lhand > 0)
writeH(68);
else
writeH(56);
writeD(_idTemplate + 1000000); // npctype id
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
writeD(_mAtkSpd);
writeD(_pAtkSpd);
putFloat((float)_moveMultiplier);
putFloat(_npc.getAttackSpeedMultiplier());
if (_rhand > 0 || _chest > 0 || _lhand > 0)
{
writeD(_rhand);
writeD(_chest);
writeD(_lhand);
}
writeC(1);
writeC(_npc.isRunning() ? 1 : 0);
writeC(_npc.isInsideZone(ZoneId.WATER) ? 1 : _npc.isFlying() ? 2 : 0); // C2
writeD(_npc.isFlying() ? 1 : 0); // C6
writeC(0);
writeC(0);
writeH(0);
writeD((int)_npc.getCurrentHp());
writeD(_npc.getMaxHp());
writeC(
(_npc.isInCombat() ? 1 : 0) +
(_npc.isAlikeDead() ? 2 : 0) +
(_npc.isTargetable() ? 4 : 0) +
(_npc.isShowName() ? 8 : 0));
java.util.List<Integer> el = _npc.getEffectIdList();
if (_npc.isInvisible() && !el.contains(21))
el.add(21);
writeH(el.size());
for(int i : el)
{
writeH(i);
}
}
}
public static class TrapInfo extends AbstractNpcInfo
{
private final L2TrapInstance _trap;
public TrapInfo(L2TrapInstance cha, L2Character attacker)
{
super(cha);
_trap = cha;
_idTemplate = cha.getTemplate().getDisplayId();
_isAttackable = cha.isAutoAttackable(attacker);
_rhand = 0;
_lhand = 0;
_collisionHeight = _trap.getTemplate().getfCollisionHeight();
_collisionRadius = _trap.getTemplate().getfCollisionRadius();
if (cha.getTemplate().isUsingServerSideName())
{
_name = cha.getName();
}
_title = cha.getOwner() != null ? cha.getOwner().getName() : "";
}
@Override
protected void writeImpl()
{
writeC(0x0C);
writeD(_trap.getObjectId());
writeC(0x00);
writeC(0x25);
writeC(0x00);
writeC(0xED);
writeC(0xBE);
writeC(0x4E);
writeC(0xA2);
writeC(0x0C);
int len_trap_title = 0; // 603
if (_title != null)
len_trap_title = _title.length(); // 603
writeC(7 + len_trap_title*2); // 603
writeC(_isAttackable ? 1 : 0);
writeH(0);
writeH(0);
writeS(_title);
writeH(56);
writeD(_idTemplate + 1000000); // npctype id
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
writeD(_mAtkSpd);
writeD(_pAtkSpd);
putFloat((float)_moveMultiplier);
putFloat(_trap.getAttackSpeedMultiplier());
writeC(1);
writeC(1);
writeC(0);
writeD(0);
writeC(0);
writeC(0);
writeH(0);
writeD((int)_trap.getCurrentHp());
writeD(_trap.getMaxHp());
writeC(
(_trap.isInCombat() ? 1 : 0) +
(_trap.isAlikeDead() ? 2 : 0) +
(_trap.isTargetable() ? 4 : 0) +
8);
java.util.List<Integer> el = _trap.getEffectIdList();
if (_trap.isInvisible() && !el.contains(21))
el.add(21);
writeH(el.size());
for(int i : el)
{
writeH(i);
}
}
}
/**
* Packet for summons.
*/
public static class SummonInfo extends AbstractNpcInfo
{
private final L2Summon _summon;
private final int _form;
private final int _val;
public SummonInfo(L2Summon cha, L2Character attacker, int val)
{
super(cha);
_summon = cha;
_val = val;
_form = cha.getFormId();
_isAttackable = cha.isAutoAttackable(attacker);
_rhand = cha.getWeapon();
_lhand = 0;
_chest = cha.getArmor();
_enchantEffect = cha.getTemplate().getWeaponEnchant();
_name = cha.getName();
_title = (cha.getOwner() != null) && cha.getOwner().isOnline() ? cha.getOwner().getName() : "";
_idTemplate = cha.getTemplate().getDisplayId();
_collisionHeight = cha.getTemplate().getfCollisionHeight();
_collisionRadius = cha.getTemplate().getfCollisionRadius();
_invisible = cha.isInvisible();
}
@Override
protected void writeImpl()
{
boolean gmSeeInvis = false;
if (_invisible)
{
final L2PcInstance activeChar = getClient().getActiveChar();
if ((activeChar != null) && activeChar.canOverrideCond(PcCondOverride.SEE_ALL_PLAYERS))
{
gmSeeInvis = true;
}
}
if (_summon.getSummonType() == 2)
{
writeC(0xFE);
writeH(0x15E);
}
else if (_summon.getSummonType() == 1)
{
writeC(0x8B);
}
else
{
_log.warning("unknow pet/summer");
return;
}
writeD(_summon.getObjectId());
if (_val != 2)
writeC(0); // 603-TEST // 0=teleported 1=default 2=summoned
else
writeC(_val); // 0=teleported 1=default 2=summoned
writeC(0x25);
writeC(_isAttackable ? 1 : 0);
if (_summon.getSummonType() == 2)
{
writeC(0xFD);
writeC(0xBF);
writeC(0x5F);
writeC(0xF3);
writeC(0xEC);
}
else if (_summon.getSummonType() == 1)
{
writeC(0xED);
writeC(0xBF);
writeC(0x4F);
writeC(0x02);
writeC(0x6C);
}
int len_npc_title = 0; // 603
if (_title != null)
len_npc_title = _title.length(); // 603
writeC(7 + len_npc_title*2); // 603
writeC(0x00);
writeC(0x00);
writeC(0x00);
writeC(0x00);
writeC(0x00);
writeS(_title);
int len_npc_name = 0; // 603
if (_name != null)
len_npc_name = _name.length(); // 603
if (_summon.getSummonType() == 2)
writeH(88 + len_npc_name*2);
else if (_summon.getSummonType() == 1)
writeH(58);
writeD(_idTemplate + 1000000); // npctype id
writeD(_x);
writeD(_y);
writeD(_z);
writeD(_heading);
writeD(_mAtkSpd);
writeD(_pAtkSpd);
putFloat((float)_moveMultiplier);
putFloat(_summon.getAttackSpeedMultiplier());
writeC(1);
writeC(_summon.isRunning() ? 1 : 0);
if (_summon.getSummonType() == 2)
writeD(0x00);
writeH(0x00);
writeH(_form);
writeD(0x00);
writeD(0x00);
writeH(0x00);
if (_summon.getSummonType() == 2)
{
writeD((int)_summon.getCurrentHp());
writeD((int)_summon.getCurrentMp());
writeD(_summon.getMaxHp());
writeD(_summon.getMaxMp());
writeS(_name);
writeD(-1);
writeD(-1);
}
writeC(_summon.getPvpFlag());
int Karma = 0 - _summon.getKarma();
writeD(Karma);
writeC(
(_summon.isInCombat() ? 1 : 0) +
(_summon.isAlikeDead() ? 2 : 0) +
(_summon.isTargetable() ? 4 : 0) +
8 );
java.util.List<Integer> el = _summon.getEffectIdList();
if (gmSeeInvis && !el.contains(21))
el.add(21);
writeH(el.size());
for(int i : el)
{
writeH(i);
}
}
}
}
Сообщений: 106
Тем: 3
Зарегистрирован: Jun 2014
08-09-2014, 04:22 PM
(Сообщение последний раз редактировалось: 08-09-2014, 05:08 PM TonsFun.)
L2j информация об инвентаре 603 протокол
Код: protected void writeItem(ItemInfo item)
{
int check_Augmentation = 0;
check_ElementType = 0;
check_EnchantOption = 0;
if (item.getAugmentationBonus() > 0)
{
check_Augmentation = 1;
}
if (item.getAttackElementPower() > 0)
{
check_ElementType = 2;
}
else
{
for (byte i = 0; i < 6; i++)
{
if (item.getElementDefAttr(i) > 0)
{
check_ElementType = 2;
}
}
}
for (int op : item.getEnchantOptions())
{
if (op > 0)
{
check_EnchantOption = 4;
}
}
writeC(check_Augmentation + check_ElementType + check_EnchantOption + 0);
writeD(item.getObjectId()); // ObjectId
writeD(item.getItem().getDisplayId()); // ItemId
writeC(item.getLocation()); // 603
writeQ(item.getCount()); // Quantity
writeC(item.getItem().getType2()); // 603 // Item Type 2 : 00-weapon, 01-shield/armor, 02-ring/earring/necklace, 03-questitem, 04-adena, 05-item
writeC(item.getCustomType1()); // 603 Filler (always 0)
writeH(item.getEquipped()); // Equipped : 00-No, 01-yes
writeQ(item.getItem().getBodyPart()); // 603 // Slot : 0006-lr.ear, 0008-neck, 0030-lr.finger, 0040-head, 0100-l.hand, 0200-gloves, 0400-chest, 0800-pants, 1000-feet, 4000-r.hand, 8000-r.hand
writeC(item.getEnchant()); // 603 // Enchant level (pet level shown in control item)
writeC(item.getCustomType2()); // 603 // Pet name exists or not shown in control item
writeD(item.getMana());
writeD(item.getTime());
writeC(0x01); // 603
if (check_Augmentation > 0) // 603
{
writeD(item.getAugmentationBonus());
}
writeItemElementalAndEnchant(item);
}
protected void writeItemElementalAndEnchant(ItemInfo item)
{
if (check_ElementType > 0) // 603
{
writeH(item.getAttackElementType());
writeH(item.getAttackElementPower());
for (byte i = 0; i < 6; i++)
{
writeH(item.getElementDefAttr(i));
}
}
if (check_EnchantOption > 0) // 603
{
for (int op : item.getEnchantOptions())
{
writeH(op);
}
}
}
protected void writeInventoryBlock(PcInventory inventory)
{
if (inventory.hasInventoryBlock())
{
writeH(inventory.getBlockItems().length);
writeC(inventory.getBlockMode());
for (int i : inventory.getBlockItems())
{
writeD(i);
}
}
else
{
writeH(0x00);
}
}
|