Package l2p.gameserver.model.instances

Source Code of l2p.gameserver.model.instances.L2ControlTowerInstance

package l2p.gameserver.model.instances;

import l2p.gameserver.idfactory.IdFactory;
import l2p.gameserver.instancemanager.SiegeManager;
import l2p.gameserver.model.L2Character;
import l2p.gameserver.model.L2Clan;
import l2p.gameserver.model.L2Player;
import l2p.gameserver.model.entity.siege.Siege;
import l2p.gameserver.model.entity.siege.castle.CastleSiege;
import l2p.gameserver.model.entity.siege.territory.TerritorySiege;
import l2p.gameserver.serverpackets.MyTargetSelected;
import l2p.gameserver.serverpackets.StatusUpdate;
import l2p.gameserver.serverpackets.ValidateLocation;
import l2p.gameserver.tables.NpcTable;
import l2p.gameserver.templates.L2NpcTemplate;

public class L2ControlTowerInstance extends L2NpcInstance
{
  private CastleSiege _siege;
  private L2FakeTowerInstance _fakeTower;
  private int _maxHp;

  @Override
  public int getMaxHp()
  {
    return _maxHp;
  }

  public L2ControlTowerInstance(int objectId, L2NpcTemplate template, CastleSiege siege, int maxHp)
  {
    super(objectId, template);
    _siege = siege;
    _maxHp = maxHp;
  }

  @Override
  public boolean isAutoAttackable(L2Character attacker)
  {
    if(attacker == null)
    {
      return false;
    }
    L2Player player = attacker.getPlayer();
    if(player == null)
    {
      return false;
    }
    L2Clan clan = player.getClan();
    return !(clan != null && _siege == clan.getSiege() && clan.isDefender());
  }

  @Override
  public boolean isAttackable(L2Character attacker)
  {
    return isAutoAttackable(attacker);
  }

  @Override
  public void onAction(L2Player player, boolean shift)
  {
    if(this != player.getTarget())
    {
      player.setTarget(this);
      player.sendPacket(new MyTargetSelected(getObjectId(), player.getLevel() - getLevel()), makeStatusUpdate(StatusUpdate.CUR_HP, StatusUpdate.MAX_HP), new ValidateLocation(this));
    }
    else
    {
      player.sendPacket(new MyTargetSelected(getObjectId(), player.getLevel() - getLevel()));
      if(isAutoAttackable(player))
      {
        player.getAI().Attack(this, false, shift);
      }
      else
      {
        player.sendActionFailed();
      }
    }
  }

  /**
   * Вызывает обработку смерти у вышек.
   *
   * @param killer убийца
   */
  @Override
  public void doDie(L2Character killer)
  {
    onDeath();
    super.doDie(killer);
  }

  /**
   * Спавнит фэйковую вышку на месте умершей
   */
  @Override
  public void onDecay()
  {
    super.onDecay();
    spawnFakeTower();
  }

  /**
   * Убирает фэйковую вышку на месте новорожденной
   */
  @Override
  public void spawnMe()
  {
    unSpawnFakeTower();
    super.spawnMe();
  }

  /**
   * Обработка смерти вышки
   */
  public void onDeath()
  {
    if(TerritorySiege.isInProgress())
    {
      TerritorySiege.killedCT(getCastle().getId());
      return;
    }
    Siege siege = SiegeManager.getSiege(this, true);
    if(siege != null)
    {
      siege.killedCT();
    }
  }

  /**
   * Спавнит фэйковую вышку на месте умершей настоящей.
   * Создается новый инстанс, и привязывается к текущему инстансу.
   */
  public void spawnFakeTower()
  {
    if(_fakeTower == null)
    {
      L2FakeTowerInstance tower = new L2FakeTowerInstance(IdFactory.getInstance().getNextId(), NpcTable.getTemplate(getFakeTowerNpcId()));
      tower.spawnMe(getLoc());
      _fakeTower = tower;
    }
    else
    {
      _fakeTower.decayMe();
      _fakeTower.spawnMe();
    }
  }

  /**
   * Убирает из мира фэйковую вышку которая относится к данному инстансу.
   * Ссылка на обьект не обнуляется, т.к. он еше будет использован в перспективе
   */
  public void unSpawnFakeTower()
  {
    if(_fakeTower == null)
    {
      return;
    }
    _fakeTower.decayMe();
  }

  public boolean isFakeTower()
  {
    return _fakeTower != null;
  }

  @Override
  public boolean hasRandomAnimation()
  {
    return false;
  }

  /**
   * Осадные вышки должны быть уязвимы во время осады, во время осады включается осадная зона
   * Вывод - если не в осадной зоне, то неуязвимая
   *
   * @return уязвимая ли вышка
   */
  @Override
  public boolean isInvul()
  {
    Siege siege = SiegeManager.getSiege(this, true);
    return siege == null;
  }

  @Override
  public boolean isFearImmune()
  {
    return true;
  }

  @Override
  public boolean isParalyzeImmune()
  {
    return true;
  }

  @Override
  public boolean isLethalImmune()
  {
    return true;
  }

  /**
   * Возвращает ID Фэйковой вышки которая спавнится после смерти настоящей.
   * Для Life Control Tower это 13003
   * Для Flame Control Tower это 13005
   *
   * @return Fake Tower NPC ID
   */
  private int getFakeTowerNpcId()
  {
    return getNpcId() + 1;
  }
}
TOP

Related Classes of l2p.gameserver.model.instances.L2ControlTowerInstance

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.