Avoid pointless boxing-unboxing operations.

Contributed by Sahar.
This commit is contained in:
MobiusDevelopment
2020-06-14 23:22:23 +00:00
parent 860d393948
commit 37fba579da
45 changed files with 663 additions and 1083 deletions

View File

@ -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<Integer> requiredItems = new LinkedHashSet<>();
final Set<Integer> optionalItems = new LinkedHashSet<>();
final List<ArmorsetSkillHolder> skills = new ArrayList<>();
final Map<BaseStat, Double> 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));
}
}
}

View File

@ -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<Integer> _requiredItems = new LinkedHashSet<>();
private final Set<Integer> _optionalItems = new LinkedHashSet<>();
private final int[] _requiredItems;
private final int[] _optionalItems;
private final List<ArmorsetSkillHolder> _skills = new ArrayList<>();
private final Map<BaseStat, Double> _stats = new LinkedHashMap<>();
private final List<ArmorsetSkillHolder> _skills;
private final Map<BaseStat, Double> _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<Integer> requiredItems, Set<Integer> optionalItems, List<ArmorsetSkillHolder> skills, Map<BaseStat, Double> 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<Integer> 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<Integer> 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<ItemInstance, Integer> 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<ItemInstance, Integer> 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()));
}
}

View File

@ -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));
}