Обратите внимание, что данный пользователь заблокирован! Не совершайте с ним никаких сделок! Перейдите в его профиль, чтобы узнать причину блокировки.
Пакеты алхимии.
P.S. структура ExTryMixCube не точная ибо не хватает снифа для тяж камней, одно знаю точно, если в поле "type" слать 0, то появляется окошко для вывода полученный тяж камней и обычных.
P.P.S. строго не судите по реализации, формула полученных камней не точная, требуется доработка.
Автор: GenCloud
P.S. структура ExTryMixCube не точная ибо не хватает снифа для тяж камней, одно знаю точно, если в поле "type" слать 0, то появляется окошко для вывода полученный тяж камней и обычных.
P.P.S. строго не судите по реализации, формула полученных камней не точная, требуется доработка.
Код:
public class RequestAlchemyConversion extends L2GameClientPacket {
private int _skillId;
private int _skillLevel;
private int _skillUseCount;
private int _unk;
private long _resultItemCount = 0;
private long _resultFailCount = 0;
@Override
protected void readImpl()
{
_skillUseCount = readD();
_unk = readH(); //unk = 10; хз что это
_skillId = readD();
_skillLevel = readD();
readB(new byte[28]);
}
@Override
protected void runImpl()
{
L2PcInstance activeChar = getClient().getActiveChar();
L2Skill skill = SkillTable.getInstance().getInfo(_skillId, _skillLevel);
L2AlchemySkill aSkill = skill.getAlchemySkill();
L2ItemInstance invitem = null;
if (activeChar == null || activeChar.getRace() != Race.Arteas)
{
return;
}
double chance = 100;
for(int i = 0 ; i < _skillUseCount; i++)
{
List<ItemHolder> creationList = new ArrayList<>();
boolean ok = Rnd.getChance(chance);
aSkill.getProductItems().stream().filter(item -> chance > 50).forEach(item ->
{
creationList.addAll(item.getItems());
});
creationList.forEach(holder ->
activeChar.getInventory().destroyItemByItemId(ProcessType.ALCHEMY, holder.getId(), holder.getCount(), activeChar, null));
if (ok)
{
_resultItemCount = skill.getGiveItemCount() * _skillUseCount;
}
else
{
_resultFailCount++;
}
}
if (_resultItemCount > 0)
{
invitem = activeChar.getInventory().addItem(ProcessType.ALCHEMY, skill.getGiveItemId(), _resultItemCount, activeChar, null);
}
if (_resultFailCount > 0)
{
invitem = activeChar.getInventory().addItem(ProcessType.ALCHEMY, skill.getGiveItemId(), _resultFailCount, activeChar, null);
}
Код:
public class RequestAlchemyTryMixCube extends L2GameClientPacket {
private int _activeItems;
private int[] _objId;
private long[] _itemCounts;
private long _allPrice = 0;
private long _stoneCount;
private final int _stoneID = 39461;
private boolean _isActiveMegaStone = false;
@Override
protected void readImpl()
{
_activeItems = readD();
_objId = new int[5];
_itemCounts = new long[5];
switch (_activeItems)
{
case 1:
{
_objId[1] = readD();
_itemCounts[1] = readQ();
break;
}
case 2:
{
_objId[1] = readD();
_itemCounts[1] = readQ();
_objId[2] = readD();
_itemCounts[2] = readQ();
break;
}
case 3:
{
_objId[1] = readD();
_itemCounts[1] = readQ();
_objId[2] = readD();
_itemCounts[2] = readQ();
_objId[3] = readD();
_itemCounts[3] = readQ();
break;
}
case 4:
{
_objId[1] = readD();
_itemCounts[1] = readQ();
_objId[2] = readD();
_itemCounts[2] = readQ();
_objId[3] = readD();
_itemCounts[3] = readQ();
_objId[4] = readD();
_itemCounts[4] = readQ();
break;
}
}
}
@Override
protected void runImpl()
{
final L2PcInstance activeChar = getClient().getActiveChar();
if ((activeChar == null) || (activeChar.getRace() != Race.Arteas))
{
return;
}
for (int i = 1; i <= _activeItems; i++)
{
_allPrice = _allPrice + _itemCounts[i] * activeChar.getInventory().getItemByObjectId(_objId[i]).getReferencePrice();
activeChar.getInventory().destroyItem(ProcessType.ALCHEMY, _objId[i], _itemCounts[i], activeChar, "Alchemy");
}
_stoneCount = _allPrice / 10000; //TODO формула не верный коэффициент
activeChar.getInventory().addItem(ProcessType.ALCHEMY, _stoneID , _stoneCount , activeChar, "Alchemy");
activeChar.sendPacket(new ExTryMixCube(_stoneCount, _stoneID, 0));
activeChar.sendPacket(new ItemList(activeChar, false));
}
@Override
public String getType() {
return getClass().getSimpleName();
}
}
Код:
public class ExAlchemyConversion extends L2GameServerPacket
{
private final int _itemCount;
private final long _failCount;
public ExAlchemyConversion(int itemCount, long failCount)
{
_itemCount = itemCount;
_failCount = failCount;
}
@Override
protected void writeImpl() {
writeC(0x00); //unk
writeD(_itemCount);
writeD((int) _failCount);
}
}
Код:
public class ExAlchemySkillList extends L2GameServerPacket
{
private final List<L2Skill> _skills = new ArrayList<>();
public ExAlchemySkillList(final L2PcInstance player)
{
_skills.addAll(player.getAllSkills().stream().filter(skill -> SkillTreesData.getInstance().getAlchemySkill(skill.getId(), skill.getLevel()) != null).map(skill -> skill).collect(Collectors.toList()));
}
@Override
protected void writeImpl()
{
writeD(_skills.size());
for (L2Skill skill : _skills)
{
writeD(skill.getId());
writeD(skill.getLevel());
writeQ(0x00); //Всегла 0
int visible = 0x01;
if(skill.getId() == 17943) {
visible = 0x00;
}
writeC(visible);
}
}
}
Код:
public class ExTryMixCube extends L2GameServerPacket
{
private int _stoneID;
private long _count;
private int _typePacket;
public ExTryMixCube(long count, int stoneId , int type)
{
_count = count;
_typePacket = type;
_stoneID = stoneId;
}
@Override
protected void writeImpl()
{
writeC(0x00); //unk
writeC(0x01); //type
writeD(0x00); //unk
writeD(_stoneID); //stoneID
writeQ(_count); //count
}
}
Автор: GenCloud