private static final boolean checkAndChangeClass(L2PcInstance player, int val) {
    final ClassId currentClassId = player.getClassId();
    if (getMinLevel(currentClassId.level()) > player.getLevel() && !Config.ALLOW_ENTIRE_TREE)
      return false;

    if (!validateClassId(currentClassId, val)) return false;

    int newJobLevel = currentClassId.level() + 1;

    // Weight/Inventory check
    if (!Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).isEmpty()
        && !player.isInventoryUnder80(false)) {
      player.sendPacket(
          SystemMessage.getSystemMessage(SystemMessageId.INVENTORY_LESS_THAN_80_PERCENT));
      return false;
    }

    // check if player have all required items for class transfer
    for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keys()) {
      int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId);
      if (player.getInventory().getInventoryItemCount(_itemId, -1) < _count) {
        player.sendPacket(SystemMessageId.NOT_ENOUGH_ITEMS);
        return false;
      }
    }

    // get all required items for class transfer
    for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).keys()) {
      int _count = Config.CLASS_MASTER_SETTINGS.getRequireItems(newJobLevel).get(_itemId);
      if (!player.destroyItemByItemId("ClassMaster", _itemId, _count, player, true)) return false;
    }

    // reward player with items
    for (int _itemId : Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).keys()) {
      int _count = Config.CLASS_MASTER_SETTINGS.getRewardItems(newJobLevel).get(_itemId);
      player.addItem("ClassMaster", _itemId, _count, player, true);
    }

    player.setClassId(val);

    if (player.isSubClassActive())
      player.getSubClasses().get(player.getClassIndex()).setClassId(player.getActiveClass());
    else player.setBaseClass(player.getActiveClass());

    Quest q = QuestManager.getInstance().getQuest("SkillTransfer");
    if (q != null) q.startQuestTimer("givePormanders", 1, null, player);

    player.broadcastUserInfo();

    if (Config.CLASS_MASTER_SETTINGS.isAllowed(player.getClassId().level() + 1)
        && Config.ALTERNATE_CLASS_MASTER
        && ((player.getClassId().level() == 1 && player.getLevel() >= 40)
            || (player.getClassId().level() == 2 && player.getLevel() >= 76)))
      showQuestionMark(player);

    return true;
  }
  /**
   * Actions:
   *
   * <ul>
   *   <li>Check if the killing object is a player, and then find the party they belong to.
   *   <li>Add a blood offering item to the leader of the party.
   *   <li>Update the party leader's inventory to show the new item addition.
   * </ul>
   */
  @Override
  public void doItemDrop(L2Character lastAttacker) {
    L2PcInstance killingChar = null;

    if (!(lastAttacker instanceof L2PcInstance)) {
      return;
    }

    killingChar = (L2PcInstance) lastAttacker;
    L2Party associatedParty = killingChar.getParty();

    if (associatedParty == null) {
      return;
    }

    L2PcInstance partyLeader = associatedParty.getLeader();
    L2ItemInstance addedOfferings =
        partyLeader
            .getInventory()
            .addItem(
                "Sign",
                SevenSignsFestival.FESTIVAL_OFFERING_ID,
                _bonusMultiplier,
                partyLeader,
                this);

    InventoryUpdate iu = new InventoryUpdate();

    if (addedOfferings.getCount() != _bonusMultiplier) {
      iu.addModifiedItem(addedOfferings);
    } else {
      iu.addNewItem(addedOfferings);
    }

    partyLeader.sendPacket(iu);

    super.doItemDrop(lastAttacker); // Normal drop
  }