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">
<first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) -->
<reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
<remove itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
</fee>
<fee crystalType="C">
<first itemId="2131" count="177" /> <!-- Gemstone (C-grade) -->
<reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
<remove itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
</fee>
<fee crystalType="B">
<first itemId="2132" count="112" /> <!-- 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 crystalType="A">
<first itemId="2133" count="24" /> <!-- 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>
</list>

View File

@ -34,6 +34,7 @@
<xs:element name="reNormal" minOccurs="0" type="fee" />
<xs:element name="reSecondary" 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:attribute type="crystalType" name="crystalType" use="required" />
</xs:complexType>

View File

@ -17,6 +17,8 @@
package com.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
@ -122,6 +124,11 @@ public class EnsoulData implements IGameXmlReader
parseReFee(feeNode, fee, 2);
break;
}
case "remove":
{
parseRemove(feeNode, fee);
break;
}
}
});
}
@ -143,6 +150,14 @@ public class EnsoulData implements IGameXmlReader
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)
{
final NamedNodeMap attrs = ensoulNode.getAttributes();
@ -177,6 +192,12 @@ public class EnsoulData implements IGameXmlReader
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)
{
return _ensoulOptions.get(id);

View File

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

View File

@ -16,10 +16,13 @@
*/
package com.l2jmobius.gameserver.network.clientpackets.ensoul;
import java.util.Collection;
import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
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.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId;
@ -74,72 +77,42 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
return;
}
boolean success = false;
// TODO: Move to XML.
switch (item.getItem().getItemGrade())
final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getItem().getCrystalType());
if (removalFee.isEmpty())
{
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.destroyItemByItemId("Rune Extract", 2130, 89, player, true);
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;
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
player.sendPacket(new ExEnSoulExtractionResult(false, item));
return;
}
}
if (success)
// Take required items.
for (ItemHolder itemHolder : removalFee)
{
item.removeSpecialAbility(_position, _type);
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.destroyItemByItemId("Rune Extract", itemHolder.getId(), itemHolder.getCount(), player, true);
}
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">
<first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) -->
<reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
<remove itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
</fee>
<fee crystalType="C">
<first itemId="2131" count="177" /> <!-- Gemstone (C-grade) -->
<reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
<remove itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
</fee>
<fee crystalType="B">
<first itemId="2132" count="112" /> <!-- 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 crystalType="A">
<first itemId="2133" count="24" /> <!-- 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>
</list>

View File

@ -34,6 +34,7 @@
<xs:element name="reNormal" minOccurs="0" type="fee" />
<xs:element name="reSecondary" 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:attribute type="crystalType" name="crystalType" use="required" />
</xs:complexType>

View File

@ -17,6 +17,8 @@
package com.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
@ -122,6 +124,11 @@ public class EnsoulData implements IGameXmlReader
parseReFee(feeNode, fee, 2);
break;
}
case "remove":
{
parseRemove(feeNode, fee);
break;
}
}
});
}
@ -143,6 +150,14 @@ public class EnsoulData implements IGameXmlReader
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)
{
final NamedNodeMap attrs = ensoulNode.getAttributes();
@ -177,6 +192,12 @@ public class EnsoulData implements IGameXmlReader
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)
{
return _ensoulOptions.get(id);

View File

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

View File

@ -16,10 +16,13 @@
*/
package com.l2jmobius.gameserver.network.clientpackets.ensoul;
import java.util.Collection;
import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
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.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId;
@ -74,72 +77,42 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
return;
}
boolean success = false;
// TODO: Move to XML.
switch (item.getItem().getItemGrade())
final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getItem().getCrystalType());
if (removalFee.isEmpty())
{
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.destroyItemByItemId("Rune Extract", 2130, 89, player, true);
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;
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
player.sendPacket(new ExEnSoulExtractionResult(false, item));
return;
}
}
if (success)
// Take required items.
for (ItemHolder itemHolder : removalFee)
{
item.removeSpecialAbility(_position, _type);
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.destroyItemByItemId("Rune Extract", itemHolder.getId(), itemHolder.getCount(), player, true);
}
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">
<first itemId="2130" count="107" /> <!-- Gemstone (D-grade-grade) -->
<reNormal itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
<remove itemId="2130" count="89" /> <!-- Gemstone (D-grade) -->
</fee>
<fee crystalType="C">
<first itemId="2131" count="177" /> <!-- Gemstone (C-grade) -->
<reNormal itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
<remove itemId="2131" count="89" /> <!-- Gemstone (C-grade) -->
</fee>
<fee crystalType="B">
<first itemId="2132" count="112" /> <!-- 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 crystalType="A">
<first itemId="2133" count="24" /> <!-- 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>
</list>

View File

@ -34,6 +34,7 @@
<xs:element name="reNormal" minOccurs="0" type="fee" />
<xs:element name="reSecondary" 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:attribute type="crystalType" name="crystalType" use="required" />
</xs:complexType>

View File

@ -17,6 +17,8 @@
package com.l2jmobius.gameserver.data.xml.impl;
import java.io.File;
import java.util.Collection;
import java.util.Collections;
import java.util.EnumMap;
import java.util.HashMap;
import java.util.Map;
@ -122,6 +124,11 @@ public class EnsoulData implements IGameXmlReader
parseReFee(feeNode, fee, 2);
break;
}
case "remove":
{
parseRemove(feeNode, fee);
break;
}
}
});
}
@ -143,6 +150,14 @@ public class EnsoulData implements IGameXmlReader
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)
{
final NamedNodeMap attrs = ensoulNode.getAttributes();
@ -177,6 +192,12 @@ public class EnsoulData implements IGameXmlReader
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)
{
return _ensoulOptions.get(id);

View File

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

View File

@ -16,10 +16,13 @@
*/
package com.l2jmobius.gameserver.network.clientpackets.ensoul;
import java.util.Collection;
import com.l2jmobius.commons.network.PacketReader;
import com.l2jmobius.gameserver.data.xml.impl.EnsoulData;
import com.l2jmobius.gameserver.model.actor.instance.L2PcInstance;
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.network.L2GameClient;
import com.l2jmobius.gameserver.network.SystemMessageId;
@ -74,72 +77,42 @@ public class RequestTryEnSoulExtraction implements IClientIncomingPacket
return;
}
boolean success = false;
// TODO: Move to XML.
switch (item.getItem().getItemGrade())
final Collection<ItemHolder> removalFee = EnsoulData.getInstance().getRemovalFee(item.getItem().getCrystalType());
if (removalFee.isEmpty())
{
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.destroyItemByItemId("Rune Extract", 2130, 89, player, true);
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;
player.sendPacket(SystemMessageId.INCORRECT_ITEM_COUNT);
player.sendPacket(new ExEnSoulExtractionResult(false, item));
return;
}
}
if (success)
// Take required items.
for (ItemHolder itemHolder : removalFee)
{
item.removeSpecialAbility(_position, _type);
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.destroyItemByItemId("Rune Extract", itemHolder.getId(), itemHolder.getCount(), player, true);
}
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));
}
}