Alchemy Transmutation skills and packet improvements.

This commit is contained in:
MobiusDev
2015-05-18 16:24:30 +00:00
parent a5d65bea4f
commit 657f00d23d
4 changed files with 419 additions and 81 deletions

View File

@ -18,16 +18,14 @@
*/
package com.l2jserver.gameserver.network.clientpackets;
import com.l2jserver.Config;
import com.l2jserver.gameserver.datatables.SkillData;
import com.l2jserver.gameserver.enums.Race;
import com.l2jserver.gameserver.model.L2AlchemySkill;
import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
import com.l2jserver.gameserver.model.holders.ItemHolder;
import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
import com.l2jserver.gameserver.model.skills.Skill;
import com.l2jserver.gameserver.network.SystemMessageId;
import com.l2jserver.gameserver.network.serverpackets.ExAlchemyConversion;
import com.l2jserver.gameserver.network.serverpackets.InventoryUpdate;
import com.l2jserver.gameserver.network.serverpackets.ItemList;
import com.l2jserver.util.Rnd;
@ -49,7 +47,7 @@ public class RequestAlchemyConversion extends L2GameClientPacket
protected void readImpl()
{
_skillUseCount = readD();
_unk = readH(); // Unk = 10; xs is
_unk = readH(); // Unk = 10;
_skillId = readD();
_skillLevel = readD();
readB(new byte[28]);
@ -58,19 +56,17 @@ public class RequestAlchemyConversion extends L2GameClientPacket
@Override
protected void runImpl()
{
L2PcInstance activeChar = getClient().getActiveChar();
Skill skill = SkillData.getInstance().getSkill(_skillId, _skillLevel);
L2ItemInstance invitem = null;
final L2PcInstance activeChar = getClient().getActiveChar();
final Skill skill = SkillData.getInstance().getSkill(_skillId, _skillLevel);
final L2AlchemySkill alchemySkill = skill.getAlchemySkill();
if ((activeChar == null) || (activeChar.getRace() != Race.ERTHEIA))
if ((activeChar == null) || (activeChar.getRace() != Race.ERTHEIA) || (_skillUseCount < 0))
{
return;
}
double chance = 100; // 100% ?
boolean hasIngidients = true;
for (ItemHolder item : skill.getAlchemySkill().getIngridientItems())
for (ItemHolder item : alchemySkill.getIngridientItems())
{
if ((activeChar.getInventory().getInventoryItemCount(item.getId(), -1) * _skillUseCount) < (item.getCount() * _skillUseCount))
{
@ -84,43 +80,39 @@ public class RequestAlchemyConversion extends L2GameClientPacket
return;
}
final double chance = 80; // 80% ?
for (int i = 0; i < _skillUseCount; i++)
{
boolean ok = Rnd.get(1, 100) < chance;
skill.getAlchemySkill().getIngridientItems().forEach(holder -> activeChar.getInventory().destroyItemByItemId("Alchemy", holder.getId(), holder.getCount(), activeChar, null));
if (ok)
{
_resultItemCount = skill.getAlchemySkill().getTransmutedItem().getCount() * _skillUseCount;
_resultItemCount += alchemySkill.getTransmutedItem().getCount();
}
else
{
_resultFailCount++; // ?
_resultFailCount++;
}
}
if (_resultItemCount > 0)
{
invitem = activeChar.getInventory().addItem("Alchemy", skill.getAlchemySkill().getTransmutedItem().getId(), _resultItemCount, activeChar, null);
alchemySkill.getIngridientItems().forEach(holder -> activeChar.getInventory().destroyItemByItemId("Alchemy", holder.getId(), holder.getCount(), activeChar, null));
}
if (_resultFailCount > 0) // ?
if (_resultItemCount > 0)
{
invitem = activeChar.getInventory().destroyItemByItemId("Alchemy", skill.getAlchemySkill().getTransmutedItem().getId(), _resultFailCount, activeChar, null);
activeChar.addItem("Alchemy", alchemySkill.getTransmutedItem(), activeChar, true);
}
if (_resultFailCount > 0)
{
for (ItemHolder item : alchemySkill.getIngridientItems())
{
activeChar.getInventory().destroyItemByItemId("Alchemy", item.getId(), _resultFailCount, activeChar, null);
break; // FIXME: Take only 1st ingridient.
}
activeChar.sendPacket(SystemMessageId.FAILURE_TO_TRANSMUTE_WILL_DESTROY_SOME_INGREDIENTS);
}
activeChar.sendPacket(new ExAlchemyConversion((int) _resultItemCount, (int) _resultFailCount));
if (Config.FORCE_INVENTORY_UPDATE)
{
activeChar.sendPacket(new ItemList(activeChar, false));
}
else
{
InventoryUpdate playerIU = new InventoryUpdate();
playerIU.addItem(invitem);
sendPacket(playerIU);
}
activeChar.sendPacket(new ItemList(activeChar, false));
}
@Override

View File

@ -19,16 +19,16 @@
package com.l2jserver.gameserver.network.serverpackets;
/**
* @author GenCloud
* @author Mobius
*/
public class ExAlchemyConversion extends L2GameServerPacket
{
private final int _itemCount;
private final int _failCount;
public ExAlchemyConversion(int _resultItemCount, int failCount)
public ExAlchemyConversion(int itemCount, int failCount)
{
_itemCount = _resultItemCount;
_itemCount = itemCount;
_failCount = failCount;
}