Files
Grasscutter/src/main/java/emu/grasscutter/game/talk/TalkManager.java
2023-08-29 23:54:34 -04:00

65 lines
2.4 KiB
Java

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, ""));
}
}