/* * 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 . */ package com.l2jserver.gameserver.model; import javolution.util.FastList; import com.l2jserver.gameserver.datatables.AugmentationData; import com.l2jserver.gameserver.datatables.SkillTable; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.instance.L2PcInstance; import com.l2jserver.gameserver.model.skills.L2Skill; import com.l2jserver.gameserver.model.skills.funcs.FuncAdd; import com.l2jserver.gameserver.model.skills.funcs.LambdaConst; import com.l2jserver.gameserver.model.stats.Stats; import com.l2jserver.gameserver.network.serverpackets.SkillCoolTime; /** * 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); } // ========================================================= // Nested Class public static class AugmentationStatBoni { private Stats _stats[]; private float _values[]; private boolean _active; public AugmentationStatBoni(int augmentationId) { _active = false; FastList 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(); } } }