/** * Этот метод рассчитывает количество дропнутых вещей в зависимости от рейтов. <br> * <br> * Следует учесть, что контроль за верхним пределом вещей в квестах, в которых нужно набить * определенное количество предметов не осуществляется. <br> * <br> * Ни один из передаваемых параметров не должен быть равен 0 * * @param min минимальное количество при рейтах 1х * @param max максимальное количество при рейтах 1х * @param calcChance шанс при рейтах 1х, в процентах * @return количество вещей для дропа, может быть 0 */ public int rollDrop(int min, int max, double calcChance) { if ((calcChance <= 0) || (min <= 0) || (max <= 0)) { return 0; } int dropmult = 1; calcChance *= getRateQuestsDrop(); if (getQuest().getParty() > Quest.PARTY_NONE) { Player player = getPlayer(); if (player.getParty() != null) { calcChance *= Config.ALT_PARTY_BONUS[ player.getParty().getMemberCountInRange(player, Config.ALT_PARTY_DISTRIBUTION_RANGE) - 1]; } } if (calcChance > 100) { if ((int) Math.ceil(calcChance / 100) <= (calcChance / 100)) { calcChance = Math.nextUp(calcChance); } dropmult = (int) Math.ceil(calcChance / 100); calcChance = calcChance / dropmult; } return Rnd.chance(calcChance) ? Rnd.get(min * dropmult, max * dropmult) : 0; }
@Override public void onKill(Creature actor, Creature victim) { if (!victim.isPlayer()) { return; } Player actorPlayer = (Player) actor; List<Player> players = null; switch (_quest.getParty()) { case Quest.PARTY_NONE: players = Collections.singletonList(actorPlayer); break; case Quest.PARTY_ALL: if (actorPlayer.getParty() == null) { players = Collections.singletonList(actorPlayer); } else { players = new ArrayList<Player>(actorPlayer.getParty().getMemberCount()); for (Player member : actorPlayer.getParty().getPartyMembers()) { if (member.isInRange(actorPlayer, Creature.INTERACTION_DISTANCE)) { players.add(member); } } } break; default: players = Collections.emptyList(); break; } for (Player player : players) { QuestState questState = player.getQuestState(_quest.getClass()); if ((questState != null) && !questState.isCompleted()) { _quest.notifyKill((Player) victim, questState); } } }