Apply item skills to all playables.
This commit is contained in:
parent
b6fe06aa07
commit
680902f39d
@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
@ -82,7 +83,7 @@ public final class PaperdollCache
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxSetEnchant(Player player)
|
public int getMaxSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
if (_maxSetEnchant >= 0)
|
if (_maxSetEnchant >= 0)
|
||||||
{
|
{
|
||||||
@ -94,7 +95,7 @@ public final class PaperdollCache
|
|||||||
{
|
{
|
||||||
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
||||||
{
|
{
|
||||||
final int enchantEffect = set.getLowestSetEnchant(player);
|
final int enchantEffect = set.getLowestSetEnchant(playable);
|
||||||
if (enchantEffect > maxSetEnchant)
|
if (enchantEffect > maxSetEnchant)
|
||||||
{
|
{
|
||||||
maxSetEnchant = enchantEffect;
|
maxSetEnchant = enchantEffect;
|
||||||
|
@ -22,11 +22,10 @@ import java.util.Set;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.commons.util.CommonUtil;
|
import org.l2jmobius.commons.util.CommonUtil;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,18 +161,18 @@ public class ArmorSet
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @return true if all parts of set are enchanted to +6 or more
|
* @return true if all parts of set are enchanted to +6 or more
|
||||||
*/
|
*/
|
||||||
public int getLowestSetEnchant(Player player)
|
public int getLowestSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
// Player don't have full set
|
// Playable don't have full set
|
||||||
if (getPiecesCountById(player) < _minimumPieces)
|
if (getPiecesCountById(playable) < _minimumPieces)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int enchantLevel = Byte.MAX_VALUE;
|
int enchantLevel = Byte.MAX_VALUE;
|
||||||
for (int armorSlot : ARMORSET_SLOTS)
|
for (int armorSlot : ARMORSET_SLOTS)
|
||||||
{
|
{
|
||||||
@ -192,13 +191,13 @@ public class ArmorSet
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Condition for 3 Lv. Set Effect Applied Skill
|
* Condition for 3 Lv. Set Effect Applied Skill
|
||||||
* @param player
|
* @param playable
|
||||||
* @param bookSlot
|
* @param bookSlot
|
||||||
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
||||||
*/
|
*/
|
||||||
public int getArtifactSlotMask(Player player, int bookSlot)
|
public int getArtifactSlotMask(Playable playable, int bookSlot)
|
||||||
{
|
{
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int slotMask = 0;
|
int slotMask = 0;
|
||||||
switch (bookSlot)
|
switch (bookSlot)
|
||||||
{
|
{
|
||||||
@ -242,23 +241,23 @@ public class ArmorSet
|
|||||||
return slotMask;
|
return slotMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasOptionalEquipped(Player player, Function<Item, Integer> idProvider)
|
public boolean hasOptionalEquipped(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @param idProvider
|
* @param idProvider
|
||||||
* @return the amount of set visual items that player has equipped
|
* @return the amount of set visual items that playable has equipped
|
||||||
*/
|
*/
|
||||||
public long getPiecesCount(Player player, Function<Item, Integer> idProvider)
|
public long getPiecesCount(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getPiecesCountById(Player player)
|
public long getPiecesCountById(Playable playable)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
package org.l2jmobius.gameserver.model;
|
package org.l2jmobius.gameserver.model;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.OptionData;
|
import org.l2jmobius.gameserver.data.xml.OptionData;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.options.Options;
|
import org.l2jmobius.gameserver.model.options.Options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,27 +59,27 @@ public class VariationInstance
|
|||||||
return _option2 == null ? -1 : _option2.getId();
|
return _option2 == null ? -1 : _option2.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyBonus(Player player)
|
public void applyBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.apply(player);
|
_option1.apply(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.apply(player);
|
_option2.apply(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBonus(Player player)
|
public void removeBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.remove(player);
|
_option1.remove(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.remove(player);
|
_option2.remove(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.holders;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,34 +58,34 @@ public class ArmorsetSkillHolder extends SkillHolder
|
|||||||
return _isOptional;
|
return _isOptional;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateConditions(Player player, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
public boolean validateConditions(Playable playable, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
// Player's doesn't have full busy (1 of 3) artifact real slot
|
// Playable doesn't have full busy (1 of 3) artifact real slot
|
||||||
if (_artifactSlotMask > armorSet.getArtifactSlotMask(player, _artifactBookSlot))
|
if (_artifactSlotMask > armorSet.getArtifactSlotMask(playable, _artifactBookSlot))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have enough items equipped to use this skill
|
// Playable doesn't have enough items equipped to use this skill
|
||||||
if (_minimumPieces > armorSet.getPiecesCount(player, idProvider))
|
if (_minimumPieces > armorSet.getPiecesCount(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player's set enchantment isn't enough to use this skill
|
// Playable set enchantment isn't enough to use this skill
|
||||||
if (_minEnchant > armorSet.getLowestSetEnchant(player))
|
if (_minEnchant > armorSet.getLowestSetEnchant(playable))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have the required item to use this skill
|
// Playable doesn't have the required item to use this skill
|
||||||
if (_isOptional && !armorSet.hasOptionalEquipped(player, idProvider))
|
if (_isOptional && !armorSet.hasOptionalEquipped(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player already knows that skill
|
// Playable already knows that skill
|
||||||
if (player.getSkillLevel(getSkillId()) == getSkillLevel())
|
if (playable.getSkillLevel(getSkillId()) == getSkillLevel())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ import org.l2jmobius.gameserver.model.ArmorSet;
|
|||||||
import org.l2jmobius.gameserver.model.VariationInstance;
|
import org.l2jmobius.gameserver.model.VariationInstance;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
import org.l2jmobius.gameserver.model.World;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
||||||
@ -310,12 +311,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final ItemTemplate it = item.getTemplate();
|
final ItemTemplate it = item.getTemplate();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
||||||
@ -325,11 +326,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove augmentation bonuses on unequip
|
// Remove augmentation bonuses on unequip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().removeBonus(player);
|
item.getAugmentation().removeBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Clear enchant bonus
|
// Clear enchant bonus
|
||||||
item.clearEnchantStats();
|
item.clearEnchantStats();
|
||||||
@ -406,7 +407,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
for (ItemSkillHolder holder : otherNormalSkills)
|
for (ItemSkillHolder holder : otherNormalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) != 0)
|
if (playable.getSkillLevel(holder.getSkillId()) != 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -430,13 +431,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -477,7 +478,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -496,7 +497,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -506,12 +507,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
||||||
for (Skill skill : player.getAllSkills())
|
for (Skill skill : playable.getAllSkills())
|
||||||
{
|
{
|
||||||
if ((skill.isToggle() && player.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, player, player)) //
|
if ((skill.isToggle() && playable.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, playable, playable)) //
|
||||||
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
||||||
{
|
{
|
||||||
player.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
playable.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -519,55 +520,58 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
{
|
{
|
||||||
for (Skill skill : removedSkills.values())
|
for (Skill skill : removedSkills.values())
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, skill.isPassive());
|
playable.removeSkill(skill, skill.isPassive());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.isWeapon())
|
if (item.isWeapon())
|
||||||
{
|
{
|
||||||
player.unchargeAllShots();
|
playable.unchargeAllShots();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
boolean updateTimestamp = false;
|
boolean updateTimestamp = false;
|
||||||
|
|
||||||
// Apply augmentation bonuses on equip
|
// Apply augmentation bonuses on equip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().applyBonus(player);
|
item.getAugmentation().applyBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Apply enchant stats
|
// Apply enchant stats
|
||||||
item.applyEnchantStats();
|
item.applyEnchantStats();
|
||||||
@ -582,7 +586,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onEnchantSkills)
|
for (ItemSkillHolder holder : onEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -599,7 +603,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -626,7 +630,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onBlessingSkills)
|
for (ItemSkillHolder holder : onBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -643,7 +647,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -669,7 +673,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : normalSkills)
|
for (ItemSkillHolder holder : normalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -681,7 +685,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -699,13 +703,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -732,7 +736,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherEnchantSkills)
|
for (ItemSkillHolder holder : otherEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -749,7 +753,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -773,7 +777,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherBlessingSkills)
|
for (ItemSkillHolder holder : otherBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -787,7 +791,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -812,22 +816,25 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!addedSkills.isEmpty())
|
if (!addedSkills.isEmpty())
|
||||||
{
|
{
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -844,16 +851,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
|
|
||||||
// Verify and apply normal set
|
// Verify and apply normal set
|
||||||
if (verifyAndApply(player, item, Item::getId))
|
if (verifyAndApply(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -863,26 +870,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if (playable.isPlayer() && ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH)))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean applySkills(Player player, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
private static boolean applySkills(Playable playable, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
final long piecesCount = armorSet.getPiecesCount(player, idProvider);
|
final long piecesCount = armorSet.getPiecesCount(playable, idProvider);
|
||||||
if (piecesCount >= armorSet.getMinimumPieces())
|
if (piecesCount >= armorSet.getMinimumPieces())
|
||||||
{
|
{
|
||||||
// Applying all skills that matching the conditions
|
// Applying all skills that matching the conditions
|
||||||
@ -890,12 +897,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
boolean update = false;
|
boolean update = false;
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (holder.validateConditions(player, armorSet, idProvider))
|
if (holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -904,21 +911,21 @@ public abstract class Inventory extends ItemContainer
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, player, player))
|
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.addSkill(itemSkill, false);
|
playable.addSkill(itemSkill);
|
||||||
if (itemSkill.isActive() && (item != null))
|
if (itemSkill.isActive() && (item != null))
|
||||||
{
|
{
|
||||||
if (!player.hasSkillReuse(itemSkill.getReuseHashCode()))
|
if (!playable.hasSkillReuse(itemSkill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(itemSkill, equipDelay);
|
playable.addTimeStamp(itemSkill, equipDelay);
|
||||||
player.disableSkill(itemSkill, equipDelay);
|
playable.disableSkill(itemSkill, equipDelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
@ -926,22 +933,22 @@ public abstract class Inventory extends ItemContainer
|
|||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndApply(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndApply(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
for (ArmorSet armorSet : armorSets)
|
for (ArmorSet armorSet : armorSets)
|
||||||
{
|
{
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -949,7 +956,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndRemove(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndRemove(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
@ -958,7 +965,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove all skills that doesn't matches the conditions
|
// Remove all skills that doesn't matches the conditions
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (!holder.validateConditions(player, armorSet, idProvider))
|
if (!holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -968,7 +975,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update if a skill has been removed.
|
// Update if a skill has been removed.
|
||||||
if (player.removeSkill(itemSkill, false, itemSkill.isPassive()) != null)
|
if (playable.removeSkill(itemSkill, itemSkill.isPassive()) != null)
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -976,7 +983,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to apply lower level skills if possible
|
// Attempt to apply lower level skills if possible
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -988,16 +995,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean remove = false;
|
boolean remove = false;
|
||||||
|
|
||||||
// Verify and remove normal set bonus
|
// Verify and remove normal set bonus
|
||||||
if (verifyAndRemove(player, item, Item::getId))
|
if (verifyAndRemove(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
@ -1007,21 +1014,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!playable.isPlayer())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (remove)
|
if (remove)
|
||||||
{
|
{
|
||||||
player.checkItemRestriction();
|
playable.getActingPlayer().checkItemRestriction();
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1189,6 +1201,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
||||||
_paperdollListeners = new ArrayList<>();
|
_paperdollListeners = new ArrayList<>();
|
||||||
|
|
||||||
if (this instanceof PlayerInventory)
|
if (this instanceof PlayerInventory)
|
||||||
{
|
{
|
||||||
addPaperdollListener(ArmorSetListener.getInstance());
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
@ -1199,6 +1212,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addPaperdollListener(AgathionBraceletListener.getInstance());
|
addPaperdollListener(AgathionBraceletListener.getInstance());
|
||||||
addPaperdollListener(ArtifactBookListener.getInstance());
|
addPaperdollListener(ArtifactBookListener.getInstance());
|
||||||
}
|
}
|
||||||
|
else if (this instanceof PetInventory)
|
||||||
|
{
|
||||||
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
|
addPaperdollListener(ItemSkillsListener.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
// common
|
// common
|
||||||
addPaperdollListener(StatsListener.getInstance());
|
addPaperdollListener(StatsListener.getInstance());
|
||||||
@ -2674,12 +2692,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
public int getArmorMinEnchant()
|
public int getArmorMinEnchant()
|
||||||
{
|
{
|
||||||
if ((getOwner() == null) || !getOwner().isPlayer())
|
if ((getOwner() == null) || !getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = getOwner().getActingPlayer();
|
final Playable player = (Playable) getOwner();
|
||||||
return _paperdollCache.getMaxSetEnchant(player);
|
return _paperdollCache.getMaxSetEnchant(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||||
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
@ -157,11 +157,11 @@ public class Options
|
|||||||
_activationSkills.add(holder);
|
_activationSkills.add(holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Player player)
|
public void apply(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
final BuffInfo info = new BuffInfo(player, player, null, true, null, this);
|
final BuffInfo info = new BuffInfo(playable, playable, null, true, null, this);
|
||||||
for (AbstractEffect effect : _effects)
|
for (AbstractEffect effect : _effects)
|
||||||
{
|
{
|
||||||
if (effect.isInstant())
|
if (effect.isInstant())
|
||||||
@ -174,7 +174,7 @@ public class Options
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
||||||
effect.pump(player, info.getSkill());
|
effect.pump(playable, info.getSkill());
|
||||||
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
||||||
{
|
{
|
||||||
info.addEffect(effect);
|
info.addEffect(effect);
|
||||||
@ -183,44 +183,47 @@ public class Options
|
|||||||
}
|
}
|
||||||
if (!info.getEffects().isEmpty())
|
if (!info.getEffects().isEmpty())
|
||||||
{
|
{
|
||||||
player.getEffectList().add(info);
|
playable.getEffectList().add(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActiveSkills())
|
if (hasActiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.addTriggerSkill(holder);
|
playable.addTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(Player player)
|
public void remove(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
for (BuffInfo info : player.getEffectList().getOptions())
|
for (BuffInfo info : playable.getEffectList().getOptions())
|
||||||
{
|
{
|
||||||
if (info.getOption() == this)
|
if (info.getOption() == this)
|
||||||
{
|
{
|
||||||
player.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
playable.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,45 +231,48 @@ public class Options
|
|||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, false);
|
playable.removeSkill(skill, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, true);
|
playable.removeSkill(skill, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.removeTriggerSkill(holder);
|
playable.removeTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSkill(Player player, Skill skill)
|
private void addSkill(Playable playable, Skill skill)
|
||||||
{
|
{
|
||||||
boolean updateTimeStamp = false;
|
boolean updateTimeStamp = false;
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
if (skill.isActive())
|
if (skill.isActive())
|
||||||
{
|
{
|
||||||
final long remainingTime = player.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
final long remainingTime = playable.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, remainingTime);
|
playable.addTimeStamp(skill, remainingTime);
|
||||||
player.disableSkill(skill, remainingTime);
|
playable.disableSkill(skill, remainingTime);
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
@ -82,7 +83,7 @@ public final class PaperdollCache
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxSetEnchant(Player player)
|
public int getMaxSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
if (_maxSetEnchant >= 0)
|
if (_maxSetEnchant >= 0)
|
||||||
{
|
{
|
||||||
@ -94,7 +95,7 @@ public final class PaperdollCache
|
|||||||
{
|
{
|
||||||
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
||||||
{
|
{
|
||||||
final int enchantEffect = set.getLowestSetEnchant(player);
|
final int enchantEffect = set.getLowestSetEnchant(playable);
|
||||||
if (enchantEffect > maxSetEnchant)
|
if (enchantEffect > maxSetEnchant)
|
||||||
{
|
{
|
||||||
maxSetEnchant = enchantEffect;
|
maxSetEnchant = enchantEffect;
|
||||||
|
@ -22,11 +22,10 @@ import java.util.Set;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.commons.util.CommonUtil;
|
import org.l2jmobius.commons.util.CommonUtil;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,18 +161,18 @@ public class ArmorSet
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @return true if all parts of set are enchanted to +6 or more
|
* @return true if all parts of set are enchanted to +6 or more
|
||||||
*/
|
*/
|
||||||
public int getLowestSetEnchant(Player player)
|
public int getLowestSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
// Player don't have full set
|
// Playable don't have full set
|
||||||
if (getPiecesCountById(player) < _minimumPieces)
|
if (getPiecesCountById(playable) < _minimumPieces)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int enchantLevel = Byte.MAX_VALUE;
|
int enchantLevel = Byte.MAX_VALUE;
|
||||||
for (int armorSlot : ARMORSET_SLOTS)
|
for (int armorSlot : ARMORSET_SLOTS)
|
||||||
{
|
{
|
||||||
@ -192,13 +191,13 @@ public class ArmorSet
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Condition for 3 Lv. Set Effect Applied Skill
|
* Condition for 3 Lv. Set Effect Applied Skill
|
||||||
* @param player
|
* @param playable
|
||||||
* @param bookSlot
|
* @param bookSlot
|
||||||
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
||||||
*/
|
*/
|
||||||
public int getArtifactSlotMask(Player player, int bookSlot)
|
public int getArtifactSlotMask(Playable playable, int bookSlot)
|
||||||
{
|
{
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int slotMask = 0;
|
int slotMask = 0;
|
||||||
switch (bookSlot)
|
switch (bookSlot)
|
||||||
{
|
{
|
||||||
@ -242,23 +241,23 @@ public class ArmorSet
|
|||||||
return slotMask;
|
return slotMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasOptionalEquipped(Player player, Function<Item, Integer> idProvider)
|
public boolean hasOptionalEquipped(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @param idProvider
|
* @param idProvider
|
||||||
* @return the amount of set visual items that player has equipped
|
* @return the amount of set visual items that playable has equipped
|
||||||
*/
|
*/
|
||||||
public long getPiecesCount(Player player, Function<Item, Integer> idProvider)
|
public long getPiecesCount(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getPiecesCountById(Player player)
|
public long getPiecesCountById(Playable playable)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
package org.l2jmobius.gameserver.model;
|
package org.l2jmobius.gameserver.model;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.OptionData;
|
import org.l2jmobius.gameserver.data.xml.OptionData;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.options.Options;
|
import org.l2jmobius.gameserver.model.options.Options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,27 +59,27 @@ public class VariationInstance
|
|||||||
return _option2 == null ? -1 : _option2.getId();
|
return _option2 == null ? -1 : _option2.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyBonus(Player player)
|
public void applyBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.apply(player);
|
_option1.apply(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.apply(player);
|
_option2.apply(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBonus(Player player)
|
public void removeBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.remove(player);
|
_option1.remove(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.remove(player);
|
_option2.remove(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.holders;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,34 +58,34 @@ public class ArmorsetSkillHolder extends SkillHolder
|
|||||||
return _isOptional;
|
return _isOptional;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateConditions(Player player, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
public boolean validateConditions(Playable playable, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
// Player's doesn't have full busy (1 of 3) artifact real slot
|
// Playable doesn't have full busy (1 of 3) artifact real slot
|
||||||
if (_artifactSlotMask > armorSet.getArtifactSlotMask(player, _artifactBookSlot))
|
if (_artifactSlotMask > armorSet.getArtifactSlotMask(playable, _artifactBookSlot))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have enough items equipped to use this skill
|
// Playable doesn't have enough items equipped to use this skill
|
||||||
if (_minimumPieces > armorSet.getPiecesCount(player, idProvider))
|
if (_minimumPieces > armorSet.getPiecesCount(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player's set enchantment isn't enough to use this skill
|
// Playable set enchantment isn't enough to use this skill
|
||||||
if (_minEnchant > armorSet.getLowestSetEnchant(player))
|
if (_minEnchant > armorSet.getLowestSetEnchant(playable))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have the required item to use this skill
|
// Playable doesn't have the required item to use this skill
|
||||||
if (_isOptional && !armorSet.hasOptionalEquipped(player, idProvider))
|
if (_isOptional && !armorSet.hasOptionalEquipped(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player already knows that skill
|
// Playable already knows that skill
|
||||||
if (player.getSkillLevel(getSkillId()) == getSkillLevel())
|
if (playable.getSkillLevel(getSkillId()) == getSkillLevel())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ import org.l2jmobius.gameserver.model.ArmorSet;
|
|||||||
import org.l2jmobius.gameserver.model.VariationInstance;
|
import org.l2jmobius.gameserver.model.VariationInstance;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
import org.l2jmobius.gameserver.model.World;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
||||||
@ -319,12 +320,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final ItemTemplate it = item.getTemplate();
|
final ItemTemplate it = item.getTemplate();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
||||||
@ -334,11 +335,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove augmentation bonuses on unequip
|
// Remove augmentation bonuses on unequip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().removeBonus(player);
|
item.getAugmentation().removeBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Clear enchant bonus
|
// Clear enchant bonus
|
||||||
item.clearEnchantStats();
|
item.clearEnchantStats();
|
||||||
@ -415,7 +416,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
for (ItemSkillHolder holder : otherNormalSkills)
|
for (ItemSkillHolder holder : otherNormalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) != 0)
|
if (playable.getSkillLevel(holder.getSkillId()) != 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -439,13 +440,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -486,7 +487,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -505,7 +506,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -515,12 +516,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
||||||
for (Skill skill : player.getAllSkills())
|
for (Skill skill : playable.getAllSkills())
|
||||||
{
|
{
|
||||||
if ((skill.isToggle() && player.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, player, player)) //
|
if ((skill.isToggle() && playable.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, playable, playable)) //
|
||||||
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
||||||
{
|
{
|
||||||
player.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
playable.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -528,55 +529,58 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
{
|
{
|
||||||
for (Skill skill : removedSkills.values())
|
for (Skill skill : removedSkills.values())
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, skill.isPassive());
|
playable.removeSkill(skill, skill.isPassive());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.isWeapon())
|
if (item.isWeapon())
|
||||||
{
|
{
|
||||||
player.unchargeAllShots();
|
playable.unchargeAllShots();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
boolean updateTimestamp = false;
|
boolean updateTimestamp = false;
|
||||||
|
|
||||||
// Apply augmentation bonuses on equip
|
// Apply augmentation bonuses on equip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().applyBonus(player);
|
item.getAugmentation().applyBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Apply enchant stats
|
// Apply enchant stats
|
||||||
item.applyEnchantStats();
|
item.applyEnchantStats();
|
||||||
@ -591,7 +595,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onEnchantSkills)
|
for (ItemSkillHolder holder : onEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -608,7 +612,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -635,7 +639,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onBlessingSkills)
|
for (ItemSkillHolder holder : onBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -652,7 +656,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -678,7 +682,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : normalSkills)
|
for (ItemSkillHolder holder : normalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -690,7 +694,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -708,13 +712,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -741,7 +745,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherEnchantSkills)
|
for (ItemSkillHolder holder : otherEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -758,7 +762,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -782,7 +786,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherBlessingSkills)
|
for (ItemSkillHolder holder : otherBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -796,7 +800,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -821,22 +825,25 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!addedSkills.isEmpty())
|
if (!addedSkills.isEmpty())
|
||||||
{
|
{
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -853,16 +860,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
|
|
||||||
// Verify and apply normal set
|
// Verify and apply normal set
|
||||||
if (verifyAndApply(player, item, Item::getId))
|
if (verifyAndApply(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -872,26 +879,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if (playable.isPlayer() && ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH)))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean applySkills(Player player, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
private static boolean applySkills(Playable playable, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
final long piecesCount = armorSet.getPiecesCount(player, idProvider);
|
final long piecesCount = armorSet.getPiecesCount(playable, idProvider);
|
||||||
if (piecesCount >= armorSet.getMinimumPieces())
|
if (piecesCount >= armorSet.getMinimumPieces())
|
||||||
{
|
{
|
||||||
// Applying all skills that matching the conditions
|
// Applying all skills that matching the conditions
|
||||||
@ -899,12 +906,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
boolean update = false;
|
boolean update = false;
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (holder.validateConditions(player, armorSet, idProvider))
|
if (holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -913,21 +920,21 @@ public abstract class Inventory extends ItemContainer
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, player, player))
|
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.addSkill(itemSkill, false);
|
playable.addSkill(itemSkill);
|
||||||
if (itemSkill.isActive() && (item != null))
|
if (itemSkill.isActive() && (item != null))
|
||||||
{
|
{
|
||||||
if (!player.hasSkillReuse(itemSkill.getReuseHashCode()))
|
if (!playable.hasSkillReuse(itemSkill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(itemSkill, equipDelay);
|
playable.addTimeStamp(itemSkill, equipDelay);
|
||||||
player.disableSkill(itemSkill, equipDelay);
|
playable.disableSkill(itemSkill, equipDelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
@ -935,22 +942,22 @@ public abstract class Inventory extends ItemContainer
|
|||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndApply(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndApply(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
for (ArmorSet armorSet : armorSets)
|
for (ArmorSet armorSet : armorSets)
|
||||||
{
|
{
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -958,7 +965,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndRemove(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndRemove(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
@ -967,7 +974,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove all skills that doesn't matches the conditions
|
// Remove all skills that doesn't matches the conditions
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (!holder.validateConditions(player, armorSet, idProvider))
|
if (!holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -977,7 +984,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update if a skill has been removed.
|
// Update if a skill has been removed.
|
||||||
if (player.removeSkill(itemSkill, false, itemSkill.isPassive()) != null)
|
if (playable.removeSkill(itemSkill, itemSkill.isPassive()) != null)
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -985,7 +992,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to apply lower level skills if possible
|
// Attempt to apply lower level skills if possible
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -997,16 +1004,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean remove = false;
|
boolean remove = false;
|
||||||
|
|
||||||
// Verify and remove normal set bonus
|
// Verify and remove normal set bonus
|
||||||
if (verifyAndRemove(player, item, Item::getId))
|
if (verifyAndRemove(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
@ -1016,21 +1023,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!playable.isPlayer())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (remove)
|
if (remove)
|
||||||
{
|
{
|
||||||
player.checkItemRestriction();
|
playable.getActingPlayer().checkItemRestriction();
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1198,6 +1210,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
||||||
_paperdollListeners = new ArrayList<>();
|
_paperdollListeners = new ArrayList<>();
|
||||||
|
|
||||||
if (this instanceof PlayerInventory)
|
if (this instanceof PlayerInventory)
|
||||||
{
|
{
|
||||||
addPaperdollListener(ArmorSetListener.getInstance());
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
@ -1208,6 +1221,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addPaperdollListener(AgathionBraceletListener.getInstance());
|
addPaperdollListener(AgathionBraceletListener.getInstance());
|
||||||
addPaperdollListener(ArtifactBookListener.getInstance());
|
addPaperdollListener(ArtifactBookListener.getInstance());
|
||||||
}
|
}
|
||||||
|
else if (this instanceof PetInventory)
|
||||||
|
{
|
||||||
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
|
addPaperdollListener(ItemSkillsListener.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
// common
|
// common
|
||||||
addPaperdollListener(StatsListener.getInstance());
|
addPaperdollListener(StatsListener.getInstance());
|
||||||
@ -2704,12 +2722,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
public int getArmorMinEnchant()
|
public int getArmorMinEnchant()
|
||||||
{
|
{
|
||||||
if ((getOwner() == null) || !getOwner().isPlayer())
|
if ((getOwner() == null) || !getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = getOwner().getActingPlayer();
|
final Playable player = (Playable) getOwner();
|
||||||
return _paperdollCache.getMaxSetEnchant(player);
|
return _paperdollCache.getMaxSetEnchant(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||||
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
@ -157,11 +157,11 @@ public class Options
|
|||||||
_activationSkills.add(holder);
|
_activationSkills.add(holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Player player)
|
public void apply(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
final BuffInfo info = new BuffInfo(player, player, null, true, null, this);
|
final BuffInfo info = new BuffInfo(playable, playable, null, true, null, this);
|
||||||
for (AbstractEffect effect : _effects)
|
for (AbstractEffect effect : _effects)
|
||||||
{
|
{
|
||||||
if (effect.isInstant())
|
if (effect.isInstant())
|
||||||
@ -174,7 +174,7 @@ public class Options
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
||||||
effect.pump(player, info.getSkill());
|
effect.pump(playable, info.getSkill());
|
||||||
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
||||||
{
|
{
|
||||||
info.addEffect(effect);
|
info.addEffect(effect);
|
||||||
@ -183,44 +183,47 @@ public class Options
|
|||||||
}
|
}
|
||||||
if (!info.getEffects().isEmpty())
|
if (!info.getEffects().isEmpty())
|
||||||
{
|
{
|
||||||
player.getEffectList().add(info);
|
playable.getEffectList().add(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActiveSkills())
|
if (hasActiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.addTriggerSkill(holder);
|
playable.addTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(Player player)
|
public void remove(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
for (BuffInfo info : player.getEffectList().getOptions())
|
for (BuffInfo info : playable.getEffectList().getOptions())
|
||||||
{
|
{
|
||||||
if (info.getOption() == this)
|
if (info.getOption() == this)
|
||||||
{
|
{
|
||||||
player.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
playable.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,45 +231,48 @@ public class Options
|
|||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, false);
|
playable.removeSkill(skill, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, true);
|
playable.removeSkill(skill, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.removeTriggerSkill(holder);
|
playable.removeTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSkill(Player player, Skill skill)
|
private void addSkill(Playable playable, Skill skill)
|
||||||
{
|
{
|
||||||
boolean updateTimeStamp = false;
|
boolean updateTimeStamp = false;
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
if (skill.isActive())
|
if (skill.isActive())
|
||||||
{
|
{
|
||||||
final long remainingTime = player.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
final long remainingTime = playable.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, remainingTime);
|
playable.addTimeStamp(skill, remainingTime);
|
||||||
player.disableSkill(skill, remainingTime);
|
playable.disableSkill(skill, remainingTime);
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
@ -82,7 +83,7 @@ public final class PaperdollCache
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxSetEnchant(Player player)
|
public int getMaxSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
if (_maxSetEnchant >= 0)
|
if (_maxSetEnchant >= 0)
|
||||||
{
|
{
|
||||||
@ -94,7 +95,7 @@ public final class PaperdollCache
|
|||||||
{
|
{
|
||||||
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
||||||
{
|
{
|
||||||
final int enchantEffect = set.getLowestSetEnchant(player);
|
final int enchantEffect = set.getLowestSetEnchant(playable);
|
||||||
if (enchantEffect > maxSetEnchant)
|
if (enchantEffect > maxSetEnchant)
|
||||||
{
|
{
|
||||||
maxSetEnchant = enchantEffect;
|
maxSetEnchant = enchantEffect;
|
||||||
|
@ -22,11 +22,10 @@ import java.util.Set;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.commons.util.CommonUtil;
|
import org.l2jmobius.commons.util.CommonUtil;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,18 +161,18 @@ public class ArmorSet
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @return true if all parts of set are enchanted to +6 or more
|
* @return true if all parts of set are enchanted to +6 or more
|
||||||
*/
|
*/
|
||||||
public int getLowestSetEnchant(Player player)
|
public int getLowestSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
// Player don't have full set
|
// Playable don't have full set
|
||||||
if (getPiecesCountById(player) < _minimumPieces)
|
if (getPiecesCountById(playable) < _minimumPieces)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int enchantLevel = Byte.MAX_VALUE;
|
int enchantLevel = Byte.MAX_VALUE;
|
||||||
for (int armorSlot : ARMORSET_SLOTS)
|
for (int armorSlot : ARMORSET_SLOTS)
|
||||||
{
|
{
|
||||||
@ -192,13 +191,13 @@ public class ArmorSet
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Condition for 3 Lv. Set Effect Applied Skill
|
* Condition for 3 Lv. Set Effect Applied Skill
|
||||||
* @param player
|
* @param playable
|
||||||
* @param bookSlot
|
* @param bookSlot
|
||||||
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
||||||
*/
|
*/
|
||||||
public int getArtifactSlotMask(Player player, int bookSlot)
|
public int getArtifactSlotMask(Playable playable, int bookSlot)
|
||||||
{
|
{
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int slotMask = 0;
|
int slotMask = 0;
|
||||||
switch (bookSlot)
|
switch (bookSlot)
|
||||||
{
|
{
|
||||||
@ -242,23 +241,23 @@ public class ArmorSet
|
|||||||
return slotMask;
|
return slotMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasOptionalEquipped(Player player, Function<Item, Integer> idProvider)
|
public boolean hasOptionalEquipped(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @param idProvider
|
* @param idProvider
|
||||||
* @return the amount of set visual items that player has equipped
|
* @return the amount of set visual items that playable has equipped
|
||||||
*/
|
*/
|
||||||
public long getPiecesCount(Player player, Function<Item, Integer> idProvider)
|
public long getPiecesCount(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getPiecesCountById(Player player)
|
public long getPiecesCountById(Playable playable)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
package org.l2jmobius.gameserver.model;
|
package org.l2jmobius.gameserver.model;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.OptionData;
|
import org.l2jmobius.gameserver.data.xml.OptionData;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.options.Options;
|
import org.l2jmobius.gameserver.model.options.Options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,27 +59,27 @@ public class VariationInstance
|
|||||||
return _option2 == null ? -1 : _option2.getId();
|
return _option2 == null ? -1 : _option2.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyBonus(Player player)
|
public void applyBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.apply(player);
|
_option1.apply(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.apply(player);
|
_option2.apply(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBonus(Player player)
|
public void removeBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.remove(player);
|
_option1.remove(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.remove(player);
|
_option2.remove(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.holders;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,34 +58,34 @@ public class ArmorsetSkillHolder extends SkillHolder
|
|||||||
return _isOptional;
|
return _isOptional;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateConditions(Player player, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
public boolean validateConditions(Playable playable, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
// Player's doesn't have full busy (1 of 3) artifact real slot
|
// Playable doesn't have full busy (1 of 3) artifact real slot
|
||||||
if (_artifactSlotMask > armorSet.getArtifactSlotMask(player, _artifactBookSlot))
|
if (_artifactSlotMask > armorSet.getArtifactSlotMask(playable, _artifactBookSlot))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have enough items equipped to use this skill
|
// Playable doesn't have enough items equipped to use this skill
|
||||||
if (_minimumPieces > armorSet.getPiecesCount(player, idProvider))
|
if (_minimumPieces > armorSet.getPiecesCount(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player's set enchantment isn't enough to use this skill
|
// Playable set enchantment isn't enough to use this skill
|
||||||
if (_minEnchant > armorSet.getLowestSetEnchant(player))
|
if (_minEnchant > armorSet.getLowestSetEnchant(playable))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have the required item to use this skill
|
// Playable doesn't have the required item to use this skill
|
||||||
if (_isOptional && !armorSet.hasOptionalEquipped(player, idProvider))
|
if (_isOptional && !armorSet.hasOptionalEquipped(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player already knows that skill
|
// Playable already knows that skill
|
||||||
if (player.getSkillLevel(getSkillId()) == getSkillLevel())
|
if (playable.getSkillLevel(getSkillId()) == getSkillLevel())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ import org.l2jmobius.gameserver.model.ArmorSet;
|
|||||||
import org.l2jmobius.gameserver.model.VariationInstance;
|
import org.l2jmobius.gameserver.model.VariationInstance;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
import org.l2jmobius.gameserver.model.World;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
||||||
@ -319,12 +320,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final ItemTemplate it = item.getTemplate();
|
final ItemTemplate it = item.getTemplate();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
||||||
@ -334,11 +335,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove augmentation bonuses on unequip
|
// Remove augmentation bonuses on unequip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().removeBonus(player);
|
item.getAugmentation().removeBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Clear enchant bonus
|
// Clear enchant bonus
|
||||||
item.clearEnchantStats();
|
item.clearEnchantStats();
|
||||||
@ -415,7 +416,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
for (ItemSkillHolder holder : otherNormalSkills)
|
for (ItemSkillHolder holder : otherNormalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) != 0)
|
if (playable.getSkillLevel(holder.getSkillId()) != 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -439,13 +440,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -486,7 +487,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -505,7 +506,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -515,12 +516,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
||||||
for (Skill skill : player.getAllSkills())
|
for (Skill skill : playable.getAllSkills())
|
||||||
{
|
{
|
||||||
if ((skill.isToggle() && player.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, player, player)) //
|
if ((skill.isToggle() && playable.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, playable, playable)) //
|
||||||
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
||||||
{
|
{
|
||||||
player.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
playable.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -528,55 +529,58 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
{
|
{
|
||||||
for (Skill skill : removedSkills.values())
|
for (Skill skill : removedSkills.values())
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, skill.isPassive());
|
playable.removeSkill(skill, skill.isPassive());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.isWeapon())
|
if (item.isWeapon())
|
||||||
{
|
{
|
||||||
player.unchargeAllShots();
|
playable.unchargeAllShots();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
boolean updateTimestamp = false;
|
boolean updateTimestamp = false;
|
||||||
|
|
||||||
// Apply augmentation bonuses on equip
|
// Apply augmentation bonuses on equip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().applyBonus(player);
|
item.getAugmentation().applyBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Apply enchant stats
|
// Apply enchant stats
|
||||||
item.applyEnchantStats();
|
item.applyEnchantStats();
|
||||||
@ -591,7 +595,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onEnchantSkills)
|
for (ItemSkillHolder holder : onEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -608,7 +612,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -635,7 +639,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onBlessingSkills)
|
for (ItemSkillHolder holder : onBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -652,7 +656,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -678,7 +682,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : normalSkills)
|
for (ItemSkillHolder holder : normalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -690,7 +694,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -708,13 +712,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -741,7 +745,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherEnchantSkills)
|
for (ItemSkillHolder holder : otherEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -758,7 +762,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -782,7 +786,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherBlessingSkills)
|
for (ItemSkillHolder holder : otherBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -796,7 +800,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -821,22 +825,25 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!addedSkills.isEmpty())
|
if (!addedSkills.isEmpty())
|
||||||
{
|
{
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -853,16 +860,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
|
|
||||||
// Verify and apply normal set
|
// Verify and apply normal set
|
||||||
if (verifyAndApply(player, item, Item::getId))
|
if (verifyAndApply(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -872,26 +879,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if (playable.isPlayer() && ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH)))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean applySkills(Player player, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
private static boolean applySkills(Playable playable, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
final long piecesCount = armorSet.getPiecesCount(player, idProvider);
|
final long piecesCount = armorSet.getPiecesCount(playable, idProvider);
|
||||||
if (piecesCount >= armorSet.getMinimumPieces())
|
if (piecesCount >= armorSet.getMinimumPieces())
|
||||||
{
|
{
|
||||||
// Applying all skills that matching the conditions
|
// Applying all skills that matching the conditions
|
||||||
@ -899,12 +906,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
boolean update = false;
|
boolean update = false;
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (holder.validateConditions(player, armorSet, idProvider))
|
if (holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -913,21 +920,21 @@ public abstract class Inventory extends ItemContainer
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, player, player))
|
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.addSkill(itemSkill, false);
|
playable.addSkill(itemSkill);
|
||||||
if (itemSkill.isActive() && (item != null))
|
if (itemSkill.isActive() && (item != null))
|
||||||
{
|
{
|
||||||
if (!player.hasSkillReuse(itemSkill.getReuseHashCode()))
|
if (!playable.hasSkillReuse(itemSkill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(itemSkill, equipDelay);
|
playable.addTimeStamp(itemSkill, equipDelay);
|
||||||
player.disableSkill(itemSkill, equipDelay);
|
playable.disableSkill(itemSkill, equipDelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
@ -935,22 +942,22 @@ public abstract class Inventory extends ItemContainer
|
|||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndApply(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndApply(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
for (ArmorSet armorSet : armorSets)
|
for (ArmorSet armorSet : armorSets)
|
||||||
{
|
{
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -958,7 +965,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndRemove(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndRemove(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
@ -967,7 +974,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove all skills that doesn't matches the conditions
|
// Remove all skills that doesn't matches the conditions
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (!holder.validateConditions(player, armorSet, idProvider))
|
if (!holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -977,7 +984,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update if a skill has been removed.
|
// Update if a skill has been removed.
|
||||||
if (player.removeSkill(itemSkill, false, itemSkill.isPassive()) != null)
|
if (playable.removeSkill(itemSkill, itemSkill.isPassive()) != null)
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -985,7 +992,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to apply lower level skills if possible
|
// Attempt to apply lower level skills if possible
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -997,16 +1004,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean remove = false;
|
boolean remove = false;
|
||||||
|
|
||||||
// Verify and remove normal set bonus
|
// Verify and remove normal set bonus
|
||||||
if (verifyAndRemove(player, item, Item::getId))
|
if (verifyAndRemove(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
@ -1016,21 +1023,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!playable.isPlayer())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (remove)
|
if (remove)
|
||||||
{
|
{
|
||||||
player.checkItemRestriction();
|
playable.getActingPlayer().checkItemRestriction();
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1198,6 +1210,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
||||||
_paperdollListeners = new ArrayList<>();
|
_paperdollListeners = new ArrayList<>();
|
||||||
|
|
||||||
if (this instanceof PlayerInventory)
|
if (this instanceof PlayerInventory)
|
||||||
{
|
{
|
||||||
addPaperdollListener(ArmorSetListener.getInstance());
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
@ -1208,6 +1221,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addPaperdollListener(AgathionBraceletListener.getInstance());
|
addPaperdollListener(AgathionBraceletListener.getInstance());
|
||||||
addPaperdollListener(ArtifactBookListener.getInstance());
|
addPaperdollListener(ArtifactBookListener.getInstance());
|
||||||
}
|
}
|
||||||
|
else if (this instanceof PetInventory)
|
||||||
|
{
|
||||||
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
|
addPaperdollListener(ItemSkillsListener.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
// common
|
// common
|
||||||
addPaperdollListener(StatsListener.getInstance());
|
addPaperdollListener(StatsListener.getInstance());
|
||||||
@ -2704,12 +2722,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
public int getArmorMinEnchant()
|
public int getArmorMinEnchant()
|
||||||
{
|
{
|
||||||
if ((getOwner() == null) || !getOwner().isPlayer())
|
if ((getOwner() == null) || !getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = getOwner().getActingPlayer();
|
final Playable player = (Playable) getOwner();
|
||||||
return _paperdollCache.getMaxSetEnchant(player);
|
return _paperdollCache.getMaxSetEnchant(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||||
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
@ -157,11 +157,11 @@ public class Options
|
|||||||
_activationSkills.add(holder);
|
_activationSkills.add(holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Player player)
|
public void apply(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
final BuffInfo info = new BuffInfo(player, player, null, true, null, this);
|
final BuffInfo info = new BuffInfo(playable, playable, null, true, null, this);
|
||||||
for (AbstractEffect effect : _effects)
|
for (AbstractEffect effect : _effects)
|
||||||
{
|
{
|
||||||
if (effect.isInstant())
|
if (effect.isInstant())
|
||||||
@ -174,7 +174,7 @@ public class Options
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
||||||
effect.pump(player, info.getSkill());
|
effect.pump(playable, info.getSkill());
|
||||||
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
||||||
{
|
{
|
||||||
info.addEffect(effect);
|
info.addEffect(effect);
|
||||||
@ -183,44 +183,47 @@ public class Options
|
|||||||
}
|
}
|
||||||
if (!info.getEffects().isEmpty())
|
if (!info.getEffects().isEmpty())
|
||||||
{
|
{
|
||||||
player.getEffectList().add(info);
|
playable.getEffectList().add(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActiveSkills())
|
if (hasActiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.addTriggerSkill(holder);
|
playable.addTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(Player player)
|
public void remove(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
for (BuffInfo info : player.getEffectList().getOptions())
|
for (BuffInfo info : playable.getEffectList().getOptions())
|
||||||
{
|
{
|
||||||
if (info.getOption() == this)
|
if (info.getOption() == this)
|
||||||
{
|
{
|
||||||
player.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
playable.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,45 +231,48 @@ public class Options
|
|||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, false);
|
playable.removeSkill(skill, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, true);
|
playable.removeSkill(skill, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.removeTriggerSkill(holder);
|
playable.removeTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSkill(Player player, Skill skill)
|
private void addSkill(Playable playable, Skill skill)
|
||||||
{
|
{
|
||||||
boolean updateTimeStamp = false;
|
boolean updateTimeStamp = false;
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
if (skill.isActive())
|
if (skill.isActive())
|
||||||
{
|
{
|
||||||
final long remainingTime = player.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
final long remainingTime = playable.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, remainingTime);
|
playable.addTimeStamp(skill, remainingTime);
|
||||||
player.disableSkill(skill, remainingTime);
|
playable.disableSkill(skill, remainingTime);
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,6 +23,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
import org.l2jmobius.gameserver.data.xml.ArmorSetData;
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
@ -82,7 +83,7 @@ public final class PaperdollCache
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getMaxSetEnchant(Player player)
|
public int getMaxSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
if (_maxSetEnchant >= 0)
|
if (_maxSetEnchant >= 0)
|
||||||
{
|
{
|
||||||
@ -94,7 +95,7 @@ public final class PaperdollCache
|
|||||||
{
|
{
|
||||||
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
for (ArmorSet set : ArmorSetData.getInstance().getSets(item.getId()))
|
||||||
{
|
{
|
||||||
final int enchantEffect = set.getLowestSetEnchant(player);
|
final int enchantEffect = set.getLowestSetEnchant(playable);
|
||||||
if (enchantEffect > maxSetEnchant)
|
if (enchantEffect > maxSetEnchant)
|
||||||
{
|
{
|
||||||
maxSetEnchant = enchantEffect;
|
maxSetEnchant = enchantEffect;
|
||||||
|
@ -22,11 +22,10 @@ import java.util.Set;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.commons.util.CommonUtil;
|
import org.l2jmobius.commons.util.CommonUtil;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
import org.l2jmobius.gameserver.model.holders.ArmorsetSkillHolder;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
import org.l2jmobius.gameserver.model.itemcontainer.Inventory;
|
||||||
import org.l2jmobius.gameserver.model.itemcontainer.PlayerInventory;
|
|
||||||
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
import org.l2jmobius.gameserver.model.stats.BaseStat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -162,18 +161,18 @@ public class ArmorSet
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @return true if all parts of set are enchanted to +6 or more
|
* @return true if all parts of set are enchanted to +6 or more
|
||||||
*/
|
*/
|
||||||
public int getLowestSetEnchant(Player player)
|
public int getLowestSetEnchant(Playable playable)
|
||||||
{
|
{
|
||||||
// Player don't have full set
|
// Playable don't have full set
|
||||||
if (getPiecesCountById(player) < _minimumPieces)
|
if (getPiecesCountById(playable) < _minimumPieces)
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int enchantLevel = Byte.MAX_VALUE;
|
int enchantLevel = Byte.MAX_VALUE;
|
||||||
for (int armorSlot : ARMORSET_SLOTS)
|
for (int armorSlot : ARMORSET_SLOTS)
|
||||||
{
|
{
|
||||||
@ -192,13 +191,13 @@ public class ArmorSet
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Condition for 3 Lv. Set Effect Applied Skill
|
* Condition for 3 Lv. Set Effect Applied Skill
|
||||||
* @param player
|
* @param playable
|
||||||
* @param bookSlot
|
* @param bookSlot
|
||||||
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
* @return total paperdoll(busy) count for 1 of 3 artifact book slots
|
||||||
*/
|
*/
|
||||||
public int getArtifactSlotMask(Player player, int bookSlot)
|
public int getArtifactSlotMask(Playable playable, int bookSlot)
|
||||||
{
|
{
|
||||||
final PlayerInventory inv = player.getInventory();
|
final Inventory inv = playable.getInventory();
|
||||||
int slotMask = 0;
|
int slotMask = 0;
|
||||||
switch (bookSlot)
|
switch (bookSlot)
|
||||||
{
|
{
|
||||||
@ -242,23 +241,23 @@ public class ArmorSet
|
|||||||
return slotMask;
|
return slotMask;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean hasOptionalEquipped(Player player, Function<Item, Integer> idProvider)
|
public boolean hasOptionalEquipped(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItems().stream().anyMatch(item -> CommonUtil.contains(_optionalItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param player
|
* @param playable
|
||||||
* @param idProvider
|
* @param idProvider
|
||||||
* @return the amount of set visual items that player has equipped
|
* @return the amount of set visual items that playable has equipped
|
||||||
*/
|
*/
|
||||||
public long getPiecesCount(Player player, Function<Item, Integer> idProvider)
|
public long getPiecesCount(Playable playable, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, idProvider.apply(item)));
|
||||||
}
|
}
|
||||||
|
|
||||||
public long getPiecesCountById(Player player)
|
public long getPiecesCountById(Playable playable)
|
||||||
{
|
{
|
||||||
return player.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
return playable.getInventory().getPaperdollItemCount(item -> CommonUtil.contains(_requiredItems, item.getId()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,7 +17,7 @@
|
|||||||
package org.l2jmobius.gameserver.model;
|
package org.l2jmobius.gameserver.model;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.data.xml.OptionData;
|
import org.l2jmobius.gameserver.data.xml.OptionData;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.options.Options;
|
import org.l2jmobius.gameserver.model.options.Options;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -59,27 +59,27 @@ public class VariationInstance
|
|||||||
return _option2 == null ? -1 : _option2.getId();
|
return _option2 == null ? -1 : _option2.getId();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void applyBonus(Player player)
|
public void applyBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.apply(player);
|
_option1.apply(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.apply(player);
|
_option2.apply(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void removeBonus(Player player)
|
public void removeBonus(Playable playable)
|
||||||
{
|
{
|
||||||
if (_option1 != null)
|
if (_option1 != null)
|
||||||
{
|
{
|
||||||
_option1.remove(player);
|
_option1.remove(playable);
|
||||||
}
|
}
|
||||||
if (_option2 != null)
|
if (_option2 != null)
|
||||||
{
|
{
|
||||||
_option2.remove(player);
|
_option2.remove(playable);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ package org.l2jmobius.gameserver.model.holders;
|
|||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.model.ArmorSet;
|
import org.l2jmobius.gameserver.model.ArmorSet;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.item.instance.Item;
|
import org.l2jmobius.gameserver.model.item.instance.Item;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,34 +58,34 @@ public class ArmorsetSkillHolder extends SkillHolder
|
|||||||
return _isOptional;
|
return _isOptional;
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean validateConditions(Player player, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
public boolean validateConditions(Playable playable, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
// Player's doesn't have full busy (1 of 3) artifact real slot
|
// Playable doesn't have full busy (1 of 3) artifact real slot
|
||||||
if (_artifactSlotMask > armorSet.getArtifactSlotMask(player, _artifactBookSlot))
|
if (_artifactSlotMask > armorSet.getArtifactSlotMask(playable, _artifactBookSlot))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have enough items equipped to use this skill
|
// Playable doesn't have enough items equipped to use this skill
|
||||||
if (_minimumPieces > armorSet.getPiecesCount(player, idProvider))
|
if (_minimumPieces > armorSet.getPiecesCount(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player's set enchantment isn't enough to use this skill
|
// Playable set enchantment isn't enough to use this skill
|
||||||
if (_minEnchant > armorSet.getLowestSetEnchant(player))
|
if (_minEnchant > armorSet.getLowestSetEnchant(playable))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player doesn't have the required item to use this skill
|
// Playable doesn't have the required item to use this skill
|
||||||
if (_isOptional && !armorSet.hasOptionalEquipped(player, idProvider))
|
if (_isOptional && !armorSet.hasOptionalEquipped(playable, idProvider))
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Player already knows that skill
|
// Playable already knows that skill
|
||||||
if (player.getSkillLevel(getSkillId()) == getSkillLevel())
|
if (playable.getSkillLevel(getSkillId()) == getSkillLevel())
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -51,6 +51,7 @@ import org.l2jmobius.gameserver.model.ArmorSet;
|
|||||||
import org.l2jmobius.gameserver.model.VariationInstance;
|
import org.l2jmobius.gameserver.model.VariationInstance;
|
||||||
import org.l2jmobius.gameserver.model.World;
|
import org.l2jmobius.gameserver.model.World;
|
||||||
import org.l2jmobius.gameserver.model.actor.Creature;
|
import org.l2jmobius.gameserver.model.actor.Creature;
|
||||||
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Player;
|
||||||
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
import org.l2jmobius.gameserver.model.events.EventDispatcher;
|
||||||
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerItemUnequip;
|
||||||
@ -319,12 +320,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final ItemTemplate it = item.getTemplate();
|
final ItemTemplate it = item.getTemplate();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> removedSkills = new HashMap<>(1);
|
||||||
@ -334,11 +335,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove augmentation bonuses on unequip
|
// Remove augmentation bonuses on unequip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().removeBonus(player);
|
item.getAugmentation().removeBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Clear enchant bonus
|
// Clear enchant bonus
|
||||||
item.clearEnchantStats();
|
item.clearEnchantStats();
|
||||||
@ -415,7 +416,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
for (ItemSkillHolder holder : otherNormalSkills)
|
for (ItemSkillHolder holder : otherNormalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) != 0)
|
if (playable.getSkillLevel(holder.getSkillId()) != 0)
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -439,13 +440,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -486,7 +487,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -505,7 +506,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
removedSkills.putIfAbsent(skill.getId(), skill);
|
removedSkills.putIfAbsent(skill.getId(), skill);
|
||||||
update = true;
|
update = true;
|
||||||
@ -515,12 +516,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
// Must check for toggle and isRemovedOnUnequipWeapon skill item conditions.
|
||||||
for (Skill skill : player.getAllSkills())
|
for (Skill skill : playable.getAllSkills())
|
||||||
{
|
{
|
||||||
if ((skill.isToggle() && player.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, player, player)) //
|
if ((skill.isToggle() && playable.isAffectedBySkill(skill.getId()) && !skill.checkConditions(SkillConditionScope.GENERAL, playable, playable)) //
|
||||||
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
|| (it.isWeapon() && skill.isRemovedOnUnequipWeapon()))
|
||||||
{
|
{
|
||||||
player.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
playable.stopSkillEffects(SkillFinishType.REMOVED, skill.getId());
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -528,55 +529,58 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on unequip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
it.forEachSkill(ItemSkillType.ON_UNEQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update)
|
||||||
{
|
{
|
||||||
for (Skill skill : removedSkills.values())
|
for (Skill skill : removedSkills.values())
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, skill.isPassive());
|
playable.removeSkill(skill, skill.isPassive());
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (item.isWeapon())
|
if (item.isWeapon())
|
||||||
{
|
{
|
||||||
player.unchargeAllShots();
|
playable.unchargeAllShots();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
final Map<Integer, Skill> addedSkills = new HashMap<>(1);
|
||||||
boolean updateTimestamp = false;
|
boolean updateTimestamp = false;
|
||||||
|
|
||||||
// Apply augmentation bonuses on equip
|
// Apply augmentation bonuses on equip
|
||||||
if (item.isAugmented())
|
if (item.isAugmented())
|
||||||
{
|
{
|
||||||
item.getAugmentation().applyBonus(player);
|
item.getAugmentation().applyBonus(playable);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Recalculate all stats
|
// Recalculate all stats
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
|
|
||||||
// Apply enchant stats
|
// Apply enchant stats
|
||||||
item.applyEnchantStats();
|
item.applyEnchantStats();
|
||||||
@ -591,7 +595,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onEnchantSkills)
|
for (ItemSkillHolder holder : onEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -608,7 +612,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -635,7 +639,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : onBlessingSkills)
|
for (ItemSkillHolder holder : onBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -652,7 +656,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -678,7 +682,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : normalSkills)
|
for (ItemSkillHolder holder : normalSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -690,7 +694,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -708,13 +712,13 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addedSkills.put(skill.getId(), skill);
|
addedSkills.put(skill.getId(), skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (skill.isActive() && !player.hasSkillReuse(skill.getReuseHashCode()))
|
if (skill.isActive() && !playable.hasSkillReuse(skill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, equipDelay);
|
playable.addTimeStamp(skill, equipDelay);
|
||||||
player.disableSkill(skill, equipDelay);
|
playable.disableSkill(skill, equipDelay);
|
||||||
}
|
}
|
||||||
updateTimestamp = true;
|
updateTimestamp = true;
|
||||||
}
|
}
|
||||||
@ -741,7 +745,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherEnchantSkills)
|
for (ItemSkillHolder holder : otherEnchantSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -758,7 +762,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -782,7 +786,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
for (ItemSkillHolder holder : otherBlessingSkills)
|
for (ItemSkillHolder holder : otherBlessingSkills)
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -796,7 +800,7 @@ 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, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -821,22 +825,25 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
// Apply skill, if item has "skills on equip" and it is not a secondary agathion.
|
||||||
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
if ((slot < PAPERDOLL_AGATHION2) || (slot > PAPERDOLL_AGATHION5))
|
||||||
{
|
{
|
||||||
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(player, player));
|
item.getTemplate().forEachSkill(ItemSkillType.ON_EQUIP, holder -> holder.getSkill().activateSkill(playable, playable));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!addedSkills.isEmpty())
|
if (!addedSkills.isEmpty())
|
||||||
{
|
{
|
||||||
for (Skill skill : addedSkills.values())
|
for (Skill skill : addedSkills.values())
|
||||||
{
|
{
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
}
|
}
|
||||||
|
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (updateTimestamp)
|
if (updateTimestamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -853,16 +860,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
public void notifyEquiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
|
|
||||||
// Verify and apply normal set
|
// Verify and apply normal set
|
||||||
if (verifyAndApply(player, item, Item::getId))
|
if (verifyAndApply(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -872,26 +879,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndApply(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (update)
|
if (update && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if (playable.isPlayer() && ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH)))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean applySkills(Player player, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
private static boolean applySkills(Playable playable, Item item, ArmorSet armorSet, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
final long piecesCount = armorSet.getPiecesCount(player, idProvider);
|
final long piecesCount = armorSet.getPiecesCount(playable, idProvider);
|
||||||
if (piecesCount >= armorSet.getMinimumPieces())
|
if (piecesCount >= armorSet.getMinimumPieces())
|
||||||
{
|
{
|
||||||
// Applying all skills that matching the conditions
|
// Applying all skills that matching the conditions
|
||||||
@ -899,12 +906,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
boolean update = false;
|
boolean update = false;
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (player.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
if (playable.getSkillLevel(holder.getSkillId()) >= holder.getSkillLevel())
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (holder.validateConditions(player, armorSet, idProvider))
|
if (holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -913,21 +920,21 @@ public abstract class Inventory extends ItemContainer
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, player, player))
|
if (itemSkill.isPassive() && !itemSkill.checkConditions(SkillConditionScope.PASSIVE, playable, playable))
|
||||||
{
|
{
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
player.addSkill(itemSkill, false);
|
playable.addSkill(itemSkill);
|
||||||
if (itemSkill.isActive() && (item != null))
|
if (itemSkill.isActive() && (item != null))
|
||||||
{
|
{
|
||||||
if (!player.hasSkillReuse(itemSkill.getReuseHashCode()))
|
if (!playable.hasSkillReuse(itemSkill.getReuseHashCode()))
|
||||||
{
|
{
|
||||||
final int equipDelay = item.getEquipReuseDelay();
|
final int equipDelay = item.getEquipReuseDelay();
|
||||||
if (equipDelay > 0)
|
if (equipDelay > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(itemSkill, equipDelay);
|
playable.addTimeStamp(itemSkill, equipDelay);
|
||||||
player.disableSkill(itemSkill, equipDelay);
|
playable.disableSkill(itemSkill, equipDelay);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
@ -935,22 +942,22 @@ public abstract class Inventory extends ItemContainer
|
|||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndApply(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndApply(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
for (ArmorSet armorSet : armorSets)
|
for (ArmorSet armorSet : armorSets)
|
||||||
{
|
{
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -958,7 +965,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
return update;
|
return update;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static boolean verifyAndRemove(Player player, Item item, Function<Item, Integer> idProvider)
|
private static boolean verifyAndRemove(Playable playable, Item item, Function<Item, Integer> idProvider)
|
||||||
{
|
{
|
||||||
boolean update = false;
|
boolean update = false;
|
||||||
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
final List<ArmorSet> armorSets = ArmorSetData.getInstance().getSets(idProvider.apply(item));
|
||||||
@ -967,7 +974,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
// Remove all skills that doesn't matches the conditions
|
// Remove all skills that doesn't matches the conditions
|
||||||
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
for (ArmorsetSkillHolder holder : armorSet.getSkills())
|
||||||
{
|
{
|
||||||
if (!holder.validateConditions(player, armorSet, idProvider))
|
if (!holder.validateConditions(playable, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
final Skill itemSkill = holder.getSkill();
|
final Skill itemSkill = holder.getSkill();
|
||||||
if (itemSkill == null)
|
if (itemSkill == null)
|
||||||
@ -977,7 +984,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Update if a skill has been removed.
|
// Update if a skill has been removed.
|
||||||
if (player.removeSkill(itemSkill, false, itemSkill.isPassive()) != null)
|
if (playable.removeSkill(itemSkill, itemSkill.isPassive()) != null)
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -985,7 +992,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Attempt to apply lower level skills if possible
|
// Attempt to apply lower level skills if possible
|
||||||
if (applySkills(player, item, armorSet, idProvider))
|
if (applySkills(playable, item, armorSet, idProvider))
|
||||||
{
|
{
|
||||||
update = true;
|
update = true;
|
||||||
}
|
}
|
||||||
@ -997,16 +1004,16 @@ public abstract class Inventory extends ItemContainer
|
|||||||
@Override
|
@Override
|
||||||
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
public void notifyUnequiped(int slot, Item item, Inventory inventory)
|
||||||
{
|
{
|
||||||
if (!inventory.getOwner().isPlayer())
|
if (!inventory.getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = (Player) inventory.getOwner();
|
final Playable playable = (Playable) inventory.getOwner();
|
||||||
boolean remove = false;
|
boolean remove = false;
|
||||||
|
|
||||||
// Verify and remove normal set bonus
|
// Verify and remove normal set bonus
|
||||||
if (verifyAndRemove(player, item, Item::getId))
|
if (verifyAndRemove(playable, item, Item::getId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
@ -1016,21 +1023,26 @@ public abstract class Inventory extends ItemContainer
|
|||||||
if (itemVisualId > 0)
|
if (itemVisualId > 0)
|
||||||
{
|
{
|
||||||
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
final AppearanceStone stone = AppearanceItemData.getInstance().getStone(itemVisualId);
|
||||||
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(player, item, Item::getVisualId))
|
if ((stone != null) && (stone.getType() == AppearanceType.FIXED) && verifyAndRemove(playable, item, Item::getVisualId))
|
||||||
{
|
{
|
||||||
remove = true;
|
remove = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!playable.isPlayer())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (remove)
|
if (remove)
|
||||||
{
|
{
|
||||||
player.checkItemRestriction();
|
playable.getActingPlayer().checkItemRestriction();
|
||||||
player.sendSkillList();
|
playable.getActingPlayer().sendSkillList();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
if ((item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH_JEWEL) || (item.getTemplate().getBodyPart() == ItemTemplate.SLOT_BROOCH))
|
||||||
{
|
{
|
||||||
player.updateActiveBroochJewel();
|
playable.getActingPlayer().updateActiveBroochJewel();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1198,6 +1210,7 @@ public abstract class Inventory extends ItemContainer
|
|||||||
{
|
{
|
||||||
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
_paperdoll = new Item[PAPERDOLL_TOTALSLOTS];
|
||||||
_paperdollListeners = new ArrayList<>();
|
_paperdollListeners = new ArrayList<>();
|
||||||
|
|
||||||
if (this instanceof PlayerInventory)
|
if (this instanceof PlayerInventory)
|
||||||
{
|
{
|
||||||
addPaperdollListener(ArmorSetListener.getInstance());
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
@ -1208,6 +1221,11 @@ public abstract class Inventory extends ItemContainer
|
|||||||
addPaperdollListener(AgathionBraceletListener.getInstance());
|
addPaperdollListener(AgathionBraceletListener.getInstance());
|
||||||
addPaperdollListener(ArtifactBookListener.getInstance());
|
addPaperdollListener(ArtifactBookListener.getInstance());
|
||||||
}
|
}
|
||||||
|
else if (this instanceof PetInventory)
|
||||||
|
{
|
||||||
|
addPaperdollListener(ArmorSetListener.getInstance());
|
||||||
|
addPaperdollListener(ItemSkillsListener.getInstance());
|
||||||
|
}
|
||||||
|
|
||||||
// common
|
// common
|
||||||
addPaperdollListener(StatsListener.getInstance());
|
addPaperdollListener(StatsListener.getInstance());
|
||||||
@ -2704,12 +2722,12 @@ public abstract class Inventory extends ItemContainer
|
|||||||
|
|
||||||
public int getArmorMinEnchant()
|
public int getArmorMinEnchant()
|
||||||
{
|
{
|
||||||
if ((getOwner() == null) || !getOwner().isPlayer())
|
if ((getOwner() == null) || !getOwner().isPlayable())
|
||||||
{
|
{
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Player player = getOwner().getActingPlayer();
|
final Playable player = (Playable) getOwner();
|
||||||
return _paperdollCache.getMaxSetEnchant(player);
|
return _paperdollCache.getMaxSetEnchant(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
import org.l2jmobius.gameserver.enums.SkillFinishType;
|
||||||
import org.l2jmobius.gameserver.model.actor.Player;
|
import org.l2jmobius.gameserver.model.actor.Playable;
|
||||||
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
import org.l2jmobius.gameserver.model.effects.AbstractEffect;
|
||||||
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
import org.l2jmobius.gameserver.model.skill.BuffInfo;
|
||||||
import org.l2jmobius.gameserver.model.skill.Skill;
|
import org.l2jmobius.gameserver.model.skill.Skill;
|
||||||
@ -157,11 +157,11 @@ public class Options
|
|||||||
_activationSkills.add(holder);
|
_activationSkills.add(holder);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void apply(Player player)
|
public void apply(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
final BuffInfo info = new BuffInfo(player, player, null, true, null, this);
|
final BuffInfo info = new BuffInfo(playable, playable, null, true, null, this);
|
||||||
for (AbstractEffect effect : _effects)
|
for (AbstractEffect effect : _effects)
|
||||||
{
|
{
|
||||||
if (effect.isInstant())
|
if (effect.isInstant())
|
||||||
@ -174,7 +174,7 @@ public class Options
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
effect.continuousInstant(info.getEffector(), info.getEffected(), info.getSkill(), info.getItem());
|
||||||
effect.pump(player, info.getSkill());
|
effect.pump(playable, info.getSkill());
|
||||||
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
if (effect.canStart(info.getEffector(), info.getEffected(), info.getSkill()))
|
||||||
{
|
{
|
||||||
info.addEffect(effect);
|
info.addEffect(effect);
|
||||||
@ -183,44 +183,47 @@ public class Options
|
|||||||
}
|
}
|
||||||
if (!info.getEffects().isEmpty())
|
if (!info.getEffects().isEmpty())
|
||||||
{
|
{
|
||||||
player.getEffectList().add(info);
|
playable.getEffectList().add(info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActiveSkills())
|
if (hasActiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
addSkill(player, skill);
|
addSkill(playable, skill);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.addTriggerSkill(holder);
|
playable.addTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void remove(Player player)
|
public void remove(Playable playable)
|
||||||
{
|
{
|
||||||
if (hasEffects())
|
if (hasEffects())
|
||||||
{
|
{
|
||||||
for (BuffInfo info : player.getEffectList().getOptions())
|
for (BuffInfo info : playable.getEffectList().getOptions())
|
||||||
{
|
{
|
||||||
if (info.getOption() == this)
|
if (info.getOption() == this)
|
||||||
{
|
{
|
||||||
player.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
playable.getEffectList().remove(info, SkillFinishType.NORMAL, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -228,45 +231,48 @@ public class Options
|
|||||||
{
|
{
|
||||||
for (Skill skill : _activeSkill)
|
for (Skill skill : _activeSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, false);
|
playable.removeSkill(skill, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasPassiveSkills())
|
if (hasPassiveSkills())
|
||||||
{
|
{
|
||||||
for (Skill skill : _passiveSkill)
|
for (Skill skill : _passiveSkill)
|
||||||
{
|
{
|
||||||
player.removeSkill(skill, false, true);
|
playable.removeSkill(skill, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (hasActivationSkills())
|
if (hasActivationSkills())
|
||||||
{
|
{
|
||||||
for (OptionSkillHolder holder : _activationSkills)
|
for (OptionSkillHolder holder : _activationSkills)
|
||||||
{
|
{
|
||||||
player.removeTriggerSkill(holder);
|
playable.removeTriggerSkill(holder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
player.getStat().recalculateStats(true);
|
playable.getStat().recalculateStats(true);
|
||||||
player.sendSkillList();
|
if (playable.isPlayer())
|
||||||
|
{
|
||||||
|
playable.getActingPlayer().sendSkillList();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addSkill(Player player, Skill skill)
|
private void addSkill(Playable playable, Skill skill)
|
||||||
{
|
{
|
||||||
boolean updateTimeStamp = false;
|
boolean updateTimeStamp = false;
|
||||||
player.addSkill(skill, false);
|
playable.addSkill(skill);
|
||||||
if (skill.isActive())
|
if (skill.isActive())
|
||||||
{
|
{
|
||||||
final long remainingTime = player.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
final long remainingTime = playable.getSkillRemainingReuseTime(skill.getReuseHashCode());
|
||||||
if (remainingTime > 0)
|
if (remainingTime > 0)
|
||||||
{
|
{
|
||||||
player.addTimeStamp(skill, remainingTime);
|
playable.addTimeStamp(skill, remainingTime);
|
||||||
player.disableSkill(skill, remainingTime);
|
playable.disableSkill(skill, remainingTime);
|
||||||
}
|
}
|
||||||
updateTimeStamp = true;
|
updateTimeStamp = true;
|
||||||
}
|
}
|
||||||
if (updateTimeStamp)
|
if (updateTimeStamp && playable.isPlayer())
|
||||||
{
|
{
|
||||||
player.sendPacket(new SkillCoolTime(player));
|
playable.sendPacket(new SkillCoolTime(playable.getActingPlayer()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user