From 8251a7d3f4808baf6d6f0c56860d964a992c8469 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: Sat, 16 May 2026 01:53:52 +0800 Subject: [PATCH] =?UTF-8?q?=E7=89=88=E6=9C=AC=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- OnlineRepo.json | 6 +-- PVP/PVPAction.cs | 99 ++++++++++++++++++++++++++++++++++++++++++++++-- PVP/PVPToy.cs | 22 +++++++++-- 3 files changed, 118 insertions(+), 9 deletions(-) diff --git a/OnlineRepo.json b/OnlineRepo.json index dc25f2c..6932beb 100644 --- a/OnlineRepo.json +++ b/OnlineRepo.json @@ -957,12 +957,12 @@ { "Name": "PVP技能绘制", "Guid": "070e161a-26e9-4a57-8b19-da8c4201058c", - "Version": "0.0.0.6", + "Version": "0.0.0.7", "Author": "Tetora", "Repo": "https://github.com/Hibiya615/TetoraKAScript/tree/main", "DownloadUrl": "https://raw.githubusercontent.com/Hibiya615/TetoraKAScript/refs/heads/main/PVP/PVPAction.cs", - "Note": "v0.0.0.6:\r\nPVP技能绘制,全部地图可用,未做任何区域限制。\r\n推荐先自己过一遍设置把不需要的关闭\r\n改完用户设置的数值记得点保存!保存!\r\n【仅适用敌方目标标记】是用于四小的,因为一般都会给四小标头标x", - "UpdateInfo": "API15", + "Note": "v0.0.0.7:\r\nPVP技能绘制,全部地图可用,未做任何区域限制。\r\n推荐先自己过一遍设置把不需要的关闭\r\n改完用户设置的数值记得点保存!保存!\r\n【仅适用敌方目标标记】是用于四小的,因为一般都会给四小标头标x", + "UpdateInfo": "追加舞者镰刀LB范围预测", "TerritoryIds": [] }, { diff --git a/PVP/PVPAction.cs b/PVP/PVPAction.cs index 4448c96..c214e29 100644 --- a/PVP/PVPAction.cs +++ b/PVP/PVPAction.cs @@ -22,17 +22,18 @@ using FFXIVClientStructs.FFXIV.Client.Game.UI; namespace PVPAction; [ScriptType(guid: "070e161a-26e9-4a57-8b19-da8c4201058c", name: "PVP技能绘制", territorys: [], - version: "0.0.0.6", author: "Tetora", note: noteStr)] + version: "0.0.0.7", author: "Tetora", note: noteStr)] public class PVPTAction { const string noteStr = """ - v0.0.0.6: + v0.0.0.7: PVP技能绘制,全部地图可用,未做任何区域限制。 推荐先自己过一遍设置把不需要的关闭 改完用户设置的数值记得点保存!保存! 【仅适用敌方目标标记】是用于四小的,因为一般都会给四小标头标x + 【瞬发技能范围预测】需要手动使用宏触发 """; #region 基础控制 @@ -50,11 +51,20 @@ public class PVPTAction public bool isOnlyMark { get; set; } = false; [UserSetting("自身部分技能颜色(如圣盾阵)")] - public ScriptColor SelfAOEColor { get; set; } = new() { V4 = new(0f, 1f, 1f, 1f) }; + public ScriptColor SelfAOEColor { get; set; } = new() { V4 = new(1f, 0f, 1f, 1f) }; [UserSetting("自身部分技能填充亮度(推荐小于1)")] public float SelfAOEFillBrightness { get; set; } = 0.4f; + [UserSetting("自身控制技能预测颜色(如行列舞)")] + public ScriptColor SelfCompulsoryControlColor { get; set; } = new() { V4 = new(1f, 0f, 0f, 10f) }; + + [UserSetting("自身控制技能预测填充亮度(推荐小于1)")] + public float SelfCompulsoryControlFillBrightness { get; set; } = 0f; + + [UserSetting("自身控制技能预测显示时间(ms)")] + public int MoveActionsTime { get; set; } = 10000; + [UserSetting("敌方部分技能颜色(如占星、诗人LB)")] public ScriptColor EnmityAOEColor { get; set; } = new() { V4 = new(1f, 0f, 1f, 1f) }; @@ -674,6 +684,89 @@ public class PVPTAction #endregion + #region 舞者 + + [ScriptMethod(name: "———————— 舞者 ————————", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:"])] + public void 舞者 (Event @event, ScriptAccessory accessory) { } + + [ScriptMethod(name: "行列舞预测描边 [ 触发宏: /e 15mCompulsoryControl ]", eventType: EventTypeEnum.Chat, eventCondition: ["Type:Echo", "Message:regex:^15mCompulsoryControl$"])] + public void 行列舞预测描边 (Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + + dp.Name = "行列舞预测描边"; + dp.Scale = new Vector2(15f); + dp.InnerScale = new Vector2(14.9f); + dp.Owner = accessory.Data.Me; + dp.Color = SelfCompulsoryControlColor.V4.WithW(10f); + dp.Radian = float.Pi * 2; + dp.DestoryAt = MoveActionsTime; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Donut, dp); + } + + [ScriptMethod(name: "行列舞预测填充 [ 填充亮度在用户设置 ]", eventType: EventTypeEnum.Chat, eventCondition: ["Type:Echo", "Message:regex:^15mCompulsoryControl$"])] + public void 行列舞预测填充 (Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + + dp.Name = "行列舞预测填充"; + dp.Scale = new Vector2(15f); + dp.Owner = accessory.Data.Me; + dp.Color = SelfCompulsoryControlColor.V4.WithW(SelfCompulsoryControlFillBrightness); + dp.DestoryAt = MoveActionsTime; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "行列舞触发销毁", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:regex:^29432$"],userControl: false)] + public void 行列舞销毁(Event @event, ScriptAccessory accessory) + { + if (@event.TargetId() != accessory.Data.Me) return; + accessory.Method.RemoveDraw($"行列舞预测.*"); + } + + #endregion + + #region 镰刀 + + [ScriptMethod(name: "———————— 镰刀 ————————", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:"])] + public void 镰刀 (Event @event, ScriptAccessory accessory) { } + + [ScriptMethod(name: "暗夜游魂预测描边 [ 触发宏: /e 10mCompulsoryControl ]", eventType: EventTypeEnum.Chat, eventCondition: ["Type:Echo", "Message:regex:^10mCompulsoryControl$"])] + public void 暗夜游魂预测描边 (Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + + dp.Name = "暗夜游魂预测描边"; + dp.Scale = new Vector2(10f); + dp.InnerScale = new Vector2(9.94f); + dp.Owner = accessory.Data.Me; + dp.Color = SelfCompulsoryControlColor.V4.WithW(10f); + dp.Radian = float.Pi * 2; + dp.DestoryAt = MoveActionsTime; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Donut, dp); + } + + [ScriptMethod(name: "暗夜游魂预测填充 [ 填充亮度在用户设置 ]", eventType: EventTypeEnum.Chat, eventCondition: ["Type:Echo", "Message:regex:^10mCompulsoryControl$"])] + public void 暗夜游魂预测填充 (Event @event, ScriptAccessory accessory) + { + var dp = accessory.Data.GetDefaultDrawProperties(); + + dp.Name = "暗夜游魂预测填充"; + dp.Scale = new Vector2(10f); + dp.Owner = accessory.Data.Me; + dp.Color = SelfCompulsoryControlColor.V4.WithW(SelfCompulsoryControlFillBrightness); + dp.DestoryAt = MoveActionsTime; + accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); + } + + [ScriptMethod(name: "暗夜游魂触发销毁", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:regex:^29553$"],userControl: false)] + public void 暗夜游魂销毁(Event @event, ScriptAccessory accessory) + { + if (@event.TargetId() != accessory.Data.Me) return; + accessory.Method.RemoveDraw($"暗夜游魂预测.*"); + } + + #endregion } public static class EventExtensions diff --git a/PVP/PVPToy.cs b/PVP/PVPToy.cs index c8392a8..5ef8729 100644 --- a/PVP/PVPToy.cs +++ b/PVP/PVPToy.cs @@ -141,10 +141,17 @@ public class PVPToy if (@event.TargetId() != accessory.Data.Me) return; if (ActionExt.IsSpellReady(29054) && !IbcHelper.HasStatus(accessory, accessory.Data.MyObject, 0xBEE)) { + string sourceName = @event["SourceName"]?.ToString(); if (isText) accessory.Method.TextInfo("已尝试自动使用《防御》", duration: 1800, true); accessory.Method.SendChat($"/pvpac 防御"); - accessory.Method.SendChat($"/e 侦测到被狙!鸭鸭试着帮你开了盾! "); + accessory.Method.SendChat($"/e 侦测到被《{sourceName}》狙了!鸭鸭试着帮你开了盾! "); } + /* + if (!string.IsNullOrEmpty(sourceName)) + { + accessory.Method.SendChat($"/e 就是《{sourceName}》把你狙了!"); + } + */ } [ScriptMethod(name: "被战士抓自动防御", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:29081"])] @@ -155,14 +162,23 @@ public class PVPToy { if (@event.TargetId() != accessory.Data.Me) return; if (ActionExt.IsSpellReady(29054) && !IbcHelper.HasStatus(accessory, accessory.Data.MyObject, 0xBEE)) - { + { + string sourceName = @event["SourceName"]?.ToString(); if (isText) accessory.Method.TextInfo("已尝试自动使用《防御》", duration: 1800, true); accessory.Method.SendChat($"/pvpac 防御"); - accessory.Method.SendChat($"/e 侦测到被战士抓了!鸭鸭试着帮你进行了防御! "); + accessory.Method.SendChat($"/e 侦测到被战士《{sourceName}》抓了!鸭鸭试着帮你进行了防御! "); } } } + [ScriptMethod(name: "谁踹的我.jpg", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:29485"])] + public void WhoMeteorImpactMe(Event @event, ScriptAccessory accessory) + { + if (@event.TargetId() != accessory.Data.Me) return; + string sourceName = @event["SourceName"]?.ToString(); + accessory.Method.SendChat($"/e 鸭鸭:就是武僧《{sourceName}》踹的你! "); + } + [ScriptMethod(name: "对方诗人LB播报", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:29401"],suppress:3000)] public void FinalFantasiaTTS(Event @event, ScriptAccessory accessory) {