muffin v7.4.4

This commit is contained in:
alydev 2025-12-23 09:48:23 +10:00
parent 5791858984
commit 8461a561d3
9 changed files with 29358 additions and 748 deletions

View file

@ -0,0 +1,8 @@
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
[StructLayout(LayoutKind.Auto)]
[InlineArray(2)]
internal struct _003C_003Ey__InlineArray2<T>
{
}

View file

@ -61,7 +61,9 @@ internal sealed class GatheringPointRegistry : IDisposable
private void LoadGatheringPointsFromAssembly() private void LoadGatheringPointsFromAssembly()
{ {
_logger.LogInformation("Loading gathering points from assembly"); _logger.LogInformation("Loading gathering points from assembly");
foreach (var (value, value2) in AssemblyGatheringLocationLoader.GetLocations()) IReadOnlyDictionary<ushort, GatheringRoot> locations = AssemblyGatheringLocationLoader.GetLocations();
_logger.LogInformation("AssemblyGatheringLocationLoader returned {Count} locations", locations.Count);
foreach (var (value, value2) in locations)
{ {
_gatheringPoints[new GatheringPointId(value)] = value2; _gatheringPoints[new GatheringPointId(value)] = value2;
} }
@ -72,11 +74,11 @@ internal sealed class GatheringPointRegistry : IDisposable
private void LoadGatheringPointsFromProjectDirectory() private void LoadGatheringPointsFromProjectDirectory()
{ {
DirectoryInfo directoryInfo = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent; DirectoryInfo directoryInfo = _pluginInterface.AssemblyLocation.Directory?.Parent?.Parent;
if (directoryInfo == null) _logger.LogInformation("Looking for gathering paths in solution directory: {SolutionDirectory}", directoryInfo?.FullName ?? "(null)");
if (directoryInfo != null)
{ {
return;
}
DirectoryInfo directoryInfo2 = new DirectoryInfo(Path.Combine(directoryInfo.FullName, "GatheringPaths")); DirectoryInfo directoryInfo2 = new DirectoryInfo(Path.Combine(directoryInfo.FullName, "GatheringPaths"));
_logger.LogInformation("Gathering paths project directory: {PathProjectDirectory}, Exists: {Exists}", directoryInfo2.FullName, directoryInfo2.Exists);
if (!directoryInfo2.Exists) if (!directoryInfo2.Exists)
{ {
return; return;
@ -87,13 +89,17 @@ internal sealed class GatheringPointRegistry : IDisposable
{ {
LoadFromDirectory(new DirectoryInfo(Path.Combine(directoryInfo2.FullName, value))); LoadFromDirectory(new DirectoryInfo(Path.Combine(directoryInfo2.FullName, value)));
} }
return;
} }
catch (Exception exception) catch (Exception exception)
{ {
_gatheringPoints.Clear(); _gatheringPoints.Clear();
_logger.LogError(exception, "Failed to load gathering points from project directory"); _logger.LogError(exception, "Failed to load gathering points from project directory");
return;
} }
} }
_logger.LogWarning("Could not determine solution directory from assembly location: {AssemblyLocation}", _pluginInterface.AssemblyLocation.FullName);
}
private void LoadGatheringPointFromStream(string fileName, Stream stream) private void LoadGatheringPointFromStream(string fileName, Stream stream)
{ {

File diff suppressed because it is too large Load diff

View file

@ -7,6 +7,7 @@ using System.Runtime.InteropServices;
using Dalamud.Plugin.Services; using Dalamud.Plugin.Services;
using FFXIVClientStructs.FFXIV.Client.Game.UI; using FFXIVClientStructs.FFXIV.Client.Game.UI;
using LLib.GameData; using LLib.GameData;
using Lumina.Excel;
using Lumina.Excel.Sheets; using Lumina.Excel.Sheets;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Questionable.Model; using Questionable.Model;
@ -85,11 +86,12 @@ internal sealed class QuestData
startingCities[item.Quest.RowId] = b; startingCities[item.Quest.RowId] = b;
} }
} }
ExcelSheet<QuestEx> questExSheet = dataManager.GetExcelSheet<QuestEx>();
List<IQuestInfo> list = new List<IQuestInfo>(); List<IQuestInfo> list = new List<IQuestInfo>();
list.AddRange(from x in dataManager.GetExcelSheet<Lumina.Excel.Sheets.Quest>() list.AddRange(from x in dataManager.GetExcelSheet<Lumina.Excel.Sheets.Quest>()
where x.RowId != 0 where x.RowId != 0
where x.IssuerLocation.RowId != 0 where x.IssuerLocation.RowId != 0
select new QuestInfo(x, questChapters.GetValueOrDefault(x.RowId), startingCities.GetValueOrDefault(x.RowId), journalGenreOverrides)); select new QuestInfo(x, questExSheet.GetRow(x.RowId), questChapters.GetValueOrDefault(x.RowId), startingCities.GetValueOrDefault(x.RowId), journalGenreOverrides));
list.AddRange(from x in dataManager.GetExcelSheet<SatisfactionNpc>() list.AddRange(from x in dataManager.GetExcelSheet<SatisfactionNpc>()
where x.RowId != 0 && x.Npc.RowId != 0 where x.RowId != 0 && x.Npc.RowId != 0
select new SatisfactionSupplyInfo(x)); select new SatisfactionSupplyInfo(x));

View file

@ -873,7 +873,7 @@ internal sealed class QuestFunctions
{ {
if (IsQuestUnobtainable(questId, extraCompletedQuest)) if (IsQuestUnobtainable(questId, extraCompletedQuest))
{ {
return false; return true;
} }
QuestInfo questInfo = (QuestInfo)_questData.GetQuestInfo(questId); QuestInfo questInfo = (QuestInfo)_questData.GetQuestInfo(questId);
if (questInfo.GrandCompany != FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany.None) if (questInfo.GrandCompany != FFXIVClientStructs.FFXIV.Client.UI.Agent.GrandCompany.None)

View file

@ -0,0 +1,420 @@
using System;
using System.CodeDom.Compiler;
using Lumina.Excel;
using Lumina.Excel.Sheets;
using Lumina.Text.ReadOnly;
namespace Questionable.Model;
[GeneratedCode("Lumina.Excel.Generator", "2.0.0")]
[Sheet("Quest", 179568153u)]
public readonly struct QuestEx : IExcelRow<QuestEx>
{
public readonly struct QuestParamsStruct
{
public ReadOnlySeString ScriptInstruction => _003Cpage_003EP.ReadString(_003Coffset_003EP, _003CparentOffset_003EP);
public uint ScriptArg => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 4);
public QuestParamsStruct(ExcelPage page, uint parentOffset, uint offset)
{
_003Cpage_003EP = page;
_003CparentOffset_003EP = parentOffset;
_003Coffset_003EP = offset;
}
}
public readonly struct QuestListenerParamsStruct
{
public uint Listener => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP);
public uint ConditionValue => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 4);
public ushort Behavior => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 8);
public byte ActorSpawnSeq => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 10);
public byte ActorDespawnSeq => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 11);
public byte Unknown0 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 12);
public byte Unknown1 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 13);
public byte QuestUInt8A => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 14);
public byte ConditionType => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 15);
public byte ConditionOperator => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 16);
public bool VisibleBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 0);
public bool ConditionBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 1);
public bool ItemBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 2);
public bool AnnounceBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 3);
public bool BehaviorBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 4);
public bool AcceptBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 5);
public bool QualifiedBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 6);
public bool CanTargetBool => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 17, 7);
public QuestListenerParamsStruct(ExcelPage page, uint parentOffset, uint offset)
{
_003Cpage_003EP = page;
_003Coffset_003EP = offset;
}
}
public readonly struct TodoParamsStruct
{
public unsafe Collection<RowRef<Level>> ToDoLocation => new Collection<RowRef<Level>>(_003Cpage_003EP, _003CparentOffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<Level>>)(&ToDoLocationCtor), 8);
public byte ToDoCompleteSeq => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 32);
public byte ToDoQty => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 33);
public byte CountableNum => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 34);
public TodoParamsStruct(ExcelPage page, uint parentOffset, uint offset)
{
_003Cpage_003EP = page;
_003CparentOffset_003EP = parentOffset;
_003Coffset_003EP = offset;
}
private static RowRef<Level> ToDoLocationCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<Level>(page.Module, page.ReadUInt32(offset + i * 4), page.Language);
}
}
public ExcelPage ExcelPage => _003Cpage_003EP;
public uint RowOffset => _003Coffset_003EP;
public uint RowId => _003Crow_003EP;
public ReadOnlySeString Name => _003Cpage_003EP.ReadString(_003Coffset_003EP, _003Coffset_003EP);
public unsafe Collection<QuestParamsStruct> QuestParams => new Collection<QuestParamsStruct>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, QuestParamsStruct>)(&QuestParamsCtor), 50);
public unsafe Collection<QuestListenerParamsStruct> QuestListenerParams => new Collection<QuestListenerParamsStruct>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, QuestListenerParamsStruct>)(&QuestListenerParamsCtor), 64);
public unsafe Collection<TodoParamsStruct> TodoParams => new Collection<TodoParamsStruct>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, TodoParamsStruct>)(&TodoParamsCtor), 24);
public uint GilReward => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2548);
public RowRef<Item> CurrencyReward => new RowRef<Item>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2552), _003Cpage_003EP.Language);
public uint CurrencyRewardCount => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2556);
public unsafe Collection<RowRef> Reward => new Collection<RowRef>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef>)(&RewardCtor), 7);
public unsafe Collection<RowRef<Item>> OptionalItemReward => new Collection<RowRef<Item>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<Item>>)(&OptionalItemRewardCtor), 5);
public RowRef<InstanceContent> InstanceContentUnlock => new RowRef<InstanceContent>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2608), _003Cpage_003EP.Language);
public ushort ExpFactor => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2612);
public RowRef<Emote> EmoteReward => new RowRef<Emote>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2614), _003Cpage_003EP.Language);
public RowRef<Lumina.Excel.Sheets.Action> ActionReward => new RowRef<Lumina.Excel.Sheets.Action>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2616), _003Cpage_003EP.Language);
public unsafe Collection<ushort> SystemReward => new Collection<ushort>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, ushort>)(&SystemRewardCtor), 2);
public ushort GCTypeReward => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2622);
public unsafe Collection<RowRef<Item>> ItemCatalyst => new Collection<RowRef<Item>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<Item>>)(&ItemCatalystCtor), 3);
public unsafe Collection<byte> ItemCountCatalyst => new Collection<byte>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, byte>)(&ItemCountCatalystCtor), 3);
public byte ItemRewardType => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2630);
public unsafe Collection<byte> ItemCountReward => new Collection<byte>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, byte>)(&ItemCountRewardCtor), 7);
public unsafe Collection<RowRef<Stain>> RewardStain => new Collection<RowRef<Stain>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<Stain>>)(&RewardStainCtor), 7);
public unsafe Collection<byte> OptionalItemCountReward => new Collection<byte>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, byte>)(&OptionalItemCountRewardCtor), 5);
public unsafe Collection<RowRef<Stain>> OptionalItemStainReward => new Collection<RowRef<Stain>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<Stain>>)(&OptionalItemStainRewardCtor), 5);
public unsafe Collection<RowRef<GeneralAction>> GeneralActionReward => new Collection<RowRef<GeneralAction>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<GeneralAction>>)(&GeneralActionRewardCtor), 2);
public RowRef<QuestRewardOther> OtherReward => new RowRef<QuestRewardOther>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2657), _003Cpage_003EP.Language);
public byte Tomestone => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2658);
public byte TomestoneReward => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2659);
public byte TomestoneCountReward => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2660);
public byte ReputationReward => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2661);
public bool Unknown0 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2662);
public bool Unknown1 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2663);
public bool Unknown2 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2664);
public bool Unknown3 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2665);
public bool Unknown4 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2666);
public bool Unknown5 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2667);
public bool Unknown6 => _003Cpage_003EP.ReadBool(_003Coffset_003EP + 2668);
public unsafe Collection<bool> OptionalItemIsHQReward => new Collection<bool>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, bool>)(&OptionalItemIsHQRewardCtor), 5);
public ReadOnlySeString Id => _003Cpage_003EP.ReadString(_003Coffset_003EP + 2676, _003Coffset_003EP);
public unsafe Collection<RowRef<QuestEx>> PreviousQuest => new Collection<RowRef<QuestEx>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<QuestEx>>)(&PreviousQuestCtor), 3);
public unsafe Collection<RowRef<QuestEx>> QuestLock => new Collection<RowRef<QuestEx>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<QuestEx>>)(&QuestLockCtor), 2);
public unsafe Collection<RowRef<InstanceContent>> InstanceContent => new Collection<RowRef<InstanceContent>>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, RowRef<InstanceContent>>)(&InstanceContentCtor), 3);
public RowRef IssuerStart
{
get
{
ExcelModule module = _003Cpage_003EP.Module;
uint rowId = _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2712);
global::_003C_003Ey__InlineArray2<Type> buffer = default(global::_003C_003Ey__InlineArray2<Type>);
global::_003CPrivateImplementationDetails_003E.InlineArrayElementRef<global::_003C_003Ey__InlineArray2<Type>, Type>(ref buffer, 0) = typeof(EObjName);
global::_003CPrivateImplementationDetails_003E.InlineArrayElementRef<global::_003C_003Ey__InlineArray2<Type>, Type>(ref buffer, 1) = typeof(ENpcResident);
return RowRef.GetFirstValidRowOrUntyped(module, rowId, global::_003CPrivateImplementationDetails_003E.InlineArrayAsReadOnlySpan<global::_003C_003Ey__InlineArray2<Type>, Type>(in buffer, 2), -965341264, _003Cpage_003EP.Language);
}
}
public RowRef<Level> IssuerLocation => new RowRef<Level>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2716), _003Cpage_003EP.Language);
public RowRef TargetEnd
{
get
{
ExcelModule module = _003Cpage_003EP.Module;
uint rowId = _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2720);
global::_003C_003Ey__InlineArray2<Type> buffer = default(global::_003C_003Ey__InlineArray2<Type>);
global::_003CPrivateImplementationDetails_003E.InlineArrayElementRef<global::_003C_003Ey__InlineArray2<Type>, Type>(ref buffer, 0) = typeof(EObjName);
global::_003CPrivateImplementationDetails_003E.InlineArrayElementRef<global::_003C_003Ey__InlineArray2<Type>, Type>(ref buffer, 1) = typeof(ENpcResident);
return RowRef.GetFirstValidRowOrUntyped(module, rowId, global::_003CPrivateImplementationDetails_003E.InlineArrayAsReadOnlySpan<global::_003C_003Ey__InlineArray2<Type>, Type>(in buffer, 2), -965341264, _003Cpage_003EP.Language);
}
}
public RowRef<JournalGenre> JournalGenre => new RowRef<JournalGenre>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2724), _003Cpage_003EP.Language);
public uint Icon => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2728);
public uint IconSpecial => _003Cpage_003EP.ReadUInt32(_003Coffset_003EP + 2732);
public RowRef<Mount> MountRequired => new RowRef<Mount>(_003Cpage_003EP.Module, (uint)_003Cpage_003EP.ReadInt32(_003Coffset_003EP + 2736), _003Cpage_003EP.Language);
public unsafe Collection<ushort> ClassJobLevel => new Collection<ushort>(_003Cpage_003EP, _003Coffset_003EP, _003Coffset_003EP, (delegate*<ExcelPage, uint, uint, uint, ushort>)(&ClassJobLevelCtor), 2);
public ushort Header => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2744);
public RowRef<Festival> Festival => new RowRef<Festival>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2746), _003Cpage_003EP.Language);
public ushort BellStart => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2748);
public ushort BellEnd => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2750);
public ushort BeastReputationValue => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2752);
public SubrowRef<Behavior> ClientBehavior => new SubrowRef<Behavior>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2754), _003Cpage_003EP.Language);
public SubrowRef<QuestClassJobSupply> QuestClassJobSupply => new SubrowRef<QuestClassJobSupply>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2756), _003Cpage_003EP.Language);
public RowRef<PlaceName> PlaceName => new RowRef<PlaceName>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2758), _003Cpage_003EP.Language);
public ushort SortKey => _003Cpage_003EP.ReadUInt16(_003Coffset_003EP + 2760);
public RowRef<ExVersion> Expansion => new RowRef<ExVersion>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2762), _003Cpage_003EP.Language);
public RowRef<ClassJobCategory> ClassJobCategory0 => new RowRef<ClassJobCategory>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2763), _003Cpage_003EP.Language);
public byte QuestLevelOffset => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2764);
public RowRef<ClassJobCategory> ClassJobCategory1 => new RowRef<ClassJobCategory>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2765), _003Cpage_003EP.Language);
public byte PreviousQuestJoin => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2766);
public byte Unknown7 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2767);
public byte QuestLockJoin => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2768);
public byte Unknown8 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2769);
public byte Unknown9 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2770);
public RowRef<ClassJob> ClassJobUnlock => new RowRef<ClassJob>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2771), _003Cpage_003EP.Language);
public RowRef<GrandCompany> GrandCompany => new RowRef<GrandCompany>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2772), _003Cpage_003EP.Language);
public RowRef<GrandCompanyRank> GrandCompanyRank => new RowRef<GrandCompanyRank>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2773), _003Cpage_003EP.Language);
public byte InstanceContentJoin => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2774);
public byte FestivalBegin => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2775);
public byte FestivalEnd => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2776);
public RowRef<BeastTribe> BeastTribe => new RowRef<BeastTribe>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2777), _003Cpage_003EP.Language);
public RowRef<BeastReputationRank> BeastReputationRank => new RowRef<BeastReputationRank>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2778), _003Cpage_003EP.Language);
public RowRef<SatisfactionNpc> SatisfactionNpc => new RowRef<SatisfactionNpc>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2779), _003Cpage_003EP.Language);
public byte SatisfactionLevel => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2780);
public RowRef<DeliveryQuest> DeliveryQuest => new RowRef<DeliveryQuest>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2781), _003Cpage_003EP.Language);
public byte RepeatIntervalType => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2782);
public RowRef<QuestRepeatFlag> QuestRepeatFlag => new RowRef<QuestRepeatFlag>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2783), _003Cpage_003EP.Language);
public byte Type => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2784);
public byte Unknown_70 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2785);
public byte LevelMax => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2786);
public RowRef<ClassJob> ClassJobRequired => new RowRef<ClassJob>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2787), _003Cpage_003EP.Language);
public RowRef<QuestRewardOther> QuestRewardOtherDisplay => new RowRef<QuestRewardOther>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2788), _003Cpage_003EP.Language);
public byte Unknown10 => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2789);
public RowRef<EventIconType> EventIconType => new RowRef<EventIconType>(_003Cpage_003EP.Module, _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2790), _003Cpage_003EP.Language);
public byte DailyQuestPool => _003Cpage_003EP.ReadUInt8(_003Coffset_003EP + 2791);
public bool IsHouseRequired => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 0);
public bool IsRepeatable => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 1);
public bool CanCancel => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 2);
public bool Introduction => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 3);
public bool HideOfferIcon => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 4);
public bool Unknown12 => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 5);
public bool Unknown13 => _003Cpage_003EP.ReadPackedBool(_003Coffset_003EP + 2792, 6);
public QuestEx(ExcelPage page, uint offset, uint row)
{
_003Cpage_003EP = page;
_003Coffset_003EP = offset;
_003Crow_003EP = row;
}
private static QuestParamsStruct QuestParamsCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new QuestParamsStruct(page, parentOffset, offset + 4 + i * 8);
}
private static QuestListenerParamsStruct QuestListenerParamsCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new QuestListenerParamsStruct(page, parentOffset, offset + 404 + i * 20);
}
private static TodoParamsStruct TodoParamsCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new TodoParamsStruct(page, parentOffset, offset + 1684 + i * 36);
}
private static RowRef RewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadUInt8(offset + 2630) switch
{
1 => RowRef.Create<Item>(page.Module, page.ReadUInt32(offset + 2560 + i * 4), page.Language),
3 => RowRef.Create<Item>(page.Module, page.ReadUInt32(offset + 2560 + i * 4), page.Language),
5 => RowRef.Create<Item>(page.Module, page.ReadUInt32(offset + 2560 + i * 4), page.Language),
6 => RowRef.CreateSubrow<QuestClassJobReward>(page.Module, page.ReadUInt32(offset + 2560 + i * 4), page.Language),
7 => RowRef.Create<BeastRankBonus>(page.Module, page.ReadUInt32(offset + 2560 + i * 4), page.Language),
_ => RowRef.CreateUntyped(page.ReadUInt32(offset + 2560 + i * 4), page.Language),
};
}
private static RowRef<Item> OptionalItemRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<Item>(page.Module, page.ReadUInt32(offset + 2588 + i * 4), page.Language);
}
private static ushort SystemRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadUInt16(offset + 2618 + i * 2);
}
private static RowRef<Item> ItemCatalystCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<Item>(page.Module, page.ReadUInt8(offset + 2624 + i), page.Language);
}
private static byte ItemCountCatalystCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadUInt8(offset + 2627 + i);
}
private static byte ItemCountRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadUInt8(offset + 2631 + i);
}
private static RowRef<Stain> RewardStainCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<Stain>(page.Module, page.ReadUInt8(offset + 2638 + i), page.Language);
}
private static byte OptionalItemCountRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadUInt8(offset + 2645 + i);
}
private static RowRef<Stain> OptionalItemStainRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<Stain>(page.Module, page.ReadUInt8(offset + 2650 + i), page.Language);
}
private static RowRef<GeneralAction> GeneralActionRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<GeneralAction>(page.Module, page.ReadUInt8(offset + 2655 + i), page.Language);
}
private static bool OptionalItemIsHQRewardCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadBool(offset + 2669 + i);
}
private static RowRef<QuestEx> PreviousQuestCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<QuestEx>(page.Module, page.ReadUInt32(offset + 2680 + i * 4), page.Language);
}
private static RowRef<QuestEx> QuestLockCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<QuestEx>(page.Module, page.ReadUInt32(offset + 2692 + i * 4), page.Language);
}
private static RowRef<InstanceContent> InstanceContentCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return new RowRef<InstanceContent>(page.Module, page.ReadUInt32(offset + 2700 + i * 4), page.Language);
}
private static ushort ClassJobLevelCtor(ExcelPage page, uint parentOffset, uint offset, uint i)
{
return page.ReadUInt16(offset + 2740 + i * 2);
}
static QuestEx IExcelRow<QuestEx>.Create(ExcelPage page, uint offset, uint row)
{
return new QuestEx(page, offset, row);
}
}

View file

@ -68,7 +68,7 @@ internal sealed class QuestInfo : IQuestInfo
public bool IsSeasonalQuest { get; internal set; } public bool IsSeasonalQuest { get; internal set; }
public QuestInfo(Lumina.Excel.Sheets.Quest quest, uint newGamePlusChapter, byte startingCity, JournalGenreOverrides journalGenreOverrides, bool isSeasonalEventQuest = false, DateTime? seasonalQuestExpiry = null) public QuestInfo(Lumina.Excel.Sheets.Quest ogquest, QuestEx quest, uint newGamePlusChapter, byte startingCity, JournalGenreOverrides journalGenreOverrides, bool isSeasonalEventQuest = false, DateTime? seasonalQuestExpiry = null)
{ {
QuestId = Questionable.Model.Questing.QuestId.FromRowId(quest.RowId); QuestId = Questionable.Model.Questing.QuestId.FromRowId(quest.RowId);
string value = QuestId.Value switch string value = QuestId.Value switch

View file

@ -53,7 +53,6 @@ internal sealed class ChangelogWindow : LWindow
DrawChangelogEntries(); DrawChangelogEntries();
ChangelogFooterComponent.Draw(delegate ChangelogFooterComponent.Draw(delegate
{ {
MarkAllAsRead();
base.IsOpen = false; base.IsOpen = false;
}); });
ImDrawListPtr windowDrawList = ImGui.GetWindowDrawList(); ImDrawListPtr windowDrawList = ImGui.GetWindowDrawList();
@ -71,6 +70,12 @@ internal sealed class ChangelogWindow : LWindow
_headerComponent.Reset(); _headerComponent.Reset();
} }
public override void OnClose()
{
base.OnClose();
MarkAllAsRead();
}
private void DrawChangelogEntries() private void DrawChangelogEntries()
{ {
_headerAnimationTime += ImGui.GetIO().DeltaTime; _headerAnimationTime += ImGui.GetIO().DeltaTime;