Compare commits

...

10 commits

Author SHA1 Message Date
github-actions[bot]
01c0cbf64d Update ClientStructs
Some checks are pending
Build Dalamud / Build on Windows (push) Waiting to run
Build Dalamud / Check API Compatibility (push) Blocked by required conditions
Build Dalamud / Deploy dalamud-distrib staging (push) Blocked by required conditions
2025-12-18 01:59:29 +00:00
goat
fb7cd452f6
Merge pull request #2513 from goatcorp/csupdate-master
Some checks are pending
Build Dalamud / Build on Windows (push) Waiting to run
Build Dalamud / Check API Compatibility (push) Blocked by required conditions
Build Dalamud / Deploy dalamud-distrib staging (push) Blocked by required conditions
Tag Build / Tag Build (push) Successful in 4s
[master] Update ClientStructs
2025-12-18 01:41:11 +01:00
goat
707369bfad
Merge pull request #2457 from goatcorp/schemaupdate-master
[master] Update Excel Schema
2025-12-18 01:30:26 +01:00
goat
25dba5e23b
ci: revert global concurrency change again because it breaks PR workflows
Need to figure out something better for this soon, but it's better not to have this at all right now
2025-12-18 01:29:48 +01:00
github-actions[bot]
05037dccc7 Update ClientStructs 2025-12-18 00:24:13 +00:00
github-actions[bot]
574e0d4582 Update Excel Schema
Some checks are pending
Build Dalamud / Build on Windows (push) Waiting to run
Build Dalamud / Check API Compatibility (push) Blocked by required conditions
Build Dalamud / Deploy dalamud-distrib staging (push) Blocked by required conditions
2025-12-18 00:24:11 +00:00
goat
02d4081f2f
ci: disable rollup for now 2025-12-18 01:24:09 +01:00
goat
355ad64eb9
Merge pull request #2508 from Haselnussbomber/excel-bump
Update Lumina and Lumina.Excel
2025-12-18 01:23:18 +01:00
goat
f1f95eda09
Merge pull request #2509 from goatcorp/csupdate-master
[master] Update ClientStructs
2025-12-18 01:21:18 +01:00
Haselnussbomber
841cdf52bd
Update Lumina and Lumina.Excel 2025-12-17 16:15:33 +01:00
8 changed files with 48 additions and 93 deletions

View file

@ -1,9 +1,8 @@
name: Build Dalamud
on: [push, pull_request, workflow_dispatch]
# Globally blocking because of git pushes in deploy step
concurrency:
group: build_dalamud_${{ github.repository_owner }}
group: build_dalamud_${{ github.ref_name }}
cancel-in-progress: false
jobs:

View file

@ -1,8 +1,8 @@
name: Rollup changes to next version
on:
push:
branches:
- master
# push:
# branches:
# - master
workflow_dispatch:
jobs:

View file

@ -3,9 +3,9 @@ using Lumina.Excel.Sheets;
namespace Dalamud.Game.UnlockState;
/// <summary>
/// Enum for <see cref="ItemAction.Type"/>.
/// Enum for <see cref="ItemAction.Action"/>.
/// </summary>
internal enum ItemActionType : ushort
internal enum ItemActionAction : ushort
{
/// <summary>
/// No item action.

View file

@ -158,67 +158,23 @@ internal unsafe class RecipeData : IInternalDisposableService
{
noteBookDivisionIndex++;
// For future Lumina.Excel update, replace with:
// if (!notebookDivisionRow.AllowedCraftTypes[craftType])
// continue;
switch (craftTypeRow.RowId)
{
case 0 when !noteBookDivisionRow.CRPCraft: continue;
case 1 when !noteBookDivisionRow.BSMCraft: continue;
case 2 when !noteBookDivisionRow.ARMCraft: continue;
case 3 when !noteBookDivisionRow.GSMCraft: continue;
case 4 when !noteBookDivisionRow.LTWCraft: continue;
case 5 when !noteBookDivisionRow.WVRCraft: continue;
case 6 when !noteBookDivisionRow.ALCCraft: continue;
case 7 when !noteBookDivisionRow.CULCraft: continue;
}
if (!noteBookDivisionRow.AllowedCraftTypes[craftType])
continue;
if (noteBookDivisionRow.GatheringOpeningLevel != byte.MaxValue)
continue;
// For future Lumina.Excel update, replace with:
// if (notebookDivisionRow.RequiresSecretRecipeBookGroupUnlock)
if (noteBookDivisionRow.Unknown1)
if (noteBookDivisionRow.RequiresSecretRecipeBookGroupUnlock)
{
var secretRecipeBookUnlocked = false;
// For future Lumina.Excel update, iterate over notebookDivisionRow.SecretRecipeBookGroups
for (var i = 0; i < 2; i++)
foreach (var secretRecipeBookGroup in noteBookDivisionRow.SecretRecipeBookGroups)
{
// For future Lumina.Excel update, replace with:
// if (secretRecipeBookGroup.RowId == 0 || !secretRecipeBookGroup.IsValid)
// continue;
var secretRecipeBookGroupRowId = i switch
{
0 => noteBookDivisionRow.Unknown2,
1 => noteBookDivisionRow.Unknown2,
_ => default,
};
if (secretRecipeBookGroupRowId == 0)
if (secretRecipeBookGroup.RowId == 0 || !secretRecipeBookGroup.IsValid)
continue;
if (!this.dataManager.GetExcelSheet<SecretRecipeBookGroup>().TryGetRow(secretRecipeBookGroupRowId, out var secretRecipeBookGroupRow))
continue;
// For future Lumina.Excel update, replace with:
// var bitIndex = secretRecipeBookGroup.Value.UnlockBitIndex[craftType];
var bitIndex = craftType switch
{
0 => secretRecipeBookGroupRow.Unknown0,
1 => secretRecipeBookGroupRow.Unknown1,
2 => secretRecipeBookGroupRow.Unknown2,
3 => secretRecipeBookGroupRow.Unknown3,
4 => secretRecipeBookGroupRow.Unknown4,
5 => secretRecipeBookGroupRow.Unknown5,
6 => secretRecipeBookGroupRow.Unknown6,
7 => secretRecipeBookGroupRow.Unknown7,
_ => default,
};
if (PlayerState.Instance()->UnlockedSecretRecipeBooksBitArray.Get(bitIndex))
var bitIndex = secretRecipeBookGroup.Value.SecretRecipeBook[craftType].RowId;
if (PlayerState.Instance()->UnlockedSecretRecipeBooksBitArray.Get((int)bitIndex))
{
secretRecipeBookUnlocked = true;
break;

View file

@ -209,7 +209,7 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
/// <inheritdoc/>
public bool IsEmjVoiceNpcUnlocked(EmjVoiceNpc row)
{
return this.IsUnlockLinkUnlocked(row.Unknown26);
return this.IsUnlockLinkUnlocked(row.UnlockLink);
}
/// <inheritdoc/>
@ -217,7 +217,7 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
{
return this.dataManager.GetExcelSheet<EmjVoiceNpc>().TryGetRow(row.RowId, out var emjVoiceNpcRow)
&& this.IsEmjVoiceNpcUnlocked(emjVoiceNpcRow)
&& QuestManager.IsQuestComplete(row.Unknown1);
&& QuestManager.IsQuestComplete(row.UnlockQuest.RowId);
}
/// <inheritdoc/>
@ -264,47 +264,47 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
// To avoid the ExdModule.GetItemRowById call, which can return null if the excel page
// is not loaded, we're going to imitate the IsItemActionUnlocked call first:
switch ((ItemActionType)row.ItemAction.Value.Type)
switch ((ItemActionAction)row.ItemAction.Value.Action.RowId)
{
case ItemActionType.Companion:
case ItemActionAction.Companion:
return UIState.Instance()->IsCompanionUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.BuddyEquip:
case ItemActionAction.BuddyEquip:
return UIState.Instance()->Buddy.CompanionInfo.IsBuddyEquipUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.Mount:
case ItemActionAction.Mount:
return PlayerState.Instance()->IsMountUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.SecretRecipeBook:
case ItemActionAction.SecretRecipeBook:
return PlayerState.Instance()->IsSecretRecipeBookUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.UnlockLink:
case ItemActionType.OccultRecords:
case ItemActionAction.UnlockLink:
case ItemActionAction.OccultRecords:
return UIState.Instance()->IsUnlockLinkUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.TripleTriadCard when row.AdditionalData.Is<TripleTriadCard>():
case ItemActionAction.TripleTriadCard when row.AdditionalData.Is<TripleTriadCard>():
return UIState.Instance()->IsTripleTriadCardUnlocked((ushort)row.AdditionalData.RowId);
case ItemActionType.FolkloreTome:
case ItemActionAction.FolkloreTome:
return PlayerState.Instance()->IsFolkloreBookUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.OrchestrionRoll when row.AdditionalData.Is<Orchestrion>():
case ItemActionAction.OrchestrionRoll when row.AdditionalData.Is<Orchestrion>():
return PlayerState.Instance()->IsOrchestrionRollUnlocked(row.AdditionalData.RowId);
case ItemActionType.FramersKit:
case ItemActionAction.FramersKit:
return PlayerState.Instance()->IsFramersKitUnlocked(row.AdditionalData.RowId);
case ItemActionType.Ornament:
case ItemActionAction.Ornament:
return PlayerState.Instance()->IsOrnamentUnlocked(row.ItemAction.Value.Data[0]);
case ItemActionType.Glasses:
case ItemActionAction.Glasses:
return PlayerState.Instance()->IsGlassesUnlocked((ushort)row.AdditionalData.RowId);
case ItemActionType.SoulShards when PublicContentOccultCrescent.GetState() is var occultCrescentState && occultCrescentState != null:
case ItemActionAction.SoulShards when PublicContentOccultCrescent.GetState() is var occultCrescentState && occultCrescentState != null:
var supportJobId = (byte)row.ItemAction.Value.Data[0];
return supportJobId < occultCrescentState->SupportJobLevels.Length && occultCrescentState->SupportJobLevels[supportJobId] != 0;
case ItemActionType.CompanySealVouchers:
case ItemActionAction.CompanySealVouchers:
return false;
}
@ -327,7 +327,7 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
/// <inheritdoc/>
public bool IsMKDLoreUnlocked(MKDLore row)
{
return this.IsUnlockLinkUnlocked(row.Unknown2);
return this.IsUnlockLinkUnlocked(row.UnlockLink);
}
/// <inheritdoc/>
@ -414,20 +414,20 @@ internal unsafe class UnlockState : IInternalDisposableService, IUnlockState
if (row.ItemAction.RowId == 0)
return false;
return (ItemActionType)row.ItemAction.Value.Type
is ItemActionType.Companion
or ItemActionType.BuddyEquip
or ItemActionType.Mount
or ItemActionType.SecretRecipeBook
or ItemActionType.UnlockLink
or ItemActionType.TripleTriadCard
or ItemActionType.FolkloreTome
or ItemActionType.OrchestrionRoll
or ItemActionType.FramersKit
or ItemActionType.Ornament
or ItemActionType.Glasses
or ItemActionType.OccultRecords
or ItemActionType.SoulShards;
return (ItemActionAction)row.ItemAction.Value.Action.RowId
is ItemActionAction.Companion
or ItemActionAction.BuddyEquip
or ItemActionAction.Mount
or ItemActionAction.SecretRecipeBook
or ItemActionAction.UnlockLink
or ItemActionAction.TripleTriadCard
or ItemActionAction.FolkloreTome
or ItemActionAction.OrchestrionRoll
or ItemActionAction.FramersKit
or ItemActionAction.Ornament
or ItemActionAction.Glasses
or ItemActionAction.OccultRecords
or ItemActionAction.SoulShards;
}
/// <inheritdoc/>

View file

@ -15,7 +15,7 @@
<PackageVersion Include="CheapLoc" Version="1.1.8" />
<PackageVersion Include="MinSharp" Version="1.0.4" />
<PackageVersion Include="Newtonsoft.Json" Version="13.0.4" />
<PackageVersion Include="Lumina" Version="6.5.1" />
<PackageVersion Include="Lumina" Version="7.1.0" />
<PackageVersion Include="Microsoft.Extensions.ObjectPool" Version="10.0.0" />
<PackageVersion Include="System.Reactive" Version="6.1.0" />
<PackageVersion Include="System.Reflection.MetadataLoadContext" Version="10.0.0" />

@ -1 +1 @@
Subproject commit 305c1629eed0b1cdca5efb102e37de93d592d155
Subproject commit 85e962dd959254c771bf9fa82832f4fbc7679a65

@ -1 +1 @@
Subproject commit 5d01489c34f33a3d645f49085d7fc0065a1ac801
Subproject commit c74841abce0830ead4437ed2f560bceb6235a538