예제 #1
0
  /**
   * Обработка активации ловушки.
   *
   * @param object объект, который изменил свое положение.
   */
  public boolean activate(TObject object) {

    if (!object.isCharacter()) return false;

    Character owner = getOwner();
    Character target = object.getCharacter();

    if (owner == null || owner == target || !owner.checkTarget(target)) {
      return false;
    }

    float dist = target.getGeomDistance(x, y);

    if (dist > radius) {
      return false;
    }

    if (lifeTask != null) {
      lifeTask.cancel(false);
      lifeTask = null;
    }

    ExecutorManager executor = ExecutorManager.getInstance();
    executor.scheduleGeneral(this, 100);

    return true;
  }
예제 #2
0
  @Override
  public void addAggro(Character aggressor, long aggro, boolean damage) {
    // если это не урон от игрока
    if (!damage && aggressor.isPlayer()) {
      // получаем игрока
      Player player = aggressor.getPlayer();

      // в зависимости от класса игрока
      switch (player.getPlayerClass()) {
        case WARRIOR:
        case LANCER:
          aggro = 1;
          break;
        case MYSTIC:
        case PRIEST:
          aggro *= 3;
          break;
        default:
          break;
      }
    }

    // обрабатываем добавление аггро
    super.addAggro(aggressor, aggro, damage);
  }
예제 #3
0
  @Override
  public boolean checkTarget(Character target) {
    // если это контрол
    if (target.getClass() == RegionWarControl.class) {
      // получаем контрол
      RegionWarControl control = (RegionWarControl) target;

      // является враг, если он был захвачен
      return control.getGuildOwner() != null;
    }

    // если это НПС, значит свой
    if (target.isNpc() && !target.isSummon()) return false;

    Player player = null;

    if (target.isSummon()) {
      Character owner = target.getOwner();

      if (owner != null && owner.isPlayer()) player = owner.getPlayer();
    } else if (target.isPlayer()) player = target.getPlayer();

    // если это игрок или питомец игрока, значит враг
    return player != null;
  }
예제 #4
0
  @Override
  public void doRegen() {
    Character actor = getActor();

    actor.setCurrentHp(actor.getCurrentHp() + actor.getRegenHp());
    actor.updateHp();
  }
예제 #5
0
  @Override
  public boolean checkCondition() {
    Character actor = getActor();

    if (actor.isBattleStanced()) return false;

    return actor.getCurrentHp() < actor.getMaxHp();
  }
예제 #6
0
  @Override
  public boolean checkCondition(Character attacker, float targetX, float targetY, float targetZ) {
    if (attacker.getSummon() == null) {
      attacker.sendMessage("У вас нет вызванных питомцев.");
      return false;
    }

    return super.checkCondition(attacker, targetX, targetY, targetZ);
  }
예제 #7
0
  public static PlayerBankPanel getInstance(Character owner) {
    PlayerBankPanel packet = (PlayerBankPanel) instance.newInstance();

    packet.name = owner.getName();
    packet.objectId = owner.getObjectId();
    packet.subId = owner.getSubId();

    return packet;
  }
예제 #8
0
  @Override
  public void useSkill(Character character, float targetX, float targetY, float targetZ) {
    if (target != null) {
      if (target.isPlayer()) NpcFastShot.startShot(character, this, target);
      else FastShot.startShot(character, this, target.getX(), target.getY(), target.getZ());
    }

    target = null;
  }
예제 #9
0
파일: TargetHp.java 프로젝트: sabracx/tera
  public static TargetHp getInstance(Character target, int type) {
    TargetHp packet = (TargetHp) instance.newInstance();

    packet.objectId = target.getObjectId();
    packet.subId = target.getSubId();
    packet.hp = target.getCurrentHp() / (float) target.getMaxHp();
    packet.type = type;

    return packet;
  }
예제 #10
0
  @Override
  public void useSkill(Character character, float targetX, float targetY, float targetZ) {
    if (target != null)
      FastShot.startShot(
          character,
          this,
          target.getX(),
          target.getY(),
          target.getZ() + (target.getGeomHeight() * 0.5F));

    target = null;
  }
예제 #11
0
  @Override
  public void onDie(Character killer, Character killed) {

    if (!isCheckDieState() || !killed.isPlayer()) {
      return;
    }

    Player player = killed.getPlayer();

    if (!player.isEvent() || !players.containsKey(killed.getObjectId())) {
      return;
    }

    onDie(player, killer);
  }
예제 #12
0
  @Override
  public boolean checkCondition(Character attacker, float targetX, float targetY, float targetZ) {
    target = attacker.getTarget();

    if (target == null) return false;

    return super.checkCondition(attacker, targetX, targetY, targetZ);
  }
예제 #13
0
  @Override
  public boolean checkTarget(Character target) {
    // полукчаем игрока из цели
    Player player = target.getPlayer();

    // если это игрок на ивенте ,то можно бить
    return player != null && player.isEvent();
  }
예제 #14
0
  @Override
  public void causingDamage(Skill skill, AttackInfo info, Character attacker) {
    // полукчаем игрока из атакующего
    Player player = attacker.getPlayer();

    if (!player.isEvent()) return;

    super.causingDamage(skill, info, attacker);
  }
예제 #15
0
  @Override
  public void startSkill(Character attacker, float targetX, float targetY, float targetZ) {
    super.startSkill(attacker, targetX, targetY, targetZ);

    impactX = attacker.getX();
    impactY = attacker.getY();
    impactZ = attacker.getZ();

    if (target.isPlayer())
      attacker.broadcastPacket(StartFastShot.getInstance(attacker, target, this, castId));
    else
      attacker.broadcastPacket(
          StartFastShot.getInstance(
              attacker, this, castId, target.getX(), target.getY(), target.getZ()));
  }
예제 #16
0
  @Override
  public void causingDamage(Skill skill, AttackInfo info, Character attacker) {
    // пробуем получить игрока
    Player player = attacker.getPlayer();

    // если это игрок и он не на ивенте, выходим
    if (player != null && !player.isEvent()) return;

    super.causingDamage(skill, info, attacker);
  }
예제 #17
0
  @Override
  public void useSkill(Character character, float targetX, float targetY, float targetZ) {
    super.useSkill(character, targetX, targetY, targetZ);

    Summon summon = character.getSummon();

    if (summon == null) return;

    summon.getAI().abortAttack();
  }
예제 #18
0
  @Override
  public boolean test(Character attacker, Character attacked, Skill skill, float val) {
    if (!attacker.isPlayer()) return true;

    Equipment equipment = attacker.getEquipment();

    if (equipment == null) return false;

    Slot[] slots = equipment.getSlots();

    for (Enum<?> type : types) {
      for (Slot slot : slots) {
        if (slot.isEmpty()) continue;

        if (type == slot.getItem().getType()) return true;
      }
    }

    return false;
  }
예제 #19
0
  @Override
  protected void writeImpl() {
    writeOpcode();
    writeInt(actor.getObjectId());
    writeInt(actor.getSubId());
    writeFloat(actor.getX());
    writeFloat(actor.getY());
    writeFloat(actor.getZ());
    writeShort(actor.getHeading());
    writeInt(actor.getModelId());

    writeInt(actor.getOwerturnId());

    writeInt(0);
    writeInt(0);
  }
예제 #20
0
  @Override
  public void startSkill(Character attacker, float targetX, float targetY, float targetZ) {
    super.startSkill(attacker, targetX, targetY, targetZ);

    impactX = attacker.getX();
    impactY = attacker.getY();
    impactZ = attacker.getZ();

    attacker.broadcastPacket(
        StartFastShot.getInstance(
            attacker,
            this,
            castId,
            target.getX(),
            target.getY(),
            target.getZ() + (target.getGeomHeight() * 0.5F)));
  }
예제 #21
0
  /**
   * Создание новой ловукши.
   *
   * @param owner создатель и владелец.
   * @param skill скил, который создает.
   * @param lifeTime время жизни.
   * @param radius ражиус активации.
   * @return новая ловука.
   */
  public static Trap newInstance(
      Character owner, Skill skill, int range, int lifeTime, int radius) {

    Trap trap = pool.take();

    if (trap == null) {
      IdFactory idFactory = IdFactory.getInstance();
      trap = new Trap(idFactory.getNextTrapId());
    }

    trap.setContinentId(owner.getContinentId());
    trap.spawnMe(owner, skill, range, lifeTime, radius);

    return trap;
  }
예제 #22
0
  /**
   * Спавн в мир ловушку.
   *
   * @param owner владелец.
   * @param skill скил ловушки.
   * @param lifeTime время жизни.
   * @param radius радиус активации.
   */
  public void spawnMe(Character owner, Skill skill, int range, int lifeTime, int radius) {
    this.owner = owner;
    this.skill = skill;
    this.radius = radius;

    spawnMe(
        Coords.calcX(owner.getX(), range, owner.getHeading()),
        Coords.calcY(owner.getY(), range, owner.getHeading()),
        owner.getZ(),
        0);

    LocalObjects local = LocalObjects.get();

    Array<Character> chars =
        World.getAround(Character.class, local.getNextCharList(), this, radius);

    ExecutorManager executor = ExecutorManager.getInstance();

    if (chars.isEmpty()) this.lifeTask = executor.scheduleGeneral(this, lifeTime * 1000);
    else {

      Character[] array = chars.array();

      for (int i = 0, length = chars.size(); i < length; i++) {

        Character target = array[i];

        if (owner.checkTarget(target)) {
          executor.scheduleGeneral(this, 100);
          return;
        }
      }

      this.lifeTask = executor.scheduleGeneral(this, lifeTime * 1000);
    }
  }
예제 #23
0
  @Override
  public void causingDamage(Skill skill, AttackInfo info, Character attacker) {
    // определяем атакующего игрока
    Player player = null;

    if (attacker.isSummon()) {
      Character owner = attacker.getOwner();

      if (owner != null && owner.isPlayer()) player = owner.getPlayer();
    } else if (attacker.isPlayer()) player = attacker.getPlayer();

    // если игрока нет, урон не засчитываем
    if (player == null) return;

    // получаем гильдию игрока
    Guild guild = player.getGuild();

    // если гильдии нет либо она не из этой битвы, не засчитываем урон
    if (guild == null || !getRegion().isRegister(guild)) return;

    // обрабатываем урон
    super.causingDamage(skill, info, attacker);
  }
예제 #24
0
  @Override
  public <A extends Npc> void think(
      NpcAI<A> ai, A actor, LocalObjects local, ConfigAI config, long currentTime) {
    // если нпс мертв
    if (actor.isDead()) {
      // очищаем задания
      ai.clearTaskList();
      // очищаем агр лист
      actor.clearAggroList();
      // переводим в режим ожидания
      ai.setNewState(NpcAIState.WAIT);
      // выходим
      return;
    }

    // если нпс щас что-то делает, выходим
    if (actor.isTurner() || actor.isCastingNow() || actor.isStuned() || actor.isOwerturned())
      return;

    // если актор вышел за пределы максимального радиуса атаки
    if (!actor.isInRangeZ(actor.getSpawnLoc(), getReactionMaxRange())) {
      // очищаем задания
      ai.clearTaskList();
      // очищаем агр лист
      actor.clearAggroList();
      // переводим в режим возврпщения домой
      ai.setNewState(NpcAIState.RETURN_TO_HOME);
      // отправляем иконку думания
      PacketManager.showNotifyIcon(actor, NotifyType.NOTICE_THINK);
      // обновляем время отправки иконки
      ai.setLastNotifyIcon(currentTime);
      // выходим
      return;
    }

    // получаем топовый агр
    Character mostHated = actor.getMostHated();

    if (mostHated == null && actor.isAggressive()) {
      // получаем текущий регион НПС
      WorldRegion region = actor.getCurrentRegion();

      // если там есть игроки
      if (region != null) {
        // получаем список персонажей
        Array<Character> charList = local.getNextCharList();

        // собираем сведения о целях вокруг
        World.getAround(Character.class, charList, actor, actor.getAggroRange());

        // получаем массив целей
        Character[] array = charList.array();

        // перебираем потенциальные цели
        for (int i = 0, length = charList.size(); i < length; i++) {
          // получаем потенциальную цель
          Character target = array[i];

          // если на цель возможна агрессия и цель в зоне агра
          if (ai.checkAggression(target))
            // добавляем в агр лист
            actor.addAggro(target, 1, false);
        }
      }
    }

    mostHated = actor.getMostHated();

    // если главная цель отсутствует, выходим
    if (mostHated == null) {
      // очищаем задания
      ai.clearTaskList();
      // очищаем агр лист
      actor.clearAggroList();
      // переводим в режим возврпщения домой
      ai.setNewState(NpcAIState.RETURN_TO_HOME);
      // отправляем иконку думания
      PacketManager.showNotifyIcon(actor, NotifyType.NOTICE_THINK);
      // обновляем время отправки иконки
      ai.setLastNotifyIcon(currentTime);
      // выходим
      return;
    }

    // получаем текущую цель АИ
    Character target = ai.getTarget();

    // если цель выходит за радиус боевых действий
    if (mostHated.isDead() || !mostHated.isInRange(actor.getSpawnLoc(), getBattleMaxRange())) {
      // удаляем его с агр листа
      actor.removeAggro(mostHated);
      // очищаем задания
      ai.clearTaskList();
      // выходим
      return;
    }

    // если топ агр не является текущей целью АИ
    if (mostHated != target)
      // обновляем текущую цель АИ
      ai.setTarget(mostHated);

    // если есть ожидающие задания
    if (ai.isWaitingTask())
      // выполняем и если это небыло последнее задание
      if (ai.doTask(actor, currentTime, local))
        // выходим
        return;

    // если нпс щас что-то делает, выходим
    if (actor.isTurner() || actor.isCastingNow() || actor.isStuned() || actor.isOwerturned())
      return;

    if (currentTime - ai.getLastNotifyIcon() > 15000) {
      // отправляем иконку думания
      PacketManager.showNotifyIcon(actor, NotifyType.YELLOW_QUESTION);
      // обновляем время отправки иконки
      ai.setLastNotifyIcon(currentTime);
    }

    // создаем новое
    ai.getCurrentFactory().addNewTask(ai, actor, local, config, currentTime);

    // если есть ожидающие задания
    if (ai.isWaitingTask())
      // выполняем
      ai.doTask(actor, currentTime, local);
  }