/*
* 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.actor.instance;
import silentium.commons.utils.Rnd;
import silentium.gameserver.model.L2Skill;
import silentium.gameserver.model.actor.L2Character;
import silentium.gameserver.network.serverpackets.MagicSkillUse;
import silentium.gameserver.tables.NpcTable;
import silentium.gameserver.tables.SkillTable;
import silentium.gameserver.templates.chars.L2NpcTemplate;
/**
* This class manages all chest.
*
* @author Julian
*/
public final class L2ChestInstance extends L2MonsterInstance
{
private volatile boolean _isInteracted;
private volatile boolean _specialDrop;
public L2ChestInstance(int objectId, L2NpcTemplate template)
{
super(objectId, template);
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().getNpcId();
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().getLevel() >= 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().getLevel() >= 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().getLevel() >= 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);
}
private boolean handleCast(L2Character player, int skillId)
{
int skillLevel = 1;
byte lvl = getTemplate().getLevel();
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;
}
}