Package l2p.gameserver.ai

Source Code of l2p.gameserver.ai.SiegeGuard

package l2p.gameserver.ai;

import l2p.gameserver.instancemanager.SiegeManager;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Clan;
import l2p.gameserver.model.L2Playable;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.entity.residence.Castle;
import l2p.gameserver.model.instances.L2NpcInstance.AggroInfo;
import l2p.gameserver.model.instances.L2SiegeGuardInstance;
import l2p.util.GArray;
import l2p.util.Location;
import l2p.util.Rnd;

public abstract class SiegeGuard extends DefaultAI
{
  public SiegeGuard(L2Character actor)
  {
    super(actor);
    setGlobalAggro(0);
    MAX_Z_AGGRO_RANGE = 500;
  }

  @Override
  public int getMaxPathfindFails()
  {
    return Integer.MAX_VALUE;
  }

  @Override
  public int getMaxAttackTimeout()
  {
    return Integer.MAX_VALUE;
  }

  @Override
  protected boolean randomWalk()
  {
    return false;
  }

  @Override
  protected boolean randomAnimation()
  {
    return false;
  }

  @Override
  public boolean canSeeInSilentMove(L2Playable target)
  {
    // Осадные гварды могут видеть игроков в режиме Silent Move с вероятностью 10%
    return !target.isSilentMoving() || Rnd.chance(10);
  }

  @Override
  public void checkAggression(L2Character target)
  {
    L2SiegeGuardInstance actor = getActor();
    if(actor == null || target == null || !target.isPlayable() || !actor.isAutoAttackable(target))
    {
      return;
    }
    super.checkAggression(target);
  }

  @Override
  protected void onEvtAttacked(L2Character attacker, int damage)
  {
    L2SiegeGuardInstance actor = getActor();
    if(actor != null && attacker != null && attacker.getPlayer() != null)
    {
      L2Clan clan = attacker.getPlayer().getClan();
      if(clan != null && SiegeManager.getSiege(actor, true) == clan.getSiege() && clan.isDefender())
      {
        return;
      }
    }
    super.onEvtAttacked(attacker, damage);
  }

  @Override
  protected void onEvtAggression(L2Character target, int aggro)
  {
    L2SiegeGuardInstance actor = getActor();
    if(actor != null && target != null && target.getPlayer() != null)
    {
      L2Player player = target.getPlayer();
      L2Clan clan = player.getClan();
      if(clan != null && SiegeManager.getSiege(actor, true) == clan.getSiege() && clan.isDefender())
      {
        return;
      }
      Castle castle = actor.getCastle();
      if(player.getTerritorySiege() > -1 && castle != null && player.getTerritorySiege() == castle.getId())
      {
        return;
      }
    }
    super.onEvtAggression(target, aggro);
  }

  @Override
  protected boolean thinkActive()
  {
    if(_globalAggro < 0)
    {
      _globalAggro++;
    }
    else if(_globalAggro > 0)
    {
      _globalAggro--;
    }
    L2SiegeGuardInstance actor = getActor();
    if(actor == null || actor.isDead())
    {
      return true;
    }
    if(_def_think)
    {
      doTask();
      return true;
    }
    actor.setRunning();
    actor.setAttackTimeout(Long.MAX_VALUE);
    Location sloc = actor.getSpawnedLoc();
    int homeX = actor.getX() - sloc.x;
    int homeY = actor.getY() - sloc.y;
    // Проверка на расстояние до точки спауна
    if(homeX * homeX + homeY * homeY > 10000)
    {
      teleportHome(true);
      return true;
    }
    return false;
  }

  @Override
  protected void thinkAttack()
  {
    L2SiegeGuardInstance actor = getActor();
    if(actor == null)
    {
      return;
    }
    actor.setRunning();
    actor.setAttackTimeout(Long.MAX_VALUE);
    Location sloc = actor.getSpawnedLoc();
    int homeX = actor.getX() - sloc.x;
    int homeY = actor.getY() - sloc.y;
    // Проверка на расстояние до точки спауна
    if(homeX * homeX + homeY * homeY > 9000000)
    {
      teleportHome(true);
      return;
    }
    super.thinkAttack();
  }

  private L2Character getMostHated()
  {
    L2SiegeGuardInstance actor = getActor();
    if(actor == null)
    {
      return null;
    }
    GArray<AggroInfo> aggroList = actor.getAggroList();
    AggroInfo mosthated1 = null;
    for(AggroInfo ai : aggroList)
    {
      if(mosthated1 == null || mosthated1.attacker == null)
      {
        mosthated1 = ai;
      }
      else if(ai.attacker != null && actor.getDistance(ai.attacker) < actor.getDistance(mosthated1.attacker))
      {
        mosthated1 = ai;
      }
    }
    AggroInfo mosthated2 = null;
    for(AggroInfo ai : aggroList)
    {
      if(mosthated2 == null || mosthated2.attacker == null)
      {
        mosthated2 = ai;
      }
      else if(ai.attacker != null && mosthated2.hate < ai.hate)
      {
        mosthated2 = ai;
      }
    }
    if(mosthated1 != null && mosthated2 != null)
    {
      return Rnd.chance(50) ? mosthated1.attacker : mosthated2.attacker;
    }
    if(mosthated1 != null)
    {
      return mosthated1.attacker;
    }
    if(mosthated2 != null)
    {
      return mosthated2.attacker;
    }
    return null;
  }

  @Override
  protected L2Character prepareTarget()
  {
    L2SiegeGuardInstance actor = getActor();
    if(actor == null)
    {
      return null;
    }
    // Новая цель исходя из агрессивности
    L2Character hated = getMostHated();
    if(hated != null && hated != actor)
    {
      setAttackTarget(hated);
      return hated;
    }
    returnHome(true);
    return null;
  }

  @Override
  public L2SiegeGuardInstance getActor()
  {
    return (L2SiegeGuardInstance) super.getActor();
  }
}
TOP

Related Classes of l2p.gameserver.ai.SiegeGuard

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.