Ejemplo n.º 1
0
  public static Location getRestartLocation(Player player, Location from, RestartType restartType) {
    Reflection r = player.getReflection();
    if (r != ReflectionManager.DEFAULT)
      if (r.getCoreLoc() != null) return r.getCoreLoc();
      else if (r.getReturnLoc() != null) return r.getReturnLoc();

    Clan clan = player.getClan();

    if (clan != null) {
      // If teleport to clan hall
      if (restartType == RestartType.TO_CLANHALL && clan.getHasHideout() != 0)
        return ResidenceHolder.getInstance()
            .getResidence(clan.getHasHideout())
            .getOwnerRestartPoint();

      // If teleport to castle
      if (restartType == RestartType.TO_CASTLE && clan.getCastle() != 0)
        return ResidenceHolder.getInstance().getResidence(clan.getCastle()).getOwnerRestartPoint();

      // If teleport to fortress
      if (restartType == RestartType.TO_FORTRESS && clan.getHasFortress() != 0)
        return ResidenceHolder.getInstance()
            .getResidence(clan.getHasFortress())
            .getOwnerRestartPoint();
    }

    if (player.isPK()) {
      if (player.getPKRestartPoint() != null) return player.getPKRestartPoint();
    } else {
      if (player.getRestartPoint() != null) return player.getRestartPoint();
    }

    RestartArea ra = MapRegionManager.getInstance().getRegionData(RestartArea.class, from);
    if (ra != null) {
      RestartPoint rp = ra.getRestartPoint().get(player.getRace());

      Location restartPoint = Rnd.get(rp.getRestartPoints());
      Location PKrestartPoint = Rnd.get(rp.getPKrestartPoints());

      return player.isPK() ? PKrestartPoint : restartPoint;
    }

    _log.warn("Cannot find restart location from coordinates: " + from + "!");

    return DEFAULT_RESTART;
  }
Ejemplo n.º 2
0
  /**
   * Проверяет возможность носить эту вещь.
   *
   * @return null, если вещь носить можно, либо SystemMessage, который можно показать игроку
   */
  public static final IStaticPacket checkIfCanEquip(Player player, ItemInstance item) {
    // FIXME [G1ta0] черезмерный хардкод, переделать на условия
    int itemId = item.getItemId();
    int targetSlot = item.getTemplate().getBodyPart();
    Clan clan = player.getClan();

    // TODO: [Bonux] проверить, могут ли носить Камаэли щиты и сигили R ранга.
    if (!player.getClassId().isOfLevel(ClassLevel.AWAKED)
        && item.getGrade() != ItemGrade.R
        && item.getGrade() != ItemGrade.R95
        && item.getGrade() != ItemGrade.R99) {
      // камаэли и хеви/робы/щиты/сигилы
      if (player.getRace() == Race.KAMAEL
          && (item.getItemType() == ArmorType.HEAVY
              || item.getItemType() == ArmorType.MAGIC
              || item.getItemType() == ArmorType.SIGIL
              || item.getItemType() == WeaponType.NONE))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

      // не камаэли и рапиры/арбалеты/древние мечи
      if (player.getRace() != Race.KAMAEL
          && (item.getItemType() == WeaponType.CROSSBOW
              || item.getItemType() == WeaponType.RAPIER
              || item.getItemType() == WeaponType.ANCIENTSWORD))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;
    }

    if (itemId >= 7850 && itemId <= 7859 && player.getLvlJoinedAcademy() == 0) // Clan Oath Armor
    return SystemMsg.THIS_ITEM_CAN_ONLY_BE_WORN_BY_A_MEMBER_OF_THE_CLAN_ACADEMY;

    if (isClanApellaItem(itemId) && player.getPledgeRank().ordinal() < PledgeRank.WISEMAN.ordinal())
      return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

    if (item.getItemType() == WeaponType.DUALDAGGER
        && player.getSkillLevel(923) < 1
        && player.getSkillLevel(10502) < 1)
      return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

    // Корона лидера клана, владеющего замком
    if (itemId == 6841 && (clan == null || !player.isClanLeader() || clan.getCastle() == 0))
      return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

    // Нельзя одевать оружие, если уже одето проклятое оружие. Проверка двумя способами, для
    // надежности.
    if (targetSlot == ItemTemplate.SLOT_LR_HAND
        || targetSlot == ItemTemplate.SLOT_L_HAND
        || targetSlot == ItemTemplate.SLOT_R_HAND) {
      if (itemId != player.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)
          && CursedWeaponsManager.getInstance()
              .isCursed(player.getInventory().getPaperdollItemId(Inventory.PAPERDOLL_RHAND)))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;
      if (player.isCursedWeaponEquipped() && itemId != player.getCursedWeaponEquippedId())
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;
    }

    // Плащи
    if (item.getTemplate().isCloak()) {
      // Can be worn by Knights or higher ranks who own castle
      if (item.getName().contains("Knight")
          && (player.getPledgeRank().ordinal() < PledgeRank.KNIGHT.ordinal()
              || player.getCastle() == null))
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

      // Плащи для камаэлей
      if (item.getName().contains("Kamael") && player.getRace() != Race.KAMAEL)
        return SystemMsg.YOU_DO_NOT_MEET_THE_REQUIRED_CONDITION_TO_EQUIP_THAT_ITEM;

      // Плащи можно носить только с S80 или S84 сетом
      if (!player.getOpenCloak())
        return SystemMsg.THE_CLOAK_CANNOT_BE_EQUIPPED_BECAUSE_YOUR_ARMOR_SET_IS_NOT_COMPLETE;
    }

    if (targetSlot == ItemTemplate.SLOT_DECO) {
      int count = player.getTalismanCount();
      if (count <= 0)
        return new SystemMessage2(
                SystemMsg.YOU_CANNOT_WEAR_S1_BECAUSE_YOU_ARE_NOT_WEARING_A_BRACELET)
            .addItemName(itemId);

      ItemInstance deco;
      for (int slot = Inventory.PAPERDOLL_DECO1; slot <= Inventory.PAPERDOLL_DECO6; slot++) {
        deco = player.getInventory().getPaperdollItem(slot);
        if (deco != null) {
          if (deco == item) return null; // талисман уже одет и количество слотов больше нуля
          // Проверяем на количество слотов и одинаковые талисманы
          if (--count <= 0 || deco.getItemId() == itemId)
            return new SystemMessage2(
                    SystemMsg.YOU_CANNOT_EQUIP_S1_BECAUSE_YOU_DO_NOT_HAVE_ANY_AVAILABLE_SLOTS)
                .addItemName(itemId);
        }
      }
    }
    return null;
  }