package emu.grasscutter.game.talk; import emu.grasscutter.data.GameData; import emu.grasscutter.data.binout.MainQuestData.TalkData; import emu.grasscutter.game.player.*; import emu.grasscutter.server.event.player.PlayerNpcTalkEvent; import lombok.NonNull; import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_COMPLETE_TALK; import static emu.grasscutter.game.quest.enums.QuestContent.*; public final class TalkManager extends BasePlayerManager { public TalkManager(@NonNull Player player) { super(player); } /** * Invoked when a talk is triggered. * * @param talkId The ID of the talk. * @param npcEntityId The entity ID of the NPC being talked to. */ public void triggerTalkAction(int talkId, int npcEntityId) { var player = this.getPlayer(); var talkData = GameData.getTalkConfigDataMap().get(talkId); // Invoke PlayerNpcTalkEvent. var event = new PlayerNpcTalkEvent(player, talkData, talkId, npcEntityId); if (!event.call()) return; if (talkData != null) { // Check if the NPC id is valid. var entity = player.getScene().getEntityById(npcEntityId); if (entity != null) { // The config ID of the entity is the NPC's ID. if (!talkData.getNpcId().contains(entity.getConfigId())) return; } // Execute the talk action on associated handlers. talkData .getFinishExec() .forEach(e -> player.getServer().getTalkSystem().triggerExec(player, talkData, e)); // Save the talk value to the quest's data. this.saveTalkToQuest(talkId, talkData.getQuestId()); } // Invoke the talking events for quests. var questManager = player.getQuestManager(); questManager.queueEvent(QUEST_CONTENT_COMPLETE_ANY_TALK, talkId); questManager.queueEvent(QUEST_CONTENT_COMPLETE_TALK, talkId); questManager.queueEvent(QUEST_COND_COMPLETE_TALK, talkId); } public void saveTalkToQuest(int talkId, int mainQuestId) { // TODO, problem with this is that some talks for activity also have // quest id, which isn't present in QuestExcels var mainQuest = this.getPlayer().getQuestManager().getMainQuestById(mainQuestId); if (mainQuest == null) return; mainQuest.getTalks().put(talkId, new TalkData(talkId, "")); } }