/* *@author Julian * * 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 com.l2jserver.gameserver.model.actor.instance; import com.l2jserver.gameserver.datatables.NpcTable; import com.l2jserver.gameserver.datatables.SkillTable; import com.l2jserver.gameserver.model.L2Skill; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.network.serverpackets.MagicSkillUse; import com.l2jserver.gameserver.templates.chars.L2NpcTemplate; import com.l2jserver.util.Rnd; /** * This class manages all chest. */ public final class L2ChestInstance extends L2MonsterInstance { private volatile boolean _isInteracted; private volatile boolean _specialDrop; public L2ChestInstance(int objectId, L2NpcTemplate template) { super(objectId, template); setInstanceType(InstanceType.L2ChestInstance); setIsNoRndWalk(true); _isInteracted = false; _specialDrop = false; } @Override public void onSpawn() { super.onSpawn(); _isInteracted = false; _specialDrop = false; setMustRewardExpSp(true); } public synchronized boolean isInteracted() { return _isInteracted; } public synchronized void setInteracted() { _isInteracted = true; } public synchronized boolean isSpecialDrop() { return _specialDrop; } public synchronized void setSpecialDrop() { _specialDrop = true; } @Override public void doItemDrop(L2NpcTemplate npcTemplate, L2Character lastAttacker) { int id = getTemplate().npcId; if (!_specialDrop) { if (id >= 18265 && id <= 18286) id += 3536; else if (id == 18287 || id == 18288) id = 21671; else if (id == 18289 || id == 18290) id = 21694; else if (id == 18291 || id == 18292) id = 21717; else if (id == 18293 || id == 18294) id = 21740; else if (id == 18295 || id == 18296) id = 21763; else if (id == 18297 || id == 18298) id = 21786; } super.doItemDrop(NpcTable.getInstance().getTemplate(id),lastAttacker); } //cast - trap chest public void chestTrap(L2Character player) { int trapSkillId = 0; int rnd = Rnd.get(120); if (getTemplate().level >= 61) { if (rnd >= 90) trapSkillId = 4139;//explosion else if (rnd >= 50) trapSkillId = 4118;//area paralysys else if (rnd >= 20) trapSkillId = 1167;//poison cloud else trapSkillId = 223;//sting } else if (getTemplate().level >= 41) { if (rnd >= 90) trapSkillId = 4139;//explosion else if (rnd >= 60) trapSkillId = 96;//bleed else if (rnd >= 20) trapSkillId = 1167;//poison cloud else trapSkillId = 4118;//area paralysys } else if (getTemplate().level >= 21) { if (rnd >= 80) trapSkillId = 4139;//explosion else if (rnd >= 50) trapSkillId = 96;//bleed else if (rnd >= 20) trapSkillId = 1167;//poison cloud else trapSkillId = 129;//poison } else { if (rnd >= 80) trapSkillId = 4139;//explosion else if (rnd >= 50) trapSkillId = 96;//bleed else trapSkillId = 129;//poison } player.sendMessage("There was a trap!"); handleCast(player, trapSkillId); } //<-- //cast casse //<-- private boolean handleCast(L2Character player, int skillId) { int skillLevel = 1; byte lvl = getTemplate().level; if (lvl > 20 && lvl <= 40) skillLevel = 3; else if (lvl > 40 && lvl <= 60) skillLevel = 5; else if (lvl > 60) skillLevel = 6; if (player.isDead() || !player.isVisible() || !player.isInsideRadius(this, getDistanceToWatchObject(player), false, false)) return false; L2Skill skill = SkillTable.getInstance().getInfo(skillId, skillLevel); if (player.getFirstEffect(skill) == null) { skill.getEffects(this, player); broadcastPacket(new MagicSkillUse(this, player, skill.getId(), skillLevel, skill.getHitTime(), 0)); return true; } return false; } @Override public boolean isMovementDisabled() { if (super.isMovementDisabled()) return true; if (isInteracted()) return false; return true; } @Override public boolean hasRandomAnimation() { return false; } }