diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java index 45b6eb8f65..07bd61107e 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java @@ -143,9 +143,9 @@ public class HealerTrainer extends AbstractNpcAI if (skill != null) { player.removeSkill(skill); - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { - player.addItem("Cleanse", item.getId(), item.getCount(), npc, true); + player.addItem("Cleanse", item.get(0).getId(), item.get(0).getCount(), npc, true); } hasSkills = true; } diff --git a/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/skillTrees.xsd b/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/skillTrees.xsd index 5e33ebeb22..e7620cee10 100644 --- a/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/skillTrees.xsd +++ b/L2J_Mobius_08.2_Homunculus/dist/game/data/xsd/skillTrees.xsd @@ -83,7 +83,7 @@ - + diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java index ca39c87f1d..0378e5b3b7 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java @@ -243,7 +243,13 @@ public class SkillTreeData implements IXmlReader { case "item": { - skillLearn.addRequiredItem(new ItemHolder(parseInteger(attrs, "id"), parseInteger(attrs, "count"))); + final List itemList = new ArrayList<>(1); + final int count = parseInteger(attrs, "count"); + for (String id : parseString(attrs, "id").split(",")) + { + itemList.add(new ItemHolder(Integer.parseInt(id), count)); + } + skillLearn.addRequiredItem(itemList); break; } case "preRequisiteSkill": diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/SkillLearn.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/SkillLearn.java index 3d5704b5f2..8587236ce7 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/SkillLearn.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/model/SkillLearn.java @@ -16,8 +16,10 @@ */ package org.l2jmobius.gameserver.model; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.l2jmobius.gameserver.data.xml.SkillData; @@ -39,7 +41,7 @@ public class SkillLearn private final int _getDualClassLevel; private final boolean _autoGet; private final long _levelUpSp; - private final Set _requiredItems = new HashSet<>(1); + private final List> _requiredItems = new ArrayList<>(1); private final Set _races = EnumSet.noneOf(Race.class); private final Set _preReqSkills = new HashSet<>(1); private SocialClass _socialClass; @@ -134,18 +136,18 @@ public class SkillLearn /** * @return the set with the item holders required to acquire this skill. */ - public Set getRequiredItems() + public List> getRequiredItems() { return _requiredItems; } /** - * Adds a required item holder to learn this skill. - * @param item the required item holder. + * Adds a required item holder list to learn this skill. + * @param list the required item holder list. */ - public void addRequiredItem(ItemHolder item) + public void addRequiredItem(List list) { - _requiredItems.add(item); + _requiredItems.add(list); } /** diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index e868730165..e37d90515e 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -209,18 +209,26 @@ public class RequestAcquireSkill implements IClientIncomingPacket return; } - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_S_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } if (repCost > 0) @@ -566,25 +574,46 @@ public class RequestAcquireSkill implements IClientIncomingPacket if (!skillLearn.getRequiredItems().isEmpty()) { // Then checks that the player has all the items - long reqItemCount = 0; - for (ItemHolder item : skillLearn.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : skillLearn.getRequiredItems()) { - reqItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); - if (reqItemCount < item.getCount()) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Player doesn't have required item. - player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); - showSkillList(trainer, player); - return false; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if (playerItemCount >= item.getCount()) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); + showSkillList(trainer, player); + return false; + } } } // If the player has all required items, they are consumed. - for (ItemHolder itemIdCount : skillLearn.getRequiredItems()) + for (List items : skillLearn.getRequiredItems()) { - if (!player.destroyItemByItemId("SkillLearn", itemIdCount.getId(), itemIdCount.getCount(), trainer, true)) + count = 0; + SEARCH: for (ItemHolder item : items) { - Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + itemIdCount.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SkillLearn", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + item.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + } } } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java index bb3d9aab06..4c07f326f9 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java @@ -76,15 +76,15 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = skillLearn.getLevelUpSp(); _type = skillType; _reqs = new ArrayList<>(); - if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED) + if (!skillLearn.getRequiredItems().isEmpty() && ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)) { - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { if (!Config.DIVINE_SP_BOOK_NEEDED && (_id == CommonSkill.DIVINE_INSPIRATION.getId())) { continue; } - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); } } } @@ -103,9 +103,12 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = sp; _type = skillType; _reqs = new ArrayList<>(); - for (ItemHolder item : skillLearn.getRequiredItems()) + if (!skillLearn.getRequiredItems().isEmpty()) { - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + for (List item : skillLearn.getRequiredItems()) + { + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); + } } } diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java index ea54a2c64f..1e3915c663 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java @@ -17,6 +17,7 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -65,10 +66,10 @@ public class AcquireSkillList implements IClientOutgoingPacket packet.writeC(skill.getDualClassLevel()); packet.writeC(_player.getKnownSkill(skill.getSkillId()) != null ? 0 : 1); packet.writeC(skill.getRequiredItems().size()); - for (ItemHolder item : skill.getRequiredItems()) + for (List item : skill.getRequiredItems()) { - packet.writeD(item.getId()); - packet.writeQ(item.getCount()); + packet.writeD(item.get(0).getId()); + packet.writeQ(item.get(0).getCount()); } final Collection removeSkills = skill.getRemoveSkills().stream().map(_player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); packet.writeC(removeSkills.size()); diff --git a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java index eb5bfd05d8..0627a0c098 100644 --- a/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/L2J_Mobius_08.2_Homunculus/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketWriter; @@ -38,7 +37,7 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket private final int _dualClassLevel; private final long _spCost; private final int _minLevel; - private final Set _itemReq; + private final List> _itemReq; private final List _skillRem; /** @@ -68,10 +67,10 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket packet.writeH(_minLevel); packet.writeH(_dualClassLevel); packet.writeD(_itemReq.size()); - for (ItemHolder holder : _itemReq) + for (List holder : _itemReq) { - packet.writeD(holder.getId()); - packet.writeQ(holder.getCount()); + packet.writeD(holder.get(0).getId()); + packet.writeQ(holder.get(0).getCount()); } packet.writeD(_skillRem.size()); for (Skill skill : _skillRem) diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java index 45b6eb8f65..07bd61107e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java @@ -143,9 +143,9 @@ public class HealerTrainer extends AbstractNpcAI if (skill != null) { player.removeSkill(skill); - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { - player.addItem("Cleanse", item.getId(), item.getCount(), npc, true); + player.addItem("Cleanse", item.get(0).getId(), item.get(0).getCount(), npc, true); } hasSkills = true; } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml index 1625dbf777..a14ce4825e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml @@ -396,7 +396,7 @@ - + @@ -411,7 +411,7 @@ - + @@ -425,7 +425,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml index 3536e7d312..5b88010cc2 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml @@ -396,7 +396,7 @@ - + @@ -410,7 +410,7 @@ - + @@ -421,7 +421,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml index 7a3faccbe6..47dac6249d 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml @@ -365,7 +365,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -403,14 +403,14 @@ - + - + @@ -420,7 +420,7 @@ - + @@ -428,7 +428,7 @@ - + @@ -445,7 +445,7 @@ - + @@ -474,7 +474,7 @@ - + @@ -503,7 +503,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml index eadc592c19..699adb8b4b 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml @@ -378,10 +378,10 @@ - + - + @@ -394,7 +394,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml index 116915093a..6df71dc69f 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml @@ -374,7 +374,7 @@ - + @@ -391,7 +391,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml index f2bebdbb41..d47da4329d 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml @@ -384,7 +384,7 @@ - + @@ -392,7 +392,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml index 5fc9e07b5a..f1b4cc6d32 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml @@ -389,7 +389,7 @@ - + @@ -412,7 +412,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml index 26df21ac57..46f5850250 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml @@ -372,7 +372,7 @@ - + @@ -392,7 +392,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDominator.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDominator.xml index 5910e25a7e..e3f905cc8b 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDominator.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDominator.xml @@ -332,7 +332,7 @@ - + @@ -351,7 +351,7 @@ - + @@ -381,7 +381,7 @@ - + @@ -397,7 +397,7 @@ - + @@ -419,7 +419,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml index 542c627828..50fe3a2477 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml @@ -311,7 +311,7 @@ - + @@ -330,7 +330,7 @@ - + @@ -356,7 +356,7 @@ - + @@ -367,7 +367,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -392,7 +392,7 @@ - + @@ -401,7 +401,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssHierophant.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssHierophant.xml index de26778304..dc36e5c294 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssHierophant.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssHierophant.xml @@ -318,7 +318,7 @@ - + @@ -338,7 +338,7 @@ - + @@ -364,7 +364,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -385,7 +385,7 @@ - + @@ -401,7 +401,7 @@ - + @@ -410,7 +410,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml index e2b56debee..f64e782b4a 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml @@ -315,7 +315,7 @@ - + @@ -333,7 +333,7 @@ - + @@ -360,7 +360,7 @@ - + @@ -378,13 +378,13 @@ - + - + - + @@ -399,7 +399,7 @@ - + @@ -407,7 +407,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml index a0c2466f7a..fb077bff81 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml @@ -325,7 +325,7 @@ - + @@ -345,7 +345,7 @@ - + @@ -383,14 +383,14 @@ - + - + - + @@ -399,7 +399,7 @@ - + @@ -415,7 +415,7 @@ - + @@ -425,7 +425,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml index cc4789487d..154218d3d4 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml @@ -365,7 +365,7 @@ - + @@ -382,7 +382,7 @@ - + @@ -412,7 +412,7 @@ - + @@ -442,7 +442,7 @@ - + @@ -472,7 +472,7 @@ - + @@ -502,7 +502,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml index 02f4e5f37b..e04a69bf8a 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml @@ -367,7 +367,7 @@ - + @@ -381,7 +381,7 @@ - + @@ -411,7 +411,7 @@ - + @@ -441,7 +441,7 @@ - + @@ -472,7 +472,7 @@ - + @@ -502,7 +502,7 @@ - + @@ -539,7 +539,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml index 6af4f4cabc..e70b7495fc 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml @@ -368,7 +368,7 @@ - + @@ -380,7 +380,7 @@ - + @@ -410,7 +410,7 @@ - + @@ -440,7 +440,7 @@ - + @@ -470,7 +470,7 @@ - + @@ -500,7 +500,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml index 39acfc2da1..247b87264e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml @@ -369,11 +369,11 @@ - + - + @@ -403,7 +403,7 @@ - + @@ -433,7 +433,7 @@ - + @@ -464,7 +464,7 @@ - + @@ -493,7 +493,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml index 36b7120fed..ba0ee81993 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml @@ -343,7 +343,7 @@ - + @@ -367,12 +367,12 @@ - + - + @@ -383,7 +383,7 @@ - + @@ -413,7 +413,7 @@ - + @@ -442,7 +442,7 @@ - + @@ -469,7 +469,7 @@ - + @@ -495,7 +495,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml index c6516dd322..614f506738 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml @@ -339,7 +339,7 @@ - + @@ -362,12 +362,12 @@ - + - + @@ -376,7 +376,7 @@ - + @@ -405,7 +405,7 @@ - + @@ -433,7 +433,7 @@ - + @@ -460,7 +460,7 @@ - + @@ -483,7 +483,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml index 481973e3c8..eb7c336630 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml @@ -343,7 +343,7 @@ - + @@ -362,12 +362,12 @@ - + - + @@ -377,7 +377,7 @@ - + @@ -406,7 +406,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -461,7 +461,7 @@ - + @@ -485,7 +485,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml index 5a7cfd329e..328280c5ff 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml @@ -344,7 +344,7 @@ - + @@ -368,12 +368,12 @@ - + - + @@ -383,7 +383,7 @@ - + @@ -413,7 +413,7 @@ - + @@ -442,7 +442,7 @@ - + @@ -470,7 +470,7 @@ - + @@ -495,7 +495,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml index 3b87ea74e6..f8a951a926 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml @@ -340,7 +340,7 @@ - + @@ -349,7 +349,7 @@ - + @@ -361,7 +361,7 @@ - + @@ -399,7 +399,7 @@ - + @@ -408,7 +408,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -460,12 +460,12 @@ - + - + @@ -490,7 +490,7 @@ - + @@ -516,7 +516,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml index 5999d28bf3..d78c00b499 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml @@ -341,7 +341,7 @@ - + @@ -350,7 +350,7 @@ - + @@ -372,7 +372,7 @@ - + @@ -398,7 +398,7 @@ - + @@ -406,13 +406,13 @@ - + - + @@ -424,7 +424,7 @@ - + @@ -440,7 +440,7 @@ - + @@ -468,7 +468,7 @@ - + @@ -476,7 +476,7 @@ - + @@ -495,7 +495,7 @@ - + @@ -503,7 +503,7 @@ - + @@ -531,7 +531,7 @@ - + @@ -571,7 +571,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml index d3d078cb75..ec953774ef 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml @@ -338,7 +338,7 @@ - + @@ -350,7 +350,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -395,7 +395,7 @@ - + @@ -409,7 +409,7 @@ - + @@ -459,7 +459,7 @@ - + @@ -540,7 +540,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml index c12bad988c..a6f4f9700e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml @@ -343,7 +343,7 @@ - + @@ -369,7 +369,7 @@ - + @@ -386,7 +386,7 @@ - + @@ -394,7 +394,7 @@ - + @@ -443,7 +443,7 @@ - + @@ -462,7 +462,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml index 6f2c2ac1f0..2164040e46 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml @@ -377,7 +377,7 @@ - + @@ -389,7 +389,7 @@ - + @@ -406,7 +406,7 @@ - + @@ -466,7 +466,7 @@ - + @@ -485,7 +485,7 @@ - + @@ -550,7 +550,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml index d173f74e5d..690d980e3e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml @@ -358,7 +358,7 @@ - + @@ -381,7 +381,7 @@ - + @@ -391,7 +391,7 @@ - + @@ -437,7 +437,7 @@ - + @@ -454,7 +454,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml index cba7677727..f8ec0ea166 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml @@ -379,7 +379,7 @@ - + @@ -387,12 +387,12 @@ - + - + @@ -405,13 +405,13 @@ - + - + @@ -423,14 +423,14 @@ - + - + @@ -456,7 +456,7 @@ - + @@ -486,7 +486,7 @@ - + @@ -517,7 +517,7 @@ - + @@ -545,7 +545,7 @@ - + @@ -562,7 +562,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml index cf7c02fb09..71d4159d49 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml @@ -369,14 +369,14 @@ - + - + @@ -388,12 +388,12 @@ - + - + @@ -406,16 +406,16 @@ - + - + - + @@ -431,7 +431,7 @@ - + @@ -449,7 +449,7 @@ - + @@ -479,7 +479,7 @@ - + @@ -510,7 +510,7 @@ - + @@ -538,7 +538,7 @@ - + @@ -563,7 +563,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml index b75b005b30..5c1e65b5ea 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml @@ -379,20 +379,20 @@ - + - + - + @@ -405,13 +405,13 @@ - + - + @@ -421,7 +421,7 @@ - + @@ -429,7 +429,7 @@ - + @@ -455,14 +455,14 @@ - + - + @@ -488,14 +488,14 @@ - + - + @@ -522,13 +522,13 @@ - + - + @@ -553,13 +553,13 @@ - + - + @@ -574,7 +574,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml index d175ce07c4..089ca88240 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml @@ -383,7 +383,7 @@ - + @@ -393,7 +393,7 @@ - + @@ -523,7 +523,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml index 24f405c6a6..3c0337d568 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml @@ -381,7 +381,7 @@ - + @@ -391,7 +391,7 @@ - + @@ -521,7 +521,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml index 3c5d90d6f4..0e7f95e4c2 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml @@ -383,7 +383,7 @@ - + @@ -393,7 +393,7 @@ - + @@ -523,7 +523,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulTrickster.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulTrickster.xml index 5802e8bc74..78dc9dbfa3 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulTrickster.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/4rthClass/YulTrickster.xml @@ -357,7 +357,7 @@ - + @@ -386,7 +386,7 @@ - + @@ -396,7 +396,7 @@ - + @@ -526,7 +526,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml index db08ba0940..78a3fdc221 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml @@ -196,7 +196,7 @@ - + @@ -261,7 +261,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml index 65d895b0f6..6e682578cf 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml @@ -171,7 +171,7 @@ - + @@ -221,7 +221,7 @@ - + @@ -241,7 +241,7 @@ - + @@ -260,7 +260,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/skillTrees.xsd b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/skillTrees.xsd index 5e33ebeb22..e7620cee10 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/skillTrees.xsd +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/dist/game/data/xsd/skillTrees.xsd @@ -83,7 +83,7 @@ - + diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java index ca39c87f1d..0378e5b3b7 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java @@ -243,7 +243,13 @@ public class SkillTreeData implements IXmlReader { case "item": { - skillLearn.addRequiredItem(new ItemHolder(parseInteger(attrs, "id"), parseInteger(attrs, "count"))); + final List itemList = new ArrayList<>(1); + final int count = parseInteger(attrs, "count"); + for (String id : parseString(attrs, "id").split(",")) + { + itemList.add(new ItemHolder(Integer.parseInt(id), count)); + } + skillLearn.addRequiredItem(itemList); break; } case "preRequisiteSkill": diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/SkillLearn.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/SkillLearn.java index 3d5704b5f2..8587236ce7 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/SkillLearn.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/model/SkillLearn.java @@ -16,8 +16,10 @@ */ package org.l2jmobius.gameserver.model; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.l2jmobius.gameserver.data.xml.SkillData; @@ -39,7 +41,7 @@ public class SkillLearn private final int _getDualClassLevel; private final boolean _autoGet; private final long _levelUpSp; - private final Set _requiredItems = new HashSet<>(1); + private final List> _requiredItems = new ArrayList<>(1); private final Set _races = EnumSet.noneOf(Race.class); private final Set _preReqSkills = new HashSet<>(1); private SocialClass _socialClass; @@ -134,18 +136,18 @@ public class SkillLearn /** * @return the set with the item holders required to acquire this skill. */ - public Set getRequiredItems() + public List> getRequiredItems() { return _requiredItems; } /** - * Adds a required item holder to learn this skill. - * @param item the required item holder. + * Adds a required item holder list to learn this skill. + * @param list the required item holder list. */ - public void addRequiredItem(ItemHolder item) + public void addRequiredItem(List list) { - _requiredItems.add(item); + _requiredItems.add(list); } /** diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index e868730165..e37d90515e 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -209,18 +209,26 @@ public class RequestAcquireSkill implements IClientIncomingPacket return; } - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_S_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } if (repCost > 0) @@ -566,25 +574,46 @@ public class RequestAcquireSkill implements IClientIncomingPacket if (!skillLearn.getRequiredItems().isEmpty()) { // Then checks that the player has all the items - long reqItemCount = 0; - for (ItemHolder item : skillLearn.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : skillLearn.getRequiredItems()) { - reqItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); - if (reqItemCount < item.getCount()) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Player doesn't have required item. - player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); - showSkillList(trainer, player); - return false; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if (playerItemCount >= item.getCount()) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.YOU_DO_NOT_HAVE_ENOUGH_ITEMS_TO_LEARN_THIS_SKILL); + showSkillList(trainer, player); + return false; + } } } // If the player has all required items, they are consumed. - for (ItemHolder itemIdCount : skillLearn.getRequiredItems()) + for (List items : skillLearn.getRequiredItems()) { - if (!player.destroyItemByItemId("SkillLearn", itemIdCount.getId(), itemIdCount.getCount(), trainer, true)) + count = 0; + SEARCH: for (ItemHolder item : items) { - Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + itemIdCount.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SkillLearn", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + item.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + } } } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java index bb3d9aab06..4c07f326f9 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java @@ -76,15 +76,15 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = skillLearn.getLevelUpSp(); _type = skillType; _reqs = new ArrayList<>(); - if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED) + if (!skillLearn.getRequiredItems().isEmpty() && ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)) { - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { if (!Config.DIVINE_SP_BOOK_NEEDED && (_id == CommonSkill.DIVINE_INSPIRATION.getId())) { continue; } - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); } } } @@ -103,9 +103,12 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = sp; _type = skillType; _reqs = new ArrayList<>(); - for (ItemHolder item : skillLearn.getRequiredItems()) + if (!skillLearn.getRequiredItems().isEmpty()) { - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + for (List item : skillLearn.getRequiredItems()) + { + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); + } } } diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java index ea54a2c64f..1e3915c663 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java @@ -17,6 +17,7 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -65,10 +66,10 @@ public class AcquireSkillList implements IClientOutgoingPacket packet.writeC(skill.getDualClassLevel()); packet.writeC(_player.getKnownSkill(skill.getSkillId()) != null ? 0 : 1); packet.writeC(skill.getRequiredItems().size()); - for (ItemHolder item : skill.getRequiredItems()) + for (List item : skill.getRequiredItems()) { - packet.writeD(item.getId()); - packet.writeQ(item.getCount()); + packet.writeD(item.get(0).getId()); + packet.writeQ(item.get(0).getCount()); } final Collection removeSkills = skill.getRemoveSkills().stream().map(_player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); packet.writeC(removeSkills.size()); diff --git a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java index eb5bfd05d8..0627a0c098 100644 --- a/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/L2J_Mobius_09.2_ReturnOfTheQueenAnt/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketWriter; @@ -38,7 +37,7 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket private final int _dualClassLevel; private final long _spCost; private final int _minLevel; - private final Set _itemReq; + private final List> _itemReq; private final List _skillRem; /** @@ -68,10 +67,10 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket packet.writeH(_minLevel); packet.writeH(_dualClassLevel); packet.writeD(_itemReq.size()); - for (ItemHolder holder : _itemReq) + for (List holder : _itemReq) { - packet.writeD(holder.getId()); - packet.writeQ(holder.getCount()); + packet.writeD(holder.get(0).getId()); + packet.writeQ(holder.get(0).getCount()); } packet.writeD(_skillRem.size()); for (Skill skill : _skillRem) diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java index 45b6eb8f65..07bd61107e 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/scripts/ai/others/HealerTrainer/HealerTrainer.java @@ -143,9 +143,9 @@ public class HealerTrainer extends AbstractNpcAI if (skill != null) { player.removeSkill(skill); - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { - player.addItem("Cleanse", item.getId(), item.getCount(), npc, true); + player.addItem("Cleanse", item.get(0).getId(), item.get(0).getCount(), npc, true); } hasSkills = true; } diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml index ce929f5ea0..0f1596c0ea 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreCardinal.xml @@ -388,7 +388,7 @@ - + @@ -403,7 +403,7 @@ - + @@ -417,7 +417,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml index 349f984cb8..2717374d8a 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreEva'sSaint.xml @@ -388,7 +388,7 @@ - + @@ -402,7 +402,7 @@ - + @@ -413,7 +413,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml index 2fb6e96acf..593f2032e8 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/AeoreShillienSaint.xml @@ -357,7 +357,7 @@ - + @@ -369,7 +369,7 @@ - + @@ -395,14 +395,14 @@ - + - + @@ -412,7 +412,7 @@ - + @@ -420,7 +420,7 @@ - + @@ -437,7 +437,7 @@ - + @@ -466,7 +466,7 @@ - + @@ -495,7 +495,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml index 9c90dd0ee7..58cfe7ae1e 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohArchmage.xml @@ -370,10 +370,10 @@ - + - + @@ -386,7 +386,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml index a5057ccaa1..a3be523fa0 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohMysticMuse.xml @@ -366,7 +366,7 @@ - + @@ -383,7 +383,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml index 4798226f20..690c04309e 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoulhound.xml @@ -376,7 +376,7 @@ - + @@ -384,7 +384,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml index 240fcfc2b0..fdae7cad52 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohSoultaker.xml @@ -381,7 +381,7 @@ - + @@ -404,7 +404,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml index 9136865526..599720bd53 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/FeohStormScreamer.xml @@ -364,7 +364,7 @@ - + @@ -384,7 +384,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDominator.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDominator.xml index ae38f488ed..efd2586dd3 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDominator.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDominator.xml @@ -324,7 +324,7 @@ - + @@ -343,7 +343,7 @@ - + @@ -373,7 +373,7 @@ - + @@ -389,7 +389,7 @@ - + @@ -411,7 +411,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml index 05b018f9c5..daf1106afa 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssDoomcryer.xml @@ -303,7 +303,7 @@ - + @@ -322,7 +322,7 @@ - + @@ -348,7 +348,7 @@ - + @@ -359,7 +359,7 @@ - + @@ -369,7 +369,7 @@ - + @@ -384,7 +384,7 @@ - + @@ -393,7 +393,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssHierophant.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssHierophant.xml index af5ff5ec22..c8a965ee18 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssHierophant.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssHierophant.xml @@ -310,7 +310,7 @@ - + @@ -330,7 +330,7 @@ - + @@ -356,7 +356,7 @@ - + @@ -369,7 +369,7 @@ - + @@ -377,7 +377,7 @@ - + @@ -393,7 +393,7 @@ - + @@ -402,7 +402,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml index 52f78726ec..2e4a4fe963 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSpectralDancer.xml @@ -307,7 +307,7 @@ - + @@ -325,7 +325,7 @@ - + @@ -352,7 +352,7 @@ - + @@ -370,13 +370,13 @@ - + - + - + @@ -391,7 +391,7 @@ - + @@ -399,7 +399,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml index fbee60671c..f83ed6c084 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/IssSwordMuse.xml @@ -317,7 +317,7 @@ - + @@ -337,7 +337,7 @@ - + @@ -375,14 +375,14 @@ - + - + - + @@ -391,7 +391,7 @@ - + @@ -407,7 +407,7 @@ - + @@ -417,7 +417,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml index f5aa2c1bed..6897acd075 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellAdventurer.xml @@ -357,7 +357,7 @@ - + @@ -374,7 +374,7 @@ - + @@ -404,7 +404,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -464,7 +464,7 @@ - + @@ -494,7 +494,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml index ed48c07096..03da0b3a8d 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellFortuneSeeker.xml @@ -359,7 +359,7 @@ - + @@ -373,7 +373,7 @@ - + @@ -403,7 +403,7 @@ - + @@ -433,7 +433,7 @@ - + @@ -464,7 +464,7 @@ - + @@ -494,7 +494,7 @@ - + @@ -531,7 +531,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml index e3ba7f61af..8c8af7976a 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellGhostHunter.xml @@ -360,7 +360,7 @@ - + @@ -372,7 +372,7 @@ - + @@ -402,7 +402,7 @@ - + @@ -432,7 +432,7 @@ - + @@ -462,7 +462,7 @@ - + @@ -492,7 +492,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml index 0a1adb1709..57ec51affd 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/OthellWindRider.xml @@ -361,11 +361,11 @@ - + - + @@ -395,7 +395,7 @@ - + @@ -425,7 +425,7 @@ - + @@ -456,7 +456,7 @@ - + @@ -485,7 +485,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml index 892bbdae72..07721c63d3 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelEva'sTemplar.xml @@ -335,7 +335,7 @@ - + @@ -359,12 +359,12 @@ - + - + @@ -375,7 +375,7 @@ - + @@ -405,7 +405,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -461,7 +461,7 @@ - + @@ -487,7 +487,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml index 2f2c6a2d41..233a4d20c1 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelHellKnight.xml @@ -331,7 +331,7 @@ - + @@ -354,12 +354,12 @@ - + - + @@ -368,7 +368,7 @@ - + @@ -397,7 +397,7 @@ - + @@ -425,7 +425,7 @@ - + @@ -452,7 +452,7 @@ - + @@ -475,7 +475,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml index 08a3e2dd4d..f99336308c 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelPhoenixKnight.xml @@ -335,7 +335,7 @@ - + @@ -354,12 +354,12 @@ - + - + @@ -369,7 +369,7 @@ - + @@ -398,7 +398,7 @@ - + @@ -426,7 +426,7 @@ - + @@ -453,7 +453,7 @@ - + @@ -477,7 +477,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml index f0b4186edd..0c9a972473 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/SigelShillienTemplar.xml @@ -336,7 +336,7 @@ - + @@ -360,12 +360,12 @@ - + - + @@ -375,7 +375,7 @@ - + @@ -405,7 +405,7 @@ - + @@ -434,7 +434,7 @@ - + @@ -462,7 +462,7 @@ - + @@ -487,7 +487,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml index 323d165adc..d9b75f35f6 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDoombringer.xml @@ -332,7 +332,7 @@ - + @@ -341,7 +341,7 @@ - + @@ -353,7 +353,7 @@ - + @@ -391,7 +391,7 @@ - + @@ -400,7 +400,7 @@ - + @@ -426,7 +426,7 @@ - + @@ -452,12 +452,12 @@ - + - + @@ -482,7 +482,7 @@ - + @@ -508,7 +508,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml index 830bfe6122..81b03b4fee 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDreadnought.xml @@ -333,7 +333,7 @@ - + @@ -342,7 +342,7 @@ - + @@ -364,7 +364,7 @@ - + @@ -390,7 +390,7 @@ - + @@ -398,13 +398,13 @@ - + - + @@ -416,7 +416,7 @@ - + @@ -432,7 +432,7 @@ - + @@ -460,7 +460,7 @@ - + @@ -468,7 +468,7 @@ - + @@ -487,7 +487,7 @@ - + @@ -495,7 +495,7 @@ - + @@ -523,7 +523,7 @@ - + @@ -563,7 +563,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml index 4a35dbc1e4..8fbb285738 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrDuelist.xml @@ -330,7 +330,7 @@ - + @@ -342,7 +342,7 @@ - + @@ -369,7 +369,7 @@ - + @@ -387,7 +387,7 @@ - + @@ -401,7 +401,7 @@ - + @@ -451,7 +451,7 @@ - + @@ -532,7 +532,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml index 29093f0f5f..ad61879108 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrGrandKhavatari.xml @@ -335,7 +335,7 @@ - + @@ -361,7 +361,7 @@ - + @@ -378,7 +378,7 @@ - + @@ -386,7 +386,7 @@ - + @@ -435,7 +435,7 @@ - + @@ -454,7 +454,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml index ea5c82f96a..4e813e5bb4 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrMaestro.xml @@ -366,7 +366,7 @@ - + @@ -378,7 +378,7 @@ - + @@ -394,7 +394,7 @@ - + @@ -454,7 +454,7 @@ - + @@ -472,7 +472,7 @@ - + @@ -537,7 +537,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml index 895e0392f9..4fb1ce4415 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/TyrrTitan.xml @@ -350,7 +350,7 @@ - + @@ -373,7 +373,7 @@ - + @@ -383,7 +383,7 @@ - + @@ -429,7 +429,7 @@ - + @@ -446,7 +446,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml index aec454a5cd..602c9ce957 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnArcanaLord.xml @@ -371,7 +371,7 @@ - + @@ -379,12 +379,12 @@ - + - + @@ -397,13 +397,13 @@ - + - + @@ -415,14 +415,14 @@ - + - + @@ -448,7 +448,7 @@ - + @@ -478,7 +478,7 @@ - + @@ -509,7 +509,7 @@ - + @@ -537,7 +537,7 @@ - + @@ -554,7 +554,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml index 8a7569fc45..f18ae13fd5 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnElementalMaster.xml @@ -361,14 +361,14 @@ - + - + @@ -380,12 +380,12 @@ - + - + @@ -398,16 +398,16 @@ - + - + - + @@ -423,7 +423,7 @@ - + @@ -441,7 +441,7 @@ - + @@ -471,7 +471,7 @@ - + @@ -502,7 +502,7 @@ - + @@ -530,7 +530,7 @@ - + @@ -555,7 +555,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml index b60e6255a8..ba9e54c364 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/WynnSpectralMaster.xml @@ -371,20 +371,20 @@ - + - + - + @@ -397,13 +397,13 @@ - + - + @@ -413,7 +413,7 @@ - + @@ -421,7 +421,7 @@ - + @@ -447,14 +447,14 @@ - + - + @@ -480,14 +480,14 @@ - + - + @@ -514,13 +514,13 @@ - + - + @@ -545,13 +545,13 @@ - + - + @@ -566,7 +566,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml index cc5de0ee05..880b8d3bb5 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulGhostSentinel.xml @@ -375,7 +375,7 @@ - + @@ -385,7 +385,7 @@ - + @@ -515,7 +515,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml index b42038d208..15a8d9d9cf 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulMoonlightSentinel.xml @@ -373,7 +373,7 @@ - + @@ -383,7 +383,7 @@ - + @@ -513,7 +513,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml index ba152bad7d..21bc0b2fe7 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulSagittarius.xml @@ -375,7 +375,7 @@ - + @@ -385,7 +385,7 @@ - + @@ -515,7 +515,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulTrickster.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulTrickster.xml index caf998e4ba..72ff43681f 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulTrickster.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/4rthClass/YulTrickster.xml @@ -349,7 +349,7 @@ - + @@ -378,7 +378,7 @@ - + @@ -388,7 +388,7 @@ - + @@ -518,7 +518,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/DeathKnight/SigelDeathKnight.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/DeathKnight/SigelDeathKnight.xml index 1a2bf53266..c25d5b073c 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/DeathKnight/SigelDeathKnight.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/DeathKnight/SigelDeathKnight.xml @@ -96,7 +96,7 @@ - + @@ -134,10 +134,10 @@ - + - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml index 7facb3641f..8b72350fc2 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Eviscerator.xml @@ -184,7 +184,7 @@ - + @@ -249,7 +249,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml index f5fc696c63..58a08733c9 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/skillTrees/ErtheiaClass/Sayha'sSeer.xml @@ -159,7 +159,7 @@ - + @@ -209,7 +209,7 @@ - + @@ -229,7 +229,7 @@ - + @@ -248,7 +248,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/dist/game/data/xsd/skillTrees.xsd b/L2J_Mobius_10.0_MasterClass/dist/game/data/xsd/skillTrees.xsd index feb7ccb2eb..44ea9a33f0 100644 --- a/L2J_Mobius_10.0_MasterClass/dist/game/data/xsd/skillTrees.xsd +++ b/L2J_Mobius_10.0_MasterClass/dist/game/data/xsd/skillTrees.xsd @@ -83,7 +83,7 @@ - + diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java index ca39c87f1d..0378e5b3b7 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java @@ -243,7 +243,13 @@ public class SkillTreeData implements IXmlReader { case "item": { - skillLearn.addRequiredItem(new ItemHolder(parseInteger(attrs, "id"), parseInteger(attrs, "count"))); + final List itemList = new ArrayList<>(1); + final int count = parseInteger(attrs, "count"); + for (String id : parseString(attrs, "id").split(",")) + { + itemList.add(new ItemHolder(Integer.parseInt(id), count)); + } + skillLearn.addRequiredItem(itemList); break; } case "preRequisiteSkill": diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/SkillLearn.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/SkillLearn.java index 3d5704b5f2..8587236ce7 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/SkillLearn.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/model/SkillLearn.java @@ -16,8 +16,10 @@ */ package org.l2jmobius.gameserver.model; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.l2jmobius.gameserver.data.xml.SkillData; @@ -39,7 +41,7 @@ public class SkillLearn private final int _getDualClassLevel; private final boolean _autoGet; private final long _levelUpSp; - private final Set _requiredItems = new HashSet<>(1); + private final List> _requiredItems = new ArrayList<>(1); private final Set _races = EnumSet.noneOf(Race.class); private final Set _preReqSkills = new HashSet<>(1); private SocialClass _socialClass; @@ -134,18 +136,18 @@ public class SkillLearn /** * @return the set with the item holders required to acquire this skill. */ - public Set getRequiredItems() + public List> getRequiredItems() { return _requiredItems; } /** - * Adds a required item holder to learn this skill. - * @param item the required item holder. + * Adds a required item holder list to learn this skill. + * @param list the required item holder list. */ - public void addRequiredItem(ItemHolder item) + public void addRequiredItem(List list) { - _requiredItems.add(item); + _requiredItems.add(list); } /** diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index 907187a3d4..4b7c0c623f 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -209,18 +209,26 @@ public class RequestAcquireSkill implements IClientIncomingPacket return; } - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S1_X_S2_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } if (repCost > 0) @@ -566,25 +574,46 @@ public class RequestAcquireSkill implements IClientIncomingPacket if (!skillLearn.getRequiredItems().isEmpty()) { // Then checks that the player has all the items - long reqItemCount = 0; - for (ItemHolder item : skillLearn.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : skillLearn.getRequiredItems()) { - reqItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); - if (reqItemCount < item.getCount()) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Player doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - showSkillList(trainer, player); - return false; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if (playerItemCount >= item.getCount()) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + showSkillList(trainer, player); + return false; + } } } // If the player has all required items, they are consumed. - for (ItemHolder itemIdCount : skillLearn.getRequiredItems()) + for (List items : skillLearn.getRequiredItems()) { - if (!player.destroyItemByItemId("SkillLearn", itemIdCount.getId(), itemIdCount.getCount(), trainer, true)) + count = 0; + SEARCH: for (ItemHolder item : items) { - Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + itemIdCount.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SkillLearn", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + item.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + } } } } diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java index bb3d9aab06..4c07f326f9 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java @@ -76,15 +76,15 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = skillLearn.getLevelUpSp(); _type = skillType; _reqs = new ArrayList<>(); - if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED) + if (!skillLearn.getRequiredItems().isEmpty() && ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)) { - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { if (!Config.DIVINE_SP_BOOK_NEEDED && (_id == CommonSkill.DIVINE_INSPIRATION.getId())) { continue; } - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); } } } @@ -103,9 +103,12 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = sp; _type = skillType; _reqs = new ArrayList<>(); - for (ItemHolder item : skillLearn.getRequiredItems()) + if (!skillLearn.getRequiredItems().isEmpty()) { - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + for (List item : skillLearn.getRequiredItems()) + { + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); + } } } diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java index ea54a2c64f..1e3915c663 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java @@ -17,6 +17,7 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -65,10 +66,10 @@ public class AcquireSkillList implements IClientOutgoingPacket packet.writeC(skill.getDualClassLevel()); packet.writeC(_player.getKnownSkill(skill.getSkillId()) != null ? 0 : 1); packet.writeC(skill.getRequiredItems().size()); - for (ItemHolder item : skill.getRequiredItems()) + for (List item : skill.getRequiredItems()) { - packet.writeD(item.getId()); - packet.writeQ(item.getCount()); + packet.writeD(item.get(0).getId()); + packet.writeQ(item.get(0).getCount()); } final Collection removeSkills = skill.getRemoveSkills().stream().map(_player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); packet.writeC(removeSkills.size()); diff --git a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java index eb5bfd05d8..0627a0c098 100644 --- a/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/L2J_Mobius_10.0_MasterClass/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketWriter; @@ -38,7 +37,7 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket private final int _dualClassLevel; private final long _spCost; private final int _minLevel; - private final Set _itemReq; + private final List> _itemReq; private final List _skillRem; /** @@ -68,10 +67,10 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket packet.writeH(_minLevel); packet.writeH(_dualClassLevel); packet.writeD(_itemReq.size()); - for (ItemHolder holder : _itemReq) + for (List holder : _itemReq) { - packet.writeD(holder.getId()); - packet.writeQ(holder.getCount()); + packet.writeD(holder.get(0).getId()); + packet.writeQ(holder.get(0).getCount()); } packet.writeD(_skillRem.size()); for (Skill skill : _skillRem) diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/skillTrees.xsd b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/skillTrees.xsd index 573397bd90..bdea701999 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/skillTrees.xsd +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/dist/game/data/xsd/skillTrees.xsd @@ -84,7 +84,7 @@ - + diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java index aacac70793..24fdea8ed9 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java @@ -242,7 +242,13 @@ public class SkillTreeData implements IXmlReader { case "item": { - skillLearn.addRequiredItem(new ItemHolder(parseInteger(attrs, "id"), parseInteger(attrs, "count"))); + final List itemList = new ArrayList<>(1); + final int count = parseInteger(attrs, "count"); + for (String id : parseString(attrs, "id").split(",")) + { + itemList.add(new ItemHolder(Integer.parseInt(id), count)); + } + skillLearn.addRequiredItem(itemList); break; } case "preRequisiteSkill": diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/SkillLearn.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/SkillLearn.java index 3d5704b5f2..8587236ce7 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/SkillLearn.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/model/SkillLearn.java @@ -16,8 +16,10 @@ */ package org.l2jmobius.gameserver.model; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.l2jmobius.gameserver.data.xml.SkillData; @@ -39,7 +41,7 @@ public class SkillLearn private final int _getDualClassLevel; private final boolean _autoGet; private final long _levelUpSp; - private final Set _requiredItems = new HashSet<>(1); + private final List> _requiredItems = new ArrayList<>(1); private final Set _races = EnumSet.noneOf(Race.class); private final Set _preReqSkills = new HashSet<>(1); private SocialClass _socialClass; @@ -134,18 +136,18 @@ public class SkillLearn /** * @return the set with the item holders required to acquire this skill. */ - public Set getRequiredItems() + public List> getRequiredItems() { return _requiredItems; } /** - * Adds a required item holder to learn this skill. - * @param item the required item holder. + * Adds a required item holder list to learn this skill. + * @param list the required item holder list. */ - public void addRequiredItem(ItemHolder item) + public void addRequiredItem(List list) { - _requiredItems.add(item); + _requiredItems.add(list); } /** diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index ed5d8e88a7..bdb99ad32e 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -186,20 +186,27 @@ public class RequestAcquireSkill implements IClientIncomingPacket { if (Config.LIFE_CRYSTAL_NEEDED) { - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("Consume", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - VillageMaster.showPledgeSkillList(player); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("PledgeLifeCrystal", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + VillageMaster.showPledgeSkillList(player); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_S_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } } @@ -250,18 +257,26 @@ public class RequestAcquireSkill implements IClientIncomingPacket return; } - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_S_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } if (repCost > 0) @@ -533,25 +548,46 @@ public class RequestAcquireSkill implements IClientIncomingPacket if (!skillLearn.getRequiredItems().isEmpty()) { // Then checks that the player has all the items - long reqItemCount = 0; - for (ItemHolder item : skillLearn.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : skillLearn.getRequiredItems()) { - reqItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); - if (reqItemCount < item.getCount()) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Player doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - showSkillList(trainer, player); - return false; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if (playerItemCount >= item.getCount()) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + showSkillList(trainer, player); + return false; + } } } // If the player has all required items, they are consumed. - for (ItemHolder itemIdCount : skillLearn.getRequiredItems()) + for (List items : skillLearn.getRequiredItems()) { - if (!player.destroyItemByItemId("SkillLearn", itemIdCount.getId(), itemIdCount.getCount(), trainer, true)) + count = 0; + SEARCH: for (ItemHolder item : items) { - Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + itemIdCount.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SkillLearn", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + item.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + } } } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java index bb3d9aab06..4c07f326f9 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java @@ -76,15 +76,15 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = skillLearn.getLevelUpSp(); _type = skillType; _reqs = new ArrayList<>(); - if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED) + if (!skillLearn.getRequiredItems().isEmpty() && ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)) { - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { if (!Config.DIVINE_SP_BOOK_NEEDED && (_id == CommonSkill.DIVINE_INSPIRATION.getId())) { continue; } - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); } } } @@ -103,9 +103,12 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = sp; _type = skillType; _reqs = new ArrayList<>(); - for (ItemHolder item : skillLearn.getRequiredItems()) + if (!skillLearn.getRequiredItems().isEmpty()) { - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + for (List item : skillLearn.getRequiredItems()) + { + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); + } } } diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java index d58cbca67e..e0083c7368 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java @@ -17,6 +17,7 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -65,10 +66,10 @@ public class AcquireSkillList implements IClientOutgoingPacket packet.writeC(0); // Skill dual class level. packet.writeC(_player.getKnownSkill(skill.getSkillId()) != null ? 0 : 1); packet.writeC(skill.getRequiredItems().size()); - for (ItemHolder item : skill.getRequiredItems()) + for (List item : skill.getRequiredItems()) { - packet.writeD(item.getId()); - packet.writeQ(item.getCount()); + packet.writeD(item.get(0).getId()); + packet.writeQ(item.get(0).getCount()); } final Collection removeSkills = skill.getRemoveSkills().stream().map(_player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); packet.writeC(removeSkills.size()); diff --git a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java index eb5bfd05d8..0627a0c098 100644 --- a/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/L2J_Mobius_Essence_4.2_DwellingOfSpirits/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketWriter; @@ -38,7 +37,7 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket private final int _dualClassLevel; private final long _spCost; private final int _minLevel; - private final Set _itemReq; + private final List> _itemReq; private final List _skillRem; /** @@ -68,10 +67,10 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket packet.writeH(_minLevel); packet.writeH(_dualClassLevel); packet.writeD(_itemReq.size()); - for (ItemHolder holder : _itemReq) + for (List holder : _itemReq) { - packet.writeD(holder.getId()); - packet.writeQ(holder.getCount()); + packet.writeD(holder.get(0).getId()); + packet.writeQ(holder.get(0).getCount()); } packet.writeD(_skillRem.size()); for (Skill skill : _skillRem) diff --git a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/skillTrees.xsd b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/skillTrees.xsd index 573397bd90..bdea701999 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/skillTrees.xsd +++ b/L2J_Mobius_Essence_5.2_FrostLord/dist/game/data/xsd/skillTrees.xsd @@ -84,7 +84,7 @@ - + diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java index aacac70793..24fdea8ed9 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java @@ -242,7 +242,13 @@ public class SkillTreeData implements IXmlReader { case "item": { - skillLearn.addRequiredItem(new ItemHolder(parseInteger(attrs, "id"), parseInteger(attrs, "count"))); + final List itemList = new ArrayList<>(1); + final int count = parseInteger(attrs, "count"); + for (String id : parseString(attrs, "id").split(",")) + { + itemList.add(new ItemHolder(Integer.parseInt(id), count)); + } + skillLearn.addRequiredItem(itemList); break; } case "preRequisiteSkill": diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/SkillLearn.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/SkillLearn.java index 3d5704b5f2..8587236ce7 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/SkillLearn.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/model/SkillLearn.java @@ -16,8 +16,10 @@ */ package org.l2jmobius.gameserver.model; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.l2jmobius.gameserver.data.xml.SkillData; @@ -39,7 +41,7 @@ public class SkillLearn private final int _getDualClassLevel; private final boolean _autoGet; private final long _levelUpSp; - private final Set _requiredItems = new HashSet<>(1); + private final List> _requiredItems = new ArrayList<>(1); private final Set _races = EnumSet.noneOf(Race.class); private final Set _preReqSkills = new HashSet<>(1); private SocialClass _socialClass; @@ -134,18 +136,18 @@ public class SkillLearn /** * @return the set with the item holders required to acquire this skill. */ - public Set getRequiredItems() + public List> getRequiredItems() { return _requiredItems; } /** - * Adds a required item holder to learn this skill. - * @param item the required item holder. + * Adds a required item holder list to learn this skill. + * @param list the required item holder list. */ - public void addRequiredItem(ItemHolder item) + public void addRequiredItem(List list) { - _requiredItems.add(item); + _requiredItems.add(list); } /** diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index ed5d8e88a7..bdb99ad32e 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -186,20 +186,27 @@ public class RequestAcquireSkill implements IClientIncomingPacket { if (Config.LIFE_CRYSTAL_NEEDED) { - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("Consume", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - VillageMaster.showPledgeSkillList(player); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("PledgeLifeCrystal", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + VillageMaster.showPledgeSkillList(player); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_S_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } } @@ -250,18 +257,26 @@ public class RequestAcquireSkill implements IClientIncomingPacket return; } - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S2_S1_S_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } if (repCost > 0) @@ -533,25 +548,46 @@ public class RequestAcquireSkill implements IClientIncomingPacket if (!skillLearn.getRequiredItems().isEmpty()) { // Then checks that the player has all the items - long reqItemCount = 0; - for (ItemHolder item : skillLearn.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : skillLearn.getRequiredItems()) { - reqItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); - if (reqItemCount < item.getCount()) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Player doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - showSkillList(trainer, player); - return false; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if (playerItemCount >= item.getCount()) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + showSkillList(trainer, player); + return false; + } } } // If the player has all required items, they are consumed. - for (ItemHolder itemIdCount : skillLearn.getRequiredItems()) + for (List items : skillLearn.getRequiredItems()) { - if (!player.destroyItemByItemId("SkillLearn", itemIdCount.getId(), itemIdCount.getCount(), trainer, true)) + count = 0; + SEARCH: for (ItemHolder item : items) { - Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + itemIdCount.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SkillLearn", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + item.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + } } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java index bb3d9aab06..4c07f326f9 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java @@ -76,15 +76,15 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = skillLearn.getLevelUpSp(); _type = skillType; _reqs = new ArrayList<>(); - if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED) + if (!skillLearn.getRequiredItems().isEmpty() && ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)) { - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { if (!Config.DIVINE_SP_BOOK_NEEDED && (_id == CommonSkill.DIVINE_INSPIRATION.getId())) { continue; } - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); } } } @@ -103,9 +103,12 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = sp; _type = skillType; _reqs = new ArrayList<>(); - for (ItemHolder item : skillLearn.getRequiredItems()) + if (!skillLearn.getRequiredItems().isEmpty()) { - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + for (List item : skillLearn.getRequiredItems()) + { + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); + } } } diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java index d58cbca67e..e0083c7368 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java @@ -17,6 +17,7 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -65,10 +66,10 @@ public class AcquireSkillList implements IClientOutgoingPacket packet.writeC(0); // Skill dual class level. packet.writeC(_player.getKnownSkill(skill.getSkillId()) != null ? 0 : 1); packet.writeC(skill.getRequiredItems().size()); - for (ItemHolder item : skill.getRequiredItems()) + for (List item : skill.getRequiredItems()) { - packet.writeD(item.getId()); - packet.writeQ(item.getCount()); + packet.writeD(item.get(0).getId()); + packet.writeQ(item.get(0).getCount()); } final Collection removeSkills = skill.getRemoveSkills().stream().map(_player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); packet.writeC(removeSkills.size()); diff --git a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java index eb5bfd05d8..0627a0c098 100644 --- a/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/L2J_Mobius_Essence_5.2_FrostLord/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketWriter; @@ -38,7 +37,7 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket private final int _dualClassLevel; private final long _spCost; private final int _minLevel; - private final Set _itemReq; + private final List> _itemReq; private final List _skillRem; /** @@ -68,10 +67,10 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket packet.writeH(_minLevel); packet.writeH(_dualClassLevel); packet.writeD(_itemReq.size()); - for (ItemHolder holder : _itemReq) + for (List holder : _itemReq) { - packet.writeD(holder.getId()); - packet.writeQ(holder.getCount()); + packet.writeD(holder.get(0).getId()); + packet.writeQ(holder.get(0).getCount()); } packet.writeD(_skillRem.size()); for (Skill skill : _skillRem) diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/xsd/skillTrees.xsd b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/xsd/skillTrees.xsd index 573397bd90..bdea701999 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/xsd/skillTrees.xsd +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/dist/game/data/xsd/skillTrees.xsd @@ -84,7 +84,7 @@ - + diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java index aacac70793..24fdea8ed9 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/data/xml/SkillTreeData.java @@ -242,7 +242,13 @@ public class SkillTreeData implements IXmlReader { case "item": { - skillLearn.addRequiredItem(new ItemHolder(parseInteger(attrs, "id"), parseInteger(attrs, "count"))); + final List itemList = new ArrayList<>(1); + final int count = parseInteger(attrs, "count"); + for (String id : parseString(attrs, "id").split(",")) + { + itemList.add(new ItemHolder(Integer.parseInt(id), count)); + } + skillLearn.addRequiredItem(itemList); break; } case "preRequisiteSkill": diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/SkillLearn.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/SkillLearn.java index 3d5704b5f2..8587236ce7 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/SkillLearn.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/model/SkillLearn.java @@ -16,8 +16,10 @@ */ package org.l2jmobius.gameserver.model; +import java.util.ArrayList; import java.util.EnumSet; import java.util.HashSet; +import java.util.List; import java.util.Set; import org.l2jmobius.gameserver.data.xml.SkillData; @@ -39,7 +41,7 @@ public class SkillLearn private final int _getDualClassLevel; private final boolean _autoGet; private final long _levelUpSp; - private final Set _requiredItems = new HashSet<>(1); + private final List> _requiredItems = new ArrayList<>(1); private final Set _races = EnumSet.noneOf(Race.class); private final Set _preReqSkills = new HashSet<>(1); private SocialClass _socialClass; @@ -134,18 +136,18 @@ public class SkillLearn /** * @return the set with the item holders required to acquire this skill. */ - public Set getRequiredItems() + public List> getRequiredItems() { return _requiredItems; } /** - * Adds a required item holder to learn this skill. - * @param item the required item holder. + * Adds a required item holder list to learn this skill. + * @param list the required item holder list. */ - public void addRequiredItem(ItemHolder item) + public void addRequiredItem(List list) { - _requiredItems.add(item); + _requiredItems.add(list); } /** diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java index c589d7a18d..92d3ac77b0 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/clientpackets/RequestAcquireSkill.java @@ -186,20 +186,27 @@ public class RequestAcquireSkill implements IClientIncomingPacket { if (Config.LIFE_CRYSTAL_NEEDED) { - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("Consume", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - VillageMaster.showPledgeSkillList(player); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("PledgeLifeCrystal", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + VillageMaster.showPledgeSkillList(player); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S1_X_S2_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } } @@ -250,18 +257,26 @@ public class RequestAcquireSkill implements IClientIncomingPacket return; } - for (ItemHolder item : s.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : s.getRequiredItems()) { - if (!player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, false)) + count = 0; + SEARCH: for (ItemHolder item : items) { - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - return; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SubSkills", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + return; + } } - - final SystemMessage sm = new SystemMessage(SystemMessageId.S1_X_S2_DISAPPEARED); - sm.addItemName(item.getId()); - sm.addLong(item.getCount()); - player.sendPacket(sm); } if (repCost > 0) @@ -533,25 +548,46 @@ public class RequestAcquireSkill implements IClientIncomingPacket if (!skillLearn.getRequiredItems().isEmpty()) { // Then checks that the player has all the items - long reqItemCount = 0; - for (ItemHolder item : skillLearn.getRequiredItems()) + int count = 0; + long playerItemCount = 0; + for (List items : skillLearn.getRequiredItems()) { - reqItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); - if (reqItemCount < item.getCount()) + count = 0; + SEARCH: for (ItemHolder item : items) { - // Player doesn't have required item. - player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); - showSkillList(trainer, player); - return false; + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if (playerItemCount >= item.getCount()) + { + break SEARCH; + } + + if (count == items.size()) + { + player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS_TO_LEARN_THE_SKILL); + showSkillList(trainer, player); + return false; + } } } // If the player has all required items, they are consumed. - for (ItemHolder itemIdCount : skillLearn.getRequiredItems()) + for (List items : skillLearn.getRequiredItems()) { - if (!player.destroyItemByItemId("SkillLearn", itemIdCount.getId(), itemIdCount.getCount(), trainer, true)) + count = 0; + SEARCH: for (ItemHolder item : items) { - Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + itemIdCount.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + count++; + playerItemCount = player.getInventory().getInventoryItemCount(item.getId(), -1); + if ((playerItemCount >= item.getCount()) && player.destroyItemByItemId("SkillLearn", item.getId(), item.getCount(), trainer, true)) + { + break SEARCH; + } + + if (count == items.size()) + { + Util.handleIllegalPlayerAction(player, "Somehow " + player + ", level " + player.getLevel() + " lose required item Id: " + item.getId() + " to learn skill while learning skill Id: " + _id + " level " + _level + "!", IllegalActionPunishmentType.NONE); + } } } } diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java index bb3d9aab06..4c07f326f9 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillInfo.java @@ -76,15 +76,15 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = skillLearn.getLevelUpSp(); _type = skillType; _reqs = new ArrayList<>(); - if ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED) + if (!skillLearn.getRequiredItems().isEmpty() && ((skillType != AcquireSkillType.PLEDGE) || Config.LIFE_CRYSTAL_NEEDED)) { - for (ItemHolder item : skillLearn.getRequiredItems()) + for (List item : skillLearn.getRequiredItems()) { if (!Config.DIVINE_SP_BOOK_NEEDED && (_id == CommonSkill.DIVINE_INSPIRATION.getId())) { continue; } - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); } } } @@ -103,9 +103,12 @@ public class AcquireSkillInfo implements IClientOutgoingPacket _spCost = sp; _type = skillType; _reqs = new ArrayList<>(); - for (ItemHolder item : skillLearn.getRequiredItems()) + if (!skillLearn.getRequiredItems().isEmpty()) { - _reqs.add(new Req(99, item.getId(), item.getCount(), 50)); + for (List item : skillLearn.getRequiredItems()) + { + _reqs.add(new Req(99, item.get(0).getId(), item.get(0).getCount(), 50)); + } } } diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java index d58cbca67e..e0083c7368 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/AcquireSkillList.java @@ -17,6 +17,7 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.Collection; +import java.util.List; import java.util.Objects; import java.util.stream.Collectors; @@ -65,10 +66,10 @@ public class AcquireSkillList implements IClientOutgoingPacket packet.writeC(0); // Skill dual class level. packet.writeC(_player.getKnownSkill(skill.getSkillId()) != null ? 0 : 1); packet.writeC(skill.getRequiredItems().size()); - for (ItemHolder item : skill.getRequiredItems()) + for (List item : skill.getRequiredItems()) { - packet.writeD(item.getId()); - packet.writeQ(item.getCount()); + packet.writeD(item.get(0).getId()); + packet.writeQ(item.get(0).getCount()); } final Collection removeSkills = skill.getRemoveSkills().stream().map(_player::getKnownSkill).filter(Objects::nonNull).collect(Collectors.toList()); packet.writeC(removeSkills.size()); diff --git a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java index eb5bfd05d8..0627a0c098 100644 --- a/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java +++ b/L2J_Mobius_Essence_6.0_BattleChronicle/java/org/l2jmobius/gameserver/network/serverpackets/ExAcquireSkillInfo.java @@ -18,7 +18,6 @@ package org.l2jmobius.gameserver.network.serverpackets; import java.util.List; import java.util.Objects; -import java.util.Set; import java.util.stream.Collectors; import org.l2jmobius.commons.network.PacketWriter; @@ -38,7 +37,7 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket private final int _dualClassLevel; private final long _spCost; private final int _minLevel; - private final Set _itemReq; + private final List> _itemReq; private final List _skillRem; /** @@ -68,10 +67,10 @@ public class ExAcquireSkillInfo implements IClientOutgoingPacket packet.writeH(_minLevel); packet.writeH(_dualClassLevel); packet.writeD(_itemReq.size()); - for (ItemHolder holder : _itemReq) + for (List holder : _itemReq) { - packet.writeD(holder.getId()); - packet.writeQ(holder.getCount()); + packet.writeD(holder.get(0).getId()); + packet.writeQ(holder.get(0).getCount()); } packet.writeD(_skillRem.size()); for (Skill skill : _skillRem)