Package ai.octavis

Source Code of ai.octavis.OctavisNormalStage2

package ai.octavis;

import lineage2.commons.util.Rnd;
import lineage2.gameserver.ai.CtrlEvent;
import lineage2.gameserver.ai.Fighter;
import lineage2.gameserver.model.Creature;
import lineage2.gameserver.model.Effect;
import lineage2.gameserver.model.Player;
import lineage2.gameserver.model.entity.Reflection;
import lineage2.gameserver.model.instances.NpcInstance;
import lineage2.gameserver.network.serverpackets.ExShowScreenMessage;
import lineage2.gameserver.network.serverpackets.ExShowScreenMessage.ScreenMessageAlign;
import lineage2.gameserver.network.serverpackets.SystemMessage;
import lineage2.gameserver.network.serverpackets.components.NpcString;
import lineage2.gameserver.tables.SkillTable;

/**
* @author KilRoy
*/
public class OctavisNormalStage2 extends Fighter
{
  private static final int Skill_EternalBlizzard = 6274;
  private long _eternalblizzardReuseTimer = 0;
  private int _eternalblizzardReuseDelay = 60;

  private static final int Skill_IceBall = 6278;
  private long _iceballReuseTimer = 0;
  private int _iceballReuseDelay = 10;

  private static final int Skill_SummonElemental = 6277;
  private long _summonReuseTimer = 0;
  private int _summonReuseDelay = 50;

  private static final int Skill_SelfNova = 6279;
  private long _selfnovaReuseTimer = 0;
  private int _selfnovaReuseDelay = 60;

  private static final int Skill_DeathSentence = 6280;
  private long _deathsentenceReuseTimer = 0;
  private int _deathsentenceReuseDelay = 40;

  private static final int Skill_ReflectMagic = 6282;
  private long _reflectReuseTimer = 0;
  private int _reflectReuseDelay = 40;

  private static final int Skill_IceStorm = 6283;
  private long _icestormReuseTimer = 0;
  private int _icestormReuseDelay = 50;

  private static final int Skill_Anger = 6285;
  private long _angerReuseTimer = 0;
  private int _angerReuseDelay = 30;

  private long _dispelTimer = 0;
  private int _dispelReuseDelay = 7;

  private long _idleDelay = 0;
  private long _lastFactionNotifyTime = 0;

  public OctavisNormalStage2(NpcInstance actor)
  {
    super(actor);
    MAX_PURSUE_RANGE = 7000;
  }

  @Override
  protected void thinkAttack()
  {
    NpcInstance actor = getActor();
    Creature topDamager = actor.getAggroList().getTopDamager();
    Creature randomHated = actor.getAggroList().getRandomHated();
    Creature mostHated = actor.getAggroList().getMostHated();

    //Eternal Blizzard Cast
    if(!actor.isCastingNow() && _eternalblizzardReuseTimer < System.currentTimeMillis())
    {
      actor.doCast(SkillTable.getInstance().getInfo(Skill_EternalBlizzard, 1), actor, true);

      Reflection r = getActor().getReflection();
      for(Player p : r.getPlayers())
        p.sendPacket(new ExShowScreenMessage(NpcString.I_FEEL_STRONG_MAGIC_FLOW, 3000, ScreenMessageAlign.MIDDLE_CENTER, true));

      _eternalblizzardReuseTimer = System.currentTimeMillis() + _eternalblizzardReuseDelay * 1000L;
    }

    // Ice Ball Cast
    if(!actor.isCastingNow() && !actor.isMoving && _iceballReuseTimer < System.currentTimeMillis())
      if(topDamager != null && !topDamager.isDead() && topDamager.isInRangeZ(actor, 1000))
      {
        actor.doCast(SkillTable.getInstance().getInfo(Skill_IceBall, 1), topDamager, true);
        _iceballReuseTimer = System.currentTimeMillis() + _iceballReuseDelay * 1000L;
      }

    // Summon Buff Cast
    if(!actor.isCastingNow() && _summonReuseTimer < System.currentTimeMillis())
    {
      actor.doCast(SkillTable.getInstance().getInfo(Skill_SummonElemental, 1), actor, true);

      for(NpcInstance guard : getActor().getAroundNpc(800, 100))
        guard.altOnMagicUseTimer(guard, SkillTable.getInstance().getInfo(Skill_SummonElemental, 1));

      _summonReuseTimer = System.currentTimeMillis() + _summonReuseDelay * 1000L;
    }

    // Self Nova
    if(!actor.isCastingNow() && _selfnovaReuseTimer < System.currentTimeMillis())
    {
      actor.doCast(SkillTable.getInstance().getInfo(Skill_SelfNova, 1), actor, true);
      _selfnovaReuseTimer = System.currentTimeMillis() + _selfnovaReuseDelay * 1000L;
    }

    // Reflect
    if(!actor.isCastingNow() && _reflectReuseTimer < System.currentTimeMillis())
    {
      actor.doCast(SkillTable.getInstance().getInfo(Skill_ReflectMagic, 1), actor, true);
      _reflectReuseTimer = System.currentTimeMillis() + _reflectReuseDelay * 1000L;
    }

    // Ice Storm
    if(!actor.isCastingNow() && _icestormReuseTimer < System.currentTimeMillis())
    {
      actor.doCast(SkillTable.getInstance().getInfo(Skill_IceStorm, 1), actor, true);
      _icestormReuseTimer = System.currentTimeMillis() + _icestormReuseDelay * 1000L;
    }

    // Death Sentence
    if(!actor.isCastingNow() && !actor.isMoving && _deathsentenceReuseTimer < System.currentTimeMillis())
      if(randomHated != null && !randomHated.isDead() && randomHated.isInRangeZ(actor, 1000))
      {
        actor.doCast(SkillTable.getInstance().getInfo(Skill_DeathSentence, 1), randomHated, true);
        _deathsentenceReuseTimer = System.currentTimeMillis() + _deathsentenceReuseDelay * 1000L;
      }

    // Freya Anger
    if(!actor.isCastingNow() && !actor.isMoving && _angerReuseTimer < System.currentTimeMillis())
    {
      actor.doCast(SkillTable.getInstance().getInfo(Skill_Anger, 1), actor, true);
      _angerReuseTimer = System.currentTimeMillis() + _angerReuseDelay * 1000L;
      //Random agro
      if(mostHated != null && randomHated != null && actor.getAggroList().getCharMap().size() > 1)
      {
        actor.getAggroList().remove(mostHated, true);
        actor.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, randomHated, 900000);
      }
    }

    //Dispel task
    if(_dispelTimer < System.currentTimeMillis())
    {
      for(Effect e : actor.getEffectList().getAllEffects())
        if(e != null && e.isOffensive())
          e.exit();

      _dispelTimer = System.currentTimeMillis() + _dispelReuseDelay * 1000L;
    }

    if(_idleDelay > 0)
      _idleDelay = 0;

    if(System.currentTimeMillis() - _lastFactionNotifyTime > _minFactionNotifyInterval)
    {
      _lastFactionNotifyTime = System.currentTimeMillis();

      for(NpcInstance npc : actor.getReflection().getNpcs())
        if(npc.isMonster() && npc != actor)
          npc.getAI().notifyEvent(CtrlEvent.EVT_AGGRESSION, actor.getAggroList().getMostHated(), 5);
    }
    super.thinkAttack();
  }

  @Override
  protected void onEvtSpawn()
  {
    super.onEvtSpawn();

    long generalReuse = System.currentTimeMillis() + 30000L;
    _eternalblizzardReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _iceballReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _summonReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _selfnovaReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _reflectReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _icestormReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _deathsentenceReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;
    _angerReuseTimer += generalReuse + Rnd.get(1, 20) * 1000L;

    Reflection r = getActor().getReflection();
    for(Player p : r.getPlayers())
      this.notifyEvent(CtrlEvent.EVT_AGGRESSION, p, 2);
  }

  @Override
  protected boolean thinkActive()
  {
    if(_idleDelay == 0 && !getActor().isCurrentHpFull())
      _idleDelay = System.currentTimeMillis();

    Reflection ref = getActor().getReflection();
    if(!getActor().isDead() && _idleDelay > 0 && _idleDelay + 60000 < System.currentTimeMillis())
      if(!ref.isDefault())
      {
        for(Player p : ref.getPlayers())
          p.sendPacket(new SystemMessage(SystemMessage.THIS_DUNGEON_WILL_EXPIRE_IN_S1_MINUTES).addNumber(1));
        ref.collapse();
      }

    super.thinkActive();
    return true;
  }

  @Override
  protected void teleportHome()
  {
    return;
  }
}
TOP

Related Classes of ai.octavis.OctavisNormalStage2

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.