Skip to content

Commit

Permalink
api 11 update
Browse files Browse the repository at this point in the history
  • Loading branch information
0ceal0t committed Nov 22, 2024
1 parent 3612e05 commit 22d6eda
Show file tree
Hide file tree
Showing 60 changed files with 289 additions and 221 deletions.
2 changes: 1 addition & 1 deletion Penumbra.String
38 changes: 21 additions & 17 deletions VFXEditor/Data/Excel/CharaMakeCustomize.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,32 @@
using Lumina.Data;
using Lumina.Excel;
using Lobby = Lumina.Excel.GeneratedSheets.Lobby;
using Lumina.Excel.Sheets;
using VfxEditor.Utils;

namespace VfxEditor.Data.Excel {
// https://github.com/ktisis-tools/Ktisis/blob/748922b02395ef9a700e3fe446f2fa2d6db0a63f/Ktisis/Data/Excel/CharaMakeCustomize.cs

[Sheet( "CharaMakeCustomize" )]
public class CharaMakeCustomize : ExcelRow {
public byte FeatureId { get; private set; }
public uint Icon { get; private set; }
public ushort Data { get; private set; }
public bool IsPurchasable { get; private set; }
public LazyRow<Lobby> Hint { get; private set; } = null!;
public byte FaceType { get; private set; }
public struct CharaMakeCustomize( uint row ) : IExcelRow<CharaMakeCustomize> {
public readonly uint RowId => row;

public override void PopulateData( RowParser parser, Lumina.GameData gameData, Language language ) {
base.PopulateData( parser, gameData, language );
public string Name { get; set; } = "";

FeatureId = parser.ReadColumn<byte>( 0 );
Icon = parser.ReadColumn<uint>( 1 );
Data = parser.ReadColumn<ushort>( 2 );
IsPurchasable = parser.ReadColumn<bool>( 3 );
Hint = new LazyRow<Lobby>( gameData, parser.ReadColumn<uint>( 4 ), language );
FaceType = parser.ReadColumn<byte>( 6 );
public byte FeatureId { get; set; }
public uint Icon { get; set; }
public ushort Data { get; set; }
public bool IsPurchasable { get; set; }
public RowRef<Lobby> Hint { get; set; }
public byte FaceType { get; set; }

static CharaMakeCustomize IExcelRow<CharaMakeCustomize>.Create( ExcelPage page, uint offset, uint row ) {
return new CharaMakeCustomize( row ) {
FeatureId = page.ReadColumn<byte>( 0, offset ),
Icon = page.ReadColumn<uint>( 1, offset ),
Data = page.ReadColumn<ushort>( 2, offset ),
IsPurchasable = page.ReadColumn<bool>( 3, offset ),
Hint = page.ReadRowRef<Lobby>( 4, offset ),
FaceType = page.ReadColumn<byte>( 6, offset )
};
}
}
}
82 changes: 48 additions & 34 deletions VFXEditor/Data/Excel/CharaMakeType.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,7 @@
using Dalamud.Game.ClientState.Objects.Enums;
using Lumina.Data;
using Lumina.Excel;
using Lumina.Excel.GeneratedSheets;
using Lobby = Lumina.Excel.GeneratedSheets.Lobby;
using Lumina.Excel.Sheets;
using VfxEditor.Utils;

namespace VfxEditor.Data.Excel {
// https://github.com/ktisis-tools/Ktisis/blob/748922b02395ef9a700e3fe446f2fa2d6db0a63f/Ktisis/Data/Excel/CharaMakeType.cs
Expand All @@ -27,64 +26,79 @@ public struct Menu {
public uint[] Params;
public byte[] Graphics;

public LazyRow<CharaMakeCustomize>[] Features;
public RowRef<CharaMakeCustomize>[] Features;

public readonly bool HasIcon => Type == MenuType.Select;
public readonly bool IsFeature => HasIcon && Graphics[0] == 0;
}

[Sheet( "CharaMakeType" )]
public class CharaMakeType : ExcelRow {
private const int MENU_COUNT = 28;
private const int VOICE_COUNT = 12;
private const int GRAPHIC_COUNT = 10;
public struct CharaMakeType( uint row ) : IExcelRow<CharaMakeType> {
// Consts

public LazyRow<Race> Race { get; set; } = null!;
public LazyRow<Tribe> Tribe { get; set; } = null!;
public sbyte Gender { get; set; }
public const int MenuCt = 28;
public const int VoiceCt = 12;
public const int GraphicCt = 10;
public const int FacialFeaturesCt = 7 * 8;

public Menu[] Menus { get; set; } = new Menu[MENU_COUNT];
public byte[] Voices { get; set; } = new byte[VOICE_COUNT];
public int[] FacialFeatures { get; set; } = new int[7 * 8];
// Properties

public LazyRow<HairMakeType> FeatureMake { get; set; } = null!;
public readonly uint RowId => row;

public override void PopulateData( RowParser parser, Lumina.GameData gameData, Language language ) {
base.PopulateData( parser, gameData, language );
public RowRef<Race> Race { get; set; }
public RowRef<Tribe> Tribe { get; set; }
public sbyte Gender { get; set; }

Race = new LazyRow<Race>( gameData, parser.ReadColumn<int>( 0 ), language );
Tribe = new LazyRow<Tribe>( gameData, parser.ReadColumn<int>( 1 ), language );
Gender = parser.ReadColumn<sbyte>( 2 );
public Menu[] Menus { get; set; }
public byte[] Voices { get; set; }
public int[] FacialFeatures { get; set; }

FeatureMake = new LazyRow<HairMakeType>( gameData, RowId, language );
public RowRef<HairMakeType> FeatureMake { get; set; }

for( var i = 0; i < 7 * 8; i++ ) FacialFeatures[i] = parser.ReadColumn<int>( 3291 + i );
public static CharaMakeType Create( ExcelPage page, uint offset, uint row ) {
var features = new int[FacialFeaturesCt];
for( var i = 0; i < FacialFeaturesCt; i++ )
features[i] = page.ReadColumn<int>( 3291 + i, offset );

for( var i = 0; i < MENU_COUNT; i++ ) {
var ct = parser.ReadColumn<byte>( 3 + 3 * MENU_COUNT + i );
var menus = new Menu[MenuCt];
for( var i = 0; i < MenuCt; i++ ) {
var ct = page.ReadColumn<byte>( 3 + 3 * MenuCt + i, offset );
var lobby = page.ReadRowRef<Lobby>( 3 + i, offset );
var menu = new Menu() {
Name = new LazyRow<Lobby>( gameData, parser.ReadColumn<uint>( 3 + i ), language ).Value!.Text,
Default = parser.ReadColumn<byte>( 3 + 1 * MENU_COUNT + i ),
Type = ( MenuType )parser.ReadColumn<byte>( 3 + 2 * MENU_COUNT + i ),
Name = lobby.IsValid ? lobby.Value.Text.ExtractText() : string.Empty,
Default = page.ReadColumn<byte>( 3 + 1 * MenuCt + i, offset ),
Type = ( MenuType )page.ReadColumn<byte>( 3 + 2 * MenuCt + i, offset ),
Count = ct,
Index = ( CustomizeIndex )parser.ReadColumn<uint>( 3 + 6 * MENU_COUNT + i ),
Index = ( CustomizeIndex )page.ReadColumn<uint>( 3 + 6 * MenuCt + i, offset ),
Params = new uint[ct],
Graphics = new byte[GRAPHIC_COUNT]
Graphics = new byte[GraphicCt]
};

if( menu.HasIcon || menu.Type == MenuType.List ) {
for( var p = 0; p < ct; p++ ) menu.Params[p] = parser.ReadColumn<uint>( 3 + ( 7 + p ) * MENU_COUNT + i );
for( var g = 0; g < GRAPHIC_COUNT; g++ ) menu.Graphics[g] = parser.ReadColumn<byte>( 3 + ( 107 + g ) * MENU_COUNT + i );
for( var p = 0; p < ct; p++ )
menu.Params[p] = page.ReadColumn<uint>( 3 + ( 7 + p ) * MenuCt + i, offset );
for( var g = 0; g < GraphicCt; g++ )
menu.Graphics[g] = page.ReadColumn<byte>( 3 + ( 107 + g ) * MenuCt + i, offset );
}

if( menu.IsFeature ) {
var feats = new LazyRow<CharaMakeCustomize>[ct];
for( var x = 0; x < ct; x++ ) feats[x] = new LazyRow<CharaMakeCustomize>( gameData, menu.Params[x] );
var feats = new RowRef<CharaMakeCustomize>[ct];
for( var x = 0; x < ct; x++ )
feats[x] = new RowRef<CharaMakeCustomize>( page.Module, menu.Params[x], page.Language );
menu.Features = feats;
}

Menus[i] = menu;
menus[i] = menu;
}

return new CharaMakeType( row ) {
Race = page.ReadRowRef<Race>( 0, offset ),
Tribe = page.ReadRowRef<Tribe>( 1, offset ),
Gender = page.ReadColumn<sbyte>( 2, offset ),
FeatureMake = new RowRef<HairMakeType>( page.Module, row, page.Language ),
FacialFeatures = features,
Menus = menus
};
}
}
}
43 changes: 28 additions & 15 deletions VFXEditor/Data/Excel/HairMakeType.cs
Original file line number Diff line number Diff line change
@@ -1,27 +1,40 @@
using Lumina.Data;
using Lumina.Excel;
using System.Collections.Generic;
using System.Linq;
using VfxEditor.Utils;

namespace VfxEditor.Data.Excel {
[Sheet( "HairMakeType" )]
public class HairMakeType : ExcelRow {
private const uint HAIR_LENGTH = 100;
private const uint FACEPAINT_LENGTH = 50;
public struct HairMakeType( uint row ) : IExcelRow<HairMakeType> {
public readonly uint RowId => row;

public uint HairStartIndex { get; set; }
public uint FacepaintStartIndex { get; set; }
// Properties

public List<LazyRow<CharaMakeCustomize>> HairStyles { get; set; } = [];
public List<LazyRow<CharaMakeCustomize>> Facepaints { get; set; } = [];
public const uint HairLength = 100;
public const uint FacepaintLength = 50;

public override void PopulateData( RowParser parser, Lumina.GameData gameData, Language language ) {
base.PopulateData( parser, gameData, language );
public uint HairStartIndex { get; set; } // 66
public uint FacepaintStartIndex { get; set; } // 82

HairStartIndex = parser.ReadColumn<uint>( 66 );
FacepaintStartIndex = parser.ReadColumn<uint>( 82 );
public List<RowRef<CharaMakeCustomize>> HairStyles { get; set; }
public List<RowRef<CharaMakeCustomize>> Facepaints { get; set; }

for( var i = HairStartIndex; i < HairStartIndex + HAIR_LENGTH; i++ ) HairStyles.Add( new LazyRow<CharaMakeCustomize>( gameData, i, language ) );
for( var i = FacepaintStartIndex; i < FacepaintStartIndex + FACEPAINT_LENGTH; i++ ) Facepaints.Add( new LazyRow<CharaMakeCustomize>( gameData, i, language ) );
// Build sheet

static HairMakeType IExcelRow<HairMakeType>.Create( ExcelPage page, uint offset, uint row ) {
var hairStartIndex = page.ReadColumn<uint>( 66, offset );
var facePaintStartIndex = page.ReadColumn<uint>( 82, offset );
return new HairMakeType( row ) {
HairStartIndex = hairStartIndex,
FacepaintStartIndex = facePaintStartIndex,
HairStyles = GetRange( page, hairStartIndex, HairLength ).ToList(),
Facepaints = GetRange( page, facePaintStartIndex, FacepaintLength ).ToList()
};
}

private static IEnumerable<RowRef<CharaMakeCustomize>> GetRange( ExcelPage page, uint start, uint length ) {
for( var i = start; i < start + length; i++ )
yield return new RowRef<CharaMakeCustomize>( page.Module, i, page.Language );
}
}
}
}
2 changes: 1 addition & 1 deletion VFXEditor/Data/SheetData.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Lumina.Excel.GeneratedSheets;
using Lumina.Excel.Sheets;
using System;
using System.Collections.Generic;
using System.Numerics;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -89,8 +89,7 @@ public override string GetDefaultText() {
return $"Clip {ClipIdx.Value}";
}

if( EffectorIdx.IsAssigned() && EffectorSelect.Selected != null )
{
if( EffectorIdx.IsAssigned() && EffectorSelect.Selected != null ) {
return EffectorSelect.GetText();
}

Expand Down
4 changes: 2 additions & 2 deletions VFXEditor/Formats/MtrlFormat/MtrlManager.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using Dalamud.Interface.Textures;
using Dalamud.Interface.Textures.TextureWraps;
using Lumina.Excel.GeneratedSheets2;
using Lumina.Excel.Sheets;
using System;
using System.Collections.Generic;
using System.IO;
Expand Down Expand Up @@ -73,7 +73,7 @@ public MtrlManager() : base( "Mtrl Editor", "Mtrl" ) {
Templates = [.. templates];

// Dyes
foreach( var item in Dalamud.DataManager.GetExcelSheet<Stain>().Where( x => !string.IsNullOrEmpty( x.Name ) ) ) {
foreach( var item in Dalamud.DataManager.GetExcelSheet<Stain>().Where( x => !string.IsNullOrEmpty( x.Name.ExtractText() ) ) ) {
var bytes = BitConverter.GetBytes( item.Color );
LegacyStains.Add( new() {
Name = item.Name.ToString(),
Expand Down
14 changes: 7 additions & 7 deletions VFXEditor/Select/Tabs/Actions/ActionRow.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Lumina.Excel.GeneratedSheets2;
using Lumina.Excel.Sheets;
using VfxEditor.Select.Base;

namespace VfxEditor.Select.Tabs.Actions {
Expand All @@ -24,17 +24,17 @@ public ActionRow( Action action ) {
RowId = ( int )action.RowId;
Icon = action.Icon;

StartVfxPath = ToVfxPath( action.AnimationStart.Value?.VFX.Value?.Location.ToString() );
CastVfxPath = ToVfxPath( action.VFX.Value?.VFX.Value?.Location.ToString() );
StartVfxPath = ToVfxPath( action.AnimationStart.ValueNullable?.VFX.ValueNullable?.Location.ToString() );
CastVfxPath = ToVfxPath( action.VFX.ValueNullable?.VFX.ValueNullable?.Location.ToString() );

var start = action.AnimationStart.Value?.Name.Value;
var end = action.AnimationEnd.Value;
var hit = action.ActionTimelineHit.Value;
var start = action.AnimationStart.ValueNullable?.Name.ValueNullable;
var end = action.AnimationEnd.ValueNullable;
var hit = action.ActionTimelineHit.ValueNullable;

StartTmbPath = ToTmbPath( start?.Key.ToString() );
EndTmbPath = ToTmbPath( end?.Key.ToString() );
HitTmbPath = ToTmbPath( hit?.Key.ToString() );
WeaponTmbPath = ToTmbPath( action.AnimationEnd.Value?.WeaponTimeline.Value?.File.ToString() );
WeaponTmbPath = ToTmbPath( action.AnimationEnd.ValueNullable?.WeaponTimeline.ValueNullable?.File.ToString() );

StartMotion = start?.IsMotionCanceledByMoving ?? false;
EndMotion = end?.IsMotionCanceledByMoving ?? false;
Expand Down
12 changes: 6 additions & 6 deletions VFXEditor/Select/Tabs/Actions/ActionRowPap.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Lumina.Excel.GeneratedSheets;
using Lumina.Excel.Sheets;
using VfxEditor.Select.Base;

namespace VfxEditor.Select.Tabs.Actions {
Expand All @@ -16,9 +16,9 @@ public ActionRowPap( Action action ) {
RowId = ( int )action.RowId;
Icon = action.Icon;

StartPath = ToPap( action.AnimationStart.Value?.Name.Value );
EndPath = ToPap( action.AnimationEnd.Value );
HitPath = ToPap( action.ActionTimelineHit.Value );
StartPath = ToPap( action.AnimationStart.ValueNullable?.Name.ValueNullable );
EndPath = ToPap( action.AnimationEnd.ValueNullable );
HitPath = ToPap( action.ActionTimelineHit.ValueNullable );
}

// chara/human/c0101/animation/a0001/bt_common/ability/2bw_bard/abl001.pap
Expand All @@ -29,13 +29,13 @@ public ActionRowPap( Action action ) {
// chara/human/c0101/animation/a0001/bt_common/limitbreak/lbk_dancer_start.pap
// timline -> loadType = 1 (not in action.pap)

private static string ToPap( ActionTimeline timeline ) {
private static string ToPap( ActionTimeline? timeline ) {
if( timeline == null ) return "";
var key = timeline?.Key.ToString();
if( string.IsNullOrEmpty( key ) ) return "";
if( key.Contains( "[SKL_ID]" ) ) return "";

var loadType = timeline.LoadType;
var loadType = timeline?.LoadType;
if( loadType == 2 && key.StartsWith( "ws" ) ) {
// human_sp/c0501/human_sp103
// emote/b_pose01_loop
Expand Down
12 changes: 6 additions & 6 deletions VFXEditor/Select/Tabs/Actions/ActionRowVfx.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
using Lumina.Excel;
using Lumina.Excel.GeneratedSheets2;
using Lumina.Excel.Sheets;
using VfxEditor.Select.Base;

namespace VfxEditor.Select.Tabs.Actions {
Expand All @@ -14,19 +14,19 @@ public class ActionRowVfx : ISelectItemWithIcon {

public readonly ActionRowVfx HitAction;

public ActionRowVfx( string name, int rowId, ushort icon, LazyRow<ActionTimeline> timeline ) {
public ActionRowVfx( string name, int rowId, ushort icon, RowRef<ActionTimeline> timeline ) {
Name = name;
RowId = rowId;
Icon = icon;

TmbPath = ActionRow.ToTmbPath( timeline.Value?.Key.ToString() );
TmbPath = ActionRow.ToTmbPath( timeline.ValueNullable?.Key.ToString() );
}

public ActionRowVfx( Action action ) : this( action.Name.ToString(), ( int )action.RowId, action.Icon, action.AnimationEnd ) {
StartVfxPath = ActionRow.ToVfxPath( action.AnimationStart.Value?.VFX.Value?.Location );
CastVfxPath = ActionRow.ToVfxPath( action.VFX.Value?.VFX.Value?.Location );
StartVfxPath = ActionRow.ToVfxPath( action.AnimationStart.ValueNullable?.VFX.ValueNullable?.Location.ExtractText() );
CastVfxPath = ActionRow.ToVfxPath( action.VFX.ValueNullable?.VFX.ValueNullable?.Location.ExtractText() );

var hitKey = action.ActionTimelineHit?.Value?.Key.ToString();
var hitKey = action.ActionTimelineHit.ValueNullable?.Key.ToString();
if( string.IsNullOrEmpty( hitKey ) || hitKey.Contains( "normal_hit" ) ) return;
HitAction = new ActionRowVfx( $"{Name} (Target)", RowId, Icon, action.ActionTimelineHit );
}
Expand Down
4 changes: 2 additions & 2 deletions VFXEditor/Select/Tabs/Actions/ActionTabPap.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Lumina.Excel.GeneratedSheets;
using Lumina.Excel.Sheets;
using System.Collections.Generic;
using System.Linq;

Expand All @@ -12,7 +12,7 @@ public ActionTabPap( SelectDialog dialog, string name, string stateId ) : base(

public override void LoadData() {
var sheet = Dalamud.DataManager.GetExcelSheet<Action>()
.Where( x => !string.IsNullOrEmpty( x.Name ) && ( x.IsPlayerAction || x.ClassJob.Value != null ) && !x.AffectsPosition );
.Where( x => !string.IsNullOrEmpty( x.Name.ExtractText() ) && ( x.IsPlayerAction || x.ClassJob.ValueNullable != null ) && !x.AffectsPosition );
foreach( var item in sheet ) Items.Add( new ActionRowPap( item ) );
}

Expand Down
4 changes: 2 additions & 2 deletions VFXEditor/Select/Tabs/Actions/ActionTabPapNonPlayer.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
using Lumina.Excel.GeneratedSheets;
using Lumina.Excel.Sheets;
using System.Linq;

namespace VfxEditor.Select.Tabs.Actions {
Expand All @@ -7,7 +7,7 @@ public ActionTabPapNonPlayer( SelectDialog dialog, string name ) : base( dialog,

public override void LoadData() {
var sheet = Dalamud.DataManager.GetExcelSheet<Action>()
.Where( x => !string.IsNullOrEmpty( x.Name ) && !( x.IsPlayerAction || x.ClassJob.Value != null ) && !x.AffectsPosition );
.Where( x => !string.IsNullOrEmpty( x.Name.ExtractText() ) && !( x.IsPlayerAction || x.ClassJob.ValueNullable != null ) && !x.AffectsPosition );
foreach( var item in sheet ) Items.Add( new( item ) );
}
}
Expand Down
Loading

0 comments on commit 22d6eda

Please sign in to comment.