From 37fba579da51327b459bed0ec7b06bfbe604d3b4 Mon Sep 17 00:00:00 2001 From: MobiusDevelopment <8391001+MobiusDevelopment@users.noreply.github.com> Date: Sun, 14 Jun 2020 23:22:23 +0000 Subject: [PATCH] Avoid pointless boxing-unboxing operations. Contributed by Sahar. --- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 87 ++++++------------- .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 87 ++++++------------- .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 87 ++++++------------- .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 87 ++++++------------- .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 87 ++++++------------- .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 87 ++++++------------- .../stats/finalizers/BaseStatFinalizer.java | 2 +- .../data/xml/impl/ArmorSetData.java | 31 ++++--- .../l2jmobius/gameserver/model/ArmorSet.java | 81 +++++------------ .../stats/finalizers/BaseStatFinalizer.java | 2 +- 45 files changed, 663 insertions(+), 1083 deletions(-) diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_1.0_Ertheia/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_2.5_Underground/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_3.0_Helios/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_4.0_GrandCrusade/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_5.0_Salvation/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index 9eeec926e4..0390cebab5 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,12 +129,12 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); final int artifactSlotMask = parseInteger(attrs, "slotMask", 0); final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); }); break; } @@ -140,14 +143,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ArmorSet.java index 461ceb4090..4a9afe8bfc 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -88,16 +86,15 @@ public class ArmorSet }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -121,51 +118,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -175,16 +143,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -200,7 +158,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -210,7 +168,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -220,7 +178,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -249,7 +207,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_1_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -261,7 +219,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_2_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -273,7 +231,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_3_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -286,7 +244,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -296,6 +254,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_5.5_EtinasFate/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index 9eeec926e4..0390cebab5 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,12 +129,12 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); final int artifactSlotMask = parseInteger(attrs, "slotMask", 0); final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); }); break; } @@ -140,14 +143,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ArmorSet.java index 461ceb4090..4a9afe8bfc 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -88,16 +86,15 @@ public class ArmorSet }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -121,51 +118,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -175,16 +143,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -200,7 +158,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -210,7 +168,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -220,7 +178,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -249,7 +207,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_1_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -261,7 +219,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_2_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -273,7 +231,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_3_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -286,7 +244,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -296,6 +254,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_6.0_Fafurion/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index 9eeec926e4..0390cebab5 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,12 +129,12 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); final int artifactSlotMask = parseInteger(attrs, "slotMask", 0); final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); }); break; } @@ -140,14 +143,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ArmorSet.java index 461ceb4090..4a9afe8bfc 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -88,16 +86,15 @@ public class ArmorSet }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -121,51 +118,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -175,16 +143,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -200,7 +158,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -210,7 +168,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -220,7 +178,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -249,7 +207,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_1_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -261,7 +219,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_2_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -273,7 +231,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_3_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -286,7 +244,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -296,6 +254,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_7.0_PreludeOfWar/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_2.0_Saviors/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_2.1_Zaken/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_2.2_Antharas/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index 9eeec926e4..0390cebab5 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,12 +129,12 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); final int artifactSlotMask = parseInteger(attrs, "slotMask", 0); final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); }); break; } @@ -140,14 +143,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ArmorSet.java index 461ceb4090..4a9afe8bfc 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -88,16 +86,15 @@ public class ArmorSet }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -121,51 +118,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -175,16 +143,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -200,7 +158,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -210,7 +168,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -220,7 +178,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -249,7 +207,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_1_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -261,7 +219,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_2_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -273,7 +231,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_3_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -286,7 +244,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -296,6 +254,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_2.3_SevenSigns/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index 9eeec926e4..0390cebab5 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,12 +129,12 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); final int artifactSlotMask = parseInteger(attrs, "slotMask", 0); final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); }); break; } @@ -140,14 +143,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ArmorSet.java index 461ceb4090..4a9afe8bfc 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -88,16 +86,15 @@ public class ArmorSet }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -121,51 +118,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -175,16 +143,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -200,7 +158,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -210,7 +168,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -220,7 +178,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -249,7 +207,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_1_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -261,7 +219,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_2_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -273,7 +231,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_3_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -286,7 +244,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -296,6 +254,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_2.4_SecretOfEmpire/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index 9eeec926e4..0390cebab5 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,12 +129,12 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); final int artifactSlotMask = parseInteger(attrs, "slotMask", 0); final int artifactBookSlot = parseInteger(attrs, "bookSlot", 0); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional, artifactSlotMask, artifactBookSlot)); }); break; } @@ -140,14 +143,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ArmorSet.java index 461ceb4090..4a9afe8bfc 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -88,16 +86,15 @@ public class ArmorSet }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -121,51 +118,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -175,16 +143,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -200,7 +158,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -210,7 +168,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -220,7 +178,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -249,7 +207,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_1_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -261,7 +219,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_2_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -273,7 +231,7 @@ public class ArmorSet for (int artifactSlot : ARTIFACT_3_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(artifactSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId())) { slotMask += artifactSlot; } @@ -286,7 +244,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -296,6 +254,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_3.0_TheKamael/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java index ab57dcf58d..57d074127b 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/data/xml/impl/ArmorSetData.java @@ -18,9 +18,13 @@ package org.l2jmobius.gameserver.data.xml.impl; import java.io.File; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Logger; import java.util.stream.Stream; @@ -74,11 +78,10 @@ public class ArmorSetData implements IXmlReader final int id = parseInteger(setNode.getAttributes(), "id"); final int minimumPieces = parseInteger(setNode.getAttributes(), "minimumPieces", 0); final boolean isVisual = parseBoolean(setNode.getAttributes(), "visual", false); - final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual); - if (_armorSets.putIfAbsent(id, set) != null) - { - LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); - } + final Set requiredItems = new LinkedHashSet<>(); + final Set optionalItems = new LinkedHashSet<>(); + final List skills = new ArrayList<>(); + final Map stats = new LinkedHashMap<>(); for (Node innerSetNode = setNode.getFirstChild(); innerSetNode != null; innerSetNode = innerSetNode.getNextSibling()) { switch (innerSetNode.getNodeName()) @@ -94,7 +97,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing required item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addRequiredItem(itemId)) + else if (!requiredItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate required item " + item + " to a set: " + f.getName()); } @@ -112,7 +115,7 @@ public class ArmorSetData implements IXmlReader { LOGGER.warning("Attempting to register non existing optional item: " + itemId + " to a set: " + f.getName()); } - else if (!set.addOptionalItem(itemId)) + else if (!optionalItems.add(itemId)) { LOGGER.warning("Attempting to register duplicate optional item " + item + " to a set: " + f.getName()); } @@ -126,10 +129,10 @@ public class ArmorSetData implements IXmlReader final NamedNodeMap attrs = node.getAttributes(); final int skillId = parseInteger(attrs, "id"); final int skillLevel = parseInteger(attrs, "level"); - final int minPieces = parseInteger(attrs, "minimumPieces", set.getMinimumPieces()); + final int minPieces = parseInteger(attrs, "minimumPieces", minimumPieces); final int minEnchant = parseInteger(attrs, "minimumEnchant", 0); final boolean isOptional = parseBoolean(attrs, "optional", false); - set.addSkill(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); + skills.add(new ArmorsetSkillHolder(skillId, skillLevel, minPieces, minEnchant, isOptional)); }); break; } @@ -138,14 +141,20 @@ public class ArmorSetData implements IXmlReader forEach(innerSetNode, b -> "stat".equals(b.getNodeName()), node -> { final NamedNodeMap attrs = node.getAttributes(); - set.addStatsBonus(parseEnum(attrs, BaseStat.class, "type"), parseInteger(attrs, "val")); + stats.put(parseEnum(attrs, BaseStat.class, "type"), parseDouble(attrs, "val")); }); break; } } } - Stream.concat(set.getRequiredItems().stream(), set.getOptionalItems().stream()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); + final ArmorSet set = new ArmorSet(id, minimumPieces, isVisual, requiredItems, optionalItems, skills, stats); + if (_armorSets.putIfAbsent(id, set) != null) + { + LOGGER.warning("Duplicate set entry with id: " + id + " in file: " + f.getName()); + } + + Stream.concat(Arrays.stream(set.getRequiredItems()).boxed(), Arrays.stream(set.getOptionalItems()).boxed()).forEach(itemHolder -> _armorSetItems.computeIfAbsent(itemHolder, key -> new ArrayList<>()).add(set)); } } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ArmorSet.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ArmorSet.java index 1eadae30e9..e48a079234 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ArmorSet.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/ArmorSet.java @@ -16,14 +16,12 @@ */ package org.l2jmobius.gameserver.model; -import java.util.ArrayList; -import java.util.LinkedHashMap; -import java.util.LinkedHashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.function.Function; +import org.l2jmobius.commons.util.CommonUtil; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.itemcontainer.Inventory; @@ -40,11 +38,11 @@ public class ArmorSet private final int _minimumPieces; private final boolean _isVisual; - private final Set _requiredItems = new LinkedHashSet<>(); - private final Set _optionalItems = new LinkedHashSet<>(); + private final int[] _requiredItems; + private final int[] _optionalItems; - private final List _skills = new ArrayList<>(); - private final Map _stats = new LinkedHashMap<>(); + private final List _skills; + private final Map _stats; private static final int[] ARMORSET_SLOTS = new int[] { @@ -55,16 +53,15 @@ public class ArmorSet Inventory.PAPERDOLL_FEET }; - /** - * @param id - * @param minimumPieces - * @param isVisual - */ - public ArmorSet(int id, int minimumPieces, boolean isVisual) + public ArmorSet(int id, int minimumPieces, boolean isVisual, Set requiredItems, Set optionalItems, List skills, Map stats) { _id = id; _minimumPieces = minimumPieces; _isVisual = isVisual; + _requiredItems = requiredItems.stream().mapToInt(x -> x).toArray(); + _optionalItems = optionalItems.stream().mapToInt(x -> x).toArray(); + _skills = skills; + _stats = stats; } public int getId() @@ -88,51 +85,22 @@ public class ArmorSet return _isVisual; } - /** - * Adds an item to the set - * @param item - * @return {@code true} if item was successfully added, {@code false} in case it already exists - */ - public boolean addRequiredItem(Integer item) - { - return _requiredItems.add(item); - } - /** * @return the set of items that can form a set */ - public Set getRequiredItems() + public int[] getRequiredItems() { return _requiredItems; } - /** - * Adds an shield to the set - * @param item - * @return {@code true} if shield was successfully added, {@code false} in case it already exists - */ - public boolean addOptionalItem(Integer item) - { - return _optionalItems.add(item); - } - /** * @return the set of shields */ - public Set getOptionalItems() + public int[] getOptionalItems() { return _optionalItems; } - /** - * Adds an skill to the set - * @param holder - */ - public void addSkill(ArmorsetSkillHolder holder) - { - _skills.add(holder); - } - /** * The list of skills that are activated when set reaches it's minimal equipped items condition * @return @@ -142,16 +110,6 @@ public class ArmorSet return _skills; } - /** - * Adds stats bonus to the set activated when set reaches it's minimal equipped items condition - * @param stat - * @param value - */ - public void addStatsBonus(BaseStat stat, double value) - { - _stats.putIfAbsent(stat, value); - } - /** * @param stat * @return the stats bonus value or 0 if doesn't exists @@ -167,7 +125,7 @@ public class ArmorSet */ public boolean containOptionalItem(int shieldId) { - return _optionalItems.contains(shieldId); + return CommonUtil.contains(_optionalItems, shieldId); } /** @@ -177,7 +135,7 @@ public class ArmorSet public int getLowestSetEnchant(PlayerInstance player) { // Player don't have full set - if (getPiecesCount(player, ItemInstance::getId) < _minimumPieces) + if (getPiecesCountById(player) < _minimumPieces) { return 0; } @@ -187,7 +145,7 @@ public class ArmorSet for (int armorSlot : ARMORSET_SLOTS) { final ItemInstance itemPart = inv.getPaperdollItem(armorSlot); - if ((itemPart != null) && _requiredItems.contains(itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) + if ((itemPart != null) && CommonUtil.contains(_requiredItems, itemPart.getId()) && (enchantLevel > itemPart.getEnchantLevel())) { enchantLevel = itemPart.getEnchantLevel(); } @@ -201,7 +159,7 @@ public class ArmorSet public boolean hasOptionalEquipped(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItems().stream().anyMatch(item -> _optionalItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item))); } /** @@ -211,6 +169,11 @@ public class ArmorSet */ public long getPiecesCount(PlayerInstance player, Function idProvider) { - return player.getInventory().getPaperdollItemCount(item -> _requiredItems.contains(idProvider.apply(item))); + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item))); + } + + public long getPiecesCountById(PlayerInstance player) + { + return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId())); } } diff --git a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java index 9f1b7359b9..58369ad827 100644 --- a/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java +++ b/L2J_Mobius_Classic_Interlude/java/org/l2jmobius/gameserver/model/stats/finalizers/BaseStatFinalizer.java @@ -53,7 +53,7 @@ public class BaseStatFinalizer implements IStatFunction { for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId())) { - if ((set.getPiecesCount(player, ItemInstance::getId) >= set.getMinimumPieces()) && appliedSets.add(set)) + if ((set.getPiecesCountById(player) >= set.getMinimumPieces()) && appliedSets.add(set)) { baseValue += set.getStatsBonus(BaseStat.valueOf(stat)); }