feat: Add WorldStateFlagAttribute and custom property drawer for enhanced dialogue management
- Implemented WorldStateFlagAttribute to mark string fields as world state flags. - Created NarrativeNPCEditor for custom inspector to visualize dialogue version activation states. - Developed WorldStateFlagDrawer to provide dropdown menu for known flags in the inspector. - Introduced ActorModule for managing DialogueActorSO assets, including viewing, creating, and deleting actors. - Added DialogueModule for managing DialogueSequenceSO assets with detailed previews and action bars. - Established QuestModule for managing QuestSO assets, including objectives and branches. - Implemented QuestManagerPostprocessor to automatically refresh QuestManager's quest list on asset changes.
This commit is contained in:
@@ -27,7 +27,7 @@ namespace BaseGames.Quest
|
||||
protected override void Interact_Internal(Transform player)
|
||||
{
|
||||
var qm = SL.GetOrDefault<IQuestManager>();
|
||||
var quest = GetCurrentQuest(qm);
|
||||
var quest = GetCurrentOrCompletedQuest(qm);
|
||||
if (quest == null || qm == null) return;
|
||||
|
||||
var state = qm.GetState(quest.questId);
|
||||
@@ -36,7 +36,7 @@ namespace BaseGames.Quest
|
||||
{
|
||||
qm.AcceptQuest(quest.questId);
|
||||
}
|
||||
else if (qm.IsReadyToComplete(quest.questId))
|
||||
else if (state == QuestStateEnum.Active && qm.IsReadyToComplete(quest.questId))
|
||||
{
|
||||
// 直接从 player 获取 PlayerStats,避免对 PlayerController 的程序集依赖
|
||||
var stats = player.GetComponentInParent<PlayerStats>();
|
||||
@@ -47,7 +47,7 @@ namespace BaseGames.Quest
|
||||
protected override DialogueSequenceSO GetCurrentDialogue()
|
||||
{
|
||||
var qm = SL.GetOrDefault<IQuestManager>();
|
||||
var quest = GetCurrentQuest(qm);
|
||||
var quest = GetCurrentOrCompletedQuest(qm);
|
||||
if (quest == null || qm == null) return base.GetCurrentDialogue();
|
||||
|
||||
var state = qm.GetState(quest.questId);
|
||||
@@ -64,19 +64,25 @@ namespace BaseGames.Quest
|
||||
|
||||
// ── 私有辅助 ─────────────────────────────────────────────────────────
|
||||
|
||||
/// <summary>返回当前处于 Available 或 Active 状态的第一个任务。</summary>
|
||||
private QuestSO GetCurrentQuest(IQuestManager qm = null)
|
||||
/// <summary>
|
||||
/// 返回当前处于 Available 或 Active 状态的第一个任务;
|
||||
/// 若全部已完成,返回最后一个已完成任务(用于显示 completedDialogue)。
|
||||
/// </summary>
|
||||
private QuestSO GetCurrentOrCompletedQuest(IQuestManager qm = null)
|
||||
{
|
||||
if (_offeredQuests == null) return null;
|
||||
qm ??= SL.GetOrDefault<IQuestManager>();
|
||||
if (qm == null) return null;
|
||||
|
||||
QuestSO lastCompleted = null;
|
||||
foreach (var q in _offeredQuests)
|
||||
{
|
||||
if (q == null) continue;
|
||||
var s = qm.GetState(q.questId);
|
||||
if (s == QuestStateEnum.Available || s == QuestStateEnum.Active) return q;
|
||||
if (s == QuestStateEnum.Completed) lastCompleted = q;
|
||||
}
|
||||
return null;
|
||||
return lastCompleted;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user