/*
* This file is part of aion-unique <aion-unique.com>.
*
* aion-unique is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* aion-unique is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with aion-unique. If not, see <http://www.gnu.org/licenses/>.
*/
package com.aionemu.gameserver.model.gameobjects.stats.listeners;
import java.util.Set;
import java.util.TreeSet;
import org.apache.log4j.Logger;
import com.aionemu.gameserver.model.gameobjects.Item;
import com.aionemu.gameserver.model.gameobjects.player.Player;
import com.aionemu.gameserver.model.gameobjects.stats.CreatureGameStats;
import com.aionemu.gameserver.model.gameobjects.stats.PlayerGameStats;
import com.aionemu.gameserver.model.gameobjects.stats.id.ItemSetStatEffectId;
import com.aionemu.gameserver.model.gameobjects.stats.id.ItemStatEffectId;
import com.aionemu.gameserver.model.gameobjects.stats.id.StoneStatEffectId;
import com.aionemu.gameserver.model.gameobjects.stats.modifiers.StatModifier;
import com.aionemu.gameserver.model.items.ManaStone;
import com.aionemu.gameserver.model.templates.item.ArmorType;
import com.aionemu.gameserver.model.templates.item.ItemTemplate;
import com.aionemu.gameserver.model.templates.item.WeaponType;
import com.aionemu.gameserver.model.templates.itemset.ItemSetTemplate;
import com.aionemu.gameserver.model.templates.itemset.PartBonus;
/**
* @author xavier
*/
public class ItemEquipmentListener
{
private static final Logger log = Logger.getLogger(ItemEquipmentListener.class);
/**
*
* @param itemTemplate
* @param slot
* @param cgs
*/
private static void onItemEquipment(ItemTemplate itemTemplate, int slot, CreatureGameStats<?> cgs)
{
TreeSet<StatModifier> modifiers = itemTemplate.getModifiers();
if (modifiers==null)
{
if (cgs instanceof PlayerGameStats)
{
log.debug("No effect was found for item "+itemTemplate.getTemplateId());
}
}
cgs.addModifiers(ItemStatEffectId.getInstance(itemTemplate.getTemplateId(), slot), modifiers);
}
/**
* @param item
* @param cgs
*/
public static void onItemEquipment(Item item, Player owner)
{
ItemTemplate itemTemplate = item.getItemTemplate();
onItemEquipment(itemTemplate,item.getEquipmentSlot(),owner.getGameStats());
// Check if belongs to ItemSet
if(itemTemplate.isItemSet())
onItemSetPartEquipment(itemTemplate.getItemSet(), owner);
if(item.hasManaStones())
addStonesStats(item.getItemStones(), owner.getGameStats());
addGodstoneEffect(owner, item);
if(item.getItemTemplate().isWeapon())
recalculateWeaponMastery(owner);
if(item.getItemTemplate().isArmor())
recalculateArmorMastery(owner);
}
/**
*
* @param itemSetTemplate
* @param player
*/
private static void onItemSetPartEquipment(ItemSetTemplate itemSetTemplate, Player player)
{
if(itemSetTemplate == null)
return;
// 1.- Check equipment for items already equip with this itemSetTemplate id
int itemSetPartsEquipped = player.getEquipment().itemSetPartsEquipped(itemSetTemplate.getId());
// 2.- Check Item Set Parts and add effects one by one if not done already
for(PartBonus itempartbonus : itemSetTemplate.getPartbonus())
{
ItemSetStatEffectId setEffectId = ItemSetStatEffectId.getInstance(itemSetTemplate.getId(), itempartbonus
.getCount());
// If the partbonus was not applied before, do it now
if(itempartbonus.getCount() <= itemSetPartsEquipped
&& !player.getGameStats().effectAlreadyAdded(setEffectId))
{
player.getGameStats().addModifiers(setEffectId, itempartbonus.getModifiers());
}
}
// 3.- Finally check if all items are applied and set the full bonus if not already applied
if(itemSetTemplate.getFullbonus() != null && itemSetPartsEquipped == itemSetTemplate.getFullbonus().getCount())
{
ItemSetStatEffectId setEffectId = ItemSetStatEffectId.getInstance(itemSetTemplate.getId(),
itemSetPartsEquipped + 1);
if(!player.getGameStats().effectAlreadyAdded(setEffectId))
{
// Add the full bonus with index = total parts + 1 to avoid confusion with part bonus equal to number of
// objects
player.getGameStats().addModifiers(setEffectId, itemSetTemplate.getFullbonus().getModifiers());
}
}
}
/**
* @param owner
*/
private static void recalculateWeaponMastery(Player owner)
{
//don't calculate for not initialized equipment
if(owner.getEquipment() == null)
return;
for(WeaponType weaponType : WeaponType.values())
{
boolean masterySet = owner.getEffectController().isWeaponMasterySet(weaponType);
boolean weaponEquiped = owner.getEquipment().isWeaponEquipped(weaponType);
Integer skillId = owner.getSkillList().getWeaponMasterySkill(weaponType);
if(skillId == null)
continue;
//remove effect if no weapon is equiped
if(masterySet && !weaponEquiped)
{
owner.getEffectController().removePassiveEffect(skillId);
}
//add effect if weapon is equiped
if(!masterySet && weaponEquiped)
{
owner.getController().useSkill(skillId);
}
}
}
/**
* @param owner
*/
private static void recalculateArmorMastery(Player owner)
{
//don't calculate for not initialized equipment
if(owner.getEquipment() == null)
return;
for(ArmorType armorType : ArmorType.values())
{
boolean masterySet = owner.getEffectController().isArmorMasterySet(armorType);
boolean armorEquiped = owner.getEquipment().isArmorEquipped(armorType);
Integer skillId = owner.getSkillList().getArmorMasterySkill(armorType);
if(skillId == null)
continue;
//remove effect if no armor is equiped
if(masterySet && !armorEquiped)
{
owner.getEffectController().removePassiveEffect(skillId);
}
//add effect if armor is equiped
if(!masterySet && armorEquiped)
{
owner.getController().useSkill(skillId);
}
}
}
/**
* All modifiers of stones will be applied to character
*
* @param itemStones
* @param cgs
*/
private static void addStonesStats(Set<ManaStone> itemStones, CreatureGameStats<?> cgs)
{
if(itemStones == null || itemStones.size() == 0)
return;
for(ManaStone stone : itemStones)
{
addStoneStats(stone, cgs);
}
}
/**
* All modifiers of stones will be removed
*
* @param itemStones
* @param cgs
*/
private static void removeStoneStats(Set<ManaStone> itemStones, CreatureGameStats<?> cgs)
{
if(itemStones == null || itemStones.size() == 0)
return;
for(ManaStone stone : itemStones)
{
TreeSet<StatModifier> modifiers = stone.getModifiers();
if(modifiers != null)
{
cgs.endEffect(StoneStatEffectId.getInstance(stone.getItemObjId(), stone.getSlot()));
}
}
}
/**
* Used when socketing of equipped item
*
* @param stone
* @param cgs
*/
public static void addStoneStats(ManaStone stone, CreatureGameStats<?> cgs)
{
TreeSet<StatModifier> modifiers = stone.getModifiers();
if(modifiers != null)
{
cgs.addModifiers(StoneStatEffectId.getInstance(stone.getItemObjId(), stone.getSlot()), modifiers);
}
}
/**
*
* @param item
* @param owner
*/
public static void onItemUnequipment(Item item, Player owner)
{
// Check if belongs to an ItemSet
if(item.getItemTemplate().isItemSet())
onItemSetPartUnequipment(item.getItemTemplate().getItemSet(), owner);
owner.getGameStats().endEffect(
ItemStatEffectId.getInstance(item.getItemTemplate().getTemplateId(), item.getEquipmentSlot()));
if(item.hasManaStones())
removeStoneStats(item.getItemStones(), owner.getGameStats());
removeGodstoneEffect(owner, item);
if(item.getItemTemplate().isWeapon())
recalculateWeaponMastery(owner);
if(item.getItemTemplate().isArmor())
recalculateArmorMastery(owner);
}
/**
*
* @param itemSetTemplate
* @param player
*/
private static void onItemSetPartUnequipment(ItemSetTemplate itemSetTemplate, Player player)
{
if(itemSetTemplate == null)
return;
// 1.- Check number of item parts equipped before the removal (i.e. current + 1)
int previousItemSetPartsEquipped = player.getEquipment().itemSetPartsEquipped(itemSetTemplate.getId()) + 1;
// 2.- Check if removed one item from the full set and if so remove the full bonus
if(itemSetTemplate.getFullbonus() != null
&& previousItemSetPartsEquipped == itemSetTemplate.getFullbonus().getCount())
{
// Full bonus was added with index = total parts + 1 to avoid confusion with part bonus equal to total
// number of item set parts
player.getGameStats()
.endEffect(
ItemSetStatEffectId.getInstance(itemSetTemplate.getId(),
itemSetTemplate.getFullbonus().getCount() + 1));
}
// 3.- Check Item Set Parts and remove appropriate effects
for(PartBonus itempartbonus : itemSetTemplate.getPartbonus())
{
// Remove modifier if not applicable anymore
if(itempartbonus.getCount() == previousItemSetPartsEquipped)
{
player.getGameStats().endEffect(
ItemSetStatEffectId.getInstance(itemSetTemplate.getId(), itempartbonus.getCount()));
}
}
}
/**
* @param item
*/
private static void addGodstoneEffect(Player player, Item item)
{
if(item.getGodStone() != null)
{
item.getGodStone().onEquip(player);
}
}
/**
* @param item
*/
private static void removeGodstoneEffect(Player player, Item item)
{
if(item.getGodStone() != null)
{
item.getGodStone().onUnEquip(player);
}
}
}