Advertisement
s4000

DAV_BossCDPlugin

Aug 30th, 2019 (edited)
2,731
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 46.04 KB | None | 0 0
  1. using System;
  2. using System.Linq;
  3. using System.Collections.Generic;
  4. using Turbo.Plugins.Default;
  5. using SharpDX;
  6. using SharpDX.Direct2D1;
  7.  
  8. namespace Turbo.Plugins.DAV
  9. {
  10.     public class DAV_BossCDPlugin : BasePlugin, IInGameWorldPainter, INewAreaHandler {
  11.         public float XPos { get; set; }
  12.         public float YPos { get; set; }
  13.         public float barH { get; set; }
  14.         public float barW { get; set; }
  15.         public string CDformat { get; set; }
  16.         public IFont SkillFont { get; set; }
  17.         public IBrush Brush_Ready { get; set; } // Skill ready (cool down = 0)
  18.         public IBrush Brush_CD { get; set; } // Cooldown in progress
  19.         public IBrush Brush_NA { get; set; } // Skill not available yet
  20.         public IBrush Brush_BG { get; set; } // background (for skill in cool down)
  21.         public Dictionary<DAV_KeyAnime, DAV_BossSkill> BossSkill_List { get; set; } = new Dictionary<DAV_KeyAnime, DAV_BossSkill>(new DAV_KeyAnime.EqualityComparer());
  22.         public Dictionary<DAV_KeyActor, DAV_BossSkill> BossActor_List { get; set; } = new Dictionary<DAV_KeyActor, DAV_BossSkill>(new DAV_KeyActor.EqualityComparer());
  23.  
  24.         private bool showDebug { get; set; } = false;
  25.         private bool BossFlight { get; set; } = false;
  26.         private DAV_KeyAnime preSkill { get; set; }
  27.         private DAV_KeyActor thisActor { get; set; }
  28.         private Dictionary<AnimSnoEnum, double> BossSkill_This { get; set; } = new Dictionary<AnimSnoEnum, double>();
  29.         private Dictionary<ActorSnoEnum, double> BossActor_This { get; set; } = new Dictionary<ActorSnoEnum, double>();
  30.  
  31.         public DAV_BossCDPlugin() {
  32.             Enabled = true;
  33.         }
  34.  
  35.         public override void Load(IController hud) {
  36.             base.Load(hud);
  37.  
  38.             XPos = Hud.Window.Size.Width * 0.7f;
  39.             YPos = Hud.Window.Size.Height * 0.5f;
  40.             barH = Hud.Window.Size.Height * 0.015f;
  41.             barW = Hud.Window.Size.Width * 0.1f;
  42.             CDformat = "F0"; // F0, F1 or F2
  43.             SkillFont = Hud.Render.CreateFont("arial", 7, 255, 255, 255, 255, false, false, 255, 0, 0, 0, true);
  44.             Brush_Ready = Hud.Render.CreateBrush(240, 128, 255, 0, 0);
  45.             Brush_CD = Hud.Render.CreateBrush(240, 255, 51, 51, 0);
  46.             Brush_NA = Hud.Render.CreateBrush(240, 153, 153, 153, 0);
  47.             Brush_BG = Hud.Render.CreateBrush(240, 255, 255, 255, 0);
  48.  
  49.             preSkill = new DAV_KeyAnime("", AnimSnoEnum._p7_cos_pet_azmodan_walk);
  50.             thisActor = new DAV_KeyActor("", ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm);
  51.  
  52.             // Thanks to user evan6944's works
  53.            
  54.              // 阿格尼多克斯
  55.             // Good Skills
  56.             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%觸發係數"));
  57.             // Normal Skills
  58.             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
  59.             BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Agnidox", "火焰飛彈", 1f, 4, "", "凝聚橙紅色光斑,然後發射 3 枚火球,造成火焰傷害\n發射方向始終瞄準目標\n無法打斷"));
  60.             BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._grenadier_proj_mortar_inpact), new DAV_BossSkill("Agnidox", "轟炮", 1f, 3));
  61.             //火焰新星缺少動畫和Actor
  62.  
  63.             // 疫王
  64.             // Good Skills
  65.             BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_middle), new DAV_BossSkill("Blighter", "瘟疫風暴", 0.5f, 10, "適合觸發克利斯賓", "每個瘟疫池可觸發5次荊棘傷害,100%觸發係數"));
  66.             //Normal Skills
  67.             BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_in), new DAV_BossSkill("Blighter", "瘟疫之手", 1f, 5));
  68.             BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_generic_cast), new DAV_BossSkill("Blighter", "劇毒飛彈", 1f, 5));
  69.            
  70.             // 血腸
  71.             // Good Skills
  72.             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%觸發係數"));
  73.             // Normal Skills
  74.             BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_b_attack_06_in), new DAV_BossSkill("Bloodmaw", "躍擊", 1f, 5, "可控制打斷", "跳躍攻擊,以棕黃色圓形標識著陸位置\n對 14 碼範圍內的玩家造成物理傷害,並附加昏迷"));
  75.  
  76.             // 白骨術士
  77.             // Good Skills
  78.             BossSkill_List.Add(new DAV_KeyAnime("Bone Warlock", AnimSnoEnum._skeletonsummoner_attack_01), new DAV_BossSkill("Bone Warlock", "奧術球", 1f, 2, "適合觸發克利斯賓")); //%thorns?
  79.  
  80.             // 急凍魔
  81.             // Good Skills
  82.             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%觸發係數"));
  83.             // Normal Skills
  84.             BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_charge_01), new DAV_BossSkill("Cold Snap", "衝鋒", 1f, 6, "", "直線猛衝,對 10 碼範圍內的玩家造成物理傷害,並附加擊退。"));
  85.             var tmpskill = new DAV_KeyActor("Cold Snap", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster);
  86.             BossActor_List.Add(tmpskill, new DAV_BossSkill("Cold Snap", "冰脈", 0.75f, 10));
  87.             BossActor_List[tmpskill].AddSecendCD(0.5f, 7);
  88.             BossActor_List.Add(new DAV_KeyActor("Cold Snap", ActorSnoEnum._monsteraffix_frozen_iceclusters), new DAV_BossSkill("Cold Snap", "冰凍", 0.5f, 4, "", "釋放 6 個冰凍晶體,類似精英怪物的冰凍詞綴,但旋轉階段不會造成傷害。\n不觸發荊棘傷害"));
  89.  
  90.             // 聖教君王
  91.             // Good Skills
  92.             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%觸發係數"));
  93.             // Normal Skills
  94.             BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_teleport), new DAV_BossSkill("Crusader King", "傳送", 1f, 9, "可控制打斷", ""));
  95.             BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_cast_summon), new DAV_BossSkill("Crusader King", "召喚", 1f, 15, "可控制打斷,上限14", "上限為14個(2波)"));
  96.  
  97.             // 灰燼
  98.             // Good Skills
  99.             BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_attack_aoe_01), new DAV_BossSkill("Ember", "隕石術", 1f, 4, "", "雙手高抬,然後落下,以紅色圓形標識區域,釋放隕石撞擊(可觸發荊棘傷害)\n對 18 碼範圍內的玩家造成火焰傷害,並燒熔地面,持續造成 4 次火焰傷害(不觸發荊棘傷害)")); //%thorns?
  100.             // Normal Skills
  101.             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 ^.^
  102.  
  103.             // 厄雷松
  104.             // Good Skills
  105.             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?
  106.             // Normal Skills
  107.             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?
  108.  
  109.             // 艾斯坎迪爾
  110.             // Good Skills
  111.             BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_cast), new DAV_BossSkill("Eskandiel", "靈魂波浪", 1f, 3,"", "雙手前推,釋放青色死亡浪潮,對 40 碼距離內的玩家造成冰霜傷害,並附加擊退和 50% 減速,持續 5 秒")); //%thorns?
  112.             // Normal Skills
  113.             BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_attack_02), new DAV_BossSkill("Eskandiel", "靈魂抽取", 1f, 11, "", "右手前伸,以青色光弧收割目標靈魂,造成冰霜傷害,並附加拉\n只有目標不在近戰範圍內時使用。"));
  114.  
  115.             //哈默林
  116.             // Hamelin
  117.             // Normal Skills
  118.             BossActor_List.Add(new DAV_KeyActor("Hamelin", ActorSnoEnum._p4_ratking_thunderdome_proxyactor), new DAV_BossSkill("Hamelin", "限制罩", 1f, 12, "", "雙手伸出並吼叫,釋放限制罩,阻止玩家和怪物通行,自身和鼠群可以通過\n虛幻長靴,毀傷之御,靈魂行走,鋼鐵之膚-疾行之膚,希望律法-天使之翼可使玩家穿過限制罩移動\n半徑:35 碼,持續時間:10 秒"));
  119.             // headbutt has no unique animation
  120.  
  121.             // 煉獄侍女
  122.             // Good Skills
  123.             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%觸發係數"));
  124.             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%觸發係數"));
  125.             // Normal Skills
  126.             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旋轉鐮刀後、跳起前可以打斷。"));
  127.             BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_temp_cast_01), new DAV_BossSkill("Infernal Maiden", "傳送", 1f, 7));
  128.  
  129.             // 狂屠
  130.             // Good Skills
  131.             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?
  132.             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?
  133.             BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_fanofchains), new DAV_BossSkill("Man Carver", "上古之矛", 0.75f, 10, "", "只有目標不在近戰範圍內時使用\n從左手鉤鐮擲出 10 根長矛穿透攻擊,對 60 碼範圍內的玩家造成物理傷害")); //%thorns?
  134.             // Normal Skills
  135.             BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_05_telegraph), new DAV_BossSkill("Man Carver", "狠砸", 1f, 8,"", "原地跺腳,然後右手切肉斧攻擊\n對 5π/18 角度、 25 碼範圍內的玩家造成物理傷害,並附加擊退"));
  136.             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 碼範圍內的玩家造成物理傷害"));
  137.  
  138.             // 奧拉什
  139.             // needs work: skills on cooldowns in a difficult pattern
  140.  
  141.             // 絕滅
  142.             // Good Skills
  143.             BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_energyblast), new DAV_BossSkill("Perdition", "劈斬", 1f, 1, "", "近戰劈斬,動畫有雙持劍刃同時攻擊和右手劍刃單獨攻擊2種\n對 17π/9 角度、 16 碼範圍內的玩家造成物理傷害> 可觸發1次荊棘傷害,100%觸發係數"));
  144.             // Normal Skills
  145.             BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_teleport_full), new DAV_BossSkill("Perdition", "傳送劈斬", 1f, 8, "可控制打斷", "雙劍豎直,緩慢抬起,然後閃現到目標位置劈斬\n對 12 碼範圍內的玩家造成物理傷害\n傳送位置追蹤瞄準目標,絕滅亦可以使用此技能以瞬移遠離玩家\n > 可觸發1次荊棘傷害,100%觸發係數"));
  146.             BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_spellcast), new DAV_BossSkill("Perdition", "劍刃齊射", 1f, 11, "", "雙劍交叉,身體懸空,然後發射 12 枚投射物,造成物理傷害\n > 僅當玩家超過5碼時使用\n可觸發1次荊棘傷害,33%觸發係數"));
  147.  
  148.             // 佩倫迪
  149.             // Good Skills
  150.             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%觸發係數"));
  151.             // Normal Skills
  152.             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?
  153.  
  154.             // 雷茲爾
  155.             // Good Skills
  156.             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?
  157.             // Normal Skills
  158.             BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_temp_cast_01), new DAV_BossSkill("Raiziel", "神聖新星", 0.75f, 8, "", "75%血量以下時扇形發射 7 枚神聖箭\n25%以下血量時圓形發射 13 枚神聖箭"));
  159.  
  160.             // 凝霜
  161.             // Good Skills
  162.             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 次。"));
  163.             // Normal Skills
  164.             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受到近戰攻擊時釋放。"));
  165.             BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_projectile_cold), new DAV_BossSkill("Rime", "冰霜飛彈", 1f, 6, "", "凝聚藍白色光斑,然後發射 3 枚冰球,造成冰霜傷害。\n發射方向始終瞄準目標\n無法打斷。"));
  166.  
  167.             // 塑沙者
  168.             // Good Skills
  169.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_direct_cast_04), new DAV_BossSkill("Sand Shaper", "灼熱巨岩", 1f, 2.5,"", "右手前推,發射熔融巨岩,對 6 碼範圍內的玩家造成火焰傷害")); //%thorns?
  170.             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?
  171.             // Normal Skills
  172.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_taunt_01), new DAV_BossSkill("Sand Shaper", "嘲諷", 1f, 8));
  173.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_05_fadeout), new DAV_BossSkill("Sand Shaper", "傳送", 1f, 7));
  174.             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 秒"));
  175.             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 秒"));
  176.  
  177.             // 薩克崔斯
  178.             // Normal Skills
  179.             //BossActor_List.Add(new DAV_KeyActor("Saxtris", ActorSnoEnum._zoltunkulle_energytwister), new DAV_BossSkill("Saxtris", "能量旋風", 1f, 6, "", "持續30秒"));
  180.             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 只"));
  181.  
  182.             // 岩石詠唱者
  183.             // Good Skills
  184.             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?
  185.             // Normal Skills
  186.             BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonsterblack_attack_03_sandwall), new DAV_BossSkill("Stonesinger", "召喚:裂隙", 1f, 7, "上限6", "雙手觸地,召喚裂隙,裂隙可以釋放轟炮\n > 最多同時召喚 6 個"));
  187.  
  188.             // 特斯瑞斯
  189.             // Good Skills
  190.             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?
  191.             // Normal Skills
  192.             //BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Tethrys", "火焰飛彈", 1f, 3));  // Unpredictable; needs further testing
  193.             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
  194.  
  195.             // 纏絲女魔
  196.             // Good Skills
  197.             BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_poison), new DAV_BossSkill("The Binder", "苦痛刺針", 0.65f, 3, "", "口部發出黃色亮光,然後發射 6 ~ 8 根黃色毒針,造成毒素傷害,可穿透")); //%thorns?
  198.             // Normal Skills
  199.             BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_summon_webpatch), new DAV_BossSkill("The Binder", "蛛網", 1f, 8, "", "噴吐蛛網,令 10 碼範圍內玩家的移動速度降低 50%,持續 30 秒"));
  200.  
  201.             // 掐脖者
  202.             // Good Skills
  203.             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?
  204.             // Normal Skills
  205.             BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_generic_cast), new DAV_BossSkill("The Choker", "召喚:軟泥怪", 1f, 4, "上限10", "每次釋放召喚 2 ~ 3 只,最大同時召喚 10 只"));
  206.  
  207.             // 威塞留斯
  208.             // Good Skills
  209.             BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_cast_02), new DAV_BossSkill("Vesalius", "冰霜飛彈", 1f, 1, "可控制打斷", "右手凝聚青色光暈,然後左手發射 4 枚冰彈,造成冰霜傷害。\n發射方向始終瞄準目標")); //%thorns?
  210.             // Normal Skills
  211.             BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_teleport_start_02), new DAV_BossSkill("Vesalius", "傳送", 1f, 12, "可控制打斷", "雙手觸地,潛入一側蟲洞,1.5 秒後從另一側蟲洞鑽出。"));
  212.             BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster), new DAV_BossSkill("Vesalius", "冰脈", 1f, 6, "", "生命值越低,釋放頻率越高"));
  213.             BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_teleportmines), new DAV_BossSkill("Vesalius", "蟲洞", 1f, 9, "", "生命值越低,釋放頻率越高"));
  214.  
  215.             // 貪食魔
  216.             // Good Skills
  217.             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%觸發係數"));
  218.             // Normal Skills
  219.             BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_sneeze), new DAV_BossSkill("Voracity", "噴吐", 0.4f, 4, "", "身體前傾,噴吐毒物,並污染地面,對 5 碼範圍內的玩家造成毒素傷害,持續 2 秒\n可觸發3次荊棘傷害,33%觸發係數"));
  220.             BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_ranged_01), new DAV_BossSkill("Voracity", "召喚:強酸黏液", 0.65f, 6, "上限4", "每次釋放召喚 2 只,最大同時召喚 4 只"));
  221.            
  222.         /*  // Agnidox
  223.             // Good Skills
  224.             BossSkill_List.Add(new DAV_KeyAnime("Agnidox", AnimSnoEnum._demonflyer_mega_firebreath_01), new DAV_BossSkill("Agnidox", "Flame Breath", 1f, 7, "", "> Only used when a player is within 15 yards\n> Procs 4 ticks of thorns @ 100%/tick)"));
  225.             // Normal Skills
  226.             BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Agnidox", "Mark of Fire", 1f, 12, "", "> 10-yard radius, lasts 5s"));// tiered CDs, 9s at lower HP; needs further testing
  227.             BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Agnidox", "Fire Ball", 1f, 4, "", ""));
  228.             BossActor_List.Add(new DAV_KeyActor("Agnidox", ActorSnoEnum._grenadier_proj_mortar_inpact), new DAV_BossSkill("Agnidox", "Mortar", 1f, 3, "", ""));
  229.             //Fire Nova lacks animation and actor
  230.  
  231.             // Blighter
  232.             BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_in), new DAV_BossSkill("Blighter", "Plagued Line", 1f, 5));
  233.             BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_generic_cast), new DAV_BossSkill("Blighter", "Poison Nova", 1f, 5));
  234.             BossSkill_List.Add(new DAV_KeyAnime("Blighter", AnimSnoEnum._creepmob_attack_04_middle), new DAV_BossSkill("Blighter", "Plague Storm", 0.5f, 10));
  235.  
  236.             // Bloodmaw
  237.             // Good Skills
  238.             BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_taunt), new DAV_BossSkill("Bloodmaw", "Leap", 1f, 21, "Stun for Krysbins", "> Procs 5 ticks of thorns per pool @ 100%/tick"));
  239.             // Normal Skills
  240.             BossSkill_List.Add(new DAV_KeyAnime("Bloodmaw", AnimSnoEnum._x1_westmarchbrute_b_attack_06_in), new DAV_BossSkill("Bloodmaw", "Leaping Strike", 1f, 5));
  241.  
  242.             // Bone Warlock
  243.             // Good Skills
  244.             BossSkill_List.Add(new DAV_KeyAnime("Bone Warlock", AnimSnoEnum._skeletonsummoner_attack_01), new DAV_BossSkill("Bone Warlock", "Arcane Bolt", 1f, 2, "Stun for Krysbins")); //%thorns?
  245.  
  246.             // Cold Snap
  247.             // Good Skills
  248.             BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_firebreath_combo_01), new DAV_BossSkill("Cold Snap", "Frozen Nova", 1f, 16, "", "> Procs 1 tick of thorns @ 100%/tick"));
  249.             // Normal Skills
  250.             BossSkill_List.Add(new DAV_KeyAnime("Cold Snap", AnimSnoEnum._bigred_charge_01), new DAV_BossSkill("Cold Snap", "Charge", 1f, 6, "", "> Only used when players are beyond 15 yards"));
  251.             var tmpskill = new DAV_KeyActor("Cold Snap", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster);
  252.             BossActor_List.Add(tmpskill, new DAV_BossSkill("Cold Snap", "Frozen Pulse", 0.75f, 10, "", "> Unlocks at 75% HP"));
  253.             BossActor_List[tmpskill].AddSecendCD(0.5f, 7);
  254.             BossActor_List.Add(new DAV_KeyActor("Cold Snap", ActorSnoEnum._monsteraffix_frozen_iceclusters), new DAV_BossSkill("Cold Snap", "Frozen Storm", 0.5f, 8, "> Unlocks at 50% HP", "> Insignificant thorns effect against this skill"));
  255.  
  256.             // Crusader King
  257.             // Good Skills
  258.             BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_whirlwind_start), new DAV_BossSkill("Crusader King", "Triple Swing", 1f, 20, "Stun for Krysbins", "> Swings 4 times\n> Procs 1 tick of thorns per swing, @ 100%/tick"));
  259.             // Normal Skills
  260.             BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_teleport), new DAV_BossSkill("Crusader King", "Teleport", 1f, 9, "Stun to interrupt", ""));
  261.             BossSkill_List.Add(new DAV_KeyAnime("Crusader King", AnimSnoEnum._skeletonking_cast_summon), new DAV_BossSkill("Crusader King", "Summonning", 1f, 15, "Stun to interrupt", "> Caps at 14 (2 waves)"));
  262.  
  263.             // Ember
  264.             // Good Skills
  265.             BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_attack_aoe_01), new DAV_BossSkill("Ember", "Meteor", 1f, 5, "Stun for Krysbins")); //%thorns?
  266.             // Normal Skills
  267.             BossSkill_List.Add(new DAV_KeyAnime("Ember", AnimSnoEnum._morluspellcaster_generic_cast), new DAV_BossSkill("Ember", "Summoning", 0.95f, 4, "","> Fallen Lunatics (95%),\n> Fallen Shaman (60%),\n> Caps at 5 shamans")); // change by DAV 1f to 0.95f > ty ^.^
  268.  
  269.             // Erethon
  270.             // Good Skills
  271.             BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._angel_corrupt_attack_dash_in), new DAV_BossSkill("Erethon", "Dash", 1f, 8,"", "> Short Dash triggered when any player is beyond 5 yards\n> Long Dash triggered when any player is beyond 15 yards")); //%thorns?
  272.             // Normal Skills
  273.             BossSkill_List.Add(new DAV_KeyAnime("Erethon", AnimSnoEnum._x1_lr_boss_angel_corrupt_a_cast_01), new DAV_BossSkill("Erethon", "Poison Blast", 1f, 3));  //%thorns?
  274.  
  275.             // Eskandiel
  276.             // Good Skills
  277.             BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_cast), new DAV_BossSkill("Eskandiel", "Repulsion Wave", 1f, 3)); //%thorns?
  278.             // Normal Skills
  279.             BossSkill_List.Add(new DAV_KeyAnime("Eskandiel", AnimSnoEnum._x1_dark_angel_attack_02), new DAV_BossSkill("Eskandiel", "Vortex", 1f, 11, "", "Only used when players are beyond 25 yards"));
  280.             BossActor_List.Add(new DAV_KeyActor("Eskandiel", ActorSnoEnum._arcaneenchanteddummy_spawn), new DAV_BossSkill("Eskandiel", "Arcane", 1f, 4, "", ""));
  281.  
  282.             // Hamelin
  283.             // Normal Skills
  284.             BossActor_List.Add(new DAV_KeyActor("Hamelin", ActorSnoEnum._p4_ratking_thunderdome_proxyactor), new DAV_BossSkill("Hamelin", "Plagued Arena", 1f, 12, "", "Lasts for 10s"));
  285.             // headbutt has no unique animation
  286.  
  287.             // Infernal Maiden
  288.             // Good Skills
  289.             BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_04_aoe), new DAV_BossSkill("Infernal Maiden", "Overhead Smash", 1f, 14, "", "> Procs 2 tick of thorns @ 100%/tick"));
  290.             BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_360_01), new DAV_BossSkill("Infernal Maiden", "Spinning Attack", 1f, 11, "", "> Procs 4 tick of thorns @ 50%/tick"));
  291.             // Normal Skills
  292.             BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_attack_special_flip_01), new DAV_BossSkill("Infernal Maiden", "Fire Nova", 0.45f, 25, "", "> Unlocks at 45% HP\n> Insignificant thorns effect against this skill"));
  293.             BossSkill_List.Add(new DAV_KeyAnime("Infernal Maiden", AnimSnoEnum._x1_deathmaiden_temp_cast_01), new DAV_BossSkill("Infernal Maiden", "Teleport", 1f, 7));
  294.  
  295.             // Man Carver
  296.             // Good Skills
  297.             BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_charge_01_in), new DAV_BossSkill("Man Carver", "Charge", 1f, 19)); //%thorns?
  298.             BossActor_List.Add(new DAV_KeyActor("Man Carver", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_fire_10foot), new DAV_BossSkill("Man Carver", "Mark of Fire", 1f, 12, "", "> 10-yard radius, lasts 15s")); //%thorns?
  299.             BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_fanofchains), new DAV_BossSkill("Man Carver", "Fan of Spears", 0.75f, 12, "", "> Unlocks at 75% HP")); //%thorns?
  300.             // Normal Skills
  301.             BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_05_telegraph), new DAV_BossSkill("Man Carver", "Heavy Smash", 1f, 11));
  302.             BossSkill_List.Add(new DAV_KeyAnime("Man Carver", AnimSnoEnum._butcher_attack_chain_01_in), new DAV_BossSkill("Man Carver", "Sickle Grab", 0.5f, 12, "", "> Unlocks at 50% HP"));
  303.  
  304.             // Orlash
  305.             // needs work: skills on cooldowns in a difficult pattern
  306.  
  307.             // Perdition
  308.             // Good Skills
  309.             BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_energyblast), new DAV_BossSkill("Perdition", "Blade Cleave", 1f, 1, "", "> Procs 1 tick of thorns @ 100%/tick"));
  310.             // Normal Skills
  311.             BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_attack_teleport_full), new DAV_BossSkill("Perdition", "Blink Strike", 1f, 11, "Stun to interrupt", "> Procs 1 tick of thorns @ 100%/tick"));
  312.             BossSkill_List.Add(new DAV_KeyAnime("Perdition", AnimSnoEnum._lordofdespair_spellcast), new DAV_BossSkill("Perdition", "Volley", 1f, 11, "", "> Only used when players are beyond 5 yards\n> Procs 1 tick of thorns @ 33%/tick"));
  313.  
  314.             // Perendi
  315.             // Good Skills
  316.             BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._x1_lr_boss_malletdemon_fallingrocks), new DAV_BossSkill("Perendi", "Cave In", 1f, 5, "Stun for Krysbins", "> Only used when there is enough space\n> Procs 3 ticks of thorns @ 25%/tick)"));
  317.             // Normal Skills
  318.             BossActor_List.Add(new DAV_KeyActor("Perendi", ActorSnoEnum._coreelitedemon_b_lr_boss), new DAV_BossSkill("Perendi", "Summoning", 1f, 6)); // needs work: more frequent on enrage?
  319.  
  320.             // Raiziel
  321.             // Good Skills
  322.             BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_firebomb_01), new DAV_BossSkill("Raiziel", "Lightning Orb", 1f, 3, "Stun for Krysbins", "> Only used when players are beyond 5 yards")); //%thorns?
  323.             // Normal Skills
  324.             BossSkill_List.Add(new DAV_KeyAnime("Raiziel", AnimSnoEnum._x1_sniperangel_temp_cast_01), new DAV_BossSkill("Raiziel", "Holy Bolt Nova", 0.75f, 8, "", "> Volley of 7 holy dmg bolts (wide arc) when below 75% HP\n> Volley of 13 holy dmg bolts (360) when below 25% HP"));
  325.  
  326.             // Rime
  327.             // Good Skills
  328.             BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_10foot), new DAV_BossSkill("Rime", "Frost Pools", 1f, 6, "", "> Procs 1 tick of thorns @ 100%/tick"));
  329.             // Normal Skills
  330.             BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_aoe_dot_cold_20foot), new DAV_BossSkill("Rime", "Frost Ring", 1f, 6, "", "> Procs 1 tick of thorns @ 100%/tick"));
  331.             BossActor_List.Add(new DAV_KeyActor("Rime", ActorSnoEnum._x1_unique_monster_generic_projectile_cold), new DAV_BossSkill("Rime", "Volley", 1f, 6, "", ""));
  332.  
  333.             // Sand Shaper
  334.             // Good Skills
  335.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_direct_cast_04), new DAV_BossSkill("Sand Shaper", "Fire Ball", 1f, 3)); //%thorns?
  336.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_aoe_01), new DAV_BossSkill("Sand Shaper", "Cave In", 0.65f, 9, "Stun for Krysbins", "> Unlocks at 65% HP, unavailable after 40% HP")); // change by DAV 75% HP to 65% HP @DAV Cave In is locked after 40%, can you code this in? //%thorns?
  337.             // Normal Skills
  338.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_taunt_01), new DAV_BossSkill("Sand Shaper", "Taunt", 1f, 8));
  339.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_05_fadeout), new DAV_BossSkill("Sand Shaper", "Teleport", 1f, 7));
  340.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_01), new DAV_BossSkill("Sand Shaper", "Twister", 0.75f, 5, "", "> Unlocks at 75% HP"));
  341.             BossSkill_List.Add(new DAV_KeyAnime("Sand Shaper", AnimSnoEnum._zoltunkulle_omni_cast_04), new DAV_BossSkill("Sand Shaper", "Slow Time", 0.65f, 13, "", "> Unlocks at 65% HP"));
  342.  
  343.             // Saxtris
  344.             // Normal Skills
  345.             BossActor_List.Add(new DAV_KeyActor("Saxtris", ActorSnoEnum._zoltunkulle_energytwister), new DAV_BossSkill("Saxtris", "Twister", 1f, 8, "", "> Lasts 30s"));
  346.             BossSkill_List.Add(new DAV_KeyAnime("Saxtris", AnimSnoEnum._snakeman_melee_generic_cast_01), new DAV_BossSkill("Saxtris", "Summoning", 0.75f, 1, "", "> Winged Larvae unlocks at 75% HP\n > Snakechild unlocks at 50% HP\n> Caps at two full sets"));
  347.  
  348.             // StoneSinger
  349.             // Good Skills
  350.             BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonster_temp_rock_throw), new DAV_BossSkill("Stonesinger", "Shovel", 1f, 2)); //%thorns?
  351.             // Normal Skills
  352.             BossSkill_List.Add(new DAV_KeyAnime("Stonesinger", AnimSnoEnum._sandmonsterblack_attack_03_sandwall), new DAV_BossSkill("Stonesinger", "Summoning", 1f, 7));
  353.  
  354.             // Tethrys
  355.             // Good Skills
  356.             BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_adria_geyser), new DAV_BossSkill("Tethrys", "Geyser", 0.6f, 9, "Stun for Krysbins", "> Unlocks at 60% HP\n> 4 pools")); //%thorns?
  357.             // Normal Skills
  358.             BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._x1_unique_monster_generic_projectile_fire), new DAV_BossSkill("Tethrys", "Fire Ball", 1f, 3));  // Unpredictable; needs further testing
  359.             BossActor_List.Add(new DAV_KeyActor("Tethrys", ActorSnoEnum._succubus_bloodstar_projectile), new DAV_BossSkill("Tethrys", "Blood Star", 1f, 9)); // Unpredictable; needs further testing
  360.  
  361.             // The Binder
  362.             // Good Skills
  363.             BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_poison), new DAV_BossSkill("The Binder", "Poison Spit", 0.65f, 3, "", "> Unlocks at 65% HP")); //%thorns?
  364.             // Normal Skills
  365.             BossSkill_List.Add(new DAV_KeyAnime("The Binder", AnimSnoEnum._mistressofpain_attack_spellcast_summon_webpatch), new DAV_BossSkill("The Binder", "Net Toss", 1f, 8, "", "> Insignificant thorns effect against this skill"));
  366.  
  367.             // The Choker
  368.             // Good Skills
  369.             BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_taunt_01), new DAV_BossSkill("The Choker", "Plagued Circle", 0.75f, 19, "Stun for Krysbins", "> Unlocks at 75% HP")); //%thorns?
  370.             // Normal Skills
  371.             BossSkill_List.Add(new DAV_KeyAnime("The Choker", AnimSnoEnum._x1_squigglet_generic_cast), new DAV_BossSkill("The Choker", "Summoning", 1f, 4, "", "> Slimes (100%),\n> Caps at 10"));
  372.  
  373.             // Vesalius
  374.             // Good Skills
  375.             BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_cast_02), new DAV_BossSkill("Vesalius", "Energy Barrage", 1f, 1)); //%thorns?
  376.             // Normal Skills
  377.             BossSkill_List.Add(new DAV_KeyAnime("Vesalius", AnimSnoEnum._p6_envy_teleport_start_02), new DAV_BossSkill("Vesalius", "Gateway", 1f, 12, "Stun to interrupt"));
  378.             BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_frozenpulse_monster), new DAV_BossSkill("Vesalius", "Frozen Pulse", 1f, 6, "", ""));
  379.             BossActor_List.Add(new DAV_KeyActor("Vesalius", ActorSnoEnum._x1_monsteraffix_teleportmines), new DAV_BossSkill("Vesalius", "Wormhole", 1f, 9, "", ""));
  380.  
  381.             // Voracity
  382.             // Good Skills
  383.             BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_areaeffect), new DAV_BossSkill("Voracity", "Fart Cloud", 1f, 11, "", "> Stun just before Skeletons enter Fart Cloud for Krysbins\n> Procs 1 tick of thorns per Cloud, per entry @ 20%/tick"));
  384.             // Normal Skills
  385.             BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_sneeze), new DAV_BossSkill("Voracity", "Vile Spew", 0.4f, 4, "", "> Unlocks at 40% HP\n> Procs 1 tick of thorns @ 33%/tick"));
  386.             BossSkill_List.Add(new DAV_KeyAnime("Voracity", AnimSnoEnum._gluttony_attack_ranged_01), new DAV_BossSkill("Voracity", "Summoning", 0.65f, 6, "", "> Acid Slime (65%),\ncaps at 4"));
  387.             */
  388.         }
  389.  
  390.         public void PaintWorld(WorldLayer layer) {
  391.             if (Hud.Game.SpecialArea != SpecialArea.GreaterRift) return ;
  392.             if (Hud.Game.RiftPercentage < 100) return;
  393.  
  394.             float bosslife = 1f;
  395.             var bosses = Hud.Game.AliveMonsters.Where(m => m.Rarity == ActorRarity.Boss && m.SummonerAcdDynamicId == 0);
  396.             foreach(IMonster m in bosses) {
  397.                 if (!BossFlight) {
  398.                     BossFlight = true;
  399.                     BossSkill_This.Clear();
  400.                     BossActor_This.Clear();
  401.                     preSkill.BossAnime = AnimSnoEnum._p7_cos_pet_azmodan_walk;
  402.                     thisActor.BossActor = ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm;
  403.  
  404.                     preSkill.Name = m.SnoMonster.NameEnglish;
  405.                     thisActor.Name = m.SnoMonster.NameEnglish;
  406.                     var curTime = Hud.Game.CurrentGameTick / 60d;
  407.                     foreach(KeyValuePair<DAV_KeyAnime, DAV_BossSkill> BossSkill in BossSkill_List)
  408.                         if(BossSkill.Value.Name == m.SnoMonster.NameEnglish)
  409.                             BossSkill_This.Add(BossSkill.Key.BossAnime, curTime - BossSkill.Value.CooldownTime);
  410.  
  411.                     foreach(KeyValuePair<DAV_KeyActor, DAV_BossSkill> BossActor in BossActor_List)
  412.                         if(BossActor.Value.Name == m.SnoMonster.NameEnglish)
  413.                             BossActor_This.Add(BossActor.Key.BossActor, curTime - BossActor.Value.CooldownTime);
  414.                 }
  415.                 bosslife = (float) (m.CurHealth / m.MaxHealth);
  416.                 if (bosslife < 0 || bosslife > 1)
  417.                     bosslife = 1;
  418.  
  419.                 if (m.Animation == preSkill.BossAnime) continue;
  420.  
  421.                 preSkill.BossAnime = m.Animation;
  422.                 if (!BossSkill_List.ContainsKey(preSkill)) continue;
  423.  
  424.                 var cTime = Hud.Game.CurrentGameTick / 60d;
  425.                 if (showDebug) {
  426.                     var tmplist = BossSkill_List[preSkill];
  427.                     var curCD = (tmplist.ChangeCD && bosslife < tmplist.ChangeCD_time) ? tmplist.ChangeCD_valve : tmplist.CooldownTime;
  428.                     BossSkill_List[preSkill].CooldownDebug = cTime - BossSkill_This[preSkill.BossAnime] - curCD;
  429.                 }
  430.                 BossSkill_This[preSkill.BossAnime] = cTime;
  431.             }
  432.  
  433.             if (!BossFlight) return;
  434.  
  435.             var yref = YPos;
  436.             if (BossSkill_This.Count > 0) {
  437.                 var tmpanime = new DAV_KeyAnime(preSkill.Name, AnimSnoEnum._p7_cos_pet_azmodan_walk);
  438.                 foreach(KeyValuePair<AnimSnoEnum, double> BossCD in BossSkill_This) {
  439.                     tmpanime.BossAnime = BossCD.Key;
  440.                     BossSkillPaint(BossSkill_List[tmpanime], BossCD.Value, bosslife, ref yref);
  441.                 }
  442.             }
  443.  
  444.             if (BossActor_This.Count == 0) return;
  445.             var bossActor = Hud.Game.Actors.Where(a => a.LastSpeak == null && BossActor_This.ContainsKey(a.SnoActor.Sno));
  446.             foreach (var actor in bossActor) {
  447.                 var cTime = Hud.Game.CurrentGameTick / 60d;
  448.                 thisActor.BossActor = actor.SnoActor.Sno;
  449.                 if (showDebug) {
  450.                     var tmplist = BossActor_List[thisActor];
  451.                     var curCD = (tmplist.ChangeCD && bosslife < tmplist.ChangeCD_time) ? tmplist.ChangeCD_valve : tmplist.CooldownTime;
  452.                     BossActor_List[thisActor].CooldownDebug = cTime - BossActor_This[actor.SnoActor.Sno] - curCD;
  453.                 }
  454.                 actor.LastSpeak = Hud.Time.CreateWatch();
  455.                 BossActor_This[actor.SnoActor.Sno] = cTime;
  456.             }
  457.  
  458.             var tmpactor = new DAV_KeyActor(thisActor.Name, ActorSnoEnum._p7_cos_wings_cosmic_bat_01_wdm);
  459.             foreach(KeyValuePair<ActorSnoEnum, double> BossCD in BossActor_This) {
  460.                 tmpactor.BossActor = BossCD.Key;
  461.                 BossSkillPaint(BossActor_List[tmpactor], BossCD.Value, bosslife, ref yref);
  462.             }
  463.         }
  464.  
  465.         public void OnNewArea(bool newGame, ISnoArea area) {
  466.             BossFlight = false;
  467.         }
  468.  
  469.         public void BossSkillPaint(DAV_BossSkill skillData, double preCDvalue, float bosslife, ref float yref) {
  470.             if (skillData == null || string.IsNullOrEmpty(skillData.SkillName)) return;
  471.  
  472.             var text = skillData.SkillName;
  473.             if (!string.IsNullOrEmpty(skillData.HintShort))
  474.                 text += " (" + skillData.HintShort + ")";
  475.             var textLayout = SkillFont.GetTextLayout(text);
  476.             SkillFont.DrawText(text, XPos, yref);
  477.  
  478.             var rect = new RectangleF(XPos, yref, barW, barH + textLayout.Metrics.Height * 1.2f);
  479.             yref += textLayout.Metrics.Height * 1.2f;
  480.  
  481.             if (bosslife > skillData.AvailableTime) {
  482.                 Brush_NA.DrawRectangle(XPos, yref, barW, barH);
  483.                 text = "Ready at Life " + skillData.AvailableTime.ToString("0%");
  484.             }
  485.             else {
  486.                 var curCD = (skillData.ChangeCD && bosslife < skillData.ChangeCD_time) ? skillData.ChangeCD_valve : skillData.CooldownTime;
  487.                 var skillCD = curCD - (Hud.Game.CurrentGameTick / 60d - preCDvalue);
  488.                 if (skillCD < 0) {
  489.                     Brush_Ready.DrawRectangle(XPos, yref, barW, barH);
  490.                     text = "Ready to Cast";
  491.                 }
  492.                 else {
  493.                     Brush_BG.DrawRectangle(XPos, yref, barW, barH);
  494.                     Brush_CD.DrawRectangle(XPos, yref, (float) (barW * skillCD / curCD), barH);
  495.                     text = skillCD.ToString(CDformat) + "s";
  496.                 }
  497.             }
  498.  
  499.             textLayout = SkillFont.GetTextLayout(text);
  500.             SkillFont.DrawText(text, XPos + 3, yref + (barH - textLayout.Metrics.Height)/2);
  501.             if (showDebug) SkillFont.DrawText(skillData.CooldownDebug.ToString("F1") + "s | life: " + bosslife.ToString("F2"), XPos + 3 + barW, yref + (barH - textLayout.Metrics.Height)/2);
  502.             yref += barH * 1.3f;
  503.  
  504.             if (!string.IsNullOrEmpty(skillData.HintHided) && Hud.Window.CursorInsideRect(rect.X, rect.Y, rect.Width, rect.Height))
  505.                 Hud.Render.SetHint(skillData.HintHided);
  506.         }
  507.     }
  508.  
  509.     public class DAV_KeyActor {
  510.         public string Name { get; set; }
  511.         public ActorSnoEnum BossActor { get; set; }
  512.  
  513.         public DAV_KeyActor(string name, ActorSnoEnum actor) {
  514.             Name = name;
  515.             BossActor = actor;
  516.         }
  517.  
  518.         public class EqualityComparer : IEqualityComparer<DAV_KeyActor> {
  519.             public bool Equals(DAV_KeyActor x, DAV_KeyActor y) { return x.Name == y.Name && x.BossActor == y.BossActor; }
  520.             public int GetHashCode(DAV_KeyActor obj) {
  521.                 string combined = obj.Name + "|" + obj.BossActor.ToString();
  522.                 return combined.GetHashCode();
  523.             }
  524.         }
  525.     }
  526.  
  527.     public class DAV_KeyAnime {
  528.         public string Name { get; set; }
  529.         public AnimSnoEnum BossAnime { get; set; }
  530.  
  531.         public DAV_KeyAnime(string name, AnimSnoEnum anime) {
  532.             Name = name;
  533.             BossAnime = anime;
  534.         }
  535.  
  536.         public class EqualityComparer : IEqualityComparer<DAV_KeyAnime> {
  537.             public bool Equals(DAV_KeyAnime x, DAV_KeyAnime y) { return x.Name == y.Name && x.BossAnime == y.BossAnime; }
  538.             public int GetHashCode(DAV_KeyAnime obj) {
  539.                 string combined = obj.Name + "|" + obj.BossAnime.ToString();
  540.                 return combined.GetHashCode();
  541.             }
  542.         }
  543.     }
  544.  
  545.     public class DAV_BossSkill {
  546.         public string Name { get; set; }
  547.         public string SkillName { get; set; }
  548.         public string HintShort { get; set; }
  549.         public string HintHided { get; set; }
  550.         public float AvailableTime { get; set; }
  551.         public double CooldownTime { get; set; }
  552.         public double CooldownDebug { get; set; }
  553.  
  554.         public bool ChangeCD { get; set; }
  555.         public float ChangeCD_time { get; set; }
  556.         public double ChangeCD_valve { get; set; }
  557.  
  558.         public DAV_BossSkill(string name, string skill, float life, double CD, string Desc = "", string hideMsg = "") {
  559.             Name = name;
  560.             SkillName = skill;
  561.             HintShort = Desc;
  562.             HintHided = hideMsg;
  563.             AvailableTime = life;
  564.             CooldownTime = CD;
  565.             CooldownDebug = 0d;
  566.             ChangeCD = false;
  567.         }
  568.  
  569.         public void AddSecendCD(float life, double CD) {
  570.             ChangeCD = true;
  571.             ChangeCD_time = life;
  572.             ChangeCD_valve = CD;
  573.         }
  574.     }
  575. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement