Merge pull request Grasscutter-Quests#53

'Updated with how talks are handle' by `mjolsic`
This commit is contained in:
KingRainbow44
2023-05-02 20:16:55 -04:00
parent 6c654ce0c3
commit fdd6820a8f
107 changed files with 538 additions and 233 deletions

View File

@@ -0,0 +1,52 @@
package emu.grasscutter.game.talk;
import emu.grasscutter.data.GameData;
import emu.grasscutter.data.binout.MainQuestData.TalkData;
import emu.grasscutter.game.player.BasePlayerManager;
import emu.grasscutter.game.player.Player;
import lombok.NonNull;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_COMPLETE_ANY_TALK;
import static emu.grasscutter.game.quest.enums.QuestContent.QUEST_CONTENT_COMPLETE_TALK;
import static emu.grasscutter.game.quest.enums.QuestCond.QUEST_COND_COMPLETE_TALK;
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.
*/
public void triggerTalkAction(int talkId) {
var talkData = GameData.getTalkConfigDataMap().get(talkId);
if (talkData == null || talkData.getFinishExec().isEmpty()) return;
var player = this.getPlayer();
// Execute the talk action on associated handlers.
talkData.getFinishExec().forEach(e -> this.getPlayer().getServer()
.getTalkSystem().triggerExec(getPlayer(), talkData, e));
// 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);
// Save the talk value to the quest's data.
this.saveTalkToQuest(talkId, talkData.getQuestId());
}
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, ""));
}
}