//作者s4000 using System.Linq; using System.Collections.Generic; using Turbo.Plugins.Default; using SharpDX; namespace Turbo.Plugins.glq { public class GLQ_BossCooldowns : BasePlugin, IInGameWorldPainter, INewAreaHandler { public float XPos { get; set; } public float YPos { get; set; } public float barH { get; set; } public float barW { get; set; } public string CDformat { get; set; } public IFont SkillFont { get; set; } public IBrush Brush_Ready { get; set; } // Skill ready (cool down = 0) public IBrush Brush_CD { get; set; } // Cooldown in progress public IBrush Brush_NA { get; set; } // Skill not available yet public IBrush Brush_BG { get; set; } // background (for skill in cool down) public Dictionary BossSkill_List { get; set; } = new Dictionary(new DAV_KeyAnime.EqualityComparer()); public Dictionary BossActor_List { get; set; } = new Dictionary(new DAV_KeyActor.EqualityComparer()); private bool showDebug { get; set; } = false; private bool BossFlight { get; set; } = false; private DAV_KeyAnime preSkill { get; set; } private DAV_KeyActor thisActor { get; set; } private Dictionary BossSkill_This { get; set; } = new Dictionary(); private Dictionary BossActor_This { get; set; } = new Dictionary(); public GLQ_BossCooldowns() { Enabled = true; } public override void Load(IController hud) { base.Load(hud); XPos = Hud.Window.Size.Width * 0.7f; YPos = Hud.Window.Size.Height * 0.5f; barH = Hud.Window.Size.Height * 0.015f; barW = Hud.Window.Size.Width * 0.1f; CDformat = "F0"; // F0, F1 or F2 SkillFont = Hud.Render.CreateFont("arial", 7, 255, 255, 255, 255, false, false, 255, 0, 0, 0, true); Brush_Ready = Hud.Render.CreateBrush(240, 128, 255, 0, 0); Brush_CD = Hud.Render.CreateBrush(240, 255, 51, 51, 0); Brush_NA = Hud.Render.CreateBrush(240, 153, 153, 153, 0); Brush_BG = Hud.Render.CreateBrush(240, 128, 255, 0, 0); preSkill = new DAV_KeyAnime("", AnimSnoEnum._p7_cos_pet_azmodan_walk); thisActor = new DAV_KeyActor("", ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm); // Thanks to user evan6944's works // 阿格尼多克斯 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Agnidox", AnimSnoEnum._demonflyer_mega_firebreath_01), new DAV_BossSkill("Agnidox", "火焰吐息", 1f, 7, "", "喷吐火焰,对 π/6 角度、 30 码范围内的玩家造成 4 次火焰伤害,并附加击退。\n仅当玩家在15码范围内时使用\n可触发4次荆棘伤害,100%触发系数")); // Normal Skills BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Agnidox", "火焰印记", 1f, 8, "", "释放火焰符文阵,符文爆破对 10 码范围内的玩家造成火焰伤害(可触发荆棘伤害);然后符文地面对范围内的玩家造成每秒火焰伤害,持续 4 秒(不触发荆棘伤害)"));// tiered CDs, 9s at lower HP; needs further testing BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Agnidox", "火焰飞弹", 1f, 4, "", "凝聚橙红色光斑,然后发射 3 枚火球,造成火焰伤害\n发射方向始终瞄准目标\n无法打断")); BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._grenadier_proj_mortar_inpact), new DAV_BossSkill("Agnidox", "轰炮", 1f, 3)); //火焰新星缺少动画和Actor // 疫王 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_middle), new DAV_BossSkill("Blighter", "瘟疫风暴", 0.5f, 10, "适合触发克利斯宾", "每个瘟疫池可触发5次荆棘伤害,100%触发系数")); //Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_in), new DAV_BossSkill("Blighter", "瘟疫之手", 1f, 5)); BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_generic_cast), new DAV_BossSkill("Blighter", "剧毒飞弹", 1f, 5)); // 血肠 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_taunt), new DAV_BossSkill("Bloodmaw", "跃击+地震", 1f, 21, "适合触发克利斯宾", "双刃抬起,然后连续跳跃 3~5 次\n以棕黄色圆形标识着陆位置,对 14 码范围内的玩家造成物理伤害,并附加击退\n > 落地 1.5 秒后产生地震,对 14 码范围内的玩家造成 4 次物理伤害\n每个地震可触发4次荆棘伤害,100%触发系数")); // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_b_attack_06_in), new DAV_BossSkill("Bloodmaw", "跃击", 1f, 5, "可控制打断", "跳跃攻击,以棕黄色圆形标识着陆位置\n对 14 码范围内的玩家造成物理伤害,并附加昏迷")); // 白骨术士 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Bone Warlock", AnimSnoEnum._skeletonsummoner_attack_01), new DAV_BossSkill("Bone Warlock", "奥术球", 1f, 2, "适合触发克利斯宾")); //%thorns? // 急冻魔 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_firebreath_combo_01), new DAV_BossSkill("Cold Snap", "冰霜新星", 1f, 16, "", "释放冰霜爆炸,对 60 码范围内的玩家造成冰霜伤害,附加冰冻\n必中,无法打断。\n可触发1次荆棘伤害,100%触发系数")); // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_charge_01), new DAV_BossSkill("Cold Snap", "冲锋", 1f, 6, "", "直线猛冲,对 10 码范围内的玩家造成物理伤害,并附加击退。")); var tmpskill = new DAV_KeyActor("Cold Snap", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster); BossActor_List.Add(tmpskill, new DAV_BossSkill("Cold Snap", "冰脉", 0.75f, 10)); BossActor_List[tmpskill].AddSecendCD(0.5f, 7); BossActor_List.Add(new DAV_KeyActor("Cold Snap", ActorSnoEnum._monsteraffix_frozen_iceclusters), new DAV_BossSkill("Cold Snap", "冰冻", 0.5f, 4, "", "释放 6 个冰冻晶体,类似精英怪物的冰冻词缀,但旋转阶段不会造成伤害。\n不触发荆棘伤害")); // 圣教君王 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_whirlwind_start), new DAV_BossSkill("Crusader King", "旋风斩", 1f, 20, "适合触发克利斯宾", "右手举起钉锤并嘲笑,然后双手挥舞钉锤,横扫 4 次\n第 1 次对 15 码范围内的玩家造成物理伤害,并附加击退\n第 2 ~ 4 次各对 15 码范围内的玩家造成物理伤害\n每次挥舞可触发1次荆棘伤害,100%触发系数")); // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_teleport), new DAV_BossSkill("Crusader King", "传送", 1f, 9, "可控制打断", "")); BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_cast_summon), new DAV_BossSkill("Crusader King", "召唤", 1f, 15, "可控制打断,上限14", "上限为14个(2波)")); // 灰烬 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_attack_aoe_01), new DAV_BossSkill("Ember", "陨石术", 1f, 4, "", "双手高抬,然后落下,以红色圆形标识区域,释放陨石撞击(可触发荆棘伤害)\n对 18 码范围内的玩家造成火焰伤害,并烧熔地面,持续造成 4 次火焰伤害(不触发荆棘伤害)")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_generic_cast), new DAV_BossSkill("Ember", "召唤", 0.95f, 2, "上限5", "自爆狂 (95%),\n堕落萨满 (60%),\n萨满上限5个")); // change by DAV 1f to 0.95f > ty ^.^ // 厄雷松 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._angel_corrupt_attack_dash_in), new DAV_BossSkill("Erethon", "冲撞", 1f, 2,"", "直线冲刺,对 7 码范围内的玩家造成物理伤害。并附加击退\n冲刺起点到目标位置的位移小于 20 码时,冲撞位移为 10 码\n冲刺起点到目标位置的位移大于 20 码时,冲撞位移为 30 码")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._x1_lr_boss_angel_corrupt_a_cast_01), new DAV_BossSkill("Erethon", "剧毒飞弹", 1f, 3,"", "凝聚绿色光斑,然后发射 3 枚毒球,造成毒素伤害\n发射方向始终瞄准目标\n无法打断")); //%thorns? // 艾斯坎迪尔 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_cast), new DAV_BossSkill("Eskandiel", "灵魂波浪", 1f, 3,"", "双手前推,释放青色死亡浪潮,对 40 码距离内的玩家造成冰霜伤害,并附加击退和 50% 减速,持续 5 秒")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_attack_02), new DAV_BossSkill("Eskandiel", "灵魂抽取", 1f, 11, "", "右手前伸,以青色光弧收割目标灵魂,造成冰霜伤害,并附加拉\n只有目标不在近战范围内时使用。")); //哈默林 // Hamelin // Normal Skills BossActor_List.Add(new DAV_KeyActor("Hamelin", ActorSnoEnum._p4_ratking_thunderdome_proxyactor), new DAV_BossSkill("Hamelin", "限制罩", 1f, 12, "", "双手伸出并吼叫,释放限制罩,阻止玩家和怪物通行,自身和鼠群可以通过\n虚幻长靴,毁伤之御,灵魂行走,钢铁之肤-疾行之肤,希望律法-天使之翼可使玩家穿过限制罩移动\n半径:35 码,持续时间:10 秒")); // headbutt has no unique animation // 炼狱侍女 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_04_aoe), new DAV_BossSkill("Infernal Maiden", "猛击", 1f, 14, "", "双手高举镰刀,然后落下猛击,对 20 码范围内的玩家造成 2 次物理伤害,并附加击退\n可触发2次荆棘伤害,100%触发系数")); BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_360_01), new DAV_BossSkill("Infernal Maiden", "旋风斩", 1f, 9, "", "原地旋转攻击,对 11 码范围内的玩家造成 4 次物理伤害,持续 2 秒\n70%以下血量时附加轰炮\n可触发4次荆棘伤害,50%触发系数")); // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_flip_01), new DAV_BossSkill("Infernal Maiden", "火焰螺旋", 0.4f, 25, "", "左手前伸,右手旋转镰刀,然后跳起\n落地并释放火焰螺旋,发射 8 枚火球,以螺线扩散,造成火焰伤害\n投射物穿透目标\n旋转镰刀后、跳起前可以打断。")); BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_temp_cast_01), new DAV_BossSkill("Infernal Maiden", "传送", 1f, 7)); // 狂屠 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_charge_01_in), new DAV_BossSkill("Man Carver", "怒吼冲锋", 1f, 12,"" , "怒吼警告,对 16 码范围内的玩家造成物理伤害并附加击退\n2 秒后沿标识的 50 码直线冲锋,对 10 码范围内的玩家造成物理伤害,并附加击退\n撞击到障碍物后停止,自身昏迷 3 秒")); //%thorns? BossActor_List.Add(new DAV_KeyActor("Man Carver", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Man Carver", "火焰印记", 1f, 12, "", "释放火焰符文阵,符文爆破对 10 码范围内的玩家造成火焰伤害(可触发1次荆棘伤害)\n然后符文地面对范围内的玩家造成最大每秒火焰伤害(不可触发荆棘伤害),持续 15 秒")); //%thorns? BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_fanofchains), new DAV_BossSkill("Man Carver", "上古之矛", 0.75f, 10, "", "只有目标不在近战范围内时使用\n从左手钩镰掷出 10 根长矛穿透攻击,对 60 码范围内的玩家造成物理伤害")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_05_telegraph), new DAV_BossSkill("Man Carver", "狠砸", 1f, 8,"", "原地跺脚,然后右手切肉斧攻击\n对 5π/18 角度、 25 码范围内的玩家造成物理伤害,并附加击退")); BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_chain_01_in), new DAV_BossSkill("Man Carver", "钩叉+猛砸", 0.5f, 5, "", "只有目标不在近战范围内时使用\n右手切肉斧指向目标,然后掷出左手钩镰,对直线上的目标造成物理伤害,将其拉回身边并附加昏迷,然后右手切肉斧猛砸攻击,对 π/3 角度、 30 码范围内的玩家造成物理伤害")); // 奥拉什 // needs work: skills on cooldowns in a difficult pattern // 绝灭 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_energyblast), new DAV_BossSkill("Perdition", "劈斩", 1f, 1, "", "近战劈斩,动画有双持剑刃同时攻击和右手剑刃单独攻击2种\n对 17π/9 角度、 16 码范围内的玩家造成物理伤害> 可触发1次荆棘伤害,100%触发系数")); // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_teleport_full), new DAV_BossSkill("Perdition", "传送劈斩", 1f, 8, "可控制打断", "双剑竖直,缓慢抬起,然后闪现到目标位置劈斩\n对 12 码范围内的玩家造成物理伤害\n传送位置追踪瞄准目标,绝灭亦可以使用此技能以瞬移远离玩家\n > 可触发1次荆棘伤害,100%触发系数")); BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_spellcast), new DAV_BossSkill("Perdition", "剑刃齐射", 1f, 11, "", "双剑交叉,身体悬空,然后发射 12 枚投射物,造成物理伤害\n > 仅当玩家超过5码时使用\n可触发1次荆棘伤害,33%触发系数")); // 佩伦迪 // Good Skills BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._x1_lr_boss_malletdemon_fallingrocks), new DAV_BossSkill("Perendi", "崩塌", 1f, 5, "适合触发克利斯宾", "以棕黄色圆形标识,2 秒后释放落石,对 20 码范围内的玩家造成 3 次物理伤害\n只有在有足够的空间时才使用\n可触发3次荆棘伤害,25%触发系数")); // Normal Skills BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._coreelitedemon_b_lr_boss), new DAV_BossSkill("Perendi", "召唤:碎石魔", 1f, 5, "", "碎石魔落地时会造成物理伤害并附加击退\n每次释放召唤 1 只,最大同时召唤 9 只\n达到上限依然继续召唤,并且最早召唤的自动死亡")); // needs work: more frequent on enrage? // 雷兹尔 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_firebomb_01), new DAV_BossSkill("Raiziel", "闪电球", 1f, 2.5, "适合触发克利斯宾", "投掷闪电球,轰击目标区域 12 次\n每次冲击对落点 6 码范围内的玩家造成闪电伤害,还会产生一道闪电箭\n闪电箭穿透目标,对路径上的玩家造成闪电伤害\n仅当玩家超过5码时使用")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_temp_cast_01), new DAV_BossSkill("Raiziel", "神圣新星", 0.75f, 8, "", "75%血量以下时扇形发射 7 枚神圣箭\n25%以下血量时圆形发射 13 枚神圣箭")); // 凝霜 // Good Skills BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_10foot), new DAV_BossSkill("Rime", "霜池", 1f, 6, "", "双手抬起,以蓝白色圆形标识,以 0.15 秒的间隔连续释放 4 ~ 6 个小型冰霜爆破\n0.5 秒后冰霜爆炸对 10 码范围内的玩家造成冰霜伤害(可触发荆棘伤害)\n然后冰霜冲击对范围内的玩家造成每秒冰霜伤害,持续 3 秒(不触发荆棘伤害)。\n双手抬起时、蓝白色圆形标识出现前可以打断。\n多个冰霜爆破的伤害叠加(暴雪宣称不会叠加)\n有时会连续释放 2 次。")); // Normal Skills BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_20foot), new DAV_BossSkill("Rime", "霜环", 1f, 6, "", "双手抬起,以蓝白色圆形标识,释放 1 个大型冰霜爆破\n1.5 秒后冰霜爆炸对 20 码范围内的玩家造成冰霜伤害(可触发荆棘伤害)\n然后冰霜冲击对范围内的玩家造成每秒冰霜伤害,持续 2.5 秒(不触发荆棘伤害)。\n双手抬起时、蓝白色圆形标识出现前可以打断。\n受到近战攻击时释放。")); BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_projectile_cold), new DAV_BossSkill("Rime", "冰霜飞弹", 1f, 6, "", "凝聚蓝白色光斑,然后发射 3 枚冰球,造成冰霜伤害。\n发射方向始终瞄准目标\n无法打断。")); // 塑沙者 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_direct_cast_04), new DAV_BossSkill("Sand Shaper", "灼热巨岩", 1f, 2.5,"", "右手前推,发射熔融巨岩,对 6 码范围内的玩家造成火焰伤害")); //%thorns? BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_aoe_01), new DAV_BossSkill("Sand Shaper", "崩塌", 0.65f, 9, "适合触发克利斯宾", "左手伸向天空,然后释放落石,对 20 码范围内的玩家造成 3 次物理伤害\n可触发3次荆棘伤害,25%触发系数")); // change by DAV 75% HP to 65% HP @DAV Cave In is locked after 40%, can you code this in? //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_taunt_01), new DAV_BossSkill("Sand Shaper", "嘲讽", 1f, 8)); BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_05_fadeout), new DAV_BossSkill("Sand Shaper", "传送", 1f, 7)); BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_01), new DAV_BossSkill("Sand Shaper", "能量旋风", 0.75f, 4.5, "", "左手抬起,释放奥术气旋,每 0.25 秒对 5 码范围内的玩家造成奥术伤害,持续 30 秒")); BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_04), new DAV_BossSkill("Sand Shaper", "时间延缓", 0.65f, 12, "", "右手挥舞,释放扭曲时空的减速罩,令 15 码范围内的玩家移动速度降低 50%,投射物速度降低 50%,持续 16 秒")); // 萨克崔斯 // Normal Skills //BossActor_List.Add(new DAV_KeyActor("Saxtris", ActorSnoEnum._zoltunkulle_energytwister), new DAV_BossSkill("Saxtris", "能量旋风", 1f, 6, "", "持续30秒")); BossSkill_List.Add(new DAV_KeyAnime("Saxtris", AnimSnoEnum._snakeman_melee_generic_cast_01), new DAV_BossSkill("Saxtris", "召唤", 0.75f, 1, "上限15", "75%血量以下解锁飞翼幼虫\n > 50%血量以下解锁蛇仔\n每次释放召唤 10 只,最大同时召唤 15 只")); // 岩石咏唱者 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonster_temp_rock_throw), new DAV_BossSkill("Stonesinger", "重击", 1f, 2,"", "近战打击,动画左右手连续挥动\n > 对 4 码范围内的玩家造成 2 次物理伤害\n可触发2次荆棘伤害,50%触发系数")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonsterblack_attack_03_sandwall), new DAV_BossSkill("Stonesinger", "召唤:裂隙", 1f, 7, "上限6", "双手触地,召唤裂隙,裂隙可以释放轰炮\n > 最多同时召唤 6 个")); // 特斯瑞斯 // Good Skills BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_adria_geyser), new DAV_BossSkill("Tethrys", "火焰风暴", 0.6f, 9, "适合触发克利斯宾", "双手前伸,释放 4 个火焰风暴阵,2 秒后启动\n火焰爆破对 6 码范围内的玩家造成火焰伤害\n然后风暴阵地面对并范围内的玩家造成最大每秒 3 倍火焰伤害,持续 2.5 秒")); //%thorns? // Normal Skills //BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Tethrys", "火焰飞弹", 1f, 3)); // Unpredictable; needs further testing BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._succubus_bloodstar_projectile), new DAV_BossSkill("Tethrys", "血之星", 1f, 9, "", "双手前伸,发射血之星,对击中 3 码范围内的玩家造成物理伤害\n并附加血光诅咒,降低 35% 护甲,持续 5 秒。\n血之星会追踪玩家")); // Unpredictable; needs further testing // 缠丝女魔 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_poison), new DAV_BossSkill("The Binder", "苦痛刺针", 0.65f, 3, "", "口部发出黄色亮光,然后发射 6 ~ 8 根黄色毒针,造成毒素伤害,可穿透")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_summon_webpatch), new DAV_BossSkill("The Binder", "蛛网", 1f, 8, "", "喷吐蛛网,令 10 码范围内玩家的移动速度降低 50%,持续 30 秒")); // 掐脖者 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_taunt_01), new DAV_BossSkill("The Choker", "剧毒爆破", 0.75f, 19, "适合触发克利斯宾", "身体后仰并吼叫,然后双手抬起,以绿色圆形标识\n释放 1 个大型剧毒爆破,1.5 秒后爆炸对 20 码范围内的玩家造成毒素伤害\n然后再度双手抬起,以绿色圆形标识,以 0.01 秒的间隔连续释放 18 ~ 22 个小型剧毒爆破\n1 秒后爆炸对 10 码范围内的玩家造成毒素伤害,然后剧毒冲击对范围内的玩家造成每秒毒素伤害,持续 2 秒。多个爆破的伤害叠加。\n双手抬起时、绿色圆形标识出现前可以打断。大小爆破需要分别打断")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_generic_cast), new DAV_BossSkill("The Choker", "召唤:软泥怪", 1f, 4, "上限10", "每次释放召唤 2 ~ 3 只,最大同时召唤 10 只")); // 威塞留斯 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_cast_02), new DAV_BossSkill("Vesalius", "冰霜飞弹", 1f, 1, "可控制打断", "右手凝聚青色光晕,然后左手发射 4 枚冰弹,造成冰霜伤害。\n发射方向始终瞄准目标")); //%thorns? // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_teleport_start_02), new DAV_BossSkill("Vesalius", "传送", 1f, 12, "可控制打断", "双手触地,潜入一侧虫洞,1.5 秒后从另一侧虫洞钻出。")); BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster), new DAV_BossSkill("Vesalius", "冰脉", 1f, 6, "", "生命值越低,释放频率越高")); BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_teleportmines), new DAV_BossSkill("Vesalius", "虫洞", 1f, 9, "", "生命值越低,释放频率越高")); // 贪食魔 // Good Skills BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_areaeffect), new DAV_BossSkill("Voracity", "毒云", 1f, 11, "", "摇摆身体,在自身和目标位置各制造一团毒云,对 19 码范围内的玩家造成最大每秒 3 倍毒素伤害,持续 75 秒\n玩家在毒云中每停留 0.5 秒,持续伤害便会堆叠 1 层,5 秒后达到最大 10 层\n多团毒云会同时叠加伤害层数,但最大伤害层数不会叠加\n在骷髅进入毒云之前控制触发克利斯宾\n每次进入毒云时可触发1次荆棘伤害,20%触发系数")); // Normal Skills BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_sneeze), new DAV_BossSkill("Voracity", "喷吐", 0.4f, 4, "", "身体前倾,喷吐毒物,并污染地面,对 5 码范围内的玩家造成毒素伤害,持续 2 秒\n可触发3次荆棘伤害,33%触发系数")); BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_ranged_01), new DAV_BossSkill("Voracity", "召唤:强酸黏液", 0.65f, 6, "上限4", "每次释放召唤 2 只,最大同时召唤 4 只")); } public void PaintWorld(WorldLayer layer) { if (Hud.Game.RiftPercentage < 100) return; var boos = Hud.Game.SelectedMonster1; if (boos == null || boos.Rarity != ActorRarity.Boss || !boos.IsAlive) return; XPos = Hud.Window.Size.Width * 0.7f; YPos = Hud.Window.Size.Height * 0.5f; barH = Hud.Window.Size.Height * 0.015f; barW = Hud.Window.Size.Width * 0.1f; float bosslife = 1f; var bosses = Hud.Game.AliveMonsters.Where(m => m.Rarity == ActorRarity.Boss && m.SummonerAcdDynamicId == 0); foreach(IMonster m in bosses) { if (!BossFlight) { BossFlight = true; BossSkill_This.Clear(); BossActor_This.Clear(); preSkill.BossAnime = AnimSnoEnum._p7_cos_pet_azmodan_walk; thisActor.BossActor = ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm; preSkill.Name = m.SnoMonster.NameEnglish; thisActor.Name = m.SnoMonster.NameEnglish; var curTime = Hud.Game.CurrentGameTick / 60d; foreach(KeyValuePair BossSkill in BossSkill_List) if(BossSkill.Value.Name == m.SnoMonster.NameEnglish) BossSkill_This.Add(BossSkill.Key.BossAnime, curTime - BossSkill.Value.CooldownTime); foreach(KeyValuePair BossActor in BossActor_List) if(BossActor.Value.Name == m.SnoMonster.NameEnglish) BossActor_This.Add(BossActor.Key.BossActor, curTime - BossActor.Value.CooldownTime); } bosslife = (float) (m.CurHealth / m.MaxHealth); if (bosslife < 0 || bosslife > 1) bosslife = 1; if (m.Animation == preSkill.BossAnime) continue; preSkill.BossAnime = m.Animation; if (!BossSkill_List.ContainsKey(preSkill)) continue; var cTime = Hud.Game.CurrentGameTick / 60d; if (showDebug) { var tmplist = BossSkill_List[preSkill]; var curCD = (tmplist.ChangeCD && bosslife < tmplist.ChangeCD_time) ? tmplist.ChangeCD_valve : tmplist.CooldownTime; BossSkill_List[preSkill].CooldownDebug = cTime - BossSkill_This[preSkill.BossAnime] - curCD; } BossSkill_This[preSkill.BossAnime] = cTime; } if (bosses == null) return; if (!BossFlight) return; var yref = YPos; if (BossSkill_This.Count > 0) { var tmpanime = new DAV_KeyAnime(preSkill.Name, AnimSnoEnum._p7_cos_pet_azmodan_walk); foreach(KeyValuePair BossCD in BossSkill_This) { tmpanime.BossAnime = BossCD.Key; BossSkillPaint(BossSkill_List[tmpanime], BossCD.Value, bosslife, ref yref); } } if (BossActor_This.Count == 0) return; var bossActor = Hud.Game.Actors.Where(a => a.LastSpeak == null && BossActor_This.ContainsKey(a.SnoActor.Sno)); if (bossActor == null) return; foreach (var actor in bossActor) { var cTime = Hud.Game.CurrentGameTick / 60d; thisActor.BossActor = actor.SnoActor.Sno; if (showDebug) { var tmplist = BossActor_List[thisActor]; var curCD = (tmplist.ChangeCD && bosslife < tmplist.ChangeCD_time) ? tmplist.ChangeCD_valve : tmplist.CooldownTime; BossActor_List[thisActor].CooldownDebug = cTime - BossActor_This[actor.SnoActor.Sno] - curCD; } actor.LastSpeak = Hud.Time.CreateWatch(); // actor.LastSpeak.Start(); BossActor_This[actor.SnoActor.Sno] = cTime; } var tmpactor = new DAV_KeyActor(thisActor.Name, ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm); foreach(KeyValuePair BossCD in BossActor_This) { tmpactor.BossActor = BossCD.Key; BossSkillPaint(BossActor_List[tmpactor], BossCD.Value, bosslife, ref yref); } } public void OnNewArea(bool newGame, ISnoArea area) { BossFlight = false; } public void BossSkillPaint(DAV_BossSkill skillData, double preCDvalue, float bosslife, ref float yref) { if (skillData == null || skillData.SkillName == null || skillData.SkillName == "" || skillData.SkillName == string.Empty) return; var text = skillData.SkillName; if (skillData.HintShort != "" && skillData.HintShort != null && skillData.HintShort != string.Empty) text += " (" + skillData.HintShort + ")"; var textLayout = SkillFont.GetTextLayout(text); if (textLayout == null) return; SkillFont.DrawText(text, XPos, yref); var rect = new RectangleF(XPos, yref, barW, barH + textLayout.Metrics.Height * 1.2f); yref += textLayout.Metrics.Height * 1.2f; if (bosslife > skillData.AvailableTime) { Brush_NA.DrawRectangle(XPos, yref, barW, barH); text = (skillData.AvailableTime * 100) + "%血时解锁"; } else { var curCD = (skillData.ChangeCD && bosslife < skillData.ChangeCD_time) ? skillData.ChangeCD_valve : skillData.CooldownTime; var skillCD = curCD - (Hud.Game.CurrentGameTick / 60d - preCDvalue); if (skillCD < 0) { Brush_Ready.DrawRectangle(XPos, yref, barW, barH); text = "准备就绪"; } else { Brush_BG.DrawRectangle(XPos, yref, barW, barH); Brush_CD.DrawRectangle(XPos, yref, (float) (barW * skillCD / curCD), barH); text = skillCD.ToString(skillCD < 1 ? "F1" : CDformat) + "秒"; } } textLayout = SkillFont.GetTextLayout(text); if (textLayout == null) return; SkillFont.DrawText(text, XPos + 3, yref + (barH - textLayout.Metrics.Height)/2); if (showDebug) SkillFont.DrawText(skillData.CooldownDebug.ToString("F1") + "秒 | 生命: " + bosslife.ToString("F2"), XPos + 3 + barW, yref + (barH - textLayout.Metrics.Height)/2); yref += barH * 1.3f; if (skillData.HintHided != null && skillData.HintHided != "" && Hud.Window.CursorInsideRect(rect.X, rect.Y, rect.Width, rect.Height)) Hud.Render.SetHint(skillData.HintHided); } } public class DAV_KeyActor { public string Name { get; set; } public ActorSnoEnum BossActor { get; set; } public DAV_KeyActor(string name, ActorSnoEnum actor) { Name = name; BossActor = actor; } public class EqualityComparer : IEqualityComparer { public bool Equals(DAV_KeyActor x, DAV_KeyActor y) { return x.Name == y.Name && x.BossActor == y.BossActor; } public int GetHashCode(DAV_KeyActor obj) { string combined = obj.Name + "|" + obj.BossActor.ToString(); return combined.GetHashCode(); } } } public class DAV_KeyAnime { public string Name { get; set; } public AnimSnoEnum BossAnime { get; set; } public DAV_KeyAnime(string name, AnimSnoEnum anime) { Name = name; BossAnime = anime; } public class EqualityComparer : IEqualityComparer { public bool Equals(DAV_KeyAnime x, DAV_KeyAnime y) { return x.Name == y.Name && x.BossAnime == y.BossAnime; } public int GetHashCode(DAV_KeyAnime obj) { string combined = obj.Name + "|" + obj.BossAnime.ToString(); return combined.GetHashCode(); } } } public class DAV_BossSkill { public string Name { get; set; } public string SkillName { get; set; } public string HintShort { get; set; } public string HintHided { get; set; } public float AvailableTime { get; set; } public double CooldownTime { get; set; } public double CooldownDebug { get; set; } public bool ChangeCD { get; set; } public float ChangeCD_time { get; set; } public double ChangeCD_valve { get; set; } public DAV_BossSkill(string name, string skill, float life, double CD, string Desc = "", string hideMsg = "") { Name = name; SkillName = skill; HintShort = Desc; HintHided = hideMsg; AvailableTime = life; CooldownTime = CD; CooldownDebug = 0d; ChangeCD = false; } public void AddSecendCD(float life, double CD) { ChangeCD = true; ChangeCD_time = life; ChangeCD_valve = CD; } } }