Removal of AtomicInteger variables from Inventory class.

This commit is contained in:
MobiusDevelopment 2020-02-03 04:04:13 +00:00
parent 980d99c48c
commit 5c532ad275
15 changed files with 1650 additions and 1162 deletions

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,43 +308,57 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -363,18 +377,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -384,11 +404,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -396,21 +417,26 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
if (item.isWeapon())
{
player.unchargeAllShots();
}
} }
@Override @Override
@ -423,8 +449,14 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final AtomicBoolean update = new AtomicBoolean(); // Any items equipped that result in expertise penalty do not give any skills at all.
final AtomicBoolean updateTimestamp = new AtomicBoolean(); if (item.getItem().getCrystalType().getId() > player.getExpertiseLevel())
{
return;
}
boolean update = false;
boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -435,58 +467,72 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -498,19 +544,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -571,8 +617,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -601,16 +647,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,15 +308,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -324,30 +328,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -366,18 +380,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -387,11 +407,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -399,18 +420,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -437,8 +458,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -449,21 +470,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -471,39 +496,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -515,19 +550,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -588,8 +623,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -618,16 +653,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,15 +308,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -324,30 +328,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -366,18 +380,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -387,11 +407,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -399,18 +420,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -437,8 +458,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -449,21 +470,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -471,39 +496,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -515,19 +550,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -588,8 +623,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -618,16 +653,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,15 +308,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -324,30 +328,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -366,18 +380,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -387,11 +407,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -399,18 +420,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -437,8 +458,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -449,21 +470,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -471,39 +496,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -515,19 +550,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -588,8 +623,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -618,16 +653,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -301,8 +301,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -313,15 +313,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -329,30 +333,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -371,18 +385,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -392,11 +412,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -404,18 +425,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -442,8 +463,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -454,21 +475,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -476,39 +501,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -520,19 +555,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -593,8 +628,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -623,16 +658,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -324,8 +324,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -336,15 +336,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -352,30 +356,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -394,18 +408,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -415,11 +435,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -427,18 +448,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -465,8 +486,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -477,21 +498,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -499,39 +524,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -543,19 +578,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -616,8 +651,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -646,16 +681,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -324,8 +324,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -336,15 +336,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -352,30 +356,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -394,18 +408,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -415,11 +435,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -427,18 +448,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -465,8 +486,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -477,21 +498,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -499,39 +524,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -543,19 +578,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -616,8 +651,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -646,16 +681,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -324,8 +324,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -336,15 +336,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -352,30 +356,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -394,18 +408,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -415,11 +435,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -427,18 +448,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -458,8 +479,8 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -470,21 +491,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -492,39 +517,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -536,19 +571,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -609,8 +644,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -639,16 +674,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,15 +308,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -324,31 +328,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill Skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (Skill != null)
{ {
player.removeSkill(Skill, false, Skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -359,30 +372,32 @@ public abstract class Inventory extends ItemContainer
if (skill != null) if (skill != null)
{ {
player.addSkill(skill, false); player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (skill.isActive())
{ {
if (!player.hasSkillReuse(skill.getReuseHashCode())) final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); player.addTimeStamp(skill, equipDelay);
if (equipDelay > 0) player.disableSkill(skill, equipDelay);
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp.compareAndSet(false, true);
} }
updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -392,11 +407,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -404,18 +420,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -442,8 +458,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -454,21 +470,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -476,21 +496,21 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
} {
return;
player.addSkill(skill, false); }
if (skill.isActive()) player.addSkill(skill, false);
{ if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (!player.hasSkillReuse(skill.getReuseHashCode()))
{ {
final int equipDelay = item.getEquipReuseDelay(); final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0) if (equipDelay > 0)
@ -498,21 +518,27 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -524,19 +550,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -574,12 +600,9 @@ public abstract class Inventory extends ItemContainer
if (itemVisualId > 0) if (itemVisualId > 0)
{ {
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId); final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
if (stone != null) if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId))
{ {
if ((stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId)) update = true;
{
update = true;
}
} }
} }
@ -600,8 +623,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -630,16 +653,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,15 +308,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -324,31 +328,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill Skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (Skill != null)
{ {
player.removeSkill(Skill, false, Skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -359,30 +372,32 @@ public abstract class Inventory extends ItemContainer
if (skill != null) if (skill != null)
{ {
player.addSkill(skill, false); player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (skill.isActive())
{ {
if (!player.hasSkillReuse(skill.getReuseHashCode())) final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); player.addTimeStamp(skill, equipDelay);
if (equipDelay > 0) player.disableSkill(skill, equipDelay);
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp.compareAndSet(false, true);
} }
updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -392,11 +407,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -404,18 +420,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -442,8 +458,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -454,21 +470,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -476,21 +496,21 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
} {
return;
player.addSkill(skill, false); }
if (skill.isActive()) player.addSkill(skill, false);
{ if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (!player.hasSkillReuse(skill.getReuseHashCode()))
{ {
final int equipDelay = item.getEquipReuseDelay(); final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0) if (equipDelay > 0)
@ -498,21 +518,27 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -524,19 +550,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -574,12 +600,9 @@ public abstract class Inventory extends ItemContainer
if (itemVisualId > 0) if (itemVisualId > 0)
{ {
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId); final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
if (stone != null) if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId))
{ {
if ((stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId)) update = true;
{
update = true;
}
} }
} }
@ -600,8 +623,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -630,16 +653,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -301,8 +301,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -313,15 +313,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -329,31 +333,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill Skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (Skill != null)
{ {
player.removeSkill(Skill, false, Skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -364,30 +377,32 @@ public abstract class Inventory extends ItemContainer
if (skill != null) if (skill != null)
{ {
player.addSkill(skill, false); player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (skill.isActive())
{ {
if (!player.hasSkillReuse(skill.getReuseHashCode())) final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); player.addTimeStamp(skill, equipDelay);
if (equipDelay > 0) player.disableSkill(skill, equipDelay);
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp.compareAndSet(false, true);
} }
updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -397,11 +412,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -409,18 +425,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -447,8 +463,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -459,21 +475,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -481,21 +501,21 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
} {
return;
player.addSkill(skill, false); }
if (skill.isActive()) player.addSkill(skill, false);
{ if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (!player.hasSkillReuse(skill.getReuseHashCode()))
{ {
final int equipDelay = item.getEquipReuseDelay(); final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0) if (equipDelay > 0)
@ -503,21 +523,27 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -529,19 +555,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -579,12 +605,9 @@ public abstract class Inventory extends ItemContainer
if (itemVisualId > 0) if (itemVisualId > 0)
{ {
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId); final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
if (stone != null) if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId))
{ {
if ((stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId)) update = true;
{
update = true;
}
} }
} }
@ -605,8 +628,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -635,16 +658,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -324,8 +324,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -336,15 +336,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -352,30 +356,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -394,18 +408,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -415,11 +435,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -427,18 +448,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -465,8 +486,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -477,21 +498,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -499,39 +524,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -543,19 +578,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -616,8 +651,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -646,16 +681,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -324,8 +324,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -336,15 +336,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -352,30 +356,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -394,18 +408,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -415,11 +435,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -427,18 +448,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -465,8 +486,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -477,21 +498,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -499,39 +524,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -543,19 +578,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -616,8 +651,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -646,16 +681,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -324,8 +324,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -336,15 +336,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -352,30 +356,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -394,18 +408,24 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -415,11 +435,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -427,18 +448,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -458,8 +479,8 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -470,21 +491,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -492,39 +517,49 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
}
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
player.addTimeStamp(skill, equipDelay); return;
player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true);
player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
{
final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp = true;
}
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -536,19 +571,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -609,8 +644,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -639,16 +674,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }

View File

@ -27,7 +27,6 @@ import java.util.List;
import java.util.Objects; import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.function.Function; import java.util.function.Function;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.logging.Level; import java.util.logging.Level;
@ -49,6 +48,7 @@ import org.l2jmobius.gameserver.model.VariationInstance;
import org.l2jmobius.gameserver.model.World; import org.l2jmobius.gameserver.model.World;
import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance; import org.l2jmobius.gameserver.model.actor.instance.PlayerInstance;
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder; import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
import org.l2jmobius.gameserver.model.holders.ItemSkillHolder;
import org.l2jmobius.gameserver.model.items.EtcItem; import org.l2jmobius.gameserver.model.items.EtcItem;
import org.l2jmobius.gameserver.model.items.Item; import org.l2jmobius.gameserver.model.items.Item;
import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone; import org.l2jmobius.gameserver.model.items.appearance.AppearanceStone;
@ -296,8 +296,8 @@ public abstract class Inventory extends ItemContainer
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
final Item it = item.getItem(); final Item it = item.getItem();
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Remove augmentation bonuses on unequip // Remove augmentation bonuses on unequip
if (item.isAugmented()) if (item.isAugmented())
@ -308,15 +308,19 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
it.forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Remove skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); // Remove skills bestowed from +4 armor
update.compareAndSet(false, true); if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
} }
}); }
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
@ -324,31 +328,40 @@ public abstract class Inventory extends ItemContainer
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
it.forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill Skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (Skill != null)
{ {
player.removeSkill(Skill, false, Skill.isPassive()); final Skill skill = holder.getSkill();
update.compareAndSet(false, true); if (skill != null)
{
player.removeSkill(skill, false, skill.isPassive());
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
if (item.isArmor()) if (item.isArmor())
{ {
for (ItemInstance itm : inventory.getItems()) for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || (itm.getItem().getSkills(ItemSkillType.NORMAL) == null) || itm.equals(item)) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
itm.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherNormalSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
@ -359,30 +372,32 @@ public abstract class Inventory extends ItemContainer
if (skill != null) if (skill != null)
{ {
player.addSkill(skill, false); player.addSkill(skill, false);
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (skill.isActive())
{ {
if (!player.hasSkillReuse(skill.getReuseHashCode())) final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); player.addTimeStamp(skill, equipDelay);
if (equipDelay > 0) player.disableSkill(skill, equipDelay);
{
player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay);
}
updateTimestamp.compareAndSet(false, true);
} }
updateTimestamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
}); }
} }
} }
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -392,11 +407,12 @@ public abstract class Inventory extends ItemContainer
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive()); player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update.compareAndSet(false, true); update = true;
} }
} }
}); }
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
for (Skill skill : player.getAllSkills()) for (Skill skill : player.getAllSkills())
{ {
@ -404,18 +420,18 @@ public abstract class Inventory extends ItemContainer
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon())) || (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
{ {
player.stopSkillEffects(true, skill.getId()); player.stopSkillEffects(true, skill.getId());
update.compareAndSet(false, true); update = true;
} }
} }
// Apply skill, if weapon have "skills on unequip" // Apply skill, if weapon have "skills on unequip"
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player)); it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -442,8 +458,8 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
final AtomicBoolean updateTimestamp = new AtomicBoolean(); boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
if (item.isAugmented()) if (item.isAugmented())
@ -454,21 +470,25 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
item.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
// Add skills bestowed from +4 armor for (ItemSkillHolder holder : onEnchantSkills)
if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); // Add skills bestowed from +4 armor
// Check passive skill conditions. if (item.getEnchantLevel() >= holder.getValue())
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
return; final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
return;
}
player.addSkill(skill, false);
update = true;
} }
player.addSkill(skill, false);
update.compareAndSet(false, true);
} }
}); }
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
@ -476,21 +496,21 @@ public abstract class Inventory extends ItemContainer
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
item.getItem().forEachSkill(ItemSkillType.NORMAL, holder -> final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : normalSkills)
if (skill != null)
{ {
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player)) final Skill skill = holder.getSkill();
if (skill != null)
{ {
return; if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
} {
return;
player.addSkill(skill, false); }
if (skill.isActive()) player.addSkill(skill, false);
{ if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
if (!player.hasSkillReuse(skill.getReuseHashCode()))
{ {
final int equipDelay = item.getEquipReuseDelay(); final int equipDelay = item.getEquipReuseDelay();
if (equipDelay > 0) if (equipDelay > 0)
@ -498,21 +518,27 @@ public abstract class Inventory extends ItemContainer
player.addTimeStamp(skill, equipDelay); player.addTimeStamp(skill, equipDelay);
player.disableSkill(skill, equipDelay); player.disableSkill(skill, equipDelay);
} }
updateTimestamp.compareAndSet(false, true); updateTimestamp = true;
} }
update = true;
}
else
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
} }
update.compareAndSet(false, true);
} }
else }
{
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder);
}
});
// Must check all equipped items for enchant conditions. // Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems()) for (ItemInstance equipped : inventory.getPaperdollItems())
{ {
equipped.getItem().forEachSkill(ItemSkillType.ON_ENCHANT, holder -> final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null)
{
continue;
}
for (ItemSkillHolder holder : otherEnchantSkills)
{ {
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.getEnchantLevel() >= holder.getValue()) if (equipped.getEnchantLevel() >= holder.getValue())
@ -524,19 +550,19 @@ public abstract class Inventory extends ItemContainer
return; return;
} }
player.addSkill(skill, false); player.addSkill(skill, false);
update.compareAndSet(false, true); update = true;
} }
}); }
} }
// Apply skill, if weapon have "skills on equip" // Apply skill, if weapon have "skills on equip"
item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player)); item.getItem().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
if (update.get()) if (update)
{ {
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp.get()) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
@ -574,12 +600,9 @@ public abstract class Inventory extends ItemContainer
if (itemVisualId > 0) if (itemVisualId > 0)
{ {
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId); final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
if (stone != null) if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId))
{ {
if ((stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, ItemInstance::getVisualId)) update = true;
{
update = true;
}
} }
} }
@ -600,8 +623,8 @@ public abstract class Inventory extends ItemContainer
if (piecesCount >= armorSet.getMinimumPieces()) if (piecesCount >= armorSet.getMinimumPieces())
{ {
// Applying all skills that matching the conditions // Applying all skills that matching the conditions
final AtomicBoolean updateTimeStamp = new AtomicBoolean(); boolean updateTimeStamp = false;
final AtomicBoolean update = new AtomicBoolean(); boolean update = false;
for (ArmorsetSkillHolder holder : armorSet.getSkills()) for (ArmorsetSkillHolder holder : armorSet.getSkills())
{ {
if (holder.validateConditions(player, armorSet, idProvider)) if (holder.validateConditions(player, armorSet, idProvider))
@ -630,16 +653,16 @@ public abstract class Inventory extends ItemContainer
player.disableSkill(itemSkill, equipDelay); player.disableSkill(itemSkill, equipDelay);
} }
} }
updateTimeStamp.compareAndSet(false, true); updateTimeStamp = true;
} }
update.compareAndSet(false, true); update = true;
} }
} }
if (updateTimeStamp.get()) if (updateTimeStamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
} }
return update.get(); return update;
} }
return false; return false;
} }