Package instances

Source Code of instances.IsthinaNormal$IsthinaDeathFinalB

package instances;

import lineage2.commons.threading.RunnableImpl;
import lineage2.gameserver.ThreadPoolManager;
import lineage2.gameserver.instancemanager.WorldStatisticsManager;
import lineage2.gameserver.listener.actor.OnCurrentHpDamageListener;
import lineage2.gameserver.listener.actor.OnDeathListener;
import lineage2.gameserver.listener.zone.OnZoneEnterLeaveListener;
import lineage2.gameserver.model.Creature;
import lineage2.gameserver.model.Player;
import lineage2.gameserver.model.Skill;
import lineage2.gameserver.model.Zone;
import lineage2.gameserver.model.entity.Reflection;
import lineage2.gameserver.model.instances.NpcInstance;
import lineage2.gameserver.model.worldstatistics.CategoryType;
import lineage2.gameserver.network.serverpackets.ExSendUIEvent;
import lineage2.gameserver.network.serverpackets.ExShowScreenMessage;
import lineage2.gameserver.network.serverpackets.ExShowScreenMessage.ScreenMessageAlign;
import lineage2.gameserver.network.serverpackets.ExStartScenePlayer;
import lineage2.gameserver.network.serverpackets.components.NpcString;
import lineage2.gameserver.scripts.Functions;
import lineage2.gameserver.utils.Location;

import java.util.concurrent.atomic.AtomicInteger;

/**
* @author KilRoy
*/
public class IsthinaNormal extends Reflection
{
  public int ballistaSeconds = 30;
  public long ballistaDamage = 0;
  private static final int Isthina = 29195;
  private static final int Ballista = 19021;
  private static final int Rumiese = 33293;
  private static final int Camera = 18919;
  private ZoneListener _epicZoneListener = new ZoneListener();
  private DeathListener _deathListener = new DeathListener();
  private CurrentHpListener _currentHpListenerBallista = new CurrentHpListener();
  private boolean _entryLocked = false;
  private boolean _startLaunched = false;
  private boolean _lockedTurn = false;
  private AtomicInteger raidplayers = new AtomicInteger();

  @Override
  protected void onCreate()
  {
    super.onCreate();
    getZone("[Isthina_epic]").addListener(_epicZoneListener);
  }

  @Override
  protected void onCollapse()
  {
    super.onCollapse();
  }

  private boolean checkstartCond(int raidplayers)
  {
    return !(raidplayers < getInstancedZone().getMinParty() || _startLaunched);
  }

  public class ZoneListener implements OnZoneEnterLeaveListener
  {
    @Override
    public void onZoneEnter(Zone zone, Creature cha)
    {
      if(_entryLocked)
        return;

      Player player = cha.getPlayer();
      if(player == null || !cha.isPlayer())
        return;

      if(checkstartCond(raidplayers.incrementAndGet()))
      {
        ThreadPoolManager.getInstance().schedule(new StartNormalIsthina(), 15000L);
        _startLaunched = true;
      }
    }

    @Override
    public void onZoneLeave(Zone zone, Creature cha)
    {}
  }

  private class StartNormalIsthina extends RunnableImpl
  {
    @Override
    public void runImpl() throws Exception
    {
      _entryLocked = true;

      closeDoor(14220100);
      closeDoor(14220101);

      NpcInstance isthinaNormal = addSpawnWithoutRespawn(Isthina, new Location(-177125, 147856, -11384, 49140), 0);
      isthinaNormal.addListener(_deathListener);

      NpcInstance camera = addSpawnWithoutRespawn(Camera, new Location(-177325, 147856, -11384, 49140), 0);
      camera.setTargetable(false);

      for(Player player : getPlayers())
        player.showQuestMovie(ExStartScenePlayer.SCENE_BOSS_ISTHINA_OPENING);
    }
  }

  public class CurrentHpListener implements OnCurrentHpDamageListener
  {
    @Override
    public void onCurrentHpDamage(final Creature actor, final double damage, final Creature attacker, Skill skill)
    {
      if(actor.getNpcId() == Ballista)
      {
        if(actor.isDead())
          return;

        ballistaDamage += damage;

        ThreadPoolManager.getInstance().schedule(new Runnable()
        {
          @Override
          public void run()
          {
            if(actor.isDead())
              return;

            if(!_lockedTurn && ballistaSeconds <= 0)
            {
              _lockedTurn = true;

              if(ballistaDamage < actor.getMaxHp())
              {
                double damagePercent = ballistaDamage / 4660000.0;
                int rewardId = 0;

                if(damagePercent > 0.5)
                {
                  rewardId = 30374;
                }
                else if(damagePercent > 0.15)
                {
                  rewardId = 30371;
                }

                Functions.addItem(attacker.getPlayer(), rewardId, 1);
                ThreadPoolManager.getInstance().schedule(new IsthinaDeathFinalA(), 10);
                actor.removeListener(_currentHpListenerBallista);
                WorldStatisticsManager.getInstance().updateStat(attacker.getPlayer(), CategoryType.EPIC_BOSS_KILLS_29195, 1);
              }
              else
              {
                ThreadPoolManager.getInstance().schedule(new IsthinaDeathFinalB(), 10);
                actor.removeListener(_currentHpListenerBallista);
                WorldStatisticsManager.getInstance().updateStat(attacker.getPlayer(), CategoryType.EPIC_BOSS_KILLS_29195, 1);
              }
            }

            int progress = (int)Math.min(6000, ballistaDamage / 4660000 * 6000);
            progress -= progress % 60;

            for(Player player : getPlayers())
            {
              player.sendPacket(new ExSendUIEvent(player, 2, ballistaSeconds, progress, 122520, NpcString.NONE2));
            }

            ballistaSeconds -= 1;
          }
        }, 1000);
      }
    }
  }

  private class DeathListener implements OnDeathListener
  {
    @Override
    public void onDeath(Creature self, Creature killer)
    {
      if(self.isNpc() && self.getNpcId() == Isthina)
        ThreadPoolManager.getInstance().schedule(new IsthinaDeath(), 10);
    }
  }

  private class IsthinaDeath extends RunnableImpl
  {
    @Override
    public void runImpl() throws Exception
    {
      for(Player player : getPlayers())
        player.showQuestMovie(ExStartScenePlayer.SCENE_BOSS_ISTHINA_BRIDGE);
      ThreadPoolManager.getInstance().schedule(new SpawnBallista(), 7200L); // 7.2 secs for movie
    }
  }

  private class IsthinaDeathFinalA extends RunnableImpl
  {
    @Override
    public void runImpl() throws Exception
    {
      setReenterTime(System.currentTimeMillis());
      for(Player player : getPlayers())
        player.showQuestMovie(ExStartScenePlayer.SCENE_BOSS_ISTHINA_ENDING_A);
      ThreadPoolManager.getInstance().schedule(new FinalAndCollapse(), 23300); // 23.3 secs for movie
      for(NpcInstance n : getNpcs())
        n.deleteMe();
      openDoor(14220100);
      openDoor(14220101);
    }
  }

  private class IsthinaDeathFinalB extends RunnableImpl
  {
    @Override
    public void runImpl() throws Exception
    {
      setReenterTime(System.currentTimeMillis());
      for(Player player : getPlayers())
        player.showQuestMovie(ExStartScenePlayer.SCENE_BOSS_ISTHINA_ENDING_B);
      ThreadPoolManager.getInstance().schedule(new FinalAndCollapse(), 22200L); // 22.2 secs for movie
      for(NpcInstance n : getNpcs())
        n.deleteMe();
      openDoor(14220100);
      openDoor(14220101);
    }
  }

  private class FinalAndCollapse extends RunnableImpl
  {
    @Override
    public void runImpl() throws Exception
    {
      clearReflection(5, true);
      addSpawnWithoutRespawn(Rumiese, new Location(-177125, 147856, -11384, 49140), 0);
    }
  }

  private class SpawnBallista extends RunnableImpl
  {
    @Override
    public void runImpl() throws Exception
    {
      NpcInstance ballista = addSpawnWithoutRespawn(Ballista, new Location(-177125, 147856, -11384, 49140), 0);
      ballista.block();
      ballista.addListener(_currentHpListenerBallista);

      for(Player players : getPlayers())
        players.sendPacket(new ExShowScreenMessage(NpcString.AFTER_$s1_SECONDS_THE_CHARGING_MAGIC_BALLISTAS_STARTS, 5000, ScreenMessageAlign.TOP_CENTER, false, String.valueOf(1)));

      NpcInstance isthinaFinal = addSpawnWithoutRespawn(Isthina, new Location(-177128, 147224, -11414, 16383), 0);
      isthinaFinal.setTargetable(false);
      isthinaFinal.block();
    }
  }
}
TOP

Related Classes of instances.IsthinaNormal$IsthinaDeathFinalB

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.