Inventory item skill checks.

This commit is contained in:
MobiusDevelopment
2021-04-20 23:08:52 +00:00
parent 1b68632161
commit 4880381383
38 changed files with 4111 additions and 2077 deletions

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,78 +314,108 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -390,6 +424,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -405,7 +444,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -425,10 +474,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -449,14 +510,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -468,68 +528,87 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -537,6 +616,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -559,18 +643,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -2082,7 +2183,7 @@ public abstract class Inventory extends ItemContainer
{ {
if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId())) if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId()))
{ {
// overwtite // overwrite
setPaperdollItem(i, item); setPaperdollItem(i, item);
return; return;
} }

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,81 +314,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -393,6 +427,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -408,7 +447,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -428,10 +477,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -452,14 +513,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -471,71 +531,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -543,6 +622,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -565,18 +649,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -2088,7 +2189,7 @@ public abstract class Inventory extends ItemContainer
{ {
if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId())) if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId()))
{ {
// overwtite // overwrite
setPaperdollItem(i, item); setPaperdollItem(i, item);
return; return;
} }

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,81 +314,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -393,6 +427,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -408,7 +447,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -428,10 +477,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -452,14 +513,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -471,71 +531,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -543,6 +622,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -565,18 +649,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -2088,7 +2189,7 @@ public abstract class Inventory extends ItemContainer
{ {
if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId())) if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId()))
{ {
// overwtite // overwrite
setPaperdollItem(i, item); setPaperdollItem(i, item);
return; return;
} }

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,81 +314,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -393,6 +427,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -408,7 +447,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -428,10 +477,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -452,14 +513,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel())) if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel()))
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -471,71 +531,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -543,6 +622,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -565,18 +649,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -2088,7 +2189,7 @@ public abstract class Inventory extends ItemContainer
{ {
if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId())) if ((_paperdoll[i] != null) && (getPaperdollItemId(i) == item.getId()))
{ {
// overwtite // overwrite
setPaperdollItem(i, item); setPaperdollItem(i, item);
return; return;
} }

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -306,6 +308,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -318,81 +322,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -401,6 +435,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -416,7 +455,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -442,8 +491,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -464,14 +524,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel())) if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel()))
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -483,71 +542,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -555,6 +633,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -577,8 +660,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -589,10 +682,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -748,6 +748,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -329,6 +331,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -341,81 +345,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -424,6 +458,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -439,7 +478,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -465,8 +514,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -487,14 +547,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel())) if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel()))
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -506,71 +565,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -578,6 +656,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -600,8 +683,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -612,10 +705,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -753,6 +753,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -329,6 +331,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -341,81 +345,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -424,6 +458,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -439,7 +478,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -465,8 +514,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -487,14 +547,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel())) if (item.getItem().getCrystalType().isGreater(player.getExpertiseLevel()))
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -506,71 +565,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -578,6 +656,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -600,8 +683,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -612,10 +705,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -754,6 +754,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -329,6 +331,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -341,81 +345,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -424,6 +458,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -439,7 +478,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -465,8 +514,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -487,7 +547,7 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -499,71 +559,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -571,6 +650,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -593,8 +677,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -605,10 +699,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -754,6 +754,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -324,6 +326,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -336,81 +340,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -419,6 +453,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -434,7 +473,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -460,8 +509,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -482,7 +542,7 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -494,71 +554,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -566,6 +645,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -588,8 +672,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -600,10 +694,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -754,6 +754,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -324,6 +326,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -336,81 +340,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -419,6 +453,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -434,7 +473,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -460,8 +509,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -482,7 +542,7 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -494,71 +554,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -566,6 +645,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -588,8 +672,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -600,10 +694,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -754,6 +754,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,81 +314,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -393,6 +427,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -408,7 +447,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -428,10 +477,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -452,14 +513,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -471,71 +531,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -543,6 +622,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -565,18 +649,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,81 +314,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -393,6 +427,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -408,7 +447,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -428,10 +477,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -452,14 +513,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -471,71 +531,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -543,6 +622,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -565,18 +649,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -306,6 +308,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -318,81 +322,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -401,6 +435,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -416,7 +455,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -442,8 +491,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -464,14 +524,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -483,71 +542,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -555,6 +633,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -577,8 +660,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -589,10 +682,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -748,6 +748,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -329,6 +331,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -341,81 +345,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -424,6 +458,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -439,7 +478,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -465,8 +514,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -487,14 +547,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -506,71 +565,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -578,6 +656,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -600,8 +683,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -612,10 +705,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -753,6 +753,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -329,6 +331,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -341,81 +345,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -424,6 +458,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -439,7 +478,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -465,8 +514,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -487,14 +547,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -506,71 +565,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -578,6 +656,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -600,8 +683,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -612,10 +705,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -753,6 +753,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -329,6 +331,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -341,81 +345,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -424,6 +458,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -439,7 +478,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -465,8 +514,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -487,7 +547,7 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -499,71 +559,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -571,6 +650,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -593,8 +677,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -605,10 +699,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -753,6 +753,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -298,6 +300,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -310,78 +314,108 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -390,6 +424,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -405,7 +444,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -425,10 +474,22 @@ public abstract class Inventory extends ItemContainer
// 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) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -449,14 +510,13 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
// Any items equipped that result in expertise penalty do not give any skills at all. // Any items equipped that result in expertise penalty do not give any skills at all.
if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel()) if (item.getItem().getCrystalType().getLevel() > player.getExpertiseLevel())
{ {
return; return;
} }
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -468,68 +528,87 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -537,6 +616,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -559,18 +643,35 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
// 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)
if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -324,6 +326,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -336,81 +340,111 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
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();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
{ if (normalSkills != null)
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); if (item.isArmor())
if (otherNormalSkills == null) {
for (ItemInstance itm : inventory.getItems())
{ {
continue; if (!itm.isEquipped() || itm.equals(item))
}
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -419,6 +453,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -434,7 +473,17 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
@@ -460,8 +509,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -482,7 +542,7 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -494,71 +554,90 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{ {
continue; if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
continue; continue;
} }
player.addSkill(skill, false); // Add skills bestowed from +4 armor
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) if (item.getEnchantLevel() >= holder.getValue())
{ {
final int equipDelay = item.getEquipReuseDelay(); final Skill skill = holder.getSkill();
if (equipDelay > 0) // Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{ {
player.addTimeStamp(skill, equipDelay); continue;
player.disableSkill(skill, equipDelay); }
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
} }
updateTimestamp = true;
} }
update = true;
} }
else }
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
} }
} }
} }
@@ -566,6 +645,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (otherEnchantSkills == null) if (otherEnchantSkills == null)
{ {
@@ -588,8 +672,18 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -600,10 +694,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -753,6 +753,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]

View File

@@ -21,7 +21,9 @@ import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
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;
@@ -333,6 +335,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 Map<Integer, Skill> addedSkills = new HashMap<>(1);
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
boolean update = false; boolean update = false;
boolean updateTimestamp = false; boolean updateTimestamp = false;
@@ -345,94 +349,134 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
// Remove skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
}
}
final List<ItemSkillHolder> onBlessingSkills = it.getSkills(ItemSkillType.ON_BLESSING);
if (onBlessingSkills != null)
{
for (ItemSkillHolder holder : onBlessingSkills)
{
if (item.isBlessed())
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
}
}
// Clear enchant bonus // Clear enchant bonus
item.clearEnchantStats(); item.clearEnchantStats();
// Clear SA Bonus // Clear SA Bonus
item.clearSpecialAbilities(); item.clearSpecialAbilities();
final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL); if (it.hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = it.getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
final Skill skill = holder.getSkill(); for (ItemSkillHolder holder : onEnchantSkills)
if (skill != null)
{ {
player.removeSkill(skill, false, skill.isPassive()); // Remove skills bestowed from +4 armor
update = true; if (item.getEnchantLevel() >= holder.getValue())
} {
else if (removedSkills.containsKey(holder.getSkill().getId()))
{ {
LOGGER.warning("Inventory.ItemSkillsListener.Weapon: Incorrect skill: " + holder); if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
} }
}
if (item.isArmor()) if (item.isBlessed())
{
for (ItemInstance itm : inventory.getItems())
{ {
if (!itm.isEquipped() || itm.equals(item)) final List<ItemSkillHolder> onBlessingSkills = it.getSkills(ItemSkillType.ON_BLESSING);
if (onBlessingSkills != null)
{ {
continue; for (ItemSkillHolder holder : onBlessingSkills)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL); final List<ItemSkillHolder> normalSkills = it.getSkills(ItemSkillType.NORMAL);
if (otherNormalSkills == null) if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{ {
continue; final Skill skill = holder.getSkill();
if (skill != null)
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
} }
}
for (ItemSkillHolder holder : otherNormalSkills) if (item.isArmor())
{
for (ItemInstance itm : inventory.getItems())
{ {
if (player.getSkillLevel(holder.getSkillId()) != 0) if (!itm.isEquipped() || itm.equals(item))
{ {
continue; continue;
} }
final Skill skill = holder.getSkill(); final List<ItemSkillHolder> otherNormalSkills = itm.getItem().getSkills(ItemSkillType.NORMAL);
if (skill != null) if (otherNormalSkills == null)
{ {
player.addSkill(skill, false); continue;
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode())) }
for (ItemSkillHolder holder : otherNormalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) != 0)
{ {
final int equipDelay = item.getEquipReuseDelay(); continue;
if (equipDelay > 0) }
{
player.addTimeStamp(skill, equipDelay); final Skill skill = holder.getSkill();
player.disableSkill(skill, equipDelay); if (skill != null)
} {
updateTimestamp = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
} }
update = true;
} }
} }
} }
@@ -441,6 +485,11 @@ public abstract class Inventory extends ItemContainer
// 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())
{ {
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT); final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
final List<ItemSkillHolder> otherBlessingSkills = equipped.getItem().getSkills(ItemSkillType.ON_BLESSING); final List<ItemSkillHolder> otherBlessingSkills = equipped.getItem().getSkills(ItemSkillType.ON_BLESSING);
if ((otherEnchantSkills == null) && (otherBlessingSkills == null)) if ((otherEnchantSkills == null) && (otherBlessingSkills == null))
@@ -448,23 +497,6 @@ public abstract class Inventory extends ItemContainer
continue; continue;
} }
if (onBlessingSkills != null)
{
for (ItemSkillHolder holder : otherBlessingSkills)
{
// Add skills bestowed from +4 armor
if (equipped.isBlessed())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
player.removeSkill(holder.getSkill(), false, holder.getSkill().isPassive());
update = true;
}
}
}
}
if (otherEnchantSkills != null) if (otherEnchantSkills != null)
{ {
for (ItemSkillHolder holder : otherEnchantSkills) for (ItemSkillHolder holder : otherEnchantSkills)
@@ -476,12 +508,47 @@ public abstract class Inventory extends ItemContainer
// Check passive skill conditions. // Check passive skill conditions.
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()); if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true; update = true;
} }
} }
} }
} }
if ((otherBlessingSkills != null) && equipped.isBlessed())
{
for (ItemSkillHolder holder : otherBlessingSkills)
{
// Add skills bestowed from +4 armor
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
if (removedSkills.containsKey(holder.getSkill().getId()))
{
if (removedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
removedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
update = true;
}
}
}
} }
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions. // Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
@@ -503,8 +570,19 @@ public abstract class Inventory extends ItemContainer
if (update) if (update)
{ {
for (Skill skill : removedSkills.values())
{
player.removeSkill(skill, false, skill.isPassive());
}
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));
@@ -525,7 +603,7 @@ public abstract class Inventory extends ItemContainer
} }
final PlayerInstance player = (PlayerInstance) inventory.getOwner(); final PlayerInstance player = (PlayerInstance) inventory.getOwner();
boolean update = false; final Map<Integer, Skill> addedSkills = new HashMap<>(1);
boolean updateTimestamp = false; boolean updateTimestamp = false;
// Apply augmentation bonuses on equip // Apply augmentation bonuses on equip
@@ -537,113 +615,18 @@ public abstract class Inventory extends ItemContainer
// Recalculate all stats // Recalculate all stats
player.getStat().recalculateStats(true); player.getStat().recalculateStats(true);
final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
final List<ItemSkillHolder> onBlessingSkills = item.getItem().getSkills(ItemSkillType.ON_BLESSING);
if (onEnchantSkills != null)
{
for (ItemSkillHolder holder : onEnchantSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.getEnchantLevel() >= holder.getValue())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
if (onBlessingSkills != null)
{
for (ItemSkillHolder holder : onBlessingSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (item.isBlessed())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
player.addSkill(skill, false);
update = true;
}
}
}
// Apply enchant stats // Apply enchant stats
item.applyEnchantStats(); item.applyEnchantStats();
// Apply SA skill // Apply SA skill
item.applySpecialAbilities(); item.applySpecialAbilities();
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL); if (item.getItem().hasSkills())
if (normalSkills != null)
{ {
for (ItemSkillHolder holder : normalSkills) final List<ItemSkillHolder> onEnchantSkills = item.getItem().getSkills(ItemSkillType.ON_ENCHANT);
if (onEnchantSkills != null)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) for (ItemSkillHolder holder : onEnchantSkills)
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
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);
}
}
}
// Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems())
{
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
final List<ItemSkillHolder> otherBlessingSkills = equipped.getItem().getSkills(ItemSkillType.ON_BLESSING);
if ((otherEnchantSkills == null) && (otherBlessingSkills == null))
{
continue;
}
if (otherBlessingSkills != null)
{
for (ItemSkillHolder holder : otherBlessingSkills)
{ {
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel()) if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{ {
@@ -651,7 +634,7 @@ public abstract class Inventory extends ItemContainer
} }
// Add skills bestowed from +4 armor // Add skills bestowed from +4 armor
if (equipped.isBlessed()) if (item.getEnchantLevel() >= holder.getValue())
{ {
final Skill skill = holder.getSkill(); final Skill skill = holder.getSkill();
// Check passive skill conditions. // Check passive skill conditions.
@@ -659,12 +642,117 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
if (item.isBlessed())
{
final List<ItemSkillHolder> onBlessingSkills = item.getItem().getSkills(ItemSkillType.ON_BLESSING);
if (onBlessingSkills != null)
{
for (ItemSkillHolder holder : onBlessingSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
}
}
final List<ItemSkillHolder> normalSkills = item.getItem().getSkills(ItemSkillType.NORMAL);
if (normalSkills != null)
{
for (ItemSkillHolder holder : normalSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
final Skill skill = holder.getSkill();
if (skill != null)
{
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
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;
}
}
}
}
}
// Must check all equipped items for enchant conditions.
for (ItemInstance equipped : inventory.getPaperdollItems())
{
if (!equipped.getItem().hasSkills())
{
continue;
}
final List<ItemSkillHolder> otherEnchantSkills = equipped.getItem().getSkills(ItemSkillType.ON_ENCHANT);
final List<ItemSkillHolder> otherBlessingSkills = equipped.getItem().getSkills(ItemSkillType.ON_BLESSING);
if ((otherEnchantSkills == null) && (otherBlessingSkills == null))
{
continue;
}
if (otherEnchantSkills != null) if (otherEnchantSkills != null)
{ {
for (ItemSkillHolder holder : otherEnchantSkills) for (ItemSkillHolder holder : otherEnchantSkills)
@@ -683,8 +771,52 @@ public abstract class Inventory extends ItemContainer
{ {
continue; continue;
} }
player.addSkill(skill, false);
update = true; if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
}
}
if (otherBlessingSkills != null)
{
for (ItemSkillHolder holder : otherBlessingSkills)
{
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
{
continue;
}
// Add skills bestowed from +4 armor
if (equipped.isBlessed())
{
final Skill skill = holder.getSkill();
// Check passive skill conditions.
if (skill.isPassive() && !skill.checkConditions(SkillConditionScope.PASSIVE, player, player))
{
continue;
}
if (addedSkills.containsKey(holder.getSkill().getId()))
{
if (addedSkills.get(holder.getSkill().getId()).getLevel() < holder.getSkill().getLevel())
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
}
else
{
addedSkills.put(holder.getSkill().getId(), holder.getSkill());
}
} }
} }
} }
@@ -696,10 +828,16 @@ public abstract class Inventory extends ItemContainer
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) if (!addedSkills.isEmpty())
{ {
for (Skill skill : addedSkills.values())
{
player.addSkill(skill, false);
}
player.sendSkillList(); player.sendSkillList();
} }
if (updateTimestamp) if (updateTimestamp)
{ {
player.sendPacket(new SkillCoolTime(player)); player.sendPacket(new SkillCoolTime(player));

View File

@@ -753,6 +753,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
return _preConditions; return _preConditions;
} }
public boolean hasSkills()
{
return _skills != null;
}
/** /**
* Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ??? * Method to retrieve skills linked to this item armor and weapon: passive skills etcitem: skills used on item use <-- ???
* @return Skills linked to this item as SkillHolder[] * @return Skills linked to this item as SkillHolder[]