Files
Hibiya615-TetoraKAScript/02-A-Realm-Reborn/Trials-Extreme/Leviathan(Extreme).cs
南沢响也 d0763d2e87 UPDATE
2025-04-12 19:22:52 +08:00

331 lines
13 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 ECommons;
using ECommons.DalamudServices;
using ECommons.GameFunctions;
using ECommons.MathHelpers;
using System.Threading.Tasks;
using KodakkuAssist.Extensions;
namespace the_Whorleater_Extreme;
[ScriptType(guid: "07f20e0e-9463-4a10-9dd1-956fde6a9c46", name: "利维亚桑歼殛战", territorys: [359],
version: "0.0.0.3", author: "Tetora", note: noteStr)]
public class the_Whorleater_Extreme
{
const string noteStr =
"""
v0.0.0.3:
LV50
""";
[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("【开发用】Debug模式")]
public bool isDebug { get; set; } = false;
#region &
uint Dive = 0;
uint Phase = 0;
public void Init(ScriptAccessory accessory) {
Dive = 0;
Phase = 0;
}
[ScriptMethod(name: "阶段转换P1", eventType: EventTypeEnum.Chat, userControl: false,eventCondition: ["Type:NPCDialogueAnnouncements",
"Message:regex:^(被光明所污染的人们.*|You trespass upon my domain.*|我が海域を侵すか.*)$"])]
public void 1(Event @event, ScriptAccessory accessory)
{
Phase = 1;
}
[ScriptMethod(name: "阶段转换P2", eventType: EventTypeEnum.Chat, userControl: false,eventCondition: ["Type:NPCDialogueAnnouncements",
"Message:regex:^(蓝色清净的大海之水将会扫去一切污秽.*|Drink deep of the sea's bitter draught.*|清浄なる青き水を以て、穢れ清めん.*)$"])]
public void 2(Event @event, ScriptAccessory accessory)
{
Phase = 2;
}
[ScriptMethod(name: "阶段转换P3", eventType: EventTypeEnum.Chat, userControl: false,eventCondition: ["Type:NPCDialogueAnnouncements",
"Message:regex:^(竟然对我卖弄小伎俩.*|You challenge me with trickery.*|ぬぅ、小細工を弄したか.*)$"])]
public void 3(Event @event, ScriptAccessory accessory)
{
Phase = 3;
}
[ScriptMethod(name: "下潜记录", eventType: EventTypeEnum.Targetable, eventCondition: ["SourceName:regex:^(利维亚桑|Leviathan|リヴァイアサン)$", "Targetable:False"],userControl: false)]
public void (Event @event, ScriptAccessory accessory)
{
Dive = 1;
}
[ScriptMethod(name: "下潜取消", eventType: EventTypeEnum.Targetable, eventCondition: ["SourceName:regex:^(利维亚桑|Leviathan|リヴァイアサン)$", "Targetable:True"],userControl: false)]
public void (Event @event, ScriptAccessory accessory)
{
Dive = 0;
}
#endregion
[ScriptMethod(name: "开场提示", eventType: EventTypeEnum.Director, eventCondition: ["Command:40000001"])]
public async void (Event @event, ScriptAccessory accessory)
{
var isTank = accessory.Data.MyObject?.IsTank() ?? false;
var isDps = accessory.Data.MyObject?.IsDps() ?? false;
var isHealer = accessory.Data.MyObject?.IsHealer() ?? false;
if (isTank && isText)accessory.Method.TextInfo("难度:★☆,不会建议退\nTMT拉头ST拉尾、小怪ST拉晕波齿鱼人60%血以下免晕) ", duration: 10000, true);
if (isDps && isText)accessory.Method.TextInfo("难度:☆\nD出黄球打黄球蓝球不管小怪优先波齿鱼人注意避开T的平A", duration: 10000, true);
if (isHealer && isText)accessory.Method.TextInfo("难度:★★,不会建议退\nHST交给小仙女和再生奶群抬错开ST尽量避免水镜debuff", duration: 10000, true);
accessory.Method.SendChat("/e ————小抄————\nTMT拉头ST拉尾、小怪ST拉晕波齿鱼人60%血以下免晕)\n蓝球ST拉着溜等一次拍击后拉离人群开大减炸掉 \nD出黄球打黄球小怪优先波齿鱼人注意避开T的平A \nHST交给小仙女和再生奶群抬错开ST尽量避免水镜debuff");
}
[ScriptMethod(name: "水神的面纱 提示", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:2165"])]
public void (Event @event, ScriptAccessory accessory)
{
if (isText)accessory.Method.TextInfo("法系打头部,物理打尾巴\n龙舞赤DK额外注意自己的技能\n尾巴有身位", duration: 5000, true);
}
[ScriptMethod(name: "波齿鱼人 击杀提示", eventType: EventTypeEnum.AddCombatant, eventCondition: ["DataId:2807"])]
public void 齿(Event @event, ScriptAccessory accessory)
{
if (isText)accessory.Method.TextInfo("优先击杀 < 波齿鱼人 >", duration: 2500, true);
}
[ScriptMethod(name: "波齿鱼人_恐慌风暴", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:1865"])]
public void (Event @event, ScriptAccessory accessory)
{
if (isTTS)accessory.Method.TTS("不要踩进恐慌圈");
if (isEdgeTTS)accessory.Method.EdgeTTS("不要踩进恐慌圈");
var dp = accessory.Data.GetDefaultDrawProperties();
dp.Name = "恐慌风暴";
dp.Color = new Vector4(1f, 0f, 1f, 1.5f);
dp.Position = @event.EffectPosition();
dp.Scale = new Vector2(6f);
dp.DestoryAt = 6000;
accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp);
}
[ScriptMethod(name: "波齿鱼人_恐慌洗礼", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:1866"])]
public void (Event @event, ScriptAccessory accessory)
{
if (isText)accessory.Method.TextInfo("眩晕 < 波齿鱼人 >", duration: 3200, true);
var dp = accessory.Data.GetDefaultDrawProperties();
dp.Name = "恐慌洗礼";
dp.Color = new Vector4(1f, 0f, 1f, 2f);
dp.Owner = @event.SourceId();
dp.Scale = new Vector2(1.5f);
dp.DestoryAt = 3200;
accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp);
}
[ScriptMethod(name: "下潜提示", eventType: EventTypeEnum.Targetable, eventCondition: ["SourceName:regex:^(利维亚桑|Leviathan|リヴァイアサン)$", "Targetable:False"])]
public void (Event @event, ScriptAccessory accessory)
{
if (isText && Phase == 1)accessory.Method.TextInfo("去水柱对侧击退", duration: 5000, true);
if (isText && Phase != 1)accessory.Method.TextInfo("中间集合,躲开南北俯冲,远离侧面水柱击退", duration: 5000, true);
}
[ScriptMethod(name: "旋转下潜 俯冲", eventType: EventTypeEnum.AddCombatant, eventCondition: ["DataId:2804"])]
public void (Event @event, ScriptAccessory accessory)
{
if ( Dive != 1) return;
var dp = accessory.Data.GetDefaultDrawProperties();
dp.Name = "旋转下潜";
dp.Scale = new (16, 40f);
dp.Owner = @event.SourceId();
dp.Color = accessory.Data.DefaultDangerColor;
dp.DestoryAt = 6200;
accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp);
}
[ScriptMethod(name: "巨浪(击退)", eventType: EventTypeEnum.Chat,eventCondition: ["Type:NPCDialogueAnnouncements",
"Message:regex:^(竟然对我卖弄小伎俩.*|You challenge me with trickery.*|ぬぅ、小細工を弄したか.*)$"])]
public void (Event @event, ScriptAccessory accessory)
{
// 击退距离为25m 实际Scale宽=36m即为安全
foreach (var item in accessory.Data.Objects.GetByDataId(2802))
{
var dp = accessory.Data.GetDefaultDrawProperties();
dp.Name = "巨浪";
dp.Scale = new (40f, 30f);
dp.Owner = item.EntityId;
dp.Color = accessory.Data.DefaultDangerColor;
dp.DestoryAt = 3000;
accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp);
}
}
[ScriptMethod(name: "巨浪泡沫 提示", eventType: EventTypeEnum.AddCombatant, eventCondition: ["DataId:2810"])]
public void (Event @event, ScriptAccessory accessory)
{
var isTank = accessory.Data.MyObject?.IsTank() ?? false;
if(isTank && isText)accessory.Method.TextInfo("ST接走蓝泡泡避开人群溜溜球转场完开减伤远离人群炸球", duration: 34500, false);
if(isTTS)accessory.Method.TTS("ST拉蓝球约半分钟后爆炸人群远离");
if(isEdgeTTS)accessory.Method.EdgeTTS("ST拉蓝球约半分钟后爆炸人群远离");
}
#region
// 巨浪击退距离 25m 场地长 40m
[ScriptMethod(name: "猛撞销毁", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:2090"],userControl: false)]
public void (Event @event, ScriptAccessory accessory)
{
accessory.Method.RemoveDraw("巨浪"); // 销毁水柱击退
}
[ScriptMethod(name: "恐慌洗礼销毁", eventType: EventTypeEnum.CancelAction, eventCondition: ["ActionId:1866"],userControl: false)]
public void (Event @event, ScriptAccessory accessory)
{
accessory.Method.RemoveDraw("恐慌洗礼");
}
[ScriptMethod(name: "旋转下潜销毁", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:2186"],userControl: false)]
public void (Event @event, ScriptAccessory accessory)
{
accessory.Method.RemoveDraw("旋转下潜");
}
#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<uint>(@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<uint>(@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<uint>(@event["DurationMilliseconds"]);
}
public static float SourceRotation(this Event @event)
{
return JsonConvert.DeserializeObject<float>(@event["SourceRotation"]);
}
public static float TargetRotation(this Event @event)
{
return JsonConvert.DeserializeObject<float>(@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<Vector3>(@event["SourcePosition"]);
}
public static Vector3 TargetPosition(this Event @event)
{
return JsonConvert.DeserializeObject<Vector3>(@event["TargetPosition"]);
}
public static Vector3 EffectPosition(this Event @event)
{
return JsonConvert.DeserializeObject<Vector3>(@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<uint>(@event["StatusId"]);
}
public static uint StackCount(this Event @event)
{
return JsonConvert.DeserializeObject<uint>(@event["StackCount"]);
}
public static uint Param(this Event @event)
{
return JsonConvert.DeserializeObject<uint>(@event["Param"]);
}
}