Unhardcoded Rune extraction fees.

This commit is contained in:
MobiusDev
2018-07-19 19:27:24 +00:00
parent 6fff504b39
commit 8286580075
15 changed files with 222 additions and 177 deletions

View File

@@ -3,17 +3,23 @@
<fee crystalType="D"> <fee crystalType="D">
<first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) --> <first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) -->
<reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) --> <reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
<remove itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
</fee> </fee>
<fee crystalType="C"> <fee crystalType="C">
<first itemId="2131" count="177" /> <!-- Gemstone (C-grade) --> <first itemId="2131" count="177" /> <!-- Gemstone (C-grade) -->
<reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) --> <reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
<remove itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
</fee> </fee>
<fee crystalType="B"> <fee crystalType="B">
<first itemId="2132" count="112" /> <!-- Gemstone (B-grade) --> <first itemId="2132" count="112" /> <!-- Gemstone (B-grade) -->
<reNormal itemId="2132" count="56" /> <!-- Gemstone (B-grade) --> <reNormal itemId="2132" count="56" /> <!-- Gemstone (B-grade) -->
<remove itemId="2132" count="19" /> <!-- Gemstone (B-grade) -->
<remove itemId="57" count="700000" /> <!-- Adena -->
</fee> </fee>
<fee crystalType="A"> <fee crystalType="A">
<first itemId="2133" count="24" /> <!-- Gemstone (A-grade) --> <first itemId="2133" count="24" /> <!-- Gemstone (A-grade) -->
<reNormal itemId="2133" count="12" /> <!-- Gemstone (A-grade) --> <reNormal itemId="2133" count="12" /> <!-- Gemstone (A-grade) -->
<remove itemId="2133" count="5" /> <!-- Gemstone (A-grade) -->
<remove itemId="57" count="3500000" /> <!-- Adena -->
</fee> </fee>
</list> </list>

View File

@@ -34,6 +34,7 @@
<xs:element name="reNormal" minOccurs="0" type="fee" /> <xs:element name="reNormal" minOccurs="0" type="fee" />
<xs:element name="reSecondary" minOccurs="0" type="fee" /> <xs:element name="reSecondary" minOccurs="0" type="fee" />
<xs:element name="reThird" minOccurs="0" type="fee" /> <xs:element name="reThird" minOccurs="0" type="fee" />
<xs:element name="remove" minOccurs="0" maxOccurs="unbounded" type="fee" />
</xs:sequence> </xs:sequence>
<xs:attribute type="crystalType" name="crystalType" use="required" /> <xs:attribute type="crystalType" name="crystalType" use="required" />
</xs:complexType> </xs:complexType>

View File

@@ -17,6 +17,8 @@
package com.l2jmobius.gameserver.data.xml.impl; package com.l2jmobius.gameserver.data.xml.impl;
import java.io.File; import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -122,6 +124,11 @@ public class EnsoulData implements IGameXmlReader
parseReFee(feeNode, fee, 2); parseReFee(feeNode, fee, 2);
break; break;
} }
case "remove":
{
parseRemove(feeNode, fee);
break;
}
} }
}); });
} }
@@ -143,6 +150,14 @@ public class EnsoulData implements IGameXmlReader
fee.setResoul(index, new ItemHolder(id, count)); fee.setResoul(index, new ItemHolder(id, count));
} }
private void parseRemove(Node ensoulNode, EnsoulFee fee)
{
final NamedNodeMap attrs = ensoulNode.getAttributes();
final int id = parseInteger(attrs, "itemId");
final int count = parseInteger(attrs, "count");
fee.addRemovalFee(new ItemHolder(id, count));
}
private void parseOptions(Node ensoulNode) private void parseOptions(Node ensoulNode)
{ {
final NamedNodeMap attrs = ensoulNode.getAttributes(); final NamedNodeMap attrs = ensoulNode.getAttributes();
@@ -177,6 +192,12 @@ public class EnsoulData implements IGameXmlReader
return fee != null ? fee.getResoul(index) : null; return fee != null ? fee.getResoul(index) : null;
} }
public Collection<ItemHolder> getRemovalFee(CrystalType type)
{
final EnsoulFee fee = _ensoulFees.get(type);
return fee != null ? fee.getRemovalFee() : Collections.emptyList();
}
public EnsoulOption getOption(int id) public EnsoulOption getOption(int id)
{ {
return _ensoulOptions.get(id); return _ensoulOptions.get(id);

View File

@@ -16,6 +16,9 @@
*/ */
package com.l2jmobius.gameserver.model.ensoul; package com.l2jmobius.gameserver.model.ensoul;
import java.util.Collection;
import java.util.Collections;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.items.type.CrystalType; import com.l2jmobius.gameserver.model.items.type.CrystalType;
@@ -28,6 +31,7 @@ public class EnsoulFee
private final ItemHolder[] _ensoulFee = new ItemHolder[3]; private final ItemHolder[] _ensoulFee = new ItemHolder[3];
private final ItemHolder[] _resoulFees = new ItemHolder[3]; private final ItemHolder[] _resoulFees = new ItemHolder[3];
private final Collection<ItemHolder> _removalFee = Collections.emptyList();
public EnsoulFee(CrystalType type) public EnsoulFee(CrystalType type)
{ {
@@ -49,6 +53,11 @@ public class EnsoulFee
_resoulFees[index] = item; _resoulFees[index] = item;
} }
public void addRemovalFee(ItemHolder itemHolder)
{
_removalFee.add(itemHolder);
}
public ItemHolder getEnsoul(int index) public ItemHolder getEnsoul(int index)
{ {
return _ensoulFee[index]; return _ensoulFee[index];
@@ -58,4 +67,9 @@ public class EnsoulFee
{ {
return _resoulFees[index]; return _resoulFees[index];
} }
public Collection<ItemHolder> getRemovalFee()
{
return _removalFee;
}
} }

View File

@@ -16,10 +16,13 @@
*/ */
package com.l2jmobius.gameserver.network.clientpackets.ensoul; package com.l2jmobius.gameserver.network.clientpackets.ensoul;
import java.util.Collection;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData; import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.ensoul.EnsoulOption; import com.l2jmobius.gameserver.model.ensoul.EnsoulOption;
import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -74,72 +77,42 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
return; return;
} }
boolean success = false; final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getItem().getCrystalType());
if (removalFee.isEmpty())
// TODO: Move to XML.
switch (item.getItem().getItemGrade())
{ {
case D: return;
}
// Check if player has required items.
for (ItemHolder itemHolder : removalFee)
{
if (player.getInventory().getInventoryItemCount(itemHolder.getId(), -1) < itemHolder.getCount())
{ {
if (player.getInventory().getInventoryItemCount(2130, -1) >= 89) player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
{ player.sendPacket(new ExEnSoulExtractionResult(false, item));
player.destroyItemByItemId("Rune Extract", 2130, 89, player, true); return;
success = true;
}
break;
}
case C:
{
if (player.getInventory().getInventoryItemCount(2131, -1) >= 89)
{
player.destroyItemByItemId("Rune Extract", 2131, 89, player, true);
success = true;
}
break;
}
case B:
{
if ((player.getInventory().getInventoryItemCount(2132, -1) >= 19) //
&& (player.getInventory().getInventoryItemCount(57, -1) >= 700000))
{
player.destroyItemByItemId("Rune Extract", 2132, 19, player, true);
player.reduceAdena("Rune Extract", 700000, player, true);
success = true;
}
break;
}
case A:
{
if ((player.getInventory().getInventoryItemCount(2133, -1) >= 5) //
&& (player.getInventory().getInventoryItemCount(57, -1) >= 3500000))
{
player.destroyItemByItemId("Rune Extract", 2133, 5, player, true);
player.reduceAdena("Rune Extract", 3500000, player, true);
success = true;
}
break;
} }
} }
if (success) // Take required items.
for (ItemHolder itemHolder : removalFee)
{ {
item.removeSpecialAbility(_position, _type); player.destroyItemByItemId("Rune Extract", itemHolder.getId(), itemHolder.getCount(), player, true);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
final int runeId = EnsoulData.getInstance().getStone(_type, option.getId());
if (runeId > 0)
{
iu.addItem(player.addItem("Rune Extract", runeId, 1, player, true));
}
player.sendInventoryUpdate(iu);
}
else
{
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
} }
player.sendPacket(new ExEnSoulExtractionResult(success, item)); // Remove equipped rune.
item.removeSpecialAbility(_position, _type);
final InventoryUpdate iu = new InventoryUpdate();
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));
}
player.sendInventoryUpdate(iu);
player.sendPacket(new ExEnSoulExtractionResult(true, item));
} }
} }

View File

@@ -3,17 +3,23 @@
<fee crystalType="D"> <fee crystalType="D">
<first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) --> <first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) -->
<reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) --> <reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
<remove itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
</fee> </fee>
<fee crystalType="C"> <fee crystalType="C">
<first itemId="2131" count="177" /> <!-- Gemstone (C-grade) --> <first itemId="2131" count="177" /> <!-- Gemstone (C-grade) -->
<reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) --> <reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
<remove itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
</fee> </fee>
<fee crystalType="B"> <fee crystalType="B">
<first itemId="2132" count="112" /> <!-- Gemstone (B-grade) --> <first itemId="2132" count="112" /> <!-- Gemstone (B-grade) -->
<reNormal itemId="2132" count="56" /> <!-- Gemstone (B-grade) --> <reNormal itemId="2132" count="56" /> <!-- Gemstone (B-grade) -->
<remove itemId="2132" count="19" /> <!-- Gemstone (B-grade) -->
<remove itemId="57" count="700000" /> <!-- Adena -->
</fee> </fee>
<fee crystalType="A"> <fee crystalType="A">
<first itemId="2133" count="24" /> <!-- Gemstone (A-grade) --> <first itemId="2133" count="24" /> <!-- Gemstone (A-grade) -->
<reNormal itemId="2133" count="12" /> <!-- Gemstone (A-grade) --> <reNormal itemId="2133" count="12" /> <!-- Gemstone (A-grade) -->
<remove itemId="2133" count="5" /> <!-- Gemstone (A-grade) -->
<remove itemId="57" count="3500000" /> <!-- Adena -->
</fee> </fee>
</list> </list>

View File

@@ -34,6 +34,7 @@
<xs:element name="reNormal" minOccurs="0" type="fee" /> <xs:element name="reNormal" minOccurs="0" type="fee" />
<xs:element name="reSecondary" minOccurs="0" type="fee" /> <xs:element name="reSecondary" minOccurs="0" type="fee" />
<xs:element name="reThird" minOccurs="0" type="fee" /> <xs:element name="reThird" minOccurs="0" type="fee" />
<xs:element name="remove" minOccurs="0" maxOccurs="unbounded" type="fee" />
</xs:sequence> </xs:sequence>
<xs:attribute type="crystalType" name="crystalType" use="required" /> <xs:attribute type="crystalType" name="crystalType" use="required" />
</xs:complexType> </xs:complexType>

View File

@@ -17,6 +17,8 @@
package com.l2jmobius.gameserver.data.xml.impl; package com.l2jmobius.gameserver.data.xml.impl;
import java.io.File; import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -122,6 +124,11 @@ public class EnsoulData implements IGameXmlReader
parseReFee(feeNode, fee, 2); parseReFee(feeNode, fee, 2);
break; break;
} }
case "remove":
{
parseRemove(feeNode, fee);
break;
}
} }
}); });
} }
@@ -143,6 +150,14 @@ public class EnsoulData implements IGameXmlReader
fee.setResoul(index, new ItemHolder(id, count)); fee.setResoul(index, new ItemHolder(id, count));
} }
private void parseRemove(Node ensoulNode, EnsoulFee fee)
{
final NamedNodeMap attrs = ensoulNode.getAttributes();
final int id = parseInteger(attrs, "itemId");
final int count = parseInteger(attrs, "count");
fee.addRemovalFee(new ItemHolder(id, count));
}
private void parseOptions(Node ensoulNode) private void parseOptions(Node ensoulNode)
{ {
final NamedNodeMap attrs = ensoulNode.getAttributes(); final NamedNodeMap attrs = ensoulNode.getAttributes();
@@ -177,6 +192,12 @@ public class EnsoulData implements IGameXmlReader
return fee != null ? fee.getResoul(index) : null; return fee != null ? fee.getResoul(index) : null;
} }
public Collection<ItemHolder> getRemovalFee(CrystalType type)
{
final EnsoulFee fee = _ensoulFees.get(type);
return fee != null ? fee.getRemovalFee() : Collections.emptyList();
}
public EnsoulOption getOption(int id) public EnsoulOption getOption(int id)
{ {
return _ensoulOptions.get(id); return _ensoulOptions.get(id);

View File

@@ -16,6 +16,9 @@
*/ */
package com.l2jmobius.gameserver.model.ensoul; package com.l2jmobius.gameserver.model.ensoul;
import java.util.Collection;
import java.util.Collections;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.items.type.CrystalType; import com.l2jmobius.gameserver.model.items.type.CrystalType;
@@ -28,6 +31,7 @@ public class EnsoulFee
private final ItemHolder[] _ensoulFee = new ItemHolder[3]; private final ItemHolder[] _ensoulFee = new ItemHolder[3];
private final ItemHolder[] _resoulFees = new ItemHolder[3]; private final ItemHolder[] _resoulFees = new ItemHolder[3];
private final Collection<ItemHolder> _removalFee = Collections.emptyList();
public EnsoulFee(CrystalType type) public EnsoulFee(CrystalType type)
{ {
@@ -49,6 +53,11 @@ public class EnsoulFee
_resoulFees[index] = item; _resoulFees[index] = item;
} }
public void addRemovalFee(ItemHolder itemHolder)
{
_removalFee.add(itemHolder);
}
public ItemHolder getEnsoul(int index) public ItemHolder getEnsoul(int index)
{ {
return _ensoulFee[index]; return _ensoulFee[index];
@@ -58,4 +67,9 @@ public class EnsoulFee
{ {
return _resoulFees[index]; return _resoulFees[index];
} }
public Collection<ItemHolder> getRemovalFee()
{
return _removalFee;
}
} }

View File

@@ -16,10 +16,13 @@
*/ */
package com.l2jmobius.gameserver.network.clientpackets.ensoul; package com.l2jmobius.gameserver.network.clientpackets.ensoul;
import java.util.Collection;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData; import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.ensoul.EnsoulOption; import com.l2jmobius.gameserver.model.ensoul.EnsoulOption;
import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -74,72 +77,42 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
return; return;
} }
boolean success = false; final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getItem().getCrystalType());
if (removalFee.isEmpty())
// TODO: Move to XML.
switch (item.getItem().getItemGrade())
{ {
case D: return;
}
// Check if player has required items.
for (ItemHolder itemHolder : removalFee)
{
if (player.getInventory().getInventoryItemCount(itemHolder.getId(), -1) < itemHolder.getCount())
{ {
if (player.getInventory().getInventoryItemCount(2130, -1) >= 89) player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
{ player.sendPacket(new ExEnSoulExtractionResult(false, item));
player.destroyItemByItemId("Rune Extract", 2130, 89, player, true); return;
success = true;
}
break;
}
case C:
{
if (player.getInventory().getInventoryItemCount(2131, -1) >= 89)
{
player.destroyItemByItemId("Rune Extract", 2131, 89, player, true);
success = true;
}
break;
}
case B:
{
if ((player.getInventory().getInventoryItemCount(2132, -1) >= 19) //
&& (player.getInventory().getInventoryItemCount(57, -1) >= 700000))
{
player.destroyItemByItemId("Rune Extract", 2132, 19, player, true);
player.reduceAdena("Rune Extract", 700000, player, true);
success = true;
}
break;
}
case A:
{
if ((player.getInventory().getInventoryItemCount(2133, -1) >= 5) //
&& (player.getInventory().getInventoryItemCount(57, -1) >= 3500000))
{
player.destroyItemByItemId("Rune Extract", 2133, 5, player, true);
player.reduceAdena("Rune Extract", 3500000, player, true);
success = true;
}
break;
} }
} }
if (success) // Take required items.
for (ItemHolder itemHolder : removalFee)
{ {
item.removeSpecialAbility(_position, _type); player.destroyItemByItemId("Rune Extract", itemHolder.getId(), itemHolder.getCount(), player, true);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
final int runeId = EnsoulData.getInstance().getStone(_type, option.getId());
if (runeId > 0)
{
iu.addItem(player.addItem("Rune Extract", runeId, 1, player, true));
}
player.sendInventoryUpdate(iu);
}
else
{
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
} }
player.sendPacket(new ExEnSoulExtractionResult(success, item)); // Remove equipped rune.
item.removeSpecialAbility(_position, _type);
final InventoryUpdate iu = new InventoryUpdate();
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));
}
player.sendInventoryUpdate(iu);
player.sendPacket(new ExEnSoulExtractionResult(true, item));
} }
} }

View File

@@ -3,17 +3,23 @@
<fee crystalType="D"> <fee crystalType="D">
<first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) --> <first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) -->
<reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) --> <reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
<remove itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
</fee> </fee>
<fee crystalType="C"> <fee crystalType="C">
<first itemId="2131" count="177" /> <!-- Gemstone (C-grade) --> <first itemId="2131" count="177" /> <!-- Gemstone (C-grade) -->
<reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) --> <reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
<remove itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
</fee> </fee>
<fee crystalType="B"> <fee crystalType="B">
<first itemId="2132" count="112" /> <!-- Gemstone (B-grade) --> <first itemId="2132" count="112" /> <!-- Gemstone (B-grade) -->
<reNormal itemId="2132" count="56" /> <!-- Gemstone (B-grade) --> <reNormal itemId="2132" count="56" /> <!-- Gemstone (B-grade) -->
<remove itemId="2132" count="19" /> <!-- Gemstone (B-grade) -->
<remove itemId="57" count="700000" /> <!-- Adena -->
</fee> </fee>
<fee crystalType="A"> <fee crystalType="A">
<first itemId="2133" count="24" /> <!-- Gemstone (A-grade) --> <first itemId="2133" count="24" /> <!-- Gemstone (A-grade) -->
<reNormal itemId="2133" count="12" /> <!-- Gemstone (A-grade) --> <reNormal itemId="2133" count="12" /> <!-- Gemstone (A-grade) -->
<remove itemId="2133" count="5" /> <!-- Gemstone (A-grade) -->
<remove itemId="57" count="3500000" /> <!-- Adena -->
</fee> </fee>
</list> </list>

View File

@@ -34,6 +34,7 @@
<xs:element name="reNormal" minOccurs="0" type="fee" /> <xs:element name="reNormal" minOccurs="0" type="fee" />
<xs:element name="reSecondary" minOccurs="0" type="fee" /> <xs:element name="reSecondary" minOccurs="0" type="fee" />
<xs:element name="reThird" minOccurs="0" type="fee" /> <xs:element name="reThird" minOccurs="0" type="fee" />
<xs:element name="remove" minOccurs="0" maxOccurs="unbounded" type="fee" />
</xs:sequence> </xs:sequence>
<xs:attribute type="crystalType" name="crystalType" use="required" /> <xs:attribute type="crystalType" name="crystalType" use="required" />
</xs:complexType> </xs:complexType>

View File

@@ -17,6 +17,8 @@
package com.l2jmobius.gameserver.data.xml.impl; package com.l2jmobius.gameserver.data.xml.impl;
import java.io.File; import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap; import java.util.EnumMap;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -122,6 +124,11 @@ public class EnsoulData implements IGameXmlReader
parseReFee(feeNode, fee, 2); parseReFee(feeNode, fee, 2);
break; break;
} }
case "remove":
{
parseRemove(feeNode, fee);
break;
}
} }
}); });
} }
@@ -143,6 +150,14 @@ public class EnsoulData implements IGameXmlReader
fee.setResoul(index, new ItemHolder(id, count)); fee.setResoul(index, new ItemHolder(id, count));
} }
private void parseRemove(Node ensoulNode, EnsoulFee fee)
{
final NamedNodeMap attrs = ensoulNode.getAttributes();
final int id = parseInteger(attrs, "itemId");
final int count = parseInteger(attrs, "count");
fee.addRemovalFee(new ItemHolder(id, count));
}
private void parseOptions(Node ensoulNode) private void parseOptions(Node ensoulNode)
{ {
final NamedNodeMap attrs = ensoulNode.getAttributes(); final NamedNodeMap attrs = ensoulNode.getAttributes();
@@ -177,6 +192,12 @@ public class EnsoulData implements IGameXmlReader
return fee != null ? fee.getResoul(index) : null; return fee != null ? fee.getResoul(index) : null;
} }
public Collection<ItemHolder> getRemovalFee(CrystalType type)
{
final EnsoulFee fee = _ensoulFees.get(type);
return fee != null ? fee.getRemovalFee() : Collections.emptyList();
}
public EnsoulOption getOption(int id) public EnsoulOption getOption(int id)
{ {
return _ensoulOptions.get(id); return _ensoulOptions.get(id);

View File

@@ -16,6 +16,9 @@
*/ */
package com.l2jmobius.gameserver.model.ensoul; package com.l2jmobius.gameserver.model.ensoul;
import java.util.Collection;
import java.util.Collections;
import com.l2jmobius.gameserver.model.holders.ItemHolder; import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.items.type.CrystalType; import com.l2jmobius.gameserver.model.items.type.CrystalType;
@@ -28,6 +31,7 @@ public class EnsoulFee
private final ItemHolder[] _ensoulFee = new ItemHolder[3]; private final ItemHolder[] _ensoulFee = new ItemHolder[3];
private final ItemHolder[] _resoulFees = new ItemHolder[3]; private final ItemHolder[] _resoulFees = new ItemHolder[3];
private final Collection<ItemHolder> _removalFee = Collections.emptyList();
public EnsoulFee(CrystalType type) public EnsoulFee(CrystalType type)
{ {
@@ -49,6 +53,11 @@ public class EnsoulFee
_resoulFees[index] = item; _resoulFees[index] = item;
} }
public void addRemovalFee(ItemHolder itemHolder)
{
_removalFee.add(itemHolder);
}
public ItemHolder getEnsoul(int index) public ItemHolder getEnsoul(int index)
{ {
return _ensoulFee[index]; return _ensoulFee[index];
@@ -58,4 +67,9 @@ public class EnsoulFee
{ {
return _resoulFees[index]; return _resoulFees[index];
} }
public Collection<ItemHolder> getRemovalFee()
{
return _removalFee;
}
} }

View File

@@ -16,10 +16,13 @@
*/ */
package com.l2jmobius.gameserver.network.clientpackets.ensoul; package com.l2jmobius.gameserver.network.clientpackets.ensoul;
import java.util.Collection;
import com.l2jmobius.commons.network.PacketReader; import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData; import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance; import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
import com.l2jmobius.gameserver.model.ensoul.EnsoulOption; import com.l2jmobius.gameserver.model.ensoul.EnsoulOption;
import com.l2jmobius.gameserver.model.holders.ItemHolder;
import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance; import com.l2jmobius.gameserver.model.items.instance.L2ItemInstance;
import com.l2jmobius.gameserver.network.L2GameClient; import com.l2jmobius.gameserver.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId; import com.l2jmobius.gameserver.network.SystemMessageId;
@@ -74,72 +77,42 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
return; return;
} }
boolean success = false; final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getItem().getCrystalType());
if (removalFee.isEmpty())
// TODO: Move to XML.
switch (item.getItem().getItemGrade())
{ {
case D: return;
}
// Check if player has required items.
for (ItemHolder itemHolder : removalFee)
{
if (player.getInventory().getInventoryItemCount(itemHolder.getId(), -1) < itemHolder.getCount())
{ {
if (player.getInventory().getInventoryItemCount(2130, -1) >= 89) player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
{ player.sendPacket(new ExEnSoulExtractionResult(false, item));
player.destroyItemByItemId("Rune Extract", 2130, 89, player, true); return;
success = true;
}
break;
}
case C:
{
if (player.getInventory().getInventoryItemCount(2131, -1) >= 89)
{
player.destroyItemByItemId("Rune Extract", 2131, 89, player, true);
success = true;
}
break;
}
case B:
{
if ((player.getInventory().getInventoryItemCount(2132, -1) >= 19) //
&& (player.getInventory().getInventoryItemCount(57, -1) >= 700000))
{
player.destroyItemByItemId("Rune Extract", 2132, 19, player, true);
player.reduceAdena("Rune Extract", 700000, player, true);
success = true;
}
break;
}
case A:
{
if ((player.getInventory().getInventoryItemCount(2133, -1) >= 5) //
&& (player.getInventory().getInventoryItemCount(57, -1) >= 3500000))
{
player.destroyItemByItemId("Rune Extract", 2133, 5, player, true);
player.reduceAdena("Rune Extract", 3500000, player, true);
success = true;
}
break;
} }
} }
if (success) // Take required items.
for (ItemHolder itemHolder : removalFee)
{ {
item.removeSpecialAbility(_position, _type); player.destroyItemByItemId("Rune Extract", itemHolder.getId(), itemHolder.getCount(), player, true);
final InventoryUpdate iu = new InventoryUpdate();
iu.addModifiedItem(item);
final int runeId = EnsoulData.getInstance().getStone(_type, option.getId());
if (runeId > 0)
{
iu.addItem(player.addItem("Rune Extract", runeId, 1, player, true));
}
player.sendInventoryUpdate(iu);
}
else
{
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
} }
player.sendPacket(new ExEnSoulExtractionResult(success, item)); // Remove equipped rune.
item.removeSpecialAbility(_position, _type);
final InventoryUpdate iu = new InventoryUpdate();
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));
}
player.sendInventoryUpdate(iu);
player.sendPacket(new ExEnSoulExtractionResult(true, item));
} }
} }