/* * This program 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. This program 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 this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.gameserver.model; import javolution.util.FastList; import silentium.gameserver.data.xml.AugmentationData; import silentium.gameserver.model.actor.L2Character; import silentium.gameserver.model.actor.instance.L2PcInstance; import silentium.gameserver.network.serverpackets.SkillCoolTime; import silentium.gameserver.skills.Stats; import silentium.gameserver.skills.basefuncs.FuncAdd; import silentium.gameserver.skills.basefuncs.LambdaConst; import silentium.gameserver.tables.SkillTable; /** * Used to store an augmentation and its boni * * @author durgus */ public final class L2Augmentation { private int _effectsId = 0; private AugmentationStatBoni _boni = null; private L2Skill _skill = null; public L2Augmentation(int effects, L2Skill skill) { _effectsId = effects; _boni = new AugmentationStatBoni(_effectsId); _skill = skill; } public L2Augmentation(int effects, int skill, int skillLevel) { this(effects, skill != 0 ? SkillTable.getInstance().getInfo(skill, skillLevel) : null); } public static class AugmentationStatBoni { private final Stats _stats[]; private final float _values[]; private boolean _active; public AugmentationStatBoni(int augmentationId) { _active = false; FastList<AugmentationData.AugStat> as = AugmentationData.getInstance().getAugStatsById(augmentationId); _stats = new Stats[as.size()]; _values = new float[as.size()]; int i = 0; for (AugmentationData.AugStat aStat : as) { _stats[i] = aStat.getStat(); _values[i] = aStat.getValue(); i++; } } public void applyBonus(L2PcInstance player) { // make sure the bonuses are not applied twice.. if (_active) return; for (int i = 0; i < _stats.length; i++) ((L2Character) player).addStatFunc(new FuncAdd(_stats[i], 0x40, this, new LambdaConst(_values[i]))); _active = true; } public void removeBonus(L2PcInstance player) { // make sure the bonuses are not removed twice if (!_active) return; ((L2Character) player).removeStatsOwner(this); _active = false; } } public int getAttributes() { return _effectsId; } /** * Get the augmentation "id" used in serverpackets. * * @return augmentationId */ public int getAugmentationId() { return _effectsId; } public L2Skill getSkill() { return _skill; } /** * Applies the bonuses to the player. * * @param player */ public void applyBonus(L2PcInstance player) { boolean updateTimeStamp = false; _boni.applyBonus(player); // add the skill if any if (_skill != null) { player.addSkill(_skill); if (_skill.isActive()) { if (!player.getReuseTimeStamp().isEmpty() && player.getReuseTimeStamp().containsKey(_skill.getReuseHashCode())) { final long delay = player.getReuseTimeStamp().get(_skill.getReuseHashCode()).getRemaining(); if (delay > 0) { player.disableSkill(_skill, delay); updateTimeStamp = true; } } } player.sendSkillList(); if (updateTimeStamp) player.sendPacket(new SkillCoolTime(player)); } } /** * Removes the augmentation bonuses from the player. * * @param player */ public void removeBonus(L2PcInstance player) { _boni.removeBonus(player); // remove the skill if any if (_skill != null) { if (_skill.isPassive()) player.removeSkill(_skill, false, true); else player.removeSkill(_skill, false, false); player.sendSkillList(); } } }