Updated ensoul system to match retail.
Contributed by CostyKiller.
This commit is contained in:
@@ -32,7 +32,6 @@ import org.l2jmobius.gameserver.model.ensoul.EnsoulFee;
|
||||
import org.l2jmobius.gameserver.model.ensoul.EnsoulOption;
|
||||
import org.l2jmobius.gameserver.model.ensoul.EnsoulStone;
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.item.type.CrystalType;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
@@ -40,7 +39,7 @@ import org.l2jmobius.gameserver.model.item.type.CrystalType;
|
||||
public class EnsoulData implements IXmlReader
|
||||
{
|
||||
private static final Logger LOGGER = Logger.getLogger(EnsoulData.class.getName());
|
||||
private final Map<CrystalType, EnsoulFee> _ensoulFees = new ConcurrentHashMap<>();
|
||||
private final Map<Integer, EnsoulFee> _ensoulFees = new ConcurrentHashMap<>();
|
||||
private final Map<Integer, EnsoulOption> _ensoulOptions = new ConcurrentHashMap<>();
|
||||
private final Map<Integer, EnsoulStone> _ensoulStones = new ConcurrentHashMap<>();
|
||||
|
||||
@@ -86,8 +85,8 @@ public class EnsoulData implements IXmlReader
|
||||
|
||||
private void parseFees(Node ensoulNode)
|
||||
{
|
||||
final CrystalType type = parseEnum(ensoulNode.getAttributes(), CrystalType.class, "crystalType");
|
||||
final EnsoulFee fee = new EnsoulFee(type);
|
||||
final Integer stoneId = parseInteger(ensoulNode.getAttributes(), "stoneId");
|
||||
final EnsoulFee fee = new EnsoulFee(stoneId);
|
||||
forEach(ensoulNode, IXmlReader::isNode, feeNode ->
|
||||
{
|
||||
switch (feeNode.getNodeName())
|
||||
@@ -137,7 +136,7 @@ public class EnsoulData implements IXmlReader
|
||||
final int id = parseInteger(attrs, "itemId");
|
||||
final int count = parseInteger(attrs, "count");
|
||||
fee.setEnsoul(index, new ItemHolder(id, count));
|
||||
_ensoulFees.put(fee.getCrystalType(), fee);
|
||||
_ensoulFees.put(fee.getStoneId(), fee);
|
||||
}
|
||||
|
||||
private void parseReFee(Node ensoulNode, EnsoulFee fee, int index)
|
||||
@@ -178,21 +177,21 @@ public class EnsoulData implements IXmlReader
|
||||
_ensoulStones.put(stone.getId(), stone);
|
||||
}
|
||||
|
||||
public ItemHolder getEnsoulFee(CrystalType type, int index)
|
||||
public ItemHolder getEnsoulFee(int stoneId, int index)
|
||||
{
|
||||
final EnsoulFee fee = _ensoulFees.get(type);
|
||||
final EnsoulFee fee = _ensoulFees.get(stoneId);
|
||||
return fee != null ? fee.getEnsoul(index) : null;
|
||||
}
|
||||
|
||||
public ItemHolder getResoulFee(CrystalType type, int index)
|
||||
public ItemHolder getResoulFee(int stoneId, int index)
|
||||
{
|
||||
final EnsoulFee fee = _ensoulFees.get(type);
|
||||
final EnsoulFee fee = _ensoulFees.get(stoneId);
|
||||
return fee != null ? fee.getResoul(index) : null;
|
||||
}
|
||||
|
||||
public Collection<ItemHolder> getRemovalFee(CrystalType type)
|
||||
public Collection<ItemHolder> getRemovalFee(int stoneId)
|
||||
{
|
||||
final EnsoulFee fee = _ensoulFees.get(type);
|
||||
final EnsoulFee fee = _ensoulFees.get(stoneId);
|
||||
return fee != null ? fee.getRemovalFee() : Collections.emptyList();
|
||||
}
|
||||
|
||||
|
@@ -20,27 +20,26 @@ import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import org.l2jmobius.gameserver.model.holders.ItemHolder;
|
||||
import org.l2jmobius.gameserver.model.item.type.CrystalType;
|
||||
|
||||
/**
|
||||
* @author UnAfraid
|
||||
*/
|
||||
public class EnsoulFee
|
||||
{
|
||||
private final CrystalType _type;
|
||||
private final Integer _stoneId;
|
||||
|
||||
private final ItemHolder[] _ensoulFee = new ItemHolder[3];
|
||||
private final ItemHolder[] _resoulFees = new ItemHolder[3];
|
||||
private final List<ItemHolder> _removalFee = new ArrayList<>();
|
||||
|
||||
public EnsoulFee(CrystalType type)
|
||||
public EnsoulFee(Integer stoneId)
|
||||
{
|
||||
_type = type;
|
||||
_stoneId = stoneId;
|
||||
}
|
||||
|
||||
public CrystalType getCrystalType()
|
||||
public Integer getStoneId()
|
||||
{
|
||||
return _type;
|
||||
return _stoneId;
|
||||
}
|
||||
|
||||
public void setEnsoul(int index, ItemHolder item)
|
||||
|
@@ -181,19 +181,19 @@ public class RequestItemEnsoul implements IClientIncomingPacket
|
||||
if (itemOption.getType() == 1)
|
||||
{
|
||||
// Normal Soul Crystal
|
||||
fee = EnsoulData.getInstance().getEnsoulFee(item.getTemplate().getCrystalType(), position);
|
||||
fee = EnsoulData.getInstance().getEnsoulFee(stone.getId(), position);
|
||||
if (((itemOption.getPosition() == 1) || (itemOption.getPosition() == 2)) && (item.getSpecialAbility(position) != null))
|
||||
{
|
||||
fee = EnsoulData.getInstance().getResoulFee(item.getTemplate().getCrystalType(), position);
|
||||
fee = EnsoulData.getInstance().getResoulFee(stone.getId(), position);
|
||||
}
|
||||
}
|
||||
else if (itemOption.getType() == 2)
|
||||
{
|
||||
// Mystic Soul Crystal
|
||||
fee = EnsoulData.getInstance().getEnsoulFee(item.getTemplate().getCrystalType(), position + 2); // Client Special type position = 0
|
||||
fee = EnsoulData.getInstance().getEnsoulFee(stone.getId(), position + 2); // Client Special type position = 0
|
||||
if ((itemOption.getPosition() == 1) && (item.getAdditionalSpecialAbility(position) != null))
|
||||
{
|
||||
fee = EnsoulData.getInstance().getResoulFee(item.getTemplate().getCrystalType(), position + 2); // Client Special type position = 0
|
||||
fee = EnsoulData.getInstance().getResoulFee(stone.getId(), position + 2); // Client Special type position = 0
|
||||
}
|
||||
}
|
||||
else
|
||||
|
@@ -85,8 +85,8 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getTemplate().getCrystalType());
|
||||
final int runeId = EnsoulData.getInstance().getStone(_type, option.getId());
|
||||
final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(runeId);
|
||||
if (removalFee.isEmpty())
|
||||
{
|
||||
return;
|
||||
@@ -115,7 +115,6 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
|
||||
iu.addModifiedItem(item);
|
||||
|
||||
// Add rune in player inventory.
|
||||
final int runeId = EnsoulData.getInstance().getStone(_type, option.getId());
|
||||
if (runeId > 0)
|
||||
{
|
||||
iu.addItem(player.addItem("Rune Extract", runeId, 1, player, true));
|
||||
|
Reference in New Issue
Block a user