using System; using System.ComponentModel; using System.Linq; using System.Numerics; using System.Collections.Generic; using Newtonsoft.Json; using Dalamud.Utility.Numerics; using KodakkuAssist.Script; using KodakkuAssist.Module.GameEvent; using KodakkuAssist.Module.Draw; using KodakkuAssist.Data; using System.Threading.Tasks; using KodakkuAssist.Extensions; namespace Thornmarch_Hard; [ScriptType(guid: "cd81e178-12e6-4e53-9b81-63002cc51ecb", name: "莫古力贤王歼灭战(整活版)", territorys: [1067], version: "0.0.0.3", author: "Tetora", note: noteStr)] public class Thornmarch_Hard { const string noteStr = """ v0.0.0.2: LV50 莫古力贤王歼灭战 纯整活无意义,不喜欢可以不用 台词暂时适用于CN版,暂未适配其他语言端 """; [UserSetting("台词TTS开关")] public bool isTTS { get; set; } = true; [UserSetting("台词文本弹窗开关")] public bool isText { get; set; } = true; [UserSetting("机制文本弹窗开关")] public bool isText2 { get; set; } = true; [UserSetting("打印气泡台词至聊天框")] public bool isSendMessage { get; set; } = true; [UserSetting("机制填充动画开关")] public bool isFill { get; set; } = true; #region 台词部分 [ScriptMethod(name: "反抗莫古力家臣团的人,会被莫古们彻底击溃库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:反抗莫古力家臣团的人\n会被莫古们彻底击溃库啵!"])] public void 会被莫古们彻底击溃库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("反抗莫古力家臣团的人,会被莫古们彻底击溃库啵!", duration: 4000, true); if (isTTS)accessory.Method.EdgeTTS("反抗莫古力家臣团的人,会被莫古们彻底击溃,库啵!"); } [ScriptMethod(name: "尝尝莫古的斧头库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1950"])] public void 尝尝莫古的斧头库啵(Event @event, ScriptAccessory accessory) { //if (isTTS)accessory.Method.EdgeTTS("尝尝莫古的斧头库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 毛毛之斧 库普塔·咔帕:尝尝莫古的斧头库啵!"); } [ScriptMethod(name: "看莫古射你屁股库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1960"])] public void 看莫古射你屁股库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("看莫古射你屁股库啵!", duration: 4000, true); if (isTTS)accessory.Method.EdgeTTS("看莫古射你屁股库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 软软之弓 库普括·叩吉:看莫古射你屁股库啵!"); } [ScriptMethod(name: "居然输了库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1947"])] public void 居然输了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("居然输了库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 绒绒之壁 库普迪·库普:居然输了库啵……"); } [ScriptMethod(name: "被打倒了库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1952"])] public void 被打倒了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("被打倒了库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 毛毛之斧 库普塔·咔帕:被打倒了库啵……"); } [ScriptMethod(name: "被干掉了库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1962"])] public void 被干掉了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("被干掉了库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 软软之弓 库普括·叩吉:被干掉了库啵……"); } [ScriptMethod(name: "想被穿成肉串吗库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1955"])] public void 想被穿成肉串吗库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("想被穿成肉串吗库啵!", duration: 4000, true); if (isTTS)accessory.Method.EdgeTTS("想被穿成肉串吗库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 茸茸之愈 库普洛·奇普:想被穿成肉串吗库啵!"); } [ScriptMethod(name: "来跟莫古一起跳库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1573"])] public void 来跟莫古一起跳库啵(Event @event, ScriptAccessory accessory) { //if (isTTS)accessory.Method.EdgeTTS("来跟莫古一起跳库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 绵绵之音 普库嘻·皮叩:来跟莫古一起跳库啵!"); } [ScriptMethod(name: "莫古输了库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1957"])] public void 莫古输了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("莫古输了库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 茸茸之愈 库普洛·奇普:莫古输了库啵……"); } [ScriptMethod(name: "已经没法唱歌了库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1975"])] public void 已经没法唱歌了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("已经没法唱歌了库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 绵绵之音 普库嘻·皮叩:已经没法唱歌了库啵……"); } [ScriptMethod(name: "玩火好有趣啊库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1965"])] public void 玩火好有趣啊库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("玩火好有趣啊库啵!", duration: 4000, true); if (isTTS)accessory.Method.EdgeTTS("玩火好有趣啊库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 柔柔之力 普库啦·普奇:玩火好有趣啊库啵!"); } [ScriptMethod(name: "真、真的要打吗库啵?", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1978"])] public void 真的要打吗库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("真、真的要打吗库啵?"); if (isSendMessage)accessory.Method.SendChat("/e 蓬蓬之障 普库呐·帕叩:真、真的要打吗库啵?"); } [ScriptMethod(name: "将力量集中到绒绒陨石上,把你们砸烂库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:将力量集中到绒绒陨石上,\n把你们砸烂库啵!"])] public void 会把你们砸烂库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("将力量集中到绒绒陨石上,把你们砸烂库啵!", duration: 4000, true); if (isTTS)accessory.Method.EdgeTTS("将力量集中到绒绒陨石上,把你们砸烂库啵!"); } [ScriptMethod(name: "莫古已经燃尽了库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1967"])] public void 莫古已经燃尽了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("莫古已经燃尽了库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 柔柔之力 普库啦·普奇:莫古已经燃尽了库啵……"); } [ScriptMethod(name: "好可怕库啵……", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1980"])] public void 好可怕库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("好可怕库啵……"); if (isSendMessage)accessory.Method.SendChat("/e 蓬蓬之障 普库呐·帕叩:好可怕库啵……"); } [ScriptMethod(name: "挺、挺厉害的嘛库啵……但贤王大人会收拾你们的库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:挺、挺厉害的嘛库啵……\n但贤王大人会收拾你们的库啵!"])] public void 贤王大人会收拾你们的库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("挺、挺厉害的嘛库啵……但贤王大人会收拾你们的库啵!"); } [ScriptMethod(name: "贤王大人啊,请降下您的制裁库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:贤王大人啊,\n请降下您的制裁库啵!"])] public void 请降下您的制裁库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("贤王大人啊,请降下您的制裁库啵!", duration: 4000, true); if (isTTS)accessory.Method.EdgeTTS("贤王大人啊,请降下您的制裁库啵!"); } [ScriptMethod(name: "贤王大人啊……后半句是啥来着库啵?", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1982"])] public void 后半句是啥来着库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("贤王大人啊……后半句是啥来着库啵?"); if (isSendMessage)accessory.Method.SendChat("/e 蓬蓬之障 普库呐·帕叩:贤王大人啊……后半句是啥来着库啵?"); } [ScriptMethod(name: "死亡莫古警告!你们会为忤逆行为付出代价库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:死亡莫古警告!\n你们会为忤逆行为付出代价库啵!"])] public void 你们会为忤逆行为付出代价库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("死亡莫古警告!你们会为忤逆行为付出代价库啵!"); } [ScriptMethod(name: "莫古们的战斗才刚刚开始库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:莫古们的战斗才刚刚开始库啵!"])] public void 莫古们的战斗才刚刚开始库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("莫古们的战斗才刚刚开始库啵!"); } [ScriptMethod(name: "家臣们,到你们出马的时候了库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:家臣们,\n到你们出马的时候了库啵!"])] public void 到你们出马的时候了库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("家臣们,到你们出马的时候了库啵!"); } [ScriptMethod(name: "让、让你们见识一下莫古真正的实力库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13788"])] public void 让你们见识一下莫古真正的实力库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("让、让你们见识一下莫古真正的实力库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 蓬蓬之障 普库呐·帕叩:让、让你们见识一下莫古真正的实力库啵!"); } [ScriptMethod(name: "尝尝纷乱箭库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1963"])] public void 尝尝纷乱箭库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("尝尝纷乱箭库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 软软之弓 库普括·叩吉:尝尝纷乱箭库啵!"); } [ScriptMethod(name: "沉到毒沼里去吧库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:1981"])] public void 沉到毒沼里去吧库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("沉到毒沼里去吧库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 蓬蓬之障 普库呐·帕叩:沉到毒沼里去吧库啵!"); } [ScriptMethod(name: "家臣们,给坏人以制裁库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:家臣们,\n给坏人以制裁库啵!"])] public void 给坏人以制裁库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("家臣们,给坏人以制裁库啵!"); } [ScriptMethod(name: "要有自知之明库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13781"])] public void 要有自知之明库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("要有自知之明库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 贤王莫古尔·莫古十二世:要有自知之明库啵!"); } [ScriptMethod(name: "把你们打散架库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13783"])] public void 把你们打散架库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("把你们打散架库啵!\n打得你们屁滚尿流库啵! ", duration: 8700, true); if (isTTS)accessory.Method.EdgeTTS("把你们打散架库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 毛毛之斧 库普塔·咔帕:把你们打散架库啵!"); } [ScriptMethod(name: "打得你们屁滚尿流库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13782"])] public void 打得你们屁滚尿流库啵(Event @event, ScriptAccessory accessory) { if (isText)accessory.Method.TextInfo("把你们打散架库啵!\n打得你们屁滚尿流库啵! ", duration: 8700, true); if (isTTS)accessory.Method.EdgeTTS("打得你们屁滚尿流库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 绒绒之壁 库普迪·库普:打得你们屁滚尿流库啵!"); } [ScriptMethod(name: "听莫古一曲库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13787"])] public void 听莫古一曲库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("听莫古一曲库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 绵绵之音 普库嘻·皮叩:听莫古一曲库啵!"); } [ScriptMethod(name: "家臣们,联起手来,对抗敌人库啵!", userControl: false,eventType: EventTypeEnum.Chat, eventCondition: ["Type:NPCDialogueAnnouncements","Message:家臣们,\n联起手来,对抗敌人库啵!"])] public void 对抗敌人库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("家臣们,联起手来,对抗敌人库啵!"); } [ScriptMethod(name: "莫古的魔力在熊熊燃烧库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13789"])] public void 莫古的魔力在熊熊燃烧库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("莫古的魔力在熊熊燃烧库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 柔柔之力 普库啦·普奇:莫古的魔力在熊熊燃烧库啵"); } [ScriptMethod(name: "碾碎你们库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13784"])] public void 碾碎你们库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("碾碎你们库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 贤王莫古尔·莫古十二世:碾碎你们库啵!"); } [ScriptMethod(name: "吃莫古一击库啵!", userControl: false,eventType: EventTypeEnum.NpcYell, eventCondition: ["Id:13785"])] public void 吃莫古一击库啵(Event @event, ScriptAccessory accessory) { if (isTTS)accessory.Method.EdgeTTS("吃莫古一击库啵!"); if (isSendMessage)accessory.Method.SendChat("/e 茸茸之愈 库普洛·奇普:吃莫古一击库啵!"); } #endregion #region 机制部分 /* 每次贤王号令都是不同的 Action id 不用计数了 private volatile int timeDecree=0; public void Init(ScriptAccessory accessory) { timeDecree=0; } */ [ScriptMethod(name: "回转莫古盾(钢铁)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29216"])] 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(6f); dp.DestoryAt = 2700; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "回转莫古盾销毁", eventType: EventTypeEnum.CancelAction, eventCondition: ["ActionId:29216"],userControl: false)] public void 回转莫古盾销毁(Event @event, ScriptAccessory accessory) { accessory.Method.RemoveDraw("回转莫古盾"); } [ScriptMethod(name: "莫古死亡雨(分散)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29191"])] public void 莫古死亡雨(Event @event, ScriptAccessory accessory) { if (isText2)accessory.Method.TextInfo("分散站位", duration: 2500, true); accessory.Method.EdgeTTS("分散站位"); } [ScriptMethod(name: "百库啵横扫(顺劈)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29215"])] 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(20); dp.Radian = 90f.DegToRad(); dp.DestoryAt = 4700; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Fan, dp); } [ScriptMethod(name: "百库啵横扫销毁", eventType: EventTypeEnum.CancelAction, eventCondition: ["ActionId:29215"],userControl: false)] public void 百库啵横扫销毁(Event @event, ScriptAccessory accessory) { accessory.Method.RemoveDraw("百库啵横扫"); } [ScriptMethod(name: "绒绒神圣(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^2921[01]$"])] public void 绒绒神圣(Event @event, ScriptAccessory accessory) { accessory.Method.EdgeTTS("AOE"); } [ScriptMethod(name: "莫古狂夜曲(顺劈)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29213"])] public void 莫古狂夜曲(Event @event, ScriptAccessory accessory) { // 命中后附加 11s [3080] 狂欢 debuff var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "莫古狂夜曲"; dp.Color = accessory.Data.DefaultDangerColor; dp.Owner = @event.SourceId(); dp.Scale = new Vector2(30); dp.Radian = 120f.DegToRad(); dp.DestoryAt = 4700; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Fan, dp); } [ScriptMethod(name: "狂欢", eventType: EventTypeEnum.StatusAdd, eventCondition: ["StatusID:3080"],userControl: false)] public void 狂欢(Event @event, ScriptAccessory accessory) { if ( @event.TargetId() != accessory.Data.Me) return; accessory.Method.TextInfo("黄圈出来你不躲?", duration: 11000, true); accessory.Method.EdgeTTS("黄圈出来你不躲?"); } [ScriptMethod(name: "莫古狂夜曲销毁", eventType: EventTypeEnum.CancelAction, eventCondition: ["ActionId:29213"],userControl: false)] public void 莫古狂夜曲销毁(Event @event, ScriptAccessory accessory) { accessory.Method.RemoveDraw("莫古狂夜曲"); } [ScriptMethod(name: "绒绒陨石(踩塔)", eventType: EventTypeEnum.ActionEffect, eventCondition: ["ActionId:29193"])] public void 绒绒陨石(Event @event, ScriptAccessory accessory) { // if (isText2)accessory.Method.TextInfo("踩塔", duration: 2700, true); accessory.Method.EdgeTTS("踩塔"); } [ScriptMethod(name: "莫古刺(死刑)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29214"])] public void 莫古刺(Event @event, ScriptAccessory accessory) { accessory.Method.EdgeTTS($"死刑点{@event.TargetName()}"); } [ScriptMethod(name: "死亡莫古警告(AOE)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29217"])] public void 死亡莫古警告(Event @event, ScriptAccessory accessory) { accessory.Method.EdgeTTS("AOE"); } [ScriptMethod(name: "贤王号令", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^(2918[89]|29190)$"])] public void 贤王号令(Event @event, ScriptAccessory accessory) { switch (@event.ActionId()) { case 29188: { if (isText2)accessory.Method.TextInfo("一运:远离毒圈,先集合 > 再分散 ,最后AOE", duration: 3700, true); } break; case 29189: { if (isText2)accessory.Method.TextInfo("二运:三穿一大圈,远离顺劈,分摊死刑后AOE", duration: 3700, true); } break; case 29190: { if (isText2)accessory.Method.TextInfo("三运:先躲避三连黄圈 后踩塔,先集合分摊,再躲钢铁月环,最后AOE接死刑", duration: 3700, true); } break; } } [ScriptMethod(name: "绒绒沼泽(毒圈)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29207"])] public void 绒绒沼泽(Event @event, ScriptAccessory accessory) { accessory.Method.EdgeTTS("躲避毒池AOE"); // 命中后附加 3082 猛毒 var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "绒绒沼泽"; dp.Color = accessory.Data.DefaultDangerColor; dp.Owner = @event.SourceId(); dp.Scale = new Vector2(8f); dp.DestoryAt = 5000; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "猛毒", eventType: EventTypeEnum.StatusAdd, eventCondition: ["StatusID:3082"],userControl: false)] public void 猛毒(Event @event, ScriptAccessory accessory) { if ( @event.TargetId() != accessory.Data.Me) return; accessory.Method.TextInfo("让你别吃你还吃?", duration: 3000, true); accessory.Method.EdgeTTS("让你别吃你还吃?"); } [ScriptMethod(name: "莫古崩石(分摊)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29204"])] public void 莫古崩石(Event @event, ScriptAccessory accessory) { if (isText2)accessory.Method.TextInfo($"靠近{@event.TargetName()}分摊", duration: 5300, true); accessory.Method.EdgeTTS($"靠近{@event.TargetName()}分摊"); var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "莫古崩石"; dp.Color = accessory.Data.DefaultSafeColor; dp.Owner = @event.TargetId(); dp.Scale = new Vector2(6f); dp.DestoryAt = 6000; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "莫古飞天乱(大圈)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^2919[67]$"])] 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(20f); dp.DestoryAt = 8700; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "绒绒双重陨石(分摊死刑)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29206"])] public void 绒绒双重陨石(Event @event, ScriptAccessory accessory) { accessory.Method.EdgeTTS($"分摊死刑点{@event.TargetName()}"); var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "绒绒双重陨石"; dp.Color = accessory.Data.DefaultDangerColor; dp.Owner = @event.TargetId(); dp.Scale = new Vector2(6f); dp.DestoryAt = 5000; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "莫古彗星(引导黄圈)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29198"])] public void 莫古彗星提示(Event @event, ScriptAccessory accessory) { if (isText2)accessory.Method.TextInfo("引导三连黄圈", duration: 7700, true); accessory.Method.EdgeTTS("引导三连黄圈"); } [ScriptMethod(name: "莫古彗星(三连黄圈)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29199"])] public void 莫古彗星(Event @event, ScriptAccessory accessory) { var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "莫古彗星"; dp.Color = accessory.Data.DefaultDangerColor; dp.Position = @event.EffectPosition(); dp.Scale = new Vector2(6f); dp.DestoryAt = 2700; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "绒绒垒石(月环)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29619"])] 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(30f); dp.InnerScale = new Vector2(20f); dp.Radian = float.Pi * 2; dp.DestoryAt = 4700; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Donut, dp); } /* [ScriptMethod(name: "绒绒垒石(月环)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:regex:^(29202|29619)$"])] public void 绒绒垒石月环(Event @event, ScriptAccessory accessory) { var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "绒绒垒石月环"; dp.Color = accessory.Data.DefaultDangerColor; dp.Owner = @event.SourceId(); dp.Scale = @event.ActionId() == 29202 ? new Vector2(20f) : new Vector2(30f); dp.InnerScale = @event.ActionId() == 29202 ? new Vector2(10f) : new Vector2(20f); dp.Radian = float.Pi * 2; dp.DestoryAt = 4700; // if (isFill)dp.ScaleMode = ScaleMode.ByTime; // 月环填充怎么是从中间扩散一个月环出去的啊好丑啊! accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Donut, dp); } */ [ScriptMethod(name: "绒绒垒石(钢铁)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29201"])] public void 绒绒垒石钢铁(Event @event, ScriptAccessory accessory) { var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "绒绒垒石钢铁"; dp.Color = accessory.Data.DefaultDangerColor; dp.Owner = @event.TargetId(); dp.Scale = new Vector2(10f); dp.DestoryAt = 4700; if (isFill)dp.ScaleMode = ScaleMode.ByTime; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Circle, dp); } [ScriptMethod(name: "森罗贤王(直线)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29208"])] public void 森罗贤王(Event @event, ScriptAccessory accessory) { var dp = accessory.Data.GetDefaultDrawProperties(); dp.Name = "森罗贤王"; dp.Scale = new (10, 50f); dp.Owner = @event.SourceId(); dp.Color = accessory.Data.DefaultDangerColor; dp.DestoryAt = 2700; accessory.Method.SendDraw(DrawModeEnum.Default, DrawTypeEnum.Rect, dp); } [ScriptMethod(name: "千库啵冲锋(死刑)", eventType: EventTypeEnum.StartCasting, eventCondition: ["ActionId:29209"])] public void 千库啵冲锋(Event @event, ScriptAccessory accessory) { accessory.Method.EdgeTTS($"死刑点{@event.TargetName()}"); } #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"]); } } #region 计算函数 public static class MathTools { public static float DegToRad(this float deg) => (deg + 360f) % 360f / 180f * float.Pi; public static float RadToDeg(this float rad) => (rad + 2 * float.Pi) % (2 * float.Pi) / float.Pi * 180f; /// /// 获得任意点与中心点的弧度值,以(0, 0, 1)方向为0,以(1, 0, 0)方向为pi/2。 /// 即,逆时针方向增加。 /// /// 任意点 /// 中心点 /// public static float GetRadian(this Vector3 point, Vector3 center) => MathF.Atan2(point.X - center.X, point.Z - center.Z); /// /// 获得任意点与中心点的长度。 /// /// 任意点 /// 中心点 /// public static float GetLength(this Vector3 point, Vector3 center) => new Vector2(point.X - center.X, point.Z - center.Z).Length(); /// /// 将任意点以中心点为圆心,逆时针旋转并延长。 /// /// 任意点 /// 中心点 /// 旋转弧度 /// 基于该点延伸长度 /// public static Vector3 RotateAndExtend(this Vector3 point, Vector3 center, float radian, float length) { var baseRad = point.GetRadian(center); var baseLength = point.GetLength(center); var rotRad = baseRad + radian; return new Vector3( center.X + MathF.Sin(rotRad) * (length + baseLength), center.Y, center.Z + MathF.Cos(rotRad) * (length + baseLength) ); } /// /// 获得某角度所在划分区域 /// /// 输入弧度 /// 区域划分数量 /// 0度所在区域的初始Idx> /// 是否为斜分割,默认为false /// 是否顺时针增加,默认为false /// public static int RadianToRegion(this float radian, int regionNum, int baseRegionIdx = 0, bool isDiagDiv = false, bool isCw = false) { var sepRad = float.Pi * 2 / regionNum; var inputAngle = radian * (isCw ? -1 : 1) + (isDiagDiv ? sepRad / 2 : 0); var rad = (inputAngle + 4 * float.Pi) % (2 * float.Pi); return ((int)Math.Floor(rad / sepRad) + baseRegionIdx + regionNum) % regionNum; } /// /// 将输入点左右折叠 /// /// 待折叠点 /// 中心折线坐标点 /// public static Vector3 FoldPointHorizon(this Vector3 point, float centerX) => point with { X = 2 * centerX - point.X }; /// /// 将输入点上下折叠 /// /// 待折叠点 /// 中心折线坐标点 /// public static Vector3 FoldPointVertical(this Vector3 point, float centerZ) => point with { Z = 2 * centerZ - point.Z }; /// /// 将输入点中心对称 /// /// 输入点 /// 中心点 /// public static Vector3 PointCenterSymmetry(this Vector3 point, Vector3 center) => point.RotateAndExtend(center, float.Pi, 0); /// /// 获取给定数的指定位数 /// /// 给定数值 /// 对应位数,个位为1 /// public static int GetDecimalDigit(this int val, int x) { var valStr = val.ToString(); var length = valStr.Length; if (x < 1 || x > length) return -1; var digitChar = valStr[length - x]; // 从右往左取第x位 return int.Parse(digitChar.ToString()); } } #endregion 计算函数