Спасибо
Посмотрите видео ниже, чтобы узнать, как установить наш сайт в виде веб-приложения на главном экране.
Примечание: Эта функция может быть недоступна в некоторых браузерах.
помогите с этим гавном, может запроса какого то нет или подтверждения , предметов я понимаю за 200 мб не выдается, он считает по убийству, выполнение заполнено но не чего не происходит, в каждой сборке по разному сделано (Код:public class Q10294_SporeInfestedPlace extends Quest { // NPC private static final int MAXIMILLIAN = 30120; private static final int ORVEN = 30857; // Monsters private static final int GIANT_FUNGUS = 20555; private static final int GIANT_MONSTER_EYE = 20556; private static final int DIRE_WYRM = 20557; private static final int ROTTING_TREE = 20558; private static final int ROTTING_GOLEM = 20559; private static final int SPIDER_TRISALIM = 20560; private static final int TRISALIM_TARANTULA = 20561; private static final int SPORE_ZOMBIE = 20562; private static final int EARTH_GUARDIAN_WYRM = 20176; // Items private static final ItemHolder SOE_SEA_OF_SPORES = new ItemHolder(95590, 1); private static final ItemHolder SOE_HIGH_PRIEST_OVEN = new ItemHolder(91768, 1); private static final ItemHolder SPIRIT_ORE = new ItemHolder(3031, 500); private static final ItemHolder SOULSHOT_TICKET = new ItemHolder(90907, 50); private static final ItemHolder HP_POTS = new ItemHolder(91912, 100); private static final ItemHolder SAYHA_GUST = new ItemHolder(91776, 9); // Misc private static final String KILL_COUNT_VAR = "KillCount"; private static final int MIN_LEVEL = 40; private static final int MAX_LEVEL = 45; public Q10294_SporeInfestedPlace() { super(10294); addStartNpc(MAXIMILLIAN); addTalkId(MAXIMILLIAN, ORVEN); addKillId(GIANT_FUNGUS, GIANT_MONSTER_EYE, DIRE_WYRM, ROTTING_TREE, ROTTING_GOLEM, SPIDER_TRISALIM, TRISALIM_TARANTULA, SPORE_ZOMBIE, EARTH_GUARDIAN_WYRM); addCondMinLevel(MIN_LEVEL, "no_lvl.html"); addCondMaxLevel(MAX_LEVEL, "no_lvl.html"); registerQuestItems(SOE_SEA_OF_SPORES.getId(), SOE_HIGH_PRIEST_OVEN.getId()); setQuestNameNpcStringId(NpcStringId.LV_40_45_SPORE_INFECTED_PLACE); } @Override public boolean checkPartyMember(Player member, Npc npc) { final QuestState qs = getQuestState(member, false); return ((qs != null) && qs.isStarted()); } @Override public String onAdvEvent(String event, Npc npc, Player player) { final QuestState qs = getQuestState(player, false); if (qs == null) { return null; } String htmltext = null; switch (event) { case "30120.htm": case "30120-01.htm": case "30120-02.htm": case "30857.html": case "30857-01.html": case "30857-03.html": case "30857-05.html": { htmltext = event; break; } case "30120-03.htm": { qs.startQuest(); final ListenersContainer container = player; container.addListener(new ConsumerEventListener(player, EventType.ON_PLAYER_LEVEL_CHANGED, (OnPlayerLevelChanged levelChange) -> onLevelUp(levelChange, qs), this)); htmltext = event; break; } case "TELEPORT_TO_ORVEN": { player.teleToLocation(147452, 22638, -1984); break; } case "30857-02.html": { qs.setCond(2); giveItems(player, SOE_SEA_OF_SPORES); htmltext = event; break; } case "reward": { if (qs.isCond(3)) { addExpAndSp(player, 10000000, 270000); giveItems(player, SPIRIT_ORE); giveItems(player, SOULSHOT_TICKET); giveItems(player, HP_POTS); giveItems(player, SAYHA_GUST); htmltext = "30857-05.html"; qs.exitQuest(false, true); } break; } } return htmltext; } @Override public String onTalk(Npc npc, Player player) { final QuestState qs = getQuestState(player, true); String htmltext = getNoQuestMsg(player); if (qs.isCreated()) { htmltext = "30120.htm"; } else if (qs.isStarted()) { switch (npc.getId()) { case MAXIMILLIAN: { htmltext = "30120-01.html"; break; } case ORVEN: { if (qs.isCond(1)) { htmltext = "30857.html"; } else if (qs.isCond(3) && (player.getLevel() > 43)) { htmltext = "30857-04.html"; } else { htmltext = "no_enough.html"; } break; } } } else if (qs.isCompleted()) { if (npc.getId() == ORVEN) { htmltext = getAlreadyCompletedMsg(player); } } return htmltext; } @Override public String onKill(Npc npc, Player killer, boolean isSummon) { final QuestState qs = getQuestState(killer, false); if ((qs != null) && qs.isCond(2)) { final int killCount = qs.getInt(KILL_COUNT_VAR) + 1; if (killCount <= 200) { qs.set(KILL_COUNT_VAR, killCount); playSound(killer, QuestSound.ITEMSOUND_QUEST_ITEMGET); sendNpcLogList(killer); } else if (allConditionsMet(killer, qs)) { prepareToFinishQuest(killer, qs); } } return super.onKill(npc, killer, isSummon); } @Override public Set<NpcLogListHolder> getNpcLogList(Player player) { final QuestState qs = getQuestState(player, false); if ((qs != null) && qs.isCond(2)) { final Set<NpcLogListHolder> holder = new HashSet<>(); holder.add(new NpcLogListHolder(NpcStringId.KILL_MONSTERS_IN_THE_SEA_OF_SPORES.getId(), true, qs.getInt(KILL_COUNT_VAR))); holder.add(new NpcLogListHolder(NpcStringId.REACH_LV_44, player.getLevel() > 43 ? 1 : 0)); return holder; } return super.getNpcLogList(player); } @Override public void onQuestAborted(Player player) { player.removeListenerIf(EventType.ON_PLAYER_LEVEL_CHANGED, listener -> listener.getOwner() == player); super.onQuestAborted(player); } private void onLevelUp(OnPlayerLevelChanged event, QuestState qs) { final Player player = event.getPlayer(); sendNpcLogList(player); if (allConditionsMet(player, qs)) { prepareToFinishQuest(player, qs); } } private boolean allConditionsMet(Player player, QuestState qs) { return (qs != null) && qs.isCond(2) && (player.getLevel() > 43) && (qs.getInt(KILL_COUNT_VAR) >= 200); } private void prepareToFinishQuest(Player killer, QuestState qs) { qs.setCond(3, true); giveItems(killer, SOE_HIGH_PRIEST_OVEN); qs.unset(KILL_COUNT_VAR); killer.removeListenerIf(EventType.ON_PLAYER_LEVEL_CHANGED, listener -> listener.getOwner() == killer); } }
В текущем состоянии код работает корректно, и квест автоматически завершится при достижении игроком 44-45 уровня. Это происходит благодаря механизму отслеживания уровня через <span>ConsumerEventListener</span>.
<span>container.addListener(new ConsumerEventListener(player, EventType.ON_PLAYER_LEVEL_CHANGED, (OnPlayerLevelChanged levelChange) -> onLevelUp(levelChange, qs), this));<br></span>
<span>private void onLevelUp(OnPlayerLevelChanged levelChange, QuestState qs) {<br> if (levelChange.getLevel() > 43) {<br> qs.setCond(3);<br> }<br>}<br></span>
Таким образом, как только игрок достигнет нужного уровня и убьет 200 монстров, квест автоматически закроется с выдачей награды.<span>private boolean allConditionsMet(Player player, QuestState qs) {<br> return (player.getLevel() > 43) && (qs.getInt(KILL_COUNT_VAR) >= 200);<br>}<br></span>