Посмотрите видео ниже, чтобы узнать, как установить наш сайт в виде веб-приложения на главном экране.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
writeOpcode(ServerPacketOpcodes.S_ABNORMAL_STATUS_UPDATE);
writeH(_effects.size());
for (Abnormal temp : _effects) {
writeD(temp.skillId);
writeH(temp.skillLvl);
writeH(temp.skillSubLvl);
writeD(temp.abnormalType);
writeH(temp.duration);
}
writeOpcode(ServerPacketOpcodes.S_EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET);
writeD(_objectId);
writeH(_effects.size());
for (Abnormal temp : _effects) {
writeD(temp.skillId);
writeH(temp.skillLvl);
writeH(temp.subLevel);
writeH(temp.abnormalType);
writeH(temp.duration);
writeD(temp.effectorObjectId); // Buffer OID
}
S_ABNORMAL_STATUS_UPDATE
S_EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET
Классик и эссенс, насколько я знаю, используют одни и те же версии пакетов.
Код:writeOpcode(ServerPacketOpcodes.S_ABNORMAL_STATUS_UPDATE); writeH(_effects.size()); for (Abnormal temp : _effects) { writeD(temp.skillId); writeH(temp.skillLvl); writeH(temp.skillSubLvl); writeD(temp.abnormalType); writeH(temp.duration); }
Код:writeOpcode(ServerPacketOpcodes.S_EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET); writeD(_objectId); writeH(_effects.size()); for (Abnormal temp : _effects) { writeD(temp.skillId); writeH(temp.skillLvl); writeH(temp.subLevel); writeH(temp.abnormalType); writeH(temp.duration); writeD(temp.effectorObjectId); // Buffer OID }
Если структура верна - проверь активные эффекты, всё ли есть в датках классика
public void writeImpl(GameClient client, WritableBuffer buffer)
{
ServerPackets.ABNORMAL_STATUS_UPDATE.writeId(this, buffer);
buffer.writeShort(_effects.size());
for (BuffInfo info : _effects)
{
if ((info != null) && info.isInUse())
{
final Skill skill = info.getSkill();
buffer.writeInt(skill.getDisplayId());
buffer.writeShort(SkillUtils.convertHFSkillLevelToGOD(skill.getDisplayId(), skill.getDisplayLevel()));
buffer.writeShort(SkillUtils.convertHFSkillLevelToGODSubLevel(skill.getDisplayId(), skill.getDisplayLevel()));
buffer.writeInt(skill.getAbnormalType().getClientId());
writeOptionalInt((skill.isAura() || skill.isToggle()) ? -1 : info.getTime(), buffer);
}
}
}
public void writeImpl(GameClient client, WritableBuffer buffer)
{
ServerPackets.EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET.writeId(this, buffer);
buffer.writeInt(_creature.getObjectId());
buffer.writeShort(_effects.size());
for (BuffInfo info : _effects)
{
final Skill skill = info.getSkill();
buffer.writeInt(skill.getDisplayId());
buffer.writeShort(skill.getDisplayLevel());
buffer.writeShort(skill.getSubLevel());
buffer.writeShort(skill.getAbnormalType().getClientId());
writeOptionalInt(skill.isAura() ? -1 : info.getTime(), buffer);
buffer.writeInt(info.getEffectorObjectId());
}
}
// Model: Codex-GPT5.1 | Date: 2025-11-18 04:18:53 | Generated by agent | Task: map packet opcodes
@Override
public IServerPacketOpCode getPacketOpCode()
{
return ExServerPacketsOpCodes.S_EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET;
}
// Model: Codex-GPT5.1 | Date: 2025-11-18 04:18:53 | Generated by agent | Task: map packet opcodes
@Override
public boolean write(PacketWriter packetWriter)
{
packetWriter.writeD(_objectId);
packetWriter.writeH(_effects.size());
for(Abnormal temp : _effects)
{
packetWriter.writeD(temp.skillId);
packetWriter.writeH(temp.skillLvl);
if (ConfigServer.GAME_VERSION.getGameServerMask() != ServerType.CLASSIC.getGameServerMask())
{
packetWriter.writeH(temp.skillSubLvl);
}
packetWriter.writeH(temp.abnormalType);
writeOptionalD(packetWriter, temp.duration);
packetWriter.writeD(temp.effectorObjectId); // Buffer OID
}
return true;
}
Java:// Model: Codex-GPT5.1 | Date: 2025-11-18 04:18:53 | Generated by agent | Task: map packet opcodes @Override public IServerPacketOpCode getPacketOpCode() { return ExServerPacketsOpCodes.S_EX_ABNORMAL_STATUS_UPDATE_FROM_TARGET; } // Model: Codex-GPT5.1 | Date: 2025-11-18 04:18:53 | Generated by agent | Task: map packet opcodes @Override public boolean write(PacketWriter packetWriter) { packetWriter.writeD(_objectId); packetWriter.writeH(_effects.size()); for(Abnormal temp : _effects) { packetWriter.writeD(temp.skillId); packetWriter.writeH(temp.skillLvl); if (ConfigServer.GAME_VERSION.getGameServerMask() != ServerType.CLASSIC.getGameServerMask()) { packetWriter.writeH(temp.skillSubLvl); } packetWriter.writeH(temp.abnormalType); writeOptionalD(packetWriter, temp.duration); packetWriter.writeD(temp.effectorObjectId); // Buffer OID } return true; }
public void writeImpl(GameClient client, WritableBuffer buffer)
{
ServerPackets.ABNORMAL_STATUS_UPDATE.writeId(this, buffer);
buffer.writeShort(_effects.size());
for (BuffInfo info : _effects)
{
if ((info != null) && info.isInUse())
{
final Skill skill = info.getSkill();
buffer.writeInt(skill.getDisplayId());
buffer.writeShort(skill.getDisplayLevel());
// buffer.writeShort(skill.getSubLevel());
buffer.writeInt(skill.getAbnormalType().getClientId());
writeOptionalInt(skill.isAura() || skill.isToggle() ? -1 : info.getTime(), buffer);
}
}
}
из того что заметил, это еще в S_EX_EVENT_MATCH_SPELLED_INFO (ExEventMatchSpelledInfo) и в S_EX_OLYMPIAD_SPELLED_INFO (ExOlympiadSpelledInfoPacket).Посмотреть вложение 94674
Всё гораздо проще:
Java:public void writeImpl(GameClient client, WritableBuffer buffer) { ServerPackets.ABNORMAL_STATUS_UPDATE.writeId(this, buffer); buffer.writeShort(_effects.size()); for (BuffInfo info : _effects) { if ((info != null) && info.isInUse()) { final Skill skill = info.getSkill(); buffer.writeInt(skill.getDisplayId()); buffer.writeShort(skill.getDisplayLevel()); // buffer.writeShort(skill.getSubLevel()); buffer.writeInt(skill.getAbnormalType().getClientId()); writeOptionalInt(skill.isAura() || skill.isToggle() ? -1 : info.getTime(), buffer); } } }
Да, саблевел, глянул в сорках классика.