DailyMission

ЕгорСПБ

Знаменитый
Местный
Старожил I степени
Сообщения
211
Розыгрыши
0
Решения
2
Репутация
10
Реакции
34
Баллы
1 298
Хроники
  1. Master Class
Исходники
Присутствуют
Сборка
L2J_Mobius_12.3_Superion
Здравствуйте.
Есть две миссии клана " Достижения" Дворянин и Почетный статус.
За эти миссии не выдается награда по какой то причине.
Код:
<reward id="3025" name="Obtain Noblesse status" requiredCompletion="1">
        <!-- Obtain the Noblesse status while in a clan. -->
        <handler name="noblesse">
            <param name="minLevel">85</param>
            <param name="maxLevel">255</param>
        </handler>
        <items>
            <item id="-200" count="30000" /> <!-- Clan Reputation -->
            <item id="-300" count="3000" /> <!-- Fame -->
        </items>
    </reward>
    <reward id="3026" name="Obtain Exalted Status" requiredCompletion="1">
        <!-- Obtain the Exalted status while in a clan. -->
        <handler name="exalted">
            <param name="minLevel">85</param>
            <param name="maxLevel">255</param>
        </handler>
        <items>
            <item id="-200" count="90000" /> <!-- Clan Reputation -->
            <item id="-300" count="9000" /> <!-- Fame -->
        </items>
    </reward>
Вот xml файл.
Код:
package handlers.dailymissionhandlers;

import org.l2jmobius.gameserver.handler.AbstractDailyMissionHandler;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.actor.enums.player.DailyMissionStatus;
import org.l2jmobius.gameserver.model.actor.holders.player.DailyMissionDataHolder;
import org.l2jmobius.gameserver.model.actor.holders.player.DailyMissionPlayerEntry;
import org.l2jmobius.gameserver.model.events.Containers;
import org.l2jmobius.gameserver.model.events.EventType;
import org.l2jmobius.gameserver.model.events.impl.creature.player.OnPlayerBecomeNoblesse;
import org.l2jmobius.gameserver.model.events.listeners.ConsumerEventListener;

/**
 * @author CostyKiller
 */
public class NoblesseDailyMissionHandler extends AbstractDailyMissionHandler
{
    private final int _amount;
    private final int _minLevel;
    private final int _maxLevel;
    
    public NoblesseDailyMissionHandler(DailyMissionDataHolder holder)
    {
        super(holder);
        _amount = holder.getRequiredCompletions();
        _minLevel = holder.getParams().getInt("minLevel", 0);
        _maxLevel = holder.getParams().getInt("maxLevel", Integer.MAX_VALUE);
    }
    
    @Override
    public void init()
    {
        Containers.Global().addListener(new ConsumerEventListener(Containers.Global(), EventType.ON_PLAYER_BECOME_NOBLESSE, (OnPlayerBecomeNoblesse event) -> onPlayerBecomeNoblesse(event), this));
    }
    
    @Override
    public boolean isAvailable(Player player)
    {
        final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), false);
        if (entry != null)
        {
            switch (entry.getStatus())
            {
                case NOT_AVAILABLE: // Initial state
                {
                    if (entry.getProgress() >= _amount)
                    {
                        entry.setStatus(DailyMissionStatus.AVAILABLE);
                        storePlayerEntry(entry);
                    }
                    break;
                }
                case AVAILABLE:
                {
                    return true;
                }
            }
        }
        return false;
    }
    
    private void onPlayerBecomeNoblesse(OnPlayerBecomeNoblesse event)
    {
        final Player player = event.getPlayer();
        if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
        {
            return;
        }
        
        // Check if player is belonging to a clan and is noble.
        if ((player.getClan() != null) && (player.getNobleLevel() > 0) && (player.getNobleLevel() == 1))
        {
            processPlayerProgress(player);
        }
    }
    
    private void processPlayerProgress(Player player)
    {
        final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
        if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE)
        {
            if (entry.increaseProgress() >= _amount)
            {
                entry.setStatus(DailyMissionStatus.AVAILABLE);
            }
            storePlayerEntry(entry);
        }
    }
}
Вот код .
Алису AI я уже *****
Она пишет
  1. Отслеживание прогресса реализовано (<span>processPlayerProgress()</span> увеличивает счётчик).
  2. Смена статуса на <span>AVAILABLE</span> происходит при достижении <span>_amount</span>.
  3. Но нет логики выдачи награды — метод, который бы вызывал <span>giveReward()</span> или аналогичный, отсутствует.
Код только подготавливает миссию к завершению, но не завершает её.
Но ничего из этого не работает.

Вариант 1. Автоматическая выдача при достижении цели​

Измените метод <span>processPlayerProgress()</span>
Код:
private void processPlayerProgress(Player player) {
    final DailyMissionPlayerEntry entry = getPlayerEntry(player.getObjectId(), true);
    if (entry.getStatus() == DailyMissionStatus.NOT_AVAILABLE) {
        if (entry.increaseProgress() >= _amount) {
            entry.setStatus(DailyMissionStatus.AVAILABLE);
            // ВЫДАЧА НАГРАДЫ
            giveReward(player, entry);
        }
        storePlayerEntry(entry);
    }
}
 
Главный по мобиусу MrKirill1232
С другой стороны, зачем тебе все это править, если сервер для друзей :loltt0:
 
Ну тут исходя из этой проверки

Java:
        // Check if player is belonging to a clan and is noble.
        if ((player.getClan() != null) && (player.getNobleLevel() > 0) && (player.getNobleLevel() == 1))
        {
            processPlayerProgress(player);
        }

чар уже должен быть нублом чтоб смог взять это задание, то есть это задание сработает только при достижении второго дворянства (getNobleLevel() == 2) у Леона (Obtain Exalted Status). Я не знаю на сколько это правильно по отношению к миссии
id="3025" name="Obtain Noblesse status"

Можно проверить для теста так

Java:
        // Check if player is belonging to a clan and is noble.
        if ((player.getClan() != null) && (player.getNobleLevel() < 2))
        {
            processPlayerProgress(player);
        }
 
ну по уму тут нужно делать статик слушатели 3х типов ещё.
1. На вход игрока;
2. На поднятия уровня;
3. При входе в клан;
1 - вешать На всех игроков, в нем проверять наличие нобла по уровню, если он есть нужный, но квест считается не выполненым по уровню персонажа - вешаем на игрока слушатель на поднятие уровня.
3 - тут или удалять проверку на наличие клана или делать слушатель, когда человек заходит в клан - проверять наличие условий для выполнения задания и выдавать его в случае успеха.
 
Да, Автор хандлера не счёл нужным повесить слушатель в квестах, на чём вообще он должен срабатывать.

где в квестах .setNobleLevel, нужно добавить

Java:
 if (EventDispatcher.getInstance().hasListener(EventType.ON_PLAYER_BECOME_NOBLESSE))
 {
       EventDispatcher.getInstance().notifyEventAsync(new OnPlayerBecomeNoblesse(player));
 }

============
P.S
1. Если перс не в клане вообще о каком DailyMission идёт речь?
2. Проверка на левел тоже не нужно, так как там можно на всех уровях 0 - 130
 
<param name="minLevel">85</param>
2. Проверка на левел тоже не нужно, так как там можно на всех уровях 0 - 130
ну тут с 85 указано :)

Сделаешь себе мультпроф - и будет у тебя от прорблема, на 1 уровне получишь нобл и будет квест не выполненым.
 
ну тут с 85 указано :)

Сделаешь себе мультпроф - и будет у тебя от прорблема, на 1 уровне получишь нобл и будет квест не выполненым.

Правильно не посмотрел я, ограничение на мин левел есть, но посути квест на нубл без 85 уроня и не взять, а на счёт мультипрофы и остальных примочек админов я не вкурсе, такими не страдаю :)
 
ну по уму тут нужно делать статик слушатели 3х типов ещё.
1. На вход игрока;
2. На поднятия уровня;
3. При входе в клан;
1 - вешать На всех игроков, в нем проверять наличие нобла по уровню, если он есть нужный, но квест считается не выполненым по уровню персонажа - вешаем на игрока слушатель на поднятие уровня.
3 - тут или удалять проверку на наличие клана или делать слушатель, когда человек заходит в клан - проверять наличие условий для выполнения задания и выдавать его в случае успеха.
зачем?
там в описании миссии явно написано "Получите статус дворянина в составе клана", т.е. достаточно слушать именно смену статуса, дергая листенер миссии при установке статуса нобла в квесте Noble Material, ну и в сервисах еще к примеру, если статус нобла можно купить.
аналогично с получением статуса почетного дворянства.
 
Shot00001.webp
Если судить по игре то все условия выполнены
1 В клане.
2 Больше 85.
3 По квестам получен статус дворянина.
Безымянный.webp
Тут квестов несколько видимо под классы.
Код:
package quests.Q10510_NobleMaterial1;

import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestDialogType;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.model.quest.newquestdata.NewQuestLocation;
import org.l2jmobius.gameserver.model.quest.newquestdata.QuestCondType;
import org.l2jmobius.gameserver.network.serverpackets.quest.ExQuestDialog;

import quests.Q10512_NobleMaterial2.Q10512_NobleMaterial2;

/**
 * @author Stayway
 */
public class Q10510_NobleMaterial1 extends Quest
{
    private static final int QUEST_ID = 10510;
    
    public Q10510_NobleMaterial1()
    {
        super(QUEST_ID);
        addItemTalkId(82963); // Teleportation Guide - Harp Zu Hestui
    }
    
    @Override
    public String onEvent(String event, Npc npc, Player player)
    {
        switch (event)
        {
            case "ACCEPT":
            {
                if (!canStartQuest(player))
                {
                    break;
                }
                
                final QuestState questState = getQuestState(player, true);
                if (!questState.isStarted() && !questState.isCompleted())
                {
                    questState.startQuest();
                    giveItems(player, 82963, 1); // Teleportation Guide - Harp Zu Hestui
                    giveStoryBuffReward(player);
                }
                break;
            }
            case "TELEPORT":
            {
                QuestState questState = getQuestState(player, false);
                if (questState == null)
                {
                    if (!canStartQuest(player))
                    {
                        break;
                    }
                    
                    questState = getQuestState(player, true);
                    
                    final NewQuestLocation questLocation = getQuestData().getLocation();
                    if (questLocation.getStartLocationId() > 0)
                    {
                        final Location location = TeleportListData.getInstance().getTeleport(questLocation.getStartLocationId()).getLocation();
                        if (teleportToQuestLocation(player, location))
                        {
                            questState.setCond(QuestCondType.ACT);
                            sendAcceptDialog(player);
                        }
                    }
                    break;
                }
                
                final NewQuestLocation questLocation = getQuestData().getLocation();
                if (questState.isCond(QuestCondType.STARTED))
                {
                    if (questLocation.getQuestLocationId() > 0)
                    {
                        final Location location = TeleportListData.getInstance().getTeleport(questLocation.getQuestLocationId()).getLocation();
                        if (teleportToQuestLocation(player, location) && (questLocation.getQuestLocationId() == questLocation.getEndLocationId()))
                        {
                            questState.setCond(QuestCondType.DONE);
                            sendEndDialog(player);
                        }
                    }
                }
                else if (questState.isCond(QuestCondType.DONE) && !questState.isCompleted())
                {
                    if (questLocation.getEndLocationId() > 0)
                    {
                        final Location location = TeleportListData.getInstance().getTeleport(questLocation.getEndLocationId()).getLocation();
                        if (teleportToQuestLocation(player, location))
                        {
                            sendEndDialog(player);
                        }
                    }
                }
                break;
            }
            case "COMPLETE":
            {
                final QuestState questState = getQuestState(player, false);
                if (questState == null)
                {
                    break;
                }
                
                if (!hasQuestItems(player, 82963))
                {
                    break;
                }
                
                if (questState.isCond(QuestCondType.DONE) && !questState.isCompleted())
                {
                    questState.exitQuest(false, true);
                    rewardPlayer(player);
                    final QuestState nextQuestState = player.getQuestState(Q10512_NobleMaterial2.class.getSimpleName());
                    if (nextQuestState == null)
                    {
                        player.sendPacket(new ExQuestDialog(10512, QuestDialogType.ACCEPT));
                    }
                }
                break;
            }
        }
        
        return null;
    }
    
    @Override
    public String onFirstTalk(Npc npc, Player player)
    {
        final QuestState questState = getQuestState(player, false);
        if ((questState != null) && !questState.isCompleted())
        {
            if (questState.isCond(QuestCondType.STARTED))
            {
                if (questState.isStarted())
                {
                    questState.setCount(getQuestData().getGoal().getCount());
                    questState.setCond(QuestCondType.DONE);
                    player.sendPacket(new ExQuestDialog(questState.getQuest().getId(), QuestDialogType.END));
                }
            }
            else if (questState.isCond(QuestCondType.DONE))
            {
                player.sendPacket(new ExQuestDialog(questState.getQuest().getId(), QuestDialogType.END));
            }
        }
        
        npc.showChatWindow(player);
        return null;
    }
}
Вот что в квесте.
 
ну вот в обработке "COMPLETE" дергай листенер миссии на получение статуса, если этого уже не делается там в rewardPlayer(player) каким либо образом.
 
зачем?
там в описании миссии явно написано "Получите статус дворянина в составе клана", т.е. достаточно слушать именно смену статуса, дергая листенер миссии при установке статуса нобла в квесте Noble Material, ну и в сервисах еще к примеру, если статус нобла можно купить.
аналогично с получением статуса почетного дворянства.
только там же есть довольно не приятная проверка на уровень и клан. Если одно из условий не выполнено - значит остаешься без прогресса миссии :)
Java:
    private void onPlayerBecomeNoblesse(OnPlayerBecomeNoblesse event)
    {
        final Player player = event.getPlayer();
        if ((player.getLevel() < _minLevel) || (player.getLevel() > _maxLevel))
        {
            return;
        }
        
        // Check if player is belonging to a clan and is noble.
        if ((player.getClan() != null) && (player.getNobleLevel() > 0) && (player.getNobleLevel() == 1))
        {
            processPlayerProgress(player);
        }
    }
Я не уверен как именно там работает проверка с возможностью забрать награды миссии (именно если миссия будет выполнена, но нельзя забрать награду из-за уровня) - но то что проверка в одноразовом событии требует только определенных условий для выполнении требует или переделать эту проверку, или добавить дополнительные слушатели чтобы эту проверку пройти.
 
Как я понял мне нужно смотреть не Noble Material - 1
А Noble Material - 4 где я у Lionel Hunter получаю награду за прохождение квестов и статус дворянина.
Код:
package quests.Q10514_NobleMaterial4;

import org.l2jmobius.gameserver.data.xml.TeleportListData;
import org.l2jmobius.gameserver.model.Location;
import org.l2jmobius.gameserver.model.actor.Npc;
import org.l2jmobius.gameserver.model.actor.Player;
import org.l2jmobius.gameserver.model.quest.Quest;
import org.l2jmobius.gameserver.model.quest.QuestDialogType;
import org.l2jmobius.gameserver.model.quest.QuestState;
import org.l2jmobius.gameserver.model.quest.newquestdata.NewQuestLocation;
import org.l2jmobius.gameserver.model.quest.newquestdata.QuestCondType;
import org.l2jmobius.gameserver.model.skill.holders.SkillHolder;
import org.l2jmobius.gameserver.network.serverpackets.quest.ExQuestDialog;

import quests.Q10518_ExaltedOneWhoFacesTheLimit.Q10518_ExaltedOneWhoFacesTheLimit;

//import quests.Q10518_ExaltedOneWhoFacesTheLimit.Q10518_ExaltedOneWhoFacesTheLimit;

/**
 * @author Stayway
 */
public class Q10514_NobleMaterial4 extends Quest
{
    private static final int QUEST_ID = 10514;
    private static final SkillHolder NOBLESSE_PRESENTATION = new SkillHolder(18176, 1);
   
    public Q10514_NobleMaterial4()
    {
        super(QUEST_ID);
        addItemTalkId(82964); // Teleportation Guide - Lionel Hunter
    }
   
    @Override
    public String onEvent(String event, Npc npc, Player player)
    {
        switch (event)
        {
            case "ACCEPT":
            {
                if (!canStartQuest(player))
                {
                    break;
                }
               
                final QuestState questState = getQuestState(player, true);
                if (!questState.isStarted() && !questState.isCompleted())
                {
                    questState.startQuest();
                    giveItems(player, 82964, 1); // Teleportation Guide - Lionel Hunter
                    giveStoryBuffReward(player);
                }
                break;
            }
            case "TELEPORT":
            {
                QuestState questState = getQuestState(player, false);
                if (questState == null)
                {
                    if (!canStartQuest(player))
                    {
                        break;
                    }
                   
                    questState = getQuestState(player, true);
                   
                    final NewQuestLocation questLocation = getQuestData().getLocation();
                    if (questLocation.getStartLocationId() > 0)
                    {
                        final Location location = TeleportListData.getInstance().getTeleport(questLocation.getStartLocationId()).getLocation();
                        if (teleportToQuestLocation(player, location))
                        {
                            questState.setCond(QuestCondType.ACT);
                            sendAcceptDialog(player);
                        }
                    }
                    break;
                }
               
                final NewQuestLocation questLocation = getQuestData().getLocation();
                if (questState.isCond(QuestCondType.STARTED))
                {
                    if (questLocation.getQuestLocationId() > 0)
                    {
                        final Location location = TeleportListData.getInstance().getTeleport(questLocation.getQuestLocationId()).getLocation();
                        if (teleportToQuestLocation(player, location) && (questLocation.getQuestLocationId() == questLocation.getEndLocationId()))
                        {
                            questState.setCond(QuestCondType.DONE);
                            sendEndDialog(player);
                        }
                    }
                }
                else if (questState.isCond(QuestCondType.DONE) && !questState.isCompleted())
                {
                    if (questLocation.getEndLocationId() > 0)
                    {
                        final Location location = TeleportListData.getInstance().getTeleport(questLocation.getEndLocationId()).getLocation();
                        if (teleportToQuestLocation(player, location))
                        {
                            sendEndDialog(player);
                        }
                    }
                }
                break;
            }
            case "COMPLETE":
            {
                final QuestState questState = getQuestState(player, false);
                if (questState == null)
                {
                    break;
                }
               
                if (!hasQuestItems(player, 82964))
                {
                    break;
                }
               
                if (questState.isCond(QuestCondType.DONE) && !questState.isCompleted())
                {
                    questState.exitQuest(false, true);
                    rewardPlayer(player);
                    player.setNobleLevel(1);
                    player.broadcastInfo();
                    player.doCast(NOBLESSE_PRESENTATION.getSkill());
                    final QuestState nextQuestState = player.getQuestState(Q10518_ExaltedOneWhoFacesTheLimit.class.getSimpleName());
                    if (nextQuestState == null)
                    {
                        player.sendPacket(new ExQuestDialog(10518, QuestDialogType.ACCEPT));
                    }
                }
                break;
            }
        }
       
        return null;
    }
   
    @Override
    public String onFirstTalk(Npc npc, Player player)
    {
        final QuestState questState = getQuestState(player, false);
        if ((questState != null) && !questState.isCompleted())
        {
            if (questState.isCond(QuestCondType.STARTED))
            {
                if (questState.isStarted())
                {
                    questState.setCount(getQuestData().getGoal().getCount());
                    questState.setCond(QuestCondType.DONE);
                    player.sendPacket(new ExQuestDialog(questState.getQuest().getId(), QuestDialogType.END));
                }
            }
            else if (questState.isCond(QuestCondType.DONE))
            {
                player.sendPacket(new ExQuestDialog(questState.getQuest().getId(), QuestDialogType.END));
            }
        }
       
        npc.showChatWindow(player);
        return null;
    }
}
Но статус то выдается а в DailyMission ничего не происходит.
 
ну так проверяй в методах что вызваются в "COMPLETE", есть ли там вызов листенера миссии вобще
например в setNobleLevel

у меня в аналогичном по смыслу setNobleType как раз это делается
Java:
    /**
     * Установка типа дворянства:<br>
     *
     * 0 - не дворянин;<br>
     * 1 - обычный дворянин;<br>
     * 2 - прославленный дворянин.
     */
    public void setNobleType(int type)
    {
        _nobleType = type;
        _variables.setVar(Variables.NOBLE_TYPE, type);

        if (_nobleType == 1)
            getListeners().onPlayerAction(PlayerActionType.OBTAINED_NOBLE_STATUS);
        else if (_nobleType == 2)
            getListeners().onPlayerAction(PlayerActionType.OBTAINED_EXALTED_NOBLE_STATUS);
    }
на худой конец можешь в самой миссии отслеживать не получение статуса нобла/почетного нобла, а выполнение конкретных квестов - листенер миссий на эту тему тоже должен быть, например для миссии 3081
 
Назад
Сверху Снизу