/* * Copyright (C) 2004-2015 L2J Server * * This file is part of L2J Server. * * L2J Server 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. * * L2J Server 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.Config; import com.l2jserver.gameserver.ThreadPoolManager; import com.l2jserver.gameserver.enums.InstanceType; import com.l2jserver.gameserver.instancemanager.RaidBossPointsManager; import com.l2jserver.gameserver.instancemanager.RaidBossSpawnManager; import com.l2jserver.gameserver.model.L2Spawn; import com.l2jserver.gameserver.model.actor.L2Character; import com.l2jserver.gameserver.model.actor.templates.L2NpcTemplate; import com.l2jserver.gameserver.model.entity.Hero; import com.l2jserver.gameserver.network.SystemMessageId; import com.l2jserver.gameserver.network.serverpackets.SystemMessage; import com.l2jserver.util.Rnd; /** * This class manages all RaidBoss.<br> * In a group mob, there are one master called RaidBoss and several slaves called Minions. */ public class L2RaidBossInstance extends L2MonsterInstance { private static final int RAIDBOSS_MAINTENANCE_INTERVAL = 30000; // 30 sec private RaidBossSpawnManager.StatusEnum _raidStatus; private boolean _useRaidCurse = true; /** * Creates a raid boss. * @param template the raid boss template */ public L2RaidBossInstance(L2NpcTemplate template) { super(template); setInstanceType(InstanceType.L2RaidBossInstance); setIsRaid(true); setLethalable(false); } @Override public void onSpawn() { setIsNoRndWalk(true); super.onSpawn(); } @Override protected int getMaintenanceInterval() { return RAIDBOSS_MAINTENANCE_INTERVAL; } @Override public boolean doDie(L2Character killer) { if (!super.doDie(killer)) { return false; } final L2PcInstance player = killer.getActingPlayer(); if (player != null) { broadcastPacket(SystemMessage.getSystemMessage(SystemMessageId.CONGRATULATIONS_YOUR_RAID_WAS_SUCCESSFUL)); if (player.getParty() != null) { for (L2PcInstance member : player.getParty().getMembers()) { RaidBossPointsManager.getInstance().addPoints(member, getId(), (getLevel() / 2) + Rnd.get(-5, 5)); if (member.isNoble()) { Hero.getInstance().setRBkilled(member.getObjectId(), getId()); } } } else { RaidBossPointsManager.getInstance().addPoints(player, getId(), (getLevel() / 2) + Rnd.get(-5, 5)); if (player.isNoble()) { Hero.getInstance().setRBkilled(player.getObjectId(), getId()); } } } RaidBossSpawnManager.getInstance().updateStatus(this, true); return true; } /** * Spawn all minions at a regular interval Also if boss is too far from home location at the time of this check, teleport it home. */ @Override protected void startMaintenanceTask() { _maintenanceTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(() -> checkAndReturnToSpawn(), 60000, getMaintenanceInterval() + Rnd.get(5000)); } protected void checkAndReturnToSpawn() { if (isDead() || isMovementDisabled() || !canReturnToSpawnPoint()) { return; } final L2Spawn spawn = getSpawn(); if (spawn == null) { return; } final int spawnX = spawn.getX(); final int spawnY = spawn.getY(); final int spawnZ = spawn.getZ(); if (!isInCombat() && !isMovementDisabled()) { if (!isInsideRadius(spawnX, spawnY, spawnZ, Math.max(Config.MAX_DRIFT_RANGE, 200), true, false)) { teleToLocation(spawnX, spawnY, spawnZ, false); } } } public void setRaidStatus(RaidBossSpawnManager.StatusEnum status) { _raidStatus = status; } public RaidBossSpawnManager.StatusEnum getRaidStatus() { return _raidStatus; } @Override public int getVitalityPoints(int damage) { return -super.getVitalityPoints(damage) / 100; } @Override public boolean useVitalityRate() { return false; } public void setUseRaidCurse(boolean val) { _useRaidCurse = val; } @Override public boolean giveRaidCurse() { return _useRaidCurse; } }