Updated ensoul system to match retail.

Contributed by CostyKiller.
This commit is contained in:
MobiusDevelopment
2022-06-12 12:13:31 +00:00
parent 0c4c85f3b6
commit ebb10b7154
7 changed files with 929 additions and 132 deletions

View File

@@ -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();
}

View File

@@ -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)

View File

@@ -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

View File

@@ -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));