Package com.l2jfrozen.gameserver.ai.special

Source Code of com.l2jfrozen.gameserver.ai.special.Antharas

/*
* 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.l2jfrozen.gameserver.ai.special;

import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.concurrent.ScheduledFuture;
import java.util.logging.Logger;

import javolution.util.FastList;

import com.l2jfrozen.Config;
import com.l2jfrozen.gameserver.ai.CtrlIntention;
import com.l2jfrozen.gameserver.datatables.SkillTable;
import com.l2jfrozen.gameserver.datatables.sql.NpcTable;
import com.l2jfrozen.gameserver.datatables.sql.SpawnTable;
import com.l2jfrozen.gameserver.geo.GeoData;
import com.l2jfrozen.gameserver.managers.GrandBossManager;
import com.l2jfrozen.gameserver.model.L2Character;
import com.l2jfrozen.gameserver.model.L2Skill;
import com.l2jfrozen.gameserver.model.L2World;
import com.l2jfrozen.gameserver.model.actor.instance.L2GrandBossInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2MonsterInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2NpcInstance;
import com.l2jfrozen.gameserver.model.actor.instance.L2PcInstance;
import com.l2jfrozen.gameserver.model.actor.position.L2CharPosition;
import com.l2jfrozen.gameserver.model.quest.Quest;
import com.l2jfrozen.gameserver.model.spawn.L2Spawn;
import com.l2jfrozen.gameserver.model.zone.type.L2BossZone;
import com.l2jfrozen.gameserver.network.serverpackets.Earthquake;
import com.l2jfrozen.gameserver.network.serverpackets.L2GameServerPacket;
import com.l2jfrozen.gameserver.network.serverpackets.PlaySound;
import com.l2jfrozen.gameserver.network.serverpackets.SpecialCamera;
import com.l2jfrozen.gameserver.templates.L2NpcTemplate;
import com.l2jfrozen.gameserver.templates.StatsSet;
import com.l2jfrozen.gameserver.thread.ThreadPoolManager;
import com.l2jfrozen.util.random.Rnd;

/**
* This class ... control for sequence of fight against Antharas.
*
* @version $Revision: $ $Date: $
* @author L2J_JP SANDMAN
*/
public class Antharas extends Quest implements Runnable
{
  protected static final Logger _log = Logger.getLogger(Antharas.class.getName());
 
  // config
  private static final int FWA_ACTIVITYTIMEOFANTHARAS = 120;
  protected static final boolean FWA_OLDANTHARAS = Config.ANTHARAS_OLD; //use antharas interlude with minions
  private static final boolean FWA_MOVEATRANDOM = true;
  private static final boolean FWA_DOSERVEREARTHQUAKE = true;
  private static final int FWA_LIMITOFWEAK = 45;
  private static final int FWA_LIMITOFNORMAL = 63;
 
  private static final int FWA_MAXMOBS = 10; // this includes Antharas itself
  private static final int FWA_INTERVALOFMOBSWEAK = 180000;
  private static final int FWA_INTERVALOFMOBSNORMAL = 150000;
  private static final int FWA_INTERVALOFMOBSSTRONG = 120000;
  private static final int FWA_PERCENTOFBEHEMOTH = 60;
  private static final int FWA_SELFDESTRUCTTIME = 15000;
  // Location of teleport cube.
  private final int _teleportCubeId = 31859;
  private final int _teleportCubeLocation[][] = { { 177615, 114941, -7709, 0 } };
 
  protected List<L2Spawn> _teleportCubeSpawn = new FastList<L2Spawn>();
  protected List<L2NpcInstance> _teleportCube = new FastList<L2NpcInstance>();
 
  // Spawn data of monsters.
  protected HashMap<Integer, L2Spawn> _monsterSpawn = new HashMap<Integer, L2Spawn>();
 
  // Instance of monsters.
  protected List<L2NpcInstance> _monsters = new FastList<L2NpcInstance>();
  protected L2GrandBossInstance _antharas = null;
 
  // monstersId
  private static final int ANTHARASOLDID = 29019;
  private static final int ANTHARASWEAKID = 29066;
  private static final int ANTHARASNORMALID = 29067;
  private static final int ANTHARASSTRONGID = 29068;
 
  // Tasks.
  protected ScheduledFuture<?> _cubeSpawnTask = null;
  protected volatile ScheduledFuture<?> _monsterSpawnTask = null;
  protected ScheduledFuture<?> _activityCheckTask = null;
  protected ScheduledFuture<?> _socialTask = null;
  protected ScheduledFuture<?> _mobiliseTask = null;
  protected ScheduledFuture<?> _mobsSpawnTask = null;
  protected ScheduledFuture<?> _selfDestructionTask = null;
  protected ScheduledFuture<?> _moveAtRandomTask = null;
  protected ScheduledFuture<?> _movieTask = null;
 
  //Antharas Status Tracking :
  private static final int DORMANT = 0;    //Antharas is spawned and no one has entered yet. Entry is unlocked
  private static final int WAITING = 1;    //Antharas is spawend and someone has entered, triggering a 30 minute window for additional people to enter
  //before he unleashes his attack. Entry is unlocked
  private static final int FIGHTING = 2;    //Antharas is engaged in battle, annihilating his foes. Entry is locked
  private static final int DEAD = 3;      //Antharas has been killed. Entry is locked
 
  protected static long _LastAction = 0;
 
  protected static L2BossZone _Zone;
 

  // Boss: Antharas
  public Antharas(int id,String name,String descr)
  {
    super(id,name,descr);
    int[] mob = {ANTHARASOLDID,ANTHARASWEAKID,ANTHARASNORMALID,ANTHARASSTRONGID,29069,29070,29071,29072,29073,29074,29075,29076};
    this.registerMobs(mob);
    init();
  }
 
  // Initialize
  private void init()
  {
    // Setting spawn data of monsters.
    try
    {
      _Zone = GrandBossManager.getInstance().getZone(179700,113800,-7709);
      L2NpcTemplate template1;
      L2Spawn tempSpawn;
     
      // Old Antharas
      template1 = NpcTable.getInstance().getTemplate(ANTHARASOLDID);
      tempSpawn = new L2Spawn(template1);
      tempSpawn.setLocx(181323);
      tempSpawn.setLocy(114850);
      tempSpawn.setLocz(-7623);
      tempSpawn.setHeading(32542);
      tempSpawn.setAmount(1);
      tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
      SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
      _monsterSpawn.put(29019, tempSpawn);
     
      // Weak Antharas
      template1 = NpcTable.getInstance().getTemplate(ANTHARASWEAKID);
      tempSpawn = new L2Spawn(template1);
      tempSpawn.setLocx(181323);
      tempSpawn.setLocy(114850);
      tempSpawn.setLocz(-7623);
      tempSpawn.setHeading(32542);
      tempSpawn.setAmount(1);
      tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
      SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
      _monsterSpawn.put(29066, tempSpawn);
     
      // Normal Antharas
      template1 = NpcTable.getInstance().getTemplate(ANTHARASNORMALID);
      tempSpawn = new L2Spawn(template1);
      tempSpawn.setLocx(181323);
      tempSpawn.setLocy(114850);
      tempSpawn.setLocz(-7623);
      tempSpawn.setHeading(32542);
      tempSpawn.setAmount(1);
      tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
      SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
      _monsterSpawn.put(29067, tempSpawn);
     
      // Strong Antharas
      template1 = NpcTable.getInstance().getTemplate(ANTHARASSTRONGID);
      tempSpawn = new L2Spawn(template1);
      tempSpawn.setLocx(181323);
      tempSpawn.setLocy(114850);
      tempSpawn.setLocz(-7623);
      tempSpawn.setHeading(32542);
      tempSpawn.setAmount(1);
      tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
      SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
      _monsterSpawn.put(29068, tempSpawn);
    }
    catch (Exception e)
    {
      _log.warning(e.getMessage());
    }
   
    // Setting spawn data of teleport cube.
    try
    {
      L2NpcTemplate Cube = NpcTable.getInstance().getTemplate(_teleportCubeId);
      L2Spawn spawnDat;
      for (int[] element : _teleportCubeLocation)
      {
        spawnDat = new L2Spawn(Cube);
        spawnDat.setAmount(1);
        spawnDat.setLocx(element[0]);
        spawnDat.setLocy(element[1]);
        spawnDat.setLocz(element[2]);
        spawnDat.setHeading(element[3]);
        spawnDat.setRespawnDelay(60);
        spawnDat.setLocation(0);
        SpawnTable.getInstance().addNewSpawn(spawnDat, false);
        _teleportCubeSpawn.add(spawnDat);
      }
    }
    catch (Exception e)
    {
      _log.warning(e.getMessage());
    }
   
    Integer status = GrandBossManager.getInstance().getBossStatus(ANTHARASOLDID);
   
    if (FWA_OLDANTHARAS || status == WAITING)
    {
      StatsSet info = GrandBossManager.getInstance().getStatsSet(ANTHARASOLDID);
      Long respawnTime = info.getLong("respawn_time");
      if (status == DEAD && respawnTime <= System.currentTimeMillis())
      {
        // the time has already expired while the server was offline. Immediately spawn antharas in his cave.
        // also, the status needs to be changed to DORMANT
        GrandBossManager.getInstance().setBossStatus(ANTHARASOLDID,DORMANT);
        status = DORMANT;
      }
      else if (status == FIGHTING)
      {
        int loc_x = info.getInteger("loc_x");
        int loc_y = info.getInteger("loc_y");
        int loc_z = info.getInteger("loc_z");
        int heading = info.getInteger("heading");
        int hp = info.getInteger("currentHP");
        int mp = info.getInteger("currentMP");
        _antharas = (L2GrandBossInstance) addSpawn(ANTHARASOLDID,loc_x,loc_y,loc_z,heading,false,0);
        GrandBossManager.getInstance().addBoss(_antharas);
        _antharas.setCurrentHpMp(hp,mp);
        _LastAction = System.currentTimeMillis();
        // Start repeating timer to check for inactivity
        _activityCheckTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckActivity(), 60000, 60000);
      }
      else if (status == DEAD)
      {
        ThreadPoolManager.getInstance().scheduleGeneral(new UnlockAntharas(ANTHARASOLDID), respawnTime - System.currentTimeMillis());
      }
      else
      {
        setAntharasSpawnTask();
      }
    }
    else
    {
      Integer statusWeak = GrandBossManager.getInstance().getBossStatus(ANTHARASWEAKID);
     
     
      Integer statusNormal = GrandBossManager.getInstance().getBossStatus(ANTHARASNORMALID);
     
     
      Integer statusStrong = GrandBossManager.getInstance().getBossStatus(ANTHARASSTRONGID);
     
      int antharasId = 0;
      if (statusWeak == FIGHTING || statusWeak == DEAD)
      {
        antharasId = ANTHARASWEAKID;
        status = statusWeak;
      }
      else if (statusNormal == FIGHTING || statusNormal == DEAD)
      {
        antharasId = ANTHARASNORMALID;
        status = statusNormal;
      }
      else if (statusStrong == FIGHTING || statusStrong == DEAD)
      {
        antharasId = ANTHARASSTRONGID;
        status = statusStrong;
      }
      if (antharasId != 0 && status == FIGHTING)
      {
        StatsSet info = GrandBossManager.getInstance().getStatsSet(antharasId);
        int loc_x = info.getInteger("loc_x");
        int loc_y = info.getInteger("loc_y");
        int loc_z = info.getInteger("loc_z");
        int heading = info.getInteger("heading");
        int hp = info.getInteger("currentHP");
        int mp = info.getInteger("currentMP");
        _antharas = (L2GrandBossInstance) addSpawn(antharasId,loc_x,loc_y,loc_z,heading,false,0);
        GrandBossManager.getInstance().addBoss(_antharas);
        _antharas.setCurrentHpMp(hp,mp);
        _LastAction = System.currentTimeMillis();
        // Start repeating timer to check for inactivity
        _activityCheckTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckActivity(), 60000, 60000);
      }
      else if (antharasId != 0 && status == DEAD)
      {
        StatsSet info = GrandBossManager.getInstance().getStatsSet(antharasId);
        Long respawnTime = info.getLong("respawn_time");
        if (respawnTime <= System.currentTimeMillis())
        {
          // the time has already expired while the server was offline. Immediately spawn antharas in his cave.
          // also, the status needs to be changed to DORMANT
          GrandBossManager.getInstance().setBossStatus(antharasId,DORMANT);
          status = DORMANT;
        }
        else
        {
          ThreadPoolManager.getInstance().scheduleGeneral(new UnlockAntharas(antharasId), respawnTime - System.currentTimeMillis());
        }
      }
    }
  }
 
  // Do spawn teleport cube.
  public void spawnCube()
  {
    if (_mobsSpawnTask != null)
    {
      _mobsSpawnTask.cancel(true);
      _mobsSpawnTask = null;
    }
    if (_selfDestructionTask != null)
    {
      _selfDestructionTask.cancel(true);
      _selfDestructionTask = null;
    }
    if (_activityCheckTask != null)
    {
      _activityCheckTask.cancel(false);
      _activityCheckTask = null;
    }
   
    for (L2Spawn spawnDat : _teleportCubeSpawn)
    {
      _teleportCube.add(spawnDat.doSpawn());
    }
  }
 
  // Setting Antharas spawn task.
  public void setAntharasSpawnTask()
  {
    if (_monsterSpawnTask == null)
    {
      synchronized(this)
      {
        if (_monsterSpawnTask == null)
        {
          GrandBossManager.getInstance().setBossStatus(ANTHARASOLDID,WAITING);
          _monsterSpawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(1),60000*Config.ANTHARAS_WAIT_TIME);
        }
      }
    }
  }
 
  protected void startMinionSpawns(int antharasId)
  {
    int intervalOfMobs;
   
    // Interval of minions is decided by the type of Antharas
    // that invaded the lair.
    switch (antharasId)
    {
      case ANTHARASWEAKID:
        intervalOfMobs = FWA_INTERVALOFMOBSWEAK;
        break;
      case ANTHARASNORMALID:
        intervalOfMobs = FWA_INTERVALOFMOBSNORMAL;
        break;
      default:
        intervalOfMobs = FWA_INTERVALOFMOBSSTRONG;
        break;
    }
   
    // Spawn mobs.
    _mobsSpawnTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new MobsSpawn(), intervalOfMobs, intervalOfMobs);
  }
 
  // Do spawn Antharas.
  private class AntharasSpawn implements Runnable
  {
    private int _taskId = 0;
    private Collection<L2Character> _players;
   
    AntharasSpawn(int taskId)
    {
      _taskId = taskId;
      if(_Zone.getCharactersInside()!=null){
        _players = _Zone.getCharactersInside().values();
      }
    }
   
    @Override
    public void run()
    {
      int npcId;
      L2Spawn antharasSpawn = null;
     
      switch (_taskId)
      {
        case 1: // Spawn.
          // Strength of Antharas is decided by the number of players that
          // invaded the lair.
          _monsterSpawnTask.cancel(false);
          _monsterSpawnTask = null;
          if (FWA_OLDANTHARAS)
            npcId = 29019; // old
          else if (_players == null || _players!=null && _players.size() <= FWA_LIMITOFWEAK)
            npcId = 29066; // weak
          else if (_players!=null && _players.size() > FWA_LIMITOFNORMAL)
            npcId = 29068; // strong
          else
            npcId = 29067; // normal
         
          // Do spawn.
          antharasSpawn = _monsterSpawn.get(npcId);
          _antharas = (L2GrandBossInstance) antharasSpawn.doSpawn();
          GrandBossManager.getInstance().addBoss(_antharas);
         
          _monsters.add(_antharas);
          _antharas.setIsImobilised(true);
         
          GrandBossManager.getInstance().setBossStatus(ANTHARASOLDID,DORMANT);
          GrandBossManager.getInstance().setBossStatus(npcId,FIGHTING);
          _LastAction = System.currentTimeMillis();
          // Start repeating timer to check for inactivity
          _activityCheckTask = ThreadPoolManager.getInstance().scheduleGeneralAtFixedRate(new CheckActivity(), 60000, 60000);
         
          // Setting 1st time of minions spawn task.
          if (!FWA_OLDANTHARAS)
          {
            startMinionSpawns(npcId);
          }
         
          // Set next task.
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          _socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(2), 16);
          break;
        case 2:
          // Set camera.
          broadcastPacket(new SpecialCamera(_antharas.getObjectId(),700,13,-19,0,20000));
         
          // Set next task.
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          _socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(3), 3000);
          break;
         
        case 3:
          // Do social.
          broadcastPacket(new SpecialCamera(_antharas.getObjectId(),700,13,0,6000,20000));
          // Set next task.
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          _socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(4), 10000);
          break;
        case 4:
          broadcastPacket(new SpecialCamera(_antharas.getObjectId(),3700,0,-3,0,10000));
          // Set next task.
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          _socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(5), 200);
          break;
         
        case 5:
          // Do social.
          broadcastPacket(new SpecialCamera(_antharas.getObjectId(),1100,0,-3,22000,30000));
          // Set next task.
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          _socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(6), 10800);
          break;
         
        case 6:
          // Set camera.
          broadcastPacket(new SpecialCamera(_antharas.getObjectId(),1100,0,-3,300,7000));
          // Set next task.
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          _socialTask = ThreadPoolManager.getInstance().scheduleGeneral(new AntharasSpawn(7), 1900);
          break;
         
        case 7:
          _antharas.abortCast();
         
          _mobiliseTask = ThreadPoolManager.getInstance().scheduleGeneral(new SetMobilised(_antharas), 16);
         
          // Move at random.
          if (FWA_MOVEATRANDOM)
          {
            L2CharPosition pos = new L2CharPosition(Rnd.get(175000,178500), Rnd.get(112400, 116000), -7707, 0);
            _moveAtRandomTask = ThreadPoolManager.getInstance().scheduleGeneral(new MoveAtRandom(_antharas, pos),500);
          }
         
          if (_socialTask != null)
          {
            _socialTask.cancel(true);
            _socialTask = null;
          }
          break;
      }
    }
  }
 
  protected void broadcastPacket(L2GameServerPacket mov)
  {
    if (_Zone != null)
    {
      for (L2Character characters : _Zone.getCharactersInside().values())
      {
        if (characters instanceof L2PcInstance)
          characters.sendPacket(mov);
      }
    }
  }
 
  // Do spawn Behemoth or Bomber.
  private class MobsSpawn implements Runnable
  {
    public MobsSpawn()
    {
    }
   
    @Override
    public void run()
    {
      L2NpcTemplate template1;
      L2Spawn tempSpawn;
      boolean isBehemoth = Rnd.get(100) < FWA_PERCENTOFBEHEMOTH;
      try
      {
        int mobNumber = (isBehemoth ? 2 : 3);
        // Set spawn.
        for(int i = 0; i < mobNumber; i++)
        {
          if (_monsters.size() >= FWA_MAXMOBS)
            break;
          int npcId;
          if (isBehemoth)
            npcId = 29069;
          else
            npcId = Rnd.get(29070, 29076);
          template1 = NpcTable.getInstance().getTemplate(npcId);
          tempSpawn = new L2Spawn(template1);
          // allocates it at random in the lair of Antharas.
          int tried = 0;
          boolean notFound = true;
          int x = 175000;
          int y = 112400;
          int dt = (_antharas.getX() - x) * (_antharas.getX() - x) + (_antharas.getY() - y) * (_antharas.getY() - y);
          while (tried++ < 25 && notFound)
          {
            int rx = Rnd.get(175000, 179900);
            int ry = Rnd.get(112400, 116000);
            int rdt = (_antharas.getX() - rx) * (_antharas.getX() - rx) + (_antharas.getY() - ry) * (_antharas.getY() - ry);
            if (GeoData.getInstance().canSeeTarget(_antharas.getX(), _antharas.getY(), -7704, rx, ry, -7704))
              if (rdt < dt)
              {
                x = rx;
                y = ry;
                dt = rdt;
                if (rdt <= 900000)
                  notFound = false;
              }
          }
          tempSpawn.setLocx(x);
          tempSpawn.setLocy(y);
          tempSpawn.setLocz(-7704);
          tempSpawn.setHeading(0);
          tempSpawn.setAmount(1);
          tempSpawn.setRespawnDelay(FWA_ACTIVITYTIMEOFANTHARAS * 2);
          SpawnTable.getInstance().addNewSpawn(tempSpawn, false);
          // Do spawn.
          _monsters.add(tempSpawn.doSpawn());
        }
      }
      catch (Exception e)
      {
        _log.warning(e.getMessage());
      }
    }
  }
 
  @Override
  public String onAggroRangeEnter (L2NpcInstance npc, L2PcInstance player, boolean isPet)
  {
    switch (npc.getNpcId())
    {
      case 29070:
      case 29071:
      case 29072:
      case 29073:
      case 29074:
      case 29075:
      case 29076:
        if (_selfDestructionTask == null && !npc.isDead())
          _selfDestructionTask = ThreadPoolManager.getInstance().scheduleGeneral(new SelfDestructionOfBomber(npc), FWA_SELFDESTRUCTTIME);
        break;
    }
    return super.onAggroRangeEnter(npc, player, isPet);
  }
 
  // Do self destruction.
  private class SelfDestructionOfBomber implements Runnable
  {
    private L2NpcInstance _bomber;
   
    public SelfDestructionOfBomber(L2NpcInstance bomber)
    {
      _bomber = bomber;
    }
   
    @Override
    public void run()
    {
      L2Skill skill = null;
      switch (_bomber.getNpcId())
      {
        case 29070:
        case 29071:
        case 29072:
        case 29073:
        case 29074:
        case 29075:
          skill = SkillTable.getInstance().getInfo(5097, 1);
          break;
        case 29076:
          skill = SkillTable.getInstance().getInfo(5094, 1);
          break;
      }
     
      _bomber.doCast(skill);
     
      if(_selfDestructionTask!=null){
        _selfDestructionTask.cancel(false);
        _selfDestructionTask = null;
      }
     
    }
  }
 
  @Override
  public String onSpellFinished(L2NpcInstance npc, L2PcInstance player, L2Skill skill)
  {
    if (npc.isInvul())
    {
      return null;
    }
    else if (skill != null && (skill.getId() == 5097 || skill.getId() == 5094))
    {
      switch (npc.getNpcId())
      {
        case 29070:
        case 29071:
        case 29072:
        case 29073:
        case 29074:
        case 29075:
        case 29076:
          npc.doDie(npc);
          break;
      }
    }
    return super.onSpellFinished(npc, player, skill);
  }
 
  // At end of activity time.
  protected class CheckActivity implements Runnable
  {
    @Override
    public void run()
    {
      Long temp = (System.currentTimeMillis() - _LastAction);
      if (temp > (Config.ANTHARAS_DESPAWN_TIME*60000))
      {
        GrandBossManager.getInstance().setBossStatus(_antharas.getNpcId(),DORMANT);
        setUnspawn();
      }
    }
  }
 
  // Clean Antharas's lair.
  public void setUnspawn()
  {
    // Eliminate players.
    _Zone.oustAllPlayers();
   
    // Not executed tasks is canceled.
    if (_cubeSpawnTask != null)
    {
      _cubeSpawnTask.cancel(true);
      _cubeSpawnTask = null;
    }
    if (_monsterSpawnTask != null)
    {
      _monsterSpawnTask.cancel(true);
      _monsterSpawnTask = null;
    }
    if (_activityCheckTask != null)
    {
      _activityCheckTask.cancel(false);
      _activityCheckTask = null;
    }
    if (_socialTask != null)
    {
      _socialTask.cancel(true);
      _socialTask = null;
    }
    if (_mobiliseTask != null)
    {
      _mobiliseTask.cancel(true);
      _mobiliseTask = null;
    }
    if (_mobsSpawnTask != null)
    {
      _mobsSpawnTask.cancel(true);
      _mobsSpawnTask = null;
    }
    if (_selfDestructionTask != null)
    {
      _selfDestructionTask.cancel(true);
      _selfDestructionTask = null;
    }
    if (_moveAtRandomTask != null)
    {
      _moveAtRandomTask.cancel(true);
      _moveAtRandomTask = null;
    }
   
    // Delete monsters.
    for (L2NpcInstance mob : _monsters)
    {
      mob.getSpawn().stopRespawn();
      mob.deleteMe();
    }
    _monsters.clear();
   
    // Delete teleport cube.
    for (L2NpcInstance cube : _teleportCube)
    {
      cube.getSpawn().stopRespawn();
      cube.deleteMe();
    }
    _teleportCube.clear();
  }
 
  // Do spawn teleport cube.
  private class CubeSpawn implements Runnable
  {
    private int _type;
   
    CubeSpawn(int type)
    {
      _type = type;
    }
   
    @Override
    public void run()
    {
      if (_type == 0)
      {
        spawnCube();
        _cubeSpawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new CubeSpawn(1), 1800000);
      }
      else
        setUnspawn();
    }
  }
 
  // UnLock Antharas.
  private static class UnlockAntharas implements Runnable
  {
    private int _bossId;
   
    public UnlockAntharas(int bossId)
    {
      _bossId = bossId;
    }
   
    @Override
    public void run()
    {
      GrandBossManager.getInstance().setBossStatus(_bossId,DORMANT);
      if (FWA_DOSERVEREARTHQUAKE)
        for(L2PcInstance p : L2World.getInstance().getAllPlayers())
          p.broadcastPacket(new Earthquake(185708,114298,-8221,20,10));
    }
  }
 
  // Action is enabled the boss.
  private class SetMobilised implements Runnable
  {
    private L2GrandBossInstance _boss;
   
    public SetMobilised(L2GrandBossInstance boss)
    {
      _boss = boss;
    }
   
    @Override
    public void run()
    {
      _boss.setIsImobilised(false);
     
      // When it is possible to act, a social action is canceled.
      if (_socialTask != null)
      {
        _socialTask.cancel(true);
        _socialTask = null;
      }
    }
  }
 
  // Move at random on after Antharas appears.
  private static class MoveAtRandom implements Runnable
  {
    private L2NpcInstance _npc;
    private L2CharPosition _pos;
   
    public MoveAtRandom(L2NpcInstance npc, L2CharPosition pos)
    {
      _npc = npc;
      _pos = pos;
    }
   
    @Override
    public void run()
    {
      _npc.getAI().setIntention(CtrlIntention.AI_INTENTION_MOVE_TO, _pos);
    }
  }
 
  @Override
  public String onAttack (L2NpcInstance npc, L2PcInstance attacker, int damage, boolean isPet)
  {
   
    if (npc.getSpawn()!=null && !npc.getSpawn().is_customBossInstance() && npc.getNpcId() == 29019 || npc.getNpcId() == 29066 || npc.getNpcId() == 29067 || npc.getNpcId() == 29068)
    {
      _LastAction = System.currentTimeMillis();
      /*if (GrandBossManager.getInstance().getBossStatus(_antharas.getNpcId()) != FIGHTING)
      {
        _Zone.oustAllPlayers();
      }
      else */if (!FWA_OLDANTHARAS && _mobsSpawnTask == null)
      {
        startMinionSpawns(npc.getNpcId());
      }
    }
    else if (npc.getNpcId() > 29069 && npc.getNpcId() < 29077 && npc.getCurrentHp() <= damage)
    {
      L2Skill skill = null;
      switch (npc.getNpcId())
      {
        case 29070:
        case 29071:
        case 29072:
        case 29073:
        case 29074:
        case 29075:
          skill = SkillTable.getInstance().getInfo(5097, 1);
          break;
        case 29076:
          skill = SkillTable.getInstance().getInfo(5094, 1);
          break;
      }
     
      npc.doCast(skill);
    }
    return super.onAttack(npc, attacker, damage, isPet);
  }
 
  @Override
  public String onKill (L2NpcInstance npc, L2PcInstance killer, boolean isPet)
  {
    if (npc.getNpcId() == 29019 || npc.getNpcId() == 29066 || npc.getNpcId() == 29067 || npc.getNpcId() == 29068)
    {
      npc.broadcastPacket(new PlaySound(1, "BS01_D", 1, npc.getObjectId(), npc.getX(), npc.getY(), npc.getZ()));
     
      if(!npc.getSpawn().is_customBossInstance()){
        _cubeSpawnTask = ThreadPoolManager.getInstance().scheduleGeneral(new CubeSpawn(0), 10000);
        GrandBossManager.getInstance().setBossStatus(npc.getNpcId(),DEAD);
        long respawnTime = (Config.ANTHARAS_RESP_FIRST + Rnd.get(Config.ANTHARAS_RESP_SECOND)) * 3600000;
        ThreadPoolManager.getInstance().scheduleGeneral(new UnlockAntharas(npc.getNpcId()), respawnTime);
        // also save the respawn time so that the info is maintained past reboots
        StatsSet info = GrandBossManager.getInstance().getStatsSet(npc.getNpcId());
        info.set("respawn_time",(System.currentTimeMillis() + respawnTime));
        GrandBossManager.getInstance().setStatsSet(npc.getNpcId(),info);
      }
     
    }
    else if (npc.getNpcId() == 29069)
    {
      int countHPHerb = Rnd.get(6, 18);
      int countMPHerb = Rnd.get(6, 18);
      for (int i = 0; i < countHPHerb; i++)
        ((L2MonsterInstance)npc).DropItem(killer, 8602, 1);
      for (int i = 0; i < countMPHerb; i++)
        ((L2MonsterInstance)npc).DropItem(killer, 8605, 1);
    }
    if (_monsters.contains(npc))
      _monsters.remove(npc);
    return super.onKill(npc,killer,isPet);
  }
 
  @Override
  public void run()
  {}
}
TOP

Related Classes of com.l2jfrozen.gameserver.ai.special.Antharas

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.