Unhardcoded Rune extraction fees.
This commit is contained in:
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
@@ -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>
|
||||||
|
@@ -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>
|
||||||
|
@@ -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);
|
||||||
|
@@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -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));
|
||||||
}
|
}
|
||||||
}
|
}
|
Reference in New Issue
Block a user