From df32dfc1f1b6f1e8bb9adc592f45b801bfe92787 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=8D=97=E6=B2=A2=E5=93=8D=E4=B9=9F?= <72963826+Hibiya615@users.noreply.github.com> Date: Thu, 22 May 2025 00:35:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=B8=BB=E9=9A=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Dungeon/MainScenario_Roulette.cs | 426 ++++++++++++++++++ 1 file changed, 426 insertions(+) create mode 100644 02-A-Realm-Reborn/Dungeon/MainScenario_Roulette.cs diff --git a/02-A-Realm-Reborn/Dungeon/MainScenario_Roulette.cs b/02-A-Realm-Reborn/Dungeon/MainScenario_Roulette.cs new file mode 100644 index 0000000..5fae608 --- /dev/null +++ b/02-A-Realm-Reborn/Dungeon/MainScenario_Roulette.cs @@ -0,0 +1,426 @@ +using System; +using System.ComponentModel; +using System.Linq; +using System.Numerics; +using System.Collections.Generic; +// using Dalamud.Game.ClientState.Objects.Subkinds; +// using Dalamud.Game.ClientState.Objects.Types; +using Newtonsoft.Json; +using Dalamud.Utility.Numerics; +using KodakkuAssist.Script; +using KodakkuAssist.Module.GameEvent; +using KodakkuAssist.Module.Draw; +using KodakkuAssist.Data; +using KodakkuAssist.Extensions; +using ECommons; +using ECommons.DalamudServices; +using ECommons.GameFunctions; +using ECommons.MathHelpers; +using System.Threading.Tasks; + +namespace MainScenario_Roulette; + +[ScriptType(guid: "84c15eea-2a19-4477-ad21-cd43d1263cfa", name: "随机任务:主线任务", territorys: [1043, 1044, 1048], + version: "0.0.0.1", author: "Tetora", note: noteStr)] + +public class MainScenario_Roulette +{ + const string noteStr = + """ + v0.0.0.1: + LV50 随机任务:主线任务 初版绘制 + 选项中的DR辅助需要你正确安装Daily Routines插件才可使用 + """; + + [UserSetting("TTS开关(TTS请二选一开启)")] + public bool isTTS { get; set; } = false; + + [UserSetting("EdgeTTS开关(TTS请二选一开启)")] + public bool isEdgeTTS { get; set; } = true; + + [UserSetting("弹窗文本提示开关")] + public bool isText { get; set; } = true; + + [UserSetting("DR 动画城上机甲自动使用魔导加农炮")] + public bool isDRHelper { get; set; } = true; + + [ScriptMethod(name: "DR 动画城上机甲自动使用魔导加农炮", eventType: EventTypeEnum.ChangeMap, eventCondition: ["MapId:100"])] + public void AutoUse(Event @event, ScriptAccessory accessory) + { + if (isDRHelper) accessory.Method.SendChat("/pdr load ThePraetoriumHelper"); + } + + #region 神兵要塞帝国南方堡 + + [ScriptMethod(name: "————神兵要塞帝国南方堡————", eventType: EventTypeEnum.Tether, eventCondition: ["ActionId:"])] + public void 神兵要塞帝国南方堡(Event @event, ScriptAccessory accessory) { } + + [ScriptMethod(name: "BOSS1_魔导死神改 高功率魔导激光(直线)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28773"])] + public void 高功率魔导激光(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "高功率魔导激光"; + dp.Scale = new (4, 60f); + dp.Owner = @event.SourceId(); + dp.Color = accessory.Data.DefaultDangerColor; + dp.DestoryAt = 4700; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp); + } + + [ScriptMethod(name: "BOSS1_魔导死神改 请求轰炸(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29268"])] + public void 请求轰炸(Event @event, ScriptAccessory accessory) + { + if (isText)accessory.Method.TextInfo("AOE", duration: 2000, false); + if (isTTS)accessory.Method.TTS("AOE"); + if (isEdgeTTS)accessory.Method.EdgeTTS("AOE"); + } + + [ScriptMethod(name: "BOSS2_魔导先锋强袭型 气化炸弹(陨石)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28779"])] + public void 气化炸弹(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "气化炸弹"; + dp.Color = accessory.Data.DefaultDangerColor.WithW(0.6f); + dp.Owner = @event.SourceId(); + dp.Scale = new Vector2(20f); + dp.DestoryAt = 6700; + dp.ScaleMode = ScaleMode.ByTime; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "BOSS3_莉维亚 魔导离子(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28033"])] + public void 魔导离子(Event @event, ScriptAccessory accessory) + { + if (isText)accessory.Method.TextInfo("AOE", duration: 4000, false); + if (isTTS)accessory.Method.TTS("AOE"); + if (isEdgeTTS)accessory.Method.EdgeTTS("AOE"); + } + + /* 太丑了算了 + [ScriptMethod(name: "BOSS3_莉维亚 枪击(圆形)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28794"])] + public void 枪击(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "枪击"; + dp.Color = new Vector4(1f, 0f, 0f, 1f); + dp.Owner = @event.SourceId(); + dp.Scale = new Vector2(8f); + dp.Delay = 5400; + dp.DestoryAt = 1500; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "BOSS3_莉维亚 无限刃(直线)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28793"])] + public void 无限刃(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "无限刃"; + dp.Scale = new (4, 40f); + dp.Owner = @event.SourceId(); + dp.Color = new Vector4(1f, 0f, 0f, 1f); + dp.Delay = 5400; + dp.DestoryAt = 1500; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp); + } + */ + + #endregion + + #region 最终决战天幕魔导城 + + [ScriptMethod(name: "————最终决战天幕魔导城————", eventType: EventTypeEnum.Tether, eventCondition: ["ActionId:"])] + public void 最终决战天幕魔导城(Event @event, ScriptAccessory accessory) { } + + [ScriptMethod(name: "路中_轰炸 & 魔导加农炮(圆形)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^29(180|049)$"])] + public void 魔导加农炮(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = $"魔导加农炮{@event.SourceId()}"; + dp.Color = accessory.Data.DefaultDangerColor.WithW(0.8f); + dp.Position = @event.EffectPosition(); + dp.Scale = new Vector2(6f); + dp.DestoryAt = 2700; + dp.ScaleMode = ScaleMode.ByTime; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "魔导加农炮 打断销毁", eventType: EventTypeEnum.CancelAction, eventCondition: ["ActionId:29180"], userControl: false)] + public void 寒冰雷电咆哮销毁(Event @event, ScriptAccessory accessory) + { + accessory.Method.RemoveDraw($"魔导加农炮{@event.SourceId()}"); + } + + [ScriptMethod(name: "BOSS1_魔导巨兵二型 青磷放射(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28474"])] + public void 青磷放射(Event @event, ScriptAccessory accessory) + { + if (isText)accessory.Method.TextInfo("AOE", duration: 4000, false); + if (isTTS)accessory.Method.TTS("AOE"); + if (isEdgeTTS)accessory.Method.EdgeTTS("AOE"); + } + + [ScriptMethod(name: "BOSS2_尼禄 过载震碎(分摊)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28477"])] + public void 过载震碎(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "过载震碎"; + dp.Color = accessory.Data.DefaultSafeColor; + dp.Owner = @event.TargetId; + dp.Scale = new Vector2(6f); + dp.DestoryAt = 5000; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "BOSS3_盖乌斯 恐怖战争(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28495"])] + public void 恐怖战争(Event @event, ScriptAccessory accessory) + { + if (isText)accessory.Method.TextInfo("AOE", duration: 4000, false); + if (isTTS)accessory.Method.TTS("AOE"); + if (isEdgeTTS)accessory.Method.EdgeTTS("AOE"); + } + + [ScriptMethod(name: "BOSS3_盖乌斯 恩惠终结(直线)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^2848[78]$"])] + public void 恩惠终结(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "恩惠终结"; + dp.Scale = new (4, 40f); + dp.Owner = @event.SourceId(); + dp.Color = accessory.Data.DefaultDangerColor; + dp.DestoryAt = 2700; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp); + } + + [ScriptMethod(name: "BOSS3_盖乌斯 从容不迫(分摊)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:28493"])] + public void 从容不迫(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "从容不迫"; + dp.Color = accessory.Data.DefaultSafeColor; + dp.Owner = @event.TargetId; + dp.Scale = new Vector2(6f); + dp.DestoryAt = 5000; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "BOSS3_盖乌斯 指引(圆形)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29052"])] + public void 指引(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "指引"; + dp.Color = accessory.Data.DefaultDangerColor; + dp.Owner = @event.SourceId(); + dp.Scale = new Vector2(8f); + dp.Delay = 2700; + dp.DestoryAt = 2000; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + #endregion + + #region 究极神兵破坏作战 + + [ScriptMethod(name: "————究极神兵破坏作战————", eventType: EventTypeEnum.Tether, eventCondition: ["ActionId:"])] + public void 究极神兵破坏作战(Event @event, ScriptAccessory accessory) { } + + [ScriptMethod(name: "魔导核爆(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29022"])] + public void 魔导核爆(Event @event, ScriptAccessory accessory) + { + if (isText)accessory.Method.TextInfo("AOE", duration: 4000, false); + if (isTTS)accessory.Method.TTS("AOE"); + if (isEdgeTTS)accessory.Method.EdgeTTS("AOE"); + } + + [ScriptMethod(name: "攻城炮(直线)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29020"])] + public void 攻城炮(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "攻城炮"; + dp.Scale = new (12, 40f); + dp.Owner = @event.SourceId(); + dp.Color = accessory.Data.DefaultDangerColor; + dp.DestoryAt = 4700; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp); + } + + [ScriptMethod(name: "魔导激光(直线)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^(2900[89]|29010)$"])] + public void 魔导激光(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "魔导激光"; + dp.Scale = new (6, 40f); + dp.Owner = @event.SourceId(); + dp.Color = accessory.Data.DefaultDangerColor; + switch (@event.ActionId()) + { + case 29010: // 左 + dp.Rotation = 45f.DegToRad(); + break; + case 29008: // 中 + dp.Rotation = 0f.DegToRad(); + break; + case 29009: // 右 + dp.Rotation = 315f.DegToRad(); + break; + } + dp.DestoryAt = 1900; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp); + } + + [ScriptMethod(name: "以太波动(中间击退)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29015"])] + public void 以太波动(Event @event, ScriptAccessory accessory) + { + if (isText)accessory.Method.TextInfo("中间击退 + 撞球", duration: 3000, false); + if (isTTS)accessory.Method.TTS("中间击退"); + if (isEdgeTTS)accessory.Method.EdgeTTS("中间击退"); + } + + [ScriptMethod(name: "集束激光(分摊)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29014"])] + public void 集束激光(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = "集束激光"; + dp.Color = accessory.Data.DefaultSafeColor; + dp.Owner = @event.TargetId; + dp.Scale = new Vector2(6f); + dp.DestoryAt = 5000; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + /* + [ScriptMethod(name: "以太爆雷(撞球)", eventType: EventTypeEnum.AddCombatant, eventCondition: ["DataId:14594"])] + public void 以太爆雷(Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + dp.Name = $"以太爆雷{@event.SourceId()}"; + dp.Color = accessory.Data.DefaultDangerColor.WithW(0.8f); + dp.Owner = @event.SourceId(); + dp.Scale = new Vector2(8f); + dp.DestoryAt = 10000; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "以太爆雷销毁", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:29016"], userControl: false)] + public void 以太爆雷销毁(Event @event, ScriptAccessory accessory) + { + accessory.Method.RemoveDraw($"以太爆雷{@event.SourceId()}"); + } + */ + + #endregion + + +} + +public static class EventExtensions +{ + private static bool ParseHexId(string? idStr, out uint id) + { + id = 0; + if (string.IsNullOrEmpty(idStr)) return false; + try + { + var idStr2 = idStr.Replace("0x", ""); + id = uint.Parse(idStr2, System.Globalization.NumberStyles.HexNumber); + return true; + } + catch (Exception) + { + return false; + } + } + + public static uint ActionId(this Event @event) + { + return JsonConvert.DeserializeObject(@event["ActionId"]); + } + + public static uint SourceId(this Event @event) + { + return ParseHexId(@event["SourceId"], out var id) ? id : 0; + } + + public static uint SourceDataId(this Event @event) + { + return JsonConvert.DeserializeObject(@event["SourceDataId"]); + } + + public static uint Command(this Event @event) + { + return ParseHexId(@event["Command"], out var cid) ? cid : 0; + } + + public static uint DurationMilliseconds(this Event @event) + { + return JsonConvert.DeserializeObject(@event["DurationMilliseconds"]); + } + + public static float SourceRotation(this Event @event) + { + return JsonConvert.DeserializeObject(@event["SourceRotation"]); + } + + public static float TargetRotation(this Event @event) + { + return JsonConvert.DeserializeObject(@event["TargetRotation"]); + } + + public static byte Index(this Event @event) + { + return (byte)(ParseHexId(@event["Index"], out var index) ? index : 0); + } + + public static uint State(this Event @event) + { + return ParseHexId(@event["State"], out var state) ? state : 0; + } + + public static string SourceName(this Event @event) + { + return @event["SourceName"]; + } + + public static string TargetName(this Event @event) + { + return @event["TargetName"]; + } + + public static uint TargetId(this Event @event) + { + return ParseHexId(@event["TargetId"], out var id) ? id : 0; + } + + public static Vector3 SourcePosition(this Event @event) + { + return JsonConvert.DeserializeObject(@event["SourcePosition"]); + } + + public static Vector3 TargetPosition(this Event @event) + { + return JsonConvert.DeserializeObject(@event["TargetPosition"]); + } + + public static Vector3 EffectPosition(this Event @event) + { + return JsonConvert.DeserializeObject(@event["EffectPosition"]); + } + + public static uint DirectorId(this Event @event) + { + return ParseHexId(@event["DirectorId"], out var id) ? id : 0; + } + + public static uint StatusId(this Event @event) + { + return JsonConvert.DeserializeObject(@event["StatusId"]); + } + + public static uint StackCount(this Event @event) + { + return JsonConvert.DeserializeObject(@event["StackCount"]); + } + + public static uint Param(this Event @event) + { + return JsonConvert.DeserializeObject(@event["Param"]); + } +} \ No newline at end of file