From 788d534cc2315bcd183fbe0c1384a3c752c0a077 Mon Sep 17 00:00:00 2001
From: yo! <1125404308@qq.com>
Date: Tue, 15 Sep 2026 21:45:33 +0800
Subject: [PATCH] Add SimpleScript class with various methods
---
yoyokity/test.cs | 282 +++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 282 insertions(+)
create mode 100644 yoyokity/test.cs
diff --git a/yoyokity/test.cs b/yoyokity/test.cs
new file mode 100644
index 0000000..f873414
--- /dev/null
+++ b/yoyokity/test.cs
@@ -0,0 +1,282 @@
+using System;
+using System.Numerics;
+using System.Reflection.Metadata;
+using System.Threading.Tasks;
+using System.Windows.Forms;
+using Dalamud.Utility.Numerics;
+using FFXIVClientStructs.FFXIV.Client.Game.Character;
+using KodakkuAssist.Extensions;
+using KodakkuAssist.Module.Draw;
+using KodakkuAssist.Module.GameEvent;
+using KodakkuAssist.Module.GameEvent.Struct;
+using KodakkuAssist.Script;
+using static FFXIVClientStructs.FFXIV.Component.GUI.AtkTimer.Delegates;
+
+namespace MyScriptNamespace
+{
+ ///
+ /// name and version affect the script name and version number displayed in the user interface.
+ /// territorys specifies the regions where this trigger is effective. If left empty, it will be effective in all regions.
+ /// Classes with the same GUID will be considered the same trigger. Please ensure your GUID is unique and does not conflict with others.
+ ///
+ [ScriptType(name: "SimpleScript", territorys: [179, 979], guid: "d3b6a9b4-1e0e-4e0c-b7b7-ff1fce0e6cf1", version: "0.0.0.2", author: "yoyokity", note: noteStr, updateInfo: updateInfoStr)]
+ public class SimpleScript : IDisposable
+ {
+ const string noteStr =
+ """
+ 这是一个提示文本.
+ 他有多行显示.
+ 请在这里放置你的提示文本
+ """;
+ const string updateInfoStr =
+ """
+ 这里是更新信息.
+ 他有多行显示.
+ 请在这里放置你的更新信息
+ """;
+ ///
+ /// note will be displayed to the user as a tooltip.
+ ///
+ [UserSetting(note: "This is a test Property")]
+ public int prop1 { get; set; } = 1;
+ [UserSetting("Another Test Property")]
+ public bool prop2 { get; set; } = false;
+
+ [UserSetting("UserColorSetting")]
+ public ScriptColor color { get; set; } = new();
+
+ [UserSetting("EnumSetting")]
+ public TestEnum enumSetting { get; set; }
+ int n = 0;
+
+
+ public enum TestEnum
+ {
+ First,
+ Second
+ }
+ ///
+ /// This method is called at the start of each battle reset.
+ /// If this method is not defined, the program will execute an empty method.
+ ///
+ public void Init(ScriptAccessory accessory)
+ {
+ n = 0;
+ }
+
+ ///
+ /// name is the name of the method as presented to the user.
+ /// eventType is the type of event that triggers this method.
+ /// eventCondition is an array of strings specifying the properties that the event must have,
+ /// in the format name:value,For specific details, please refer to the GameEvent of the plugin.
+ /// userControl set to false will make the method not be shown to the user
+ /// and cannot be disabled by the user.
+ /// Please note, the method will be executed asynchronously.
+ ///
+ /// The event instance that triggers this method.
+ /// Pass the instances of methods and data that might be needed.
+ [ScriptMethod(name: "Test StartCasting", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:133"])]
+ public void PrintInfo(Event @event, ScriptAccessory accessory)
+ {
+ n++;
+ accessory.Method.SendChat($"/e {@event["SourceId"]} {n}-th use the Medica II");
+ accessory.Log.Debug($"Prop2 is {prop2}");
+ accessory.Log.Debug($"enum is {enumSetting}");
+ }
+
+ [ScriptMethod(eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:124"])]
+ public void DrawCircle(Event @event, ScriptAccessory accessory)
+ {
+ var sid = @event.SourceId;
+
+ var prop = accessory.Data.GetDefaultDrawProperties();
+ prop.Owner = accessory.Data.Me;
+ prop.DestoryAt = 10000;
+ prop.Color = accessory.Data.DefaultDangerColor;
+ prop.Scale = new(5);
+ prop.InnerScale = new(3);
+ var start = DateTime.Now;
+ var n = 0;
+ //accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Donut, prop);
+
+ accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Donut, prop, (dpc) =>
+ {
+ var elapsedSeconds = (float)(DateTime.Now - start).TotalSeconds;
+ float hue = (elapsedSeconds * 0.5f) % 1f;
+ dpc.Color = HueToRGB(hue);
+ if (elapsedSeconds > 2)
+ {
+ start = DateTime.Now;
+ n++;
+ dpc.Radian = MathF.PI / 4 * n;
+ }
+ dpc.Scale = new(3 + hue * 3);
+ });
+
+
+ }
+ [ScriptMethod(eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:999999"])]
+ public void TestTTS(Event @event, ScriptAccessory accessory)
+ {
+ accessory.Method.TTS($"黏黏{DateTime.Now:T}");
+
+ }
+
+ [ScriptMethod(name: "Test Suppress", eventType: EventTypeEnum.Waymark)]
+ public void TestSuppress(Event @event, ScriptAccessory accessory)
+ {
+ n++;
+ accessory.Log.Debug($"WayMark {n} {@event.EventTriggerSource}");
+ uint id = 0x40000001;
+ if (accessory.Data.EnmityList.TryGetValue(id, out var objs))
+ {
+ var firstId = objs[0];
+ }
+ }
+ [ScriptMethod(name: "Test Action", eventType: EventTypeEnum.Waymark)]
+ public void TestAction(Event @event, ScriptAccessory accessory)
+ {
+ accessory.Method.UseAction(accessory.Data.Me, 37010);
+ }
+ [ScriptMethod(name: "Test ActionLocation", eventType: EventTypeEnum.Waymark)]
+ public void TestActionLocation(Event @event, ScriptAccessory accessory)
+ {
+ //accessory.Method.UseActionLocation(new System.Numerics.Vector3(-750, -30, -560), 3569, 1);
+ }
+
+ [ScriptMethod(name: "Unconfigurable Method", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:124"], userControl: false)]
+ public void UnconfigurableMethod(Event @event, ScriptAccessory accessory)
+ {
+ accessory.Log.Debug($"The unconfigurable method has been triggered.");
+ }
+ string guid = "";
+ [ScriptMethod(eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:37010"])]
+ public void TestRunOnFrame(Event @event, ScriptAccessory accessory)
+ {
+ guid = accessory.Method.RegistFrameworkUpdateAction(() =>
+ {
+ var a = 123;
+ });
+
+ }
+ [ScriptMethod(eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:124"])]
+ public void TestRunOnFrame2(Event @event, ScriptAccessory accessory)
+ {
+ accessory.Method.RegistFrameworkUpdateAction(TestRunOnFrame22);
+ }
+ [ScriptMethod(eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:124"])]
+ public void TestFadeOut(Event @event, ScriptAccessory accessory)
+ {
+ var dp = accessory.Data.GetDefaultDrawProperties();
+ dp.Name = $"TestFadeOut";
+ dp.Scale = new(5);
+ dp.Color = accessory.Data.DefaultDangerColor;
+ dp.Owner = 0x400003B8;
+ dp.FadeCentreObject = 0x400003B8;
+ dp.FadeDistance = 5;
+ dp.FadeMode = FadeMode.OmenCentre;
+ dp.DestoryAt = 15000;
+ accessory.Method.SendDraw(DrawModeEnum.Vfx, DrawTypeEnum.Circle, dp);
+ }
+
+ [ScriptMethod(eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:99999"])]
+ public void TestCreateLockOn(Event @event, ScriptAccessory accessory)
+ {
+ var objHandle = accessory.Method.ObjectMethod.CreateEmptyChara(0x40001234);
+ Task.Delay(50).ContinueWith(t =>
+ {
+ var start = DateTime.Now;
+ var handle = accessory.Method.VfxMethod.CreateLockOn(1, 0x40001234, new Vector4(1, 0, 0, 1), 10000,
+ (ref Vector4 color, ref Vector4 pos, ref Vector3 scale) =>
+ {
+ var elapsedSeconds = (float)(DateTime.Now - start).TotalSeconds;
+ float hue = (elapsedSeconds * 0.5f) % 1f;
+ scale = new(hue * 1 + 0.5f);
+ color = HueToRGB(hue);
+ //pos = new(hue);
+ unsafe
+ {
+ var obj = (BattleChara*)objHandle;
+ obj->Position = new(hue);
+ }
+
+ });
+ });
+ Task.Delay(5000).ContinueWith(t => { accessory.Method.ObjectMethod.DestoryChara(objHandle); });
+
+
+
+ }
+
+ [ScriptMethod(eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:99999"])]
+ public void TestCreateOmen(Event @event, ScriptAccessory accessory)
+ {
+ var start = DateTime.Now;
+ var pos = accessory.Data.MyObject.Position;
+ var handle = accessory.Method.VfxMethod.CreateOmen(3, new(3), accessory.Data.MyObject.Position, 0, new Vector4(1, 0, 0, 1), 10000,
+ (ref Vector4 color, ref Vector4 pos, ref Vector3 scale) =>
+ {
+ var elapsedSeconds = (float)(DateTime.Now - start).TotalSeconds;
+ float hue = (elapsedSeconds * 0.5f) % 1f;
+ color = HueToRGB(hue);//算一个rgb跑马灯颜色并赋值给颜色
+ pos = new(accessory.Data.MyObject.Position, pos.W + MathF.PI / 100);//追踪游戏人物的坐标
+ scale = new(2 + hue * 3);//随时间大小变化
+ });
+ }
+ [ScriptMethod(eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:99999"])]
+ public void TestMark(Event @event, ScriptAccessory accessory)
+ {
+ accessory.Method.Mark(accessory.Data.Me, KodakkuAssist.Module.GameOperate.MarkType.Attack1);
+ accessory.Method.Mark((uint)accessory.Data.MyObject.TargetObjectId, KodakkuAssist.Module.GameOperate.MarkType.Attack2, true);
+ }
+ [ScriptMethod(eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:99999"])]
+ public void TestClearMark(Event @event, ScriptAccessory accessory)
+ {
+ accessory.Method.MarkClear();
+ }
+ System.Threading.Timer t;
+ [ScriptMethod(eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:99999"])]
+ public void TestVarDestory(Event @event, ScriptAccessory accessory)
+ {
+ t = new(_ =>
+ {
+ accessory.Log.Debug($"来自版本F的timer,每5秒钟提示一次");
+
+
+ }, null, TimeSpan.Zero, TimeSpan.FromSeconds(5));
+ }
+ public void TestRunOnFrame22()
+ {
+ var a = 111;
+ }
+ private static Vector4 HueToRGB(float hue)
+ {
+ float r = 0, g = 0, b = 0;
+ float h = hue * 6f;
+ int segment = (int)h;
+ float f = h - segment;
+
+ float p = 0f;
+ float q = 0.5f * (1f - f);
+ float t = 0.5f * f;
+
+ switch (segment)
+ {
+ case 0: r = 1; g = t; b = p; break;
+ case 1: r = q; g = 1; b = p; break;
+ case 2: r = p; g = 1; b = t; break;
+ case 3: r = p; g = q; b = 1; break;
+ case 4: r = t; g = p; b = 1; break;
+ case 5: r = 1; g = p; b = q; break;
+ }
+
+ return new Vector4(r, g, b, 1f);
+ }
+
+ public void Dispose()
+ {
+ t.Dispose();
+ }
+ }
+}
+