Files
AetherBags/KamiToolKit/Nodes/Component/HoldButtonNode.cs
T
KnackAtNite 8db4ce6094
Debug Build and Test / Build against Latest Dalamud (push) Has been cancelled
Debug Build and Test / Build against Staging Dalamud (push) Has been cancelled
Initial commit: AetherBags + KamiToolKit for FC Gitea
Co-authored-by: Cursor <cursoragent@cursor.com>
2026-02-08 14:46:31 -05:00

271 lines
11 KiB
C#

using System;
using System.Numerics;
using FFXIVClientStructs.FFXIV.Component.GUI;
using KamiToolKit.Timelines;
using Lumina.Text.ReadOnly;
namespace KamiToolKit.Nodes;
public unsafe class HoldButtonNode : ComponentNode<AtkComponentHoldButton, AtkUldComponentDataHoldButton> {
public readonly NineGridNode BackgroundNode;
public readonly NineGridNode FrameNode;
public readonly HoldButtonProgressNode ProgressNode;
public readonly TextNode TextNode;
public HoldButtonNode() {
SetInternalComponentType(ComponentType.HoldButton);
BackgroundNode = new SimpleNineGridNode {
TexturePath = "ui/uld/LongPressButtonA.tex",
TextureCoordinates = new Vector2(0.0f, 0.0f),
TextureSize = new Vector2(100.0f, 36.0f),
Size = new Vector2(100.0f, 36.0f),
LeftOffset = 16,
RightOffset = 16,
};
BackgroundNode.AttachNode(this);
ProgressNode = new HoldButtonProgressNode {
Size = new Vector2(100.0f, 36.0f),
};
ProgressNode.AttachNode(this);
FrameNode = new SimpleNineGridNode {
TexturePath = "ui/uld/LongPressButtonA.tex",
TextureCoordinates = new Vector2(0.0f, 72.0f),
TextureSize = new Vector2(100.0f, 36.0f),
Size = new Vector2(100.0f, 36.0f),
};
FrameNode.AttachNode(this);
TextNode = new TextNode {
Position = new Vector2(16.0f, 8.0f),
Size = new Vector2(68.0f, 20.0f),
AlignmentType = AlignmentType.Center,
String = "OK",
};
TextNode.AttachNode(this);
Data->Nodes[0] = TextNode.NodeId;
Data->Nodes[1] = BackgroundNode.NodeId;
Data->Nodes[2] = ProgressNode.NodeId;
Data->Nodes[3] = ProgressNode.ImageNode.NodeId;
InitializeComponentEvents();
AddEvent(AtkEventType.ButtonClick, ClickHandler);
BuildTimelines();
}
public bool UnlockAfterClick { get; set; }
public Action? OnClick { get; set; }
public ReadOnlySeString String {
get => TextNode.String;
set => TextNode.String = value;
}
private void ClickHandler() {
OnClick?.Invoke();
if (UnlockAfterClick) {
Reset();
}
}
public void Reset() {
Component->IsTargetReached = false;
Component->IsEventFired = false;
Component->Progress.StartValue = 0;
Component->Progress.TargetValue = 0;
Component->Progress.CurrentValue = 0;
Component->Progress.EndValue = 0;
}
private void BuildTimelines() {
AddTimeline(new TimelineBuilder()
.BeginFrameSet(1, 20)
.AddLabel(1, 17, AtkTimelineJumpBehavior.Start, 0)
.AddLabel(10, 0, AtkTimelineJumpBehavior.PlayOnce, 0)
.AddLabel(11, 101, AtkTimelineJumpBehavior.Start, 0)
.AddLabel(20, 0, AtkTimelineJumpBehavior.PlayOnce, 0)
.EndFrameSet()
.Build()
);
BackgroundNode.AddTimeline(new TimelineBuilder()
.BeginFrameSet(1, 10)
.AddFrame(1, new Vector2(0, 0))
.AddFrame(1, alpha: 255)
.AddFrame(1, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(11, 17)
.AddFrame(11, new Vector2(0, 0))
.AddFrame(13, new Vector2(0, 0))
.AddFrame(11, alpha: 255)
.AddFrame(13, alpha: 255)
.AddFrame(11, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.AddFrame(13, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(18, 26)
.AddFrame(18, new Vector2(0, 1))
.AddFrame(18, alpha: 255)
.AddFrame(18, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(27, 36)
.AddFrame(27, new Vector2(0, 0))
.AddFrame(27, alpha: 178)
.AddFrame(27, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(50, 50, 50))
.EndFrameSet()
.BeginFrameSet(37, 46)
.AddFrame(37, new Vector2(0, 0))
.AddFrame(37, alpha: 255)
.AddFrame(37, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(47, 53)
.AddFrame(47, new Vector2(0, 0))
.AddFrame(53, new Vector2(0, 0))
.AddFrame(47, alpha: 255)
.AddFrame(53, alpha: 255)
.AddFrame(47, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100))
.AddFrame(53, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(54, 64)
.AddFrame(54, new Vector2(0, 0))
.AddFrame(54, alpha: 255)
.AddFrame(54, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(65, 71)
.AddFrame(65, new Vector2(0, 0))
.AddFrame(71, new Vector2(0, 0))
.AddFrame(65, alpha: 255)
.AddFrame(71, alpha: 255)
.AddFrame(65, addColor: new Vector3(16, 16, 16), multiplyColor: new Vector3(100, 100, 100))
.AddFrame(71, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.Build()
);
ProgressNode.AddTimeline(new TimelineBuilder()
.BeginFrameSet(1, 83)
.AddLabel(1, 29, AtkTimelineJumpBehavior.Start, 0)
.AddLabel(60, 30, AtkTimelineJumpBehavior.PlayOnce, 0)
.AddLabel(61, 31, AtkTimelineJumpBehavior.Start, 0)
.AddLabel(73, 32, AtkTimelineJumpBehavior.PlayOnce, 31)
.AddLabel(74, 33, AtkTimelineJumpBehavior.Start, 0)
.AddLabel(83, 0, AtkTimelineJumpBehavior.PlayOnce, 0)
.EndFrameSet()
.BeginFrameSet(18, 26)
.AddEmptyFrame(18)
.EndFrameSet()
.BeginFrameSet(37, 53)
.AddEmptyFrame(37)
.EndFrameSet()
.BeginFrameSet(54, 71)
.AddEmptyFrame(54)
.EndFrameSet()
.Build()
);
FrameNode.AddTimeline(new TimelineBuilder()
.BeginFrameSet(1, 10)
.AddFrame(1, new Vector2(0, 0))
.AddFrame(1, alpha: 255)
.AddFrame(1, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(11, 17)
.AddFrame(11, new Vector2(0, 0))
.AddFrame(13, new Vector2(0, 0))
.AddFrame(11, alpha: 255)
.AddFrame(13, alpha: 255)
.AddFrame(11, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.AddFrame(13, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(95, 95, 95))
.EndFrameSet()
.BeginFrameSet(18, 26)
.AddFrame(18, new Vector2(0, 0))
.AddFrame(18, alpha: 255)
.AddFrame(18, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(95, 95, 95))
.EndFrameSet()
.BeginFrameSet(27, 36)
.AddFrame(27, new Vector2(0, 0))
.AddFrame(27, alpha: 178)
.AddFrame(27, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(50, 50, 50))
.EndFrameSet()
.BeginFrameSet(37, 46)
.AddFrame(37, new Vector2(0, 0))
.AddFrame(37, alpha: 255)
.AddFrame(37, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(95, 95, 95))
.EndFrameSet()
.BeginFrameSet(47, 53)
.AddFrame(47, new Vector2(0, 0))
.AddFrame(53, new Vector2(0, 0))
.AddFrame(47, alpha: 255)
.AddFrame(53, alpha: 255)
.AddFrame(47, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(95, 95, 95))
.AddFrame(53, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(54, 64)
.AddFrame(54, new Vector2(0, 0))
.AddFrame(54, alpha: 255)
.AddFrame(54, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(95, 95, 95))
.EndFrameSet()
.BeginFrameSet(65, 71)
.AddFrame(65, new Vector2(0, 0))
.AddFrame(71, new Vector2(0, 0))
.AddFrame(65, alpha: 255)
.AddFrame(71, alpha: 255)
.AddFrame(65, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(95, 95, 95))
.AddFrame(71, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.Build()
);
TextNode.AddTimeline(new TimelineBuilder()
.BeginFrameSet(1, 10)
.AddFrame(1, new Vector2(16, 8))
.AddFrame(1, alpha: 255)
.AddFrame(1, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(11, 17)
.AddFrame(11, new Vector2(16, 8))
.AddFrame(11, alpha: 255)
.AddFrame(11, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(18, 26)
.AddFrame(18, new Vector2(16, 9))
.AddFrame(18, alpha: 255)
.AddFrame(18, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(27, 36)
.AddFrame(27, new Vector2(16, 8))
.AddFrame(27, alpha: 153)
.AddFrame(27, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(80, 80, 80))
.EndFrameSet()
.BeginFrameSet(37, 46)
.AddFrame(37, new Vector2(16, 8))
.AddFrame(37, alpha: 255)
.AddFrame(37, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(47, 53)
.AddFrame(47, new Vector2(16, 8))
.AddFrame(47, alpha: 255)
.AddFrame(47, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(54, 64)
.AddFrame(54, new Vector2(16, 8))
.AddFrame(54, alpha: 255)
.AddFrame(54, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.BeginFrameSet(65, 71)
.AddFrame(65, new Vector2(16, 8))
.AddFrame(65, alpha: 255)
.AddFrame(65, addColor: new Vector3(0, 0, 0), multiplyColor: new Vector3(100, 100, 100))
.EndFrameSet()
.Build()
);
}
}