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

View File

@@ -747,6 +747,11 @@ public abstract class Item extends ListenersContainer implements IIdentifiable
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 <-- ???
* @return Skills linked to this item as SkillHolder[]