From f863f142906d82b45bee1b5c51cdaeff13c8bf29 Mon Sep 17 00:00:00 2001 From: BotoX Date: Sun, 26 Feb 2017 01:11:04 +0100 Subject: [PATCH] Add BossHP --- .../bosshp/ZE_FFVII_Mako_Reactor_V6_B08.cfg | 39 + .../bosshp/ze_FFVII_Mako_Reactor_v5_3.cfg | 43 + .../bosshp/ze_FFXII_Paramina_Rift_v1_4.cfg | 120 ++ .../bosshp/ze_FFXII_Westersand_v8zeta1.cfg | 118 ++ .../bosshp/ze_Pirates_Port_Royal_v3_6.cfg | 59 + BossHP/configs/bosshp/ze_dark_souls_v2.cfg | 61 + .../bosshp/ze_ffvii_cosmo_canyon_v5c3.cfg | 74 + .../bosshp/ze_lotr_minas_tirith_v2_2fix.cfg | 42 + .../bosshp/ze_lotr_minas_tirith_v3_5.cfg | 42 + BossHP/configs/bosshp/ze_parkers_pit_b8.cfg | 11 + .../bosshp/ze_pirates_port_royal_v5_4s2.cfg | 59 + .../configs/bosshp/ze_portal_story_v3_2.cfg | 11 + .../bosshp/ze_predator_ultimate_v3.cfg | 89 ++ BossHP/configs/bosshp/ze_random_v9.cfg | 11 + BossHP/configs/bosshp/ze_shroomforest3_b2.cfg | 110 ++ BossHP/configs/bosshp/ze_shroomforest3_b3.cfg | 107 ++ .../configs/bosshp/ze_tesv_skyrim_v4fix.cfg | 59 + BossHP/scripting/BossHP.sp | 1198 +++++++++++++++++ BossHP/scripting/CBoss.inc | 271 ++++ BossHP/scripting/CConfig.inc | 321 +++++ BossHP/scripting/include/basic.inc | 1 + BossHP/scripting/include/outputinfo.inc | 1 + 22 files changed, 2847 insertions(+) create mode 100644 BossHP/configs/bosshp/ZE_FFVII_Mako_Reactor_V6_B08.cfg create mode 100644 BossHP/configs/bosshp/ze_FFVII_Mako_Reactor_v5_3.cfg create mode 100644 BossHP/configs/bosshp/ze_FFXII_Paramina_Rift_v1_4.cfg create mode 100644 BossHP/configs/bosshp/ze_FFXII_Westersand_v8zeta1.cfg create mode 100644 BossHP/configs/bosshp/ze_Pirates_Port_Royal_v3_6.cfg create mode 100644 BossHP/configs/bosshp/ze_dark_souls_v2.cfg create mode 100644 BossHP/configs/bosshp/ze_ffvii_cosmo_canyon_v5c3.cfg create mode 100644 BossHP/configs/bosshp/ze_lotr_minas_tirith_v2_2fix.cfg create mode 100644 BossHP/configs/bosshp/ze_lotr_minas_tirith_v3_5.cfg create mode 100644 BossHP/configs/bosshp/ze_parkers_pit_b8.cfg create mode 100644 BossHP/configs/bosshp/ze_pirates_port_royal_v5_4s2.cfg create mode 100644 BossHP/configs/bosshp/ze_portal_story_v3_2.cfg create mode 100644 BossHP/configs/bosshp/ze_predator_ultimate_v3.cfg create mode 100644 BossHP/configs/bosshp/ze_random_v9.cfg create mode 100644 BossHP/configs/bosshp/ze_shroomforest3_b2.cfg create mode 100644 BossHP/configs/bosshp/ze_shroomforest3_b3.cfg create mode 100644 BossHP/configs/bosshp/ze_tesv_skyrim_v4fix.cfg create mode 100644 BossHP/scripting/BossHP.sp create mode 100644 BossHP/scripting/CBoss.inc create mode 100644 BossHP/scripting/CConfig.inc create mode 120000 BossHP/scripting/include/basic.inc create mode 120000 BossHP/scripting/include/outputinfo.inc diff --git a/BossHP/configs/bosshp/ZE_FFVII_Mako_Reactor_V6_B08.cfg b/BossHP/configs/bosshp/ZE_FFVII_Mako_Reactor_V6_B08.cfg new file mode 100644 index 00000000..0b383cdd --- /dev/null +++ b/BossHP/configs/bosshp/ZE_FFVII_Mako_Reactor_V6_B08.cfg @@ -0,0 +1,39 @@ +"bosses" +{ + "0" // Easy, Normal, Hard: Scorpion + { + "name" "Scorpion" + "method" "hpbar" + "trigger" "Boss_Scorpion_Relay:OnUser1" + + "iterator" "HPCounterIterator" + "counter" "HPCounter" + "backup" "HPCounterBackUp" + } + "1" // Extreme, Insane: Bahamut + { + "name" "Bahamut" + "method" "hpbar" + "trigger" "Boss_Bahamut_Relay:OnUser1" + + "iterator" "HPCounterIterator" + "counter" "HPCounter" + "backup" "HPCounterBackUp" + } + "2" // Insane: 2nd Bahamut @ Bridge + { + "name" "Bahamut" + "method" "breakable" + "trigger" "Sephiroth_Final_HP_Counter:OnStartTouch" + + "breakable" "Final_Fulgor_Breakable" + } + "3" // Insane: Sephiroth @ Bridge + { + "name" "Sephiroth" + "method" "breakable" + "trigger" "Final_Fulgor_Breakable:OnBreak" + + "breakable" "Sephiroth_Final_Breakable" + } +} diff --git a/BossHP/configs/bosshp/ze_FFVII_Mako_Reactor_v5_3.cfg b/BossHP/configs/bosshp/ze_FFVII_Mako_Reactor_v5_3.cfg new file mode 100644 index 00000000..5ddcd490 --- /dev/null +++ b/BossHP/configs/bosshp/ze_FFVII_Mako_Reactor_v5_3.cfg @@ -0,0 +1,43 @@ +"bosses" +{ + "0" // Normal: Crab? + { + "name" "Scorpion" + "method" "breakable" + "trigger" "calcVidaM:OnStartTouch" + + "breakable" "Monstruo_Breakable" + } + "1" // Hard, Extreme, Extreme 2: Bahamut + { + "name" "Bahamut" + "method" "counter" + "trigger" "calcVidaD:OnStartTouch" + + "counter" "bahamut_vida" + } + "2" // Hard, Extreme: Moving Sephiroth @ Bridge + { + "name" "Sephiroth" + "method" "breakable" + "trigger" "puertafinal:OnStartTouch" + + "breakable" "glassT" + } + "3" // Extreme 2: 2nd Bahamut @ Bridge + { + "name" "Bahamut" + "method" "breakable" + "trigger" "baha_vida:OnStartTouch" + + "breakable" "bahamutend" + } + "4" // Extreme 2: Sephiroth @ Bridge + { + "name" "Sephiroth" + "method" "breakable" + "trigger" "baha_vida2:OnStartTouch" + + "breakable" "bahamutend1" + } +} diff --git a/BossHP/configs/bosshp/ze_FFXII_Paramina_Rift_v1_4.cfg b/BossHP/configs/bosshp/ze_FFXII_Paramina_Rift_v1_4.cfg new file mode 100644 index 00000000..8792ba9a --- /dev/null +++ b/BossHP/configs/bosshp/ze_FFXII_Paramina_Rift_v1_4.cfg @@ -0,0 +1,120 @@ +"bosses" +{ + "-1" + { + "name" "Tower" + "method" "breakable" + "trigger" "Rift_Tower_1:OnHealthChanged" + "breakable" "Rift_Tower_1" + "timeout" "3" + } + "-2" + { + "name" "Tower" + "method" "breakable" + "trigger" "Rift_Tower_2:OnHealthChanged" + "breakable" "Rift_Tower_2" + "timeout" "3" + } + "-3" + { + "name" "Tower" + "method" "breakable" + "trigger" "Rift_Tower_3:OnHealthChanged" + "breakable" "Rift_Tower_3" + "timeout" "3" + } + "-4" + { + "name" "Tower" + "method" "breakable" + "trigger" "Rift_Tower_4:OnHealthChanged" + "breakable" "Rift_Tower_4" + "timeout" "3" + } + "-5" + { + "name" "Tower" + "method" "breakable" + "trigger" "Rift_Tower_5:OnHealthChanged" + "breakable" "Rift_Tower_5" + "timeout" "3" + } + "-6" + { + "name" "Tower" + "method" "breakable" + "trigger" "Rift_Tower_6:OnHealthChanged" + "breakable" "Rift_Tower_6" + "timeout" "3" + } + + "-7" + { + "name" "Frozen lake" + "method" "breakable" + "trigger" "Forest_BreakGlass:OnTakeDamage" + "breakable" "Forest_BreakGlass" + } + + "-8" + { + "name" "Statue puzzle" + "method" "counter" + "trigger" "Temple_Randomizer:OnCase02" + "counter" "Temple_Puzzle_Counter" + } + "-9" + { + "name" "Button puzzle" + "method" "counter" + "trigger" "Temple_Randomizer:OnCase01" + "counter" "Temple_Puzzle_BtnCount" + } + "0" + { + "name" "Mateus" + "method" "hpbar" + "trigger" "Boss_Hurt_Hpadd:OnStartTouch" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } +// "1" +// { +// "name" "Minion" +// "method" "counter" +// "trigger" "Boss_Minion_Maker:OnEntitySpawned" +// "multitrigger" "1" +// "namefixup" "1" +// +// "counter" "Minion_Health" +// } + "2" + { + "name" "Chaos" + "method" "hpbar" + "trigger" "Forest_Puzzle_Temp:OnEntitySpawned" + + "iterator" "Chaos_Overlay_Counter" + "counter" "Chaos_Health" + "backup" "Chaos_Health_Init" + } + "3" + { + "name" "Mateus" + "method" "counter" + "trigger" "Fin_Boss_Temp:OnEntitySpawned" + + "counter" "Fin_Boss_Counter" + } + "4" + { + "name" "Gabranth" + "method" "counter" + "trigger" "Guardian_Temp:OnEntitySpawned" + + "counter" "Guardian_Counter" + } +} diff --git a/BossHP/configs/bosshp/ze_FFXII_Westersand_v8zeta1.cfg b/BossHP/configs/bosshp/ze_FFXII_Westersand_v8zeta1.cfg new file mode 100644 index 00000000..8d25fbe7 --- /dev/null +++ b/BossHP/configs/bosshp/ze_FFXII_Westersand_v8zeta1.cfg @@ -0,0 +1,118 @@ +"bosses" +{ + "0" + { + "name" "Dragon" + "method" "hpbar" + "trigger" "Boss_Temp:OnEntitySpawned" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } + "1" + { + "name" "Dragon" + "method" "hpbar" + "trigger" "Ehe_Dragon_Temp:OnEntitySpawned" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } + "2" + { + "name" "Belias" + "method" "hpbar" + "trigger" "Belias_Hp_To_Boss:OnEntitySpawned" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } + "3" + { + "name" "Gabranth" + "method" "hpbar" + "trigger" "Judge_Temp:OnEntitySpawned" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } + "4" + { + "name" "Gabranth" + "method" "hpbar" + "trigger" "Guard_Temp_Boss:OnEntitySpawned" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } + "5" + { + "name" "Chaos" + "method" "hpbar" + "trigger" "Chaos_Hp_To_Boss:OnStartTouch" + + "iterator" "Boss_Overlay_Counter" + "counter" "Boss_Health" + "backup" "Boss_Health_Init" + } + "6" + { + "name" "Esper Belias" + "method" "counter" + "trigger" "Espers_Temp_Belias:OnEntitySpawned" + "multitrigger" "1" + + "counter" "Espers_Belias_Counter" + } + "7" + { + "name" "Esper Chaos" + "method" "counter" + "trigger" "Espers_Temp_Chaos:OnEntitySpawned" + "multitrigger" "1" + + "counter" "Espers_Chaos_Counter" + } + "8" + { + "name" "Esper Mateus" + "method" "counter" + "trigger" "Espers_Temp_Mateus:OnEntitySpawned" + "multitrigger" "1" + + "counter" "Espers_Mateus_Counter" + } + + "9" + { + "name" "Esper Belias" + "method" "breakable" + "trigger" "Summon_Belias_Temp:OnEntitySpawned" + "multitrigger" "1" + + "breakable" "Belias_Summon_Physbox" + } + "10" + { + "name" "Esper Chaos" + "method" "breakable" + "trigger" "Summon_Chaos_Temp:OnEntitySpawned" + "multitrigger" "1" + + "breakable" "Chaos_Summon_Physbox" + } + "11" + { + "name" "Esper Mateus" + "method" "breakable" + "trigger" "Summon_Mateus_Temp:OnEntitySpawned" + "multitrigger" "1" + + "breakable" "Mateus_Summon_Physbox" + } +} diff --git a/BossHP/configs/bosshp/ze_Pirates_Port_Royal_v3_6.cfg b/BossHP/configs/bosshp/ze_Pirates_Port_Royal_v3_6.cfg new file mode 100644 index 00000000..531fd28e --- /dev/null +++ b/BossHP/configs/bosshp/ze_Pirates_Port_Royal_v3_6.cfg @@ -0,0 +1,59 @@ +"bosses" +{ + "0" // Stage 2 + { + "name" "Cannon" + "method" "hpbar" + "trigger" "delo_boss_hity:OnStartTouch" + + "iterator" "boss_hp_iterations" + "counter" "delo_counter" + "backup" "boss_hp_backup" + } + "1" // Stage 3 + { + "name" "Pirate" + "method" "hpbar" + "trigger" "pirate_add_hit:OnStartTouch" + + "iterator" "pirate_hp_iterations" + "counter" "pirate_counter" + "backup" "pirate_hp_backup" + } + "2" // Stage 4 + { + "name" "Barbossa" + "method" "hpbar" + "trigger" "barbossa2_pocty:OnStartTouch" + + "iterator" "barbossa_hp_iterations" + "counter" "barbossa_counter" + "backup" "barbossa_hp_backup" + } + "3" // Stage 5 + { + "name" "Kraken" + "method" "hpbar" + "trigger" "kraken_multipl:OnStartTouch" + + "iterator" "kraken_hp_iterations" + "counter" "kraken_counter" + "backup" "kraken_hp_backup" + } + "4" + { + "name" "Barbossa" + "method" "counter" + "trigger" "final_barbossa_hity:OnStartTouch" + + "counter" "final_barbossa_counter" + } + "5" + { + "name" "Barbossa" + "method" "counter" + "trigger" "bb_pocty:OnStartTouch" + + "counter" "final_barbossa_counter2" + } +} \ No newline at end of file diff --git a/BossHP/configs/bosshp/ze_dark_souls_v2.cfg b/BossHP/configs/bosshp/ze_dark_souls_v2.cfg new file mode 100644 index 00000000..44254d99 --- /dev/null +++ b/BossHP/configs/bosshp/ze_dark_souls_v2.cfg @@ -0,0 +1,61 @@ +"bosses" +{ + "0" // Stray Demon + { + "name" "Stray Demon" + "method" "counter" + "trigger" "Asylum_Demon_HP_Add:OnStartTouch" + + "counter" "Asylum_Demon_Counter" + } + "1" // Old Witch + { + "name" "Old Witch" + "method" "counter" + "trigger" "Broadhead_HP_Add:OnStartTouch" + + "counter" "Broadhead_Counter" + } + "2" // Golem + { + "name" "Golem" + "method" "counter" + "trigger" "Golem_Boss_Push_HP:OnStartTouch" + + "counter" "Golem_Counter" + } + "3" // Gwyndolin / Ornstein + { + "name" "Gwyndolin" + "method" "counter" + "trigger" "Gwyndolin_Push_HP:OnStartTouch" + "killtrigger" "Phase2_Add_HP:OnStartTouch" + + "counter" "Gwyndolin_Counter" + } + "4" + { + "name" "Ornstein" + "method" "counter" + "trigger" "Gwyndolin_Push_HP:OnStartTouch" + "killtrigger" "Phase2_Add_HP:OnStartTouch" + + "counter" "2Ornstein_Counter" + } + "5" + { + "name" "Phase 2" + "method" "counter" + "trigger" "Phase2_Add_HP:OnStartTouch" + + "counter" "Phase2_Counter" + } + "6" // Gwyn + { + "name" "Gwyn" + "method" "counter" + "trigger" "Gwyn_Push_HP:OnStartTouch" + + "counter" "Gwyn_Counter" + } +} \ No newline at end of file diff --git a/BossHP/configs/bosshp/ze_ffvii_cosmo_canyon_v5c3.cfg b/BossHP/configs/bosshp/ze_ffvii_cosmo_canyon_v5c3.cfg new file mode 100644 index 00000000..bd08b91b --- /dev/null +++ b/BossHP/configs/bosshp/ze_ffvii_cosmo_canyon_v5c3.cfg @@ -0,0 +1,74 @@ +"bosses" +{ + "0" + { + "name" "Gi Nattak" + "method" "hpbar" + "trigger" "Hold7_Trigger:OnTrigger:35" + + "iterator" "Special_HealthCount" + "counter" "Special_Health" + "backup" "Special_HealthInit" + } + "1" + { + "name" "Bomb" + "method" "counter" + "trigger" "Hard_End:OnTrigger" + + "counter" "lvl2_Gi_Nattak_Counter" + } + "3" + { + "name" "Ifrit" + "method" "counter" + "trigger" "Hojo_Temp:OnEntitySpawned" + + "counter" "lvl2_Gi_Nattak_Counter" + } + "4" + { + "name" "Genesis" + "method" "hpbar" + "trigger" "Shinra_Elevator_Path_3:OnPass" + + "iterator" "Special_HealthCount" + "counter" "Special_Health" + "backup" "Special_HealthInit" + } + "5" + { + "name" "Ifrit" + "method" "counter" + "trigger" "Shinra_Ifrit_Phys:OnTakeDamage" + "timeout" "3" + + "counter" "Shinra_Ifrit_Counter" + } + "6" + { + "name" "Jenova" + "method" "counter" + "trigger" "Shinra_Jenova_Phys:OnTakeDamage" + "timeout" "3" + + "counter" "Shinra_Jenova_Counter" + } + "7" + { + "name" "Shiva" + "method" "counter" + "trigger" "Shinra_Shiva_Phys:OnTakeDamage" + "timeout" "3" + + "counter" "Shinra_Shiva_Counter" + } + "8" + { + "name" "Genesis" + "method" "counter" + "trigger" "Genesis_Temp:OnEntitySpawned" + + "counter" "Genesis_Counter" + } +} diff --git a/BossHP/configs/bosshp/ze_lotr_minas_tirith_v2_2fix.cfg b/BossHP/configs/bosshp/ze_lotr_minas_tirith_v2_2fix.cfg new file mode 100644 index 00000000..475d392c --- /dev/null +++ b/BossHP/configs/bosshp/ze_lotr_minas_tirith_v2_2fix.cfg @@ -0,0 +1,42 @@ +"bosses" +{ + "0" + { + "name" "Balrog" + "method" "breakable" + "trigger" "item_balrog_hp:OnTakeDamage" + "timeout" "3" + + "breakable" "item_balrog_hp" + } + "1" + { + "name" "Gandalf" + "method" "breakable" + "trigger" "item_gandalf_15:OnTakeDamage" + "timeout" "3" + + "breakable" "item_gandalf_15" + } + "2" + { + "name" "White Knight" + "method" "breakable" + "trigger" "item_goliath_2:OnTakeDamage" + "timeout" "3" + + "breakable" "item_goliath_2" + } + "3" + { + "name" "Nazgul" + "method" "counter" + "trigger" "temp_item_nazgul:OnEntitySpawned" + "showtrigger" "item_nazgul_17:OutValue" + "multitrigger" "1" + "namefixup" "1" + "timeout" "3" + + "counter" "item_nazgul_17" + } +} \ No newline at end of file diff --git a/BossHP/configs/bosshp/ze_lotr_minas_tirith_v3_5.cfg b/BossHP/configs/bosshp/ze_lotr_minas_tirith_v3_5.cfg new file mode 100644 index 00000000..475d392c --- /dev/null +++ b/BossHP/configs/bosshp/ze_lotr_minas_tirith_v3_5.cfg @@ -0,0 +1,42 @@ +"bosses" +{ + "0" + { + "name" "Balrog" + "method" "breakable" + "trigger" "item_balrog_hp:OnTakeDamage" + "timeout" "3" + + "breakable" "item_balrog_hp" + } + "1" + { + "name" "Gandalf" + "method" "breakable" + "trigger" "item_gandalf_15:OnTakeDamage" + "timeout" "3" + + "breakable" "item_gandalf_15" + } + "2" + { + "name" "White Knight" + "method" "breakable" + "trigger" "item_goliath_2:OnTakeDamage" + "timeout" "3" + + "breakable" "item_goliath_2" + } + "3" + { + "name" "Nazgul" + "method" "counter" + "trigger" "temp_item_nazgul:OnEntitySpawned" + "showtrigger" "item_nazgul_17:OutValue" + "multitrigger" "1" + "namefixup" "1" + "timeout" "3" + + "counter" "item_nazgul_17" + } +} \ No newline at end of file diff --git a/BossHP/configs/bosshp/ze_parkers_pit_b8.cfg b/BossHP/configs/bosshp/ze_parkers_pit_b8.cfg new file mode 100644 index 00000000..e1cd30fc --- /dev/null +++ b/BossHP/configs/bosshp/ze_parkers_pit_b8.cfg @@ -0,0 +1,11 @@ +"bosses" +{ + "0" + { + "name" "The Boss" + "method" "breakable" + "trigger" "bssak12:OnHealthChanged" + + "breakable" "bssak12" + } +} diff --git a/BossHP/configs/bosshp/ze_pirates_port_royal_v5_4s2.cfg b/BossHP/configs/bosshp/ze_pirates_port_royal_v5_4s2.cfg new file mode 100644 index 00000000..531fd28e --- /dev/null +++ b/BossHP/configs/bosshp/ze_pirates_port_royal_v5_4s2.cfg @@ -0,0 +1,59 @@ +"bosses" +{ + "0" // Stage 2 + { + "name" "Cannon" + "method" "hpbar" + "trigger" "delo_boss_hity:OnStartTouch" + + "iterator" "boss_hp_iterations" + "counter" "delo_counter" + "backup" "boss_hp_backup" + } + "1" // Stage 3 + { + "name" "Pirate" + "method" "hpbar" + "trigger" "pirate_add_hit:OnStartTouch" + + "iterator" "pirate_hp_iterations" + "counter" "pirate_counter" + "backup" "pirate_hp_backup" + } + "2" // Stage 4 + { + "name" "Barbossa" + "method" "hpbar" + "trigger" "barbossa2_pocty:OnStartTouch" + + "iterator" "barbossa_hp_iterations" + "counter" "barbossa_counter" + "backup" "barbossa_hp_backup" + } + "3" // Stage 5 + { + "name" "Kraken" + "method" "hpbar" + "trigger" "kraken_multipl:OnStartTouch" + + "iterator" "kraken_hp_iterations" + "counter" "kraken_counter" + "backup" "kraken_hp_backup" + } + "4" + { + "name" "Barbossa" + "method" "counter" + "trigger" "final_barbossa_hity:OnStartTouch" + + "counter" "final_barbossa_counter" + } + "5" + { + "name" "Barbossa" + "method" "counter" + "trigger" "bb_pocty:OnStartTouch" + + "counter" "final_barbossa_counter2" + } +} \ No newline at end of file diff --git a/BossHP/configs/bosshp/ze_portal_story_v3_2.cfg b/BossHP/configs/bosshp/ze_portal_story_v3_2.cfg new file mode 100644 index 00000000..8526c4da --- /dev/null +++ b/BossHP/configs/bosshp/ze_portal_story_v3_2.cfg @@ -0,0 +1,11 @@ +"bosses" +{ + "0" // Glados + { + "name" "Glados" + "method" "counter" + "trigger" "lvl1_cts_counter_trigger:OnTrigger" + + "counter" "lvl1_health_counter" + } +} \ No newline at end of file diff --git a/BossHP/configs/bosshp/ze_predator_ultimate_v3.cfg b/BossHP/configs/bosshp/ze_predator_ultimate_v3.cfg new file mode 100644 index 00000000..795354ab --- /dev/null +++ b/BossHP/configs/bosshp/ze_predator_ultimate_v3.cfg @@ -0,0 +1,89 @@ +"bosses" +{ + "0" // Stage 1 Predator + { + "name" "Predator" + "method" "counter" + "trigger" "aztecboss_math_health:OutValue" + + "counter" "aztecboss_math_health" + } + "1" // Jump attack + { + "name" "Predator" + "method" "counter" + "trigger" "aztecboss_math_health:OnHitMin" + + "counter" "aztecboss_math_health_2" + } + "2" // Stage 2 Predator + { + "name" "Predator" + "method" "counter" + "trigger" "endboss_healthpush:OnStartTouch" + + "counter" "mob_grudge_counter" + } + "3" // Stage 3 Predator + { + "name" "Predator" + "method" "counter" + "trigger" "cboss_INIT_TRIGGER:OnStartTouch" + + "counter" "cboss_predatorhealth_counter" + } + "4" // Attack counter + { + "name" "Predator Attack" + "method" "counter" + "trigger" "cboss_attack_orb_1:OnTrigger" + "killtrigger" "cboss_attack_orb_1:OnTrigger:7" + "multitrigger" "1" + + "counter" "cboss_predator_interuptcounter" + } + "5" + { + "name" "Predator Attack" + "method" "counter" + "trigger" "cboss_attack_fly_1:OnTrigger" + "killtrigger" "cboss_attack_fly_1:OnTrigger:7" + "multitrigger" "1" + + "counter" "cboss_predator_interuptcounter" + } + "6" + { + "name" "Predator Attack" + "method" "counter" + "trigger" "cboss_attack_laser_1:OnTrigger" + "killtrigger" "cboss_attack_laser_1:OnTrigger:7" + "multitrigger" "1" + + "counter" "cboss_predator_interuptcounter" + } + "7" // Stage 4 Predator + { + "name" "Predator" + "method" "counter" + "trigger" "fboss_start_trigger:OnStartTouch" + + "counter" "fboss_math_2" + } + "8" // Rage mode + { + "name" "Predator" + "method" "counter" + "trigger" "fboss_math_2:OnHitMin" + + "counter" "fboss_math_1" + } + "8" // Stage 4 Alien + { + "name" "Alien" + "method" "counter" + "trigger" "fboss_ee_tem:OnEntitySpawned" + + "counter" "fboss_ee_math" + } +} diff --git a/BossHP/configs/bosshp/ze_random_v9.cfg b/BossHP/configs/bosshp/ze_random_v9.cfg new file mode 100644 index 00000000..f7fa8806 --- /dev/null +++ b/BossHP/configs/bosshp/ze_random_v9.cfg @@ -0,0 +1,11 @@ +"bosses" +{ + "0" + { + "name" "Combine Dropship" + "method" "breakable" + "trigger" "FBH:OnStartTouch" + + "breakable" "FBK" + } +} diff --git a/BossHP/configs/bosshp/ze_shroomforest3_b2.cfg b/BossHP/configs/bosshp/ze_shroomforest3_b2.cfg new file mode 100644 index 00000000..01a56228 --- /dev/null +++ b/BossHP/configs/bosshp/ze_shroomforest3_b2.cfg @@ -0,0 +1,110 @@ +"bosses" +{ + "0" + { + "name" "Snorlax" + "method" "hpbar" + "trigger" "Template_SnorlaxBoss:OnEntitySpawned" + + "iterator" "Boss_HealthCount" + "counter" "Boss_Health" + "backup" "Boss_HealthInit" + } + "1" + { + "name" "Knight" + "method" "hpbar" + "trigger" "Template_KnightBoss:OnEntitySpawned" + "showtrigger" "Knight_Boss_Path1:OnPass" + + "iterator" "Boss_HealthCount" + "counter" "Boss_Health" + "backup" "Boss_HealthInit" + } + + "2" + { + "name" "Skeleton 1" + "method" "hpbar" + "trigger" "Template_SkeletonBoss:OnEntitySpawned" + + "iterator" "Skeleton_Boss_HealthCount1" + "counter" "Skeleton_Boss_Health1" + "backup" "Skeleton_Boss_HealthInit1" + } + "3" + { + "name" "Skeleton 2" + "method" "hpbar" + "trigger" "Template_SkeletonBoss:OnEntitySpawned" + + "iterator" "Skeleton_Boss_HealthCount2" + "counter" "Skeleton_Boss_Health2" + "backup" "Skeleton_Boss_HealthInit2" + } + "4" + { + "name" "Skeleton 3" + "method" "hpbar" + "trigger" "Template_SkeletonBoss:OnEntitySpawned" + + "iterator" "Skeleton_Boss_HealthCount3" + "counter" "Skeleton_Boss_Health3" + "backup" "Skeleton_Boss_HealthInit3" + } + + "5" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break1:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break1" + } + "6" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break2:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break2" + } + "7" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break3:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break3" + } + "8" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break4:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break4" + } + "9" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break5:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break5" + } + "10" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break6:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break6" + } +} diff --git a/BossHP/configs/bosshp/ze_shroomforest3_b3.cfg b/BossHP/configs/bosshp/ze_shroomforest3_b3.cfg new file mode 100644 index 00000000..5b11a031 --- /dev/null +++ b/BossHP/configs/bosshp/ze_shroomforest3_b3.cfg @@ -0,0 +1,107 @@ +"bosses" +{ + "0" + { + "name" "Snorlax" + "method" "hpbar" + "trigger" "Template_SnorlaxBoss:OnEntitySpawned" + + "iterator" "Boss_HealthCount" + "counter" "Boss_Health" + "backup" "Boss_HealthInit" + } + "1" + { + "name" "Knight" + "method" "hpbar" + "trigger" "Knight_Boss_Path0:OnPass" + + "iterator" "Boss_HealthCount" + "counter" "Boss_Health" + "backup" "Boss_HealthInit" + } + "2" + { + "name" "Skeleton 1" + "method" "hpbar" + "trigger" "Template_SkeletonBoss:OnEntitySpawned" + + "iterator" "Skeleton_Boss_HealthCount1" + "counter" "Skeleton_Boss_Health1" + "backup" "Skeleton_Boss_HealthInit1" + } + "3" + { + "name" "Skeleton 2" + "method" "hpbar" + "trigger" "Template_SkeletonBoss:OnEntitySpawned" + + "iterator" "Skeleton_Boss_HealthCount2" + "counter" "Skeleton_Boss_Health2" + "backup" "Skeleton_Boss_HealthInit2" + } + "4" + { + "name" "Skeleton 3" + "method" "hpbar" + "trigger" "Template_SkeletonBoss:OnEntitySpawned" + + "iterator" "Skeleton_Boss_HealthCount3" + "counter" "Skeleton_Boss_Health3" + "backup" "Skeleton_Boss_HealthInit3" + } + "5" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break1:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break1" + } + "6" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break2:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break2" + } + "7" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break3:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break3" + } + "8" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break4:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break4" + } + "9" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break5:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break5" + } + "10" + { + "name" "Spider" + "method" "breakable" + "trigger" "Spider_Break6:OnTakeDamage" + "timeout" "3" + + "breakable" "Spider_Break6" + } +} diff --git a/BossHP/configs/bosshp/ze_tesv_skyrim_v4fix.cfg b/BossHP/configs/bosshp/ze_tesv_skyrim_v4fix.cfg new file mode 100644 index 00000000..371a5e3e --- /dev/null +++ b/BossHP/configs/bosshp/ze_tesv_skyrim_v4fix.cfg @@ -0,0 +1,59 @@ +"bosses" +{ + "0" // Stage 1 Dragon + { + "name" "Alduin" + "method" "hpbar" + "trigger" "boss_hp:OnStartTouch" + + "iterator" "BossHpIterations4" + "counter" "counter_1" + "backup" "counter_1_backup" + } + "1" // Stage 2 Dragon + { + "name" "Alduin" + "method" "hpbar" + "trigger" "boss_hp_2:OnStartTouch" + + "iterator" "BossHpIterations3" + "counter" "counter_2" + "backup" "counter_2_backup" + } + "2" // Stage 4 Centurion + { + "name" "Centurion" + "method" "hpbar" + "trigger" "stage_4_bosshp:OnStartTouch" + + "iterator" "BossHpIterations2" + "counter" "dw_hp" + "backup" "dw_hp_backup" + } + "3" // Stage 4 Small Centurion + { + "name" "Small Centurion" + "method" "breakable" + "trigger" "smalldwboss_relay:OnTrigger" + + "breakable" "smalldwboss_physbox2" + } + "4" // Stage 5 Dragonpriest @ Teleporter + { + "name" "Dragonpriest" + "method" "breakable" + "trigger" "phbox:OnAwakened" + + "breakable" "phbox" + } + "5" // Stage 5 Dragon + { + "name" "Alduin" + "method" "hpbar" + "trigger" "boss_hp_3_ex:OnStartTouch" + + "iterator" "BossHpIterations" + "counter" "counter_3" + "backup" "bosshpbackup" + } +} diff --git a/BossHP/scripting/BossHP.sp b/BossHP/scripting/BossHP.sp new file mode 100644 index 00000000..5cd693c5 --- /dev/null +++ b/BossHP/scripting/BossHP.sp @@ -0,0 +1,1198 @@ +#pragma semicolon 1 +#pragma newdecls required + +#include +#include +#include +#include + +#include +#include "CConfig.inc" +#include "CBoss.inc" + +bool g_bLate = true; + +ArrayList g_aConfig; +ArrayList g_aBoss; +StringMap g_aHadOnce; + +char g_sHUDText[256]; + +public Plugin myinfo = +{ + name = "BossHP", + author = "BotoX", + description = "", + version = "0.1", + url = "" +}; + +public void OnPluginStart() +{ + HookEvent("round_end", Event_RoundEnd, EventHookMode_PostNoCopy); + HookEntityOutput("env_entity_maker", "OnEntitySpawned", OnEnvEntityMakerEntitySpawned); +} + +public void OnPluginEnd() +{ + Cleanup(); +} + +void Cleanup() +{ + if(g_aConfig) + { + for(int i = 0; i < g_aConfig.Length; i++) + { + CConfig Config = g_aConfig.Get(i); + delete Config; + } + delete g_aConfig; + } + + if(g_aBoss) + { + for(int i = 0; i < g_aBoss.Length; i++) + { + CBoss Boss = g_aBoss.Get(i); + delete Boss; + } + delete g_aBoss; + } +} + +public void OnMapEnd() +{ + Cleanup(); +} + +public void OnMapStart() +{ + bool bLate = g_bLate; + g_bLate = false; + + char sMapName[PLATFORM_MAX_PATH]; + GetCurrentMap(sMapName, sizeof(sMapName)); + + char sConfigFile[PLATFORM_MAX_PATH]; + BuildPath(Path_SM, sConfigFile, sizeof(sConfigFile), "configs/bosshp/%s.cfg", sMapName); + if(!FileExists(sConfigFile)) + { + LogMessage("Could not find mapconfig: \"%s\"", sConfigFile); + return; + } + LogMessage("Found mapconfig: \"%s\"", sConfigFile); + + KeyValues KvConfig = new KeyValues("bosses"); + if(!KvConfig.ImportFromFile(sConfigFile)) + { + delete KvConfig; + LogError("ImportFromFile() failed!"); + return; + } + KvConfig.Rewind(); + + if(!KvConfig.GotoFirstSubKey()) + { + delete KvConfig; + LogError("GotoFirstSubKey() failed!"); + return; + } + + g_aConfig = new ArrayList(); + + do + { + char sSection[64]; + KvConfig.GetSectionName(sSection, sizeof(sSection)); + + char sName[64]; + KvConfig.GetString("name", sName, sizeof(sName)); + if(!sName[0]) + { + LogError("Could not find \"name\" in \"%s\"", sSection); + continue; + } + + char sMethod[64]; + KvConfig.GetString("method", sMethod, sizeof(sMethod)); + if(!sMethod[0]) + { + LogError("Could not find \"method\" in \"%s\"", sSection); + continue; + } + + char sTrigger[64 * 2]; + KvConfig.GetString("trigger", sTrigger, sizeof(sTrigger)); + if(!sTrigger[0]) + { + LogError("Could not find \"trigger\" in \"%s\"", sSection); + continue; + } + + int iTriggerDelim; + if((iTriggerDelim = FindCharInString(sTrigger, ':')) == -1) + { + LogError("Delimiter ':' not found in \"trigger\"(%s) in \"%s\"", sTrigger, sSection); + continue; + } + sTrigger[iTriggerDelim] = 0; + + float fTriggerDelay = 0.0; + int iTriggerDelayDelim; + if((iTriggerDelayDelim = FindCharInString(sTrigger[iTriggerDelim + 1], ':')) != -1) + { + iTriggerDelayDelim += iTriggerDelim + 1; + fTriggerDelay = StringToFloat(sTrigger[iTriggerDelayDelim + 1]); + sTrigger[iTriggerDelayDelim] = 0; + } + + char sShowTrigger[64 * 2]; + int iShowTriggerDelim; + float fShowTriggerDelay = 0.0; + int iShowTriggerDelayDelim; + KvConfig.GetString("showtrigger", sShowTrigger, sizeof(sShowTrigger)); + if(sShowTrigger[0]) + { + if((iShowTriggerDelim = FindCharInString(sShowTrigger, ':')) == -1) + { + LogError("Delimiter ':' not found in \"showtrigger\"(%s) in \"%s\"", sShowTrigger, sSection); + continue; + } + sShowTrigger[iShowTriggerDelim] = 0; + + if((iShowTriggerDelayDelim = FindCharInString(sShowTrigger[iShowTriggerDelim + 1], ':')) != -1) + { + iShowTriggerDelayDelim += iShowTriggerDelim + 1; + fShowTriggerDelay = StringToFloat(sShowTrigger[iShowTriggerDelayDelim + 1]); + sShowTrigger[iShowTriggerDelayDelim] = 0; + } + } + + char sKillTrigger[64 * 2]; + int iKillTriggerDelim; + float fKillTriggerDelay = 0.0; + int iKillTriggerDelayDelim; + KvConfig.GetString("killtrigger", sKillTrigger, sizeof(sKillTrigger)); + if(sKillTrigger[0]) + { + if((iKillTriggerDelim = FindCharInString(sKillTrigger, ':')) == -1) + { + LogError("Delimiter ':' not found in \"killtrigger\"(%s) in \"%s\"", sKillTrigger, sSection); + continue; + } + sKillTrigger[iKillTriggerDelim] = 0; + + if((iKillTriggerDelayDelim = FindCharInString(sKillTrigger[iKillTriggerDelim + 1], ':')) != -1) + { + iKillTriggerDelayDelim += iKillTriggerDelim + 1; + fKillTriggerDelay = StringToFloat(sKillTrigger[iKillTriggerDelayDelim + 1]); + sKillTrigger[iKillTriggerDelayDelim] = 0; + } + } + + bool bMultiTrigger = view_as(KvConfig.GetNum("multitrigger", 0)); + bool bNameFixup = view_as(KvConfig.GetNum("namefixup", 0)); + int iTimeout = KvConfig.GetNum("timeout", -1); + + CConfig Config = view_as(INVALID_HANDLE); + + if(StrEqual(sMethod, "breakable")) + { + char sBreakable[64]; + if(!KvConfig.GetString("breakable", sBreakable, sizeof(sBreakable))) + { + LogError("Could not find \"breakable\" in \"%s\"", sSection); + continue; + } + + CConfigBreakable BreakableConfig = new CConfigBreakable(); + + BreakableConfig.SetBreakable(sBreakable); + + Config = view_as(BreakableConfig); + } + else if(StrEqual(sMethod, "counter")) + { + char sCounter[64]; + if(!KvConfig.GetString("counter", sCounter, sizeof(sCounter))) + { + LogError("Could not find \"counter\" in \"%s\"", sSection); + continue; + } + + CConfigCounter CounterConfig = new CConfigCounter(); + + CounterConfig.SetCounter(sCounter); + + Config = view_as(CounterConfig); + } + else if(StrEqual(sMethod, "hpbar")) + { + char sIterator[64]; + if(!KvConfig.GetString("iterator", sIterator, sizeof(sIterator))) + { + LogError("Could not find \"iterator\" in \"%s\"", sSection); + continue; + } + + char sCounter[64]; + if(!KvConfig.GetString("counter", sCounter, sizeof(sCounter))) + { + LogError("Could not find \"counter\" in \"%s\"", sSection); + continue; + } + + char sBackup[64]; + if(!KvConfig.GetString("backup", sBackup, sizeof(sBackup))) + { + LogError("Could not find \"backup\" in \"%s\"", sSection); + continue; + } + + CConfigHPBar HPBarConfig = new CConfigHPBar(); + + HPBarConfig.SetIterator(sIterator); + HPBarConfig.SetCounter(sCounter); + HPBarConfig.SetBackup(sBackup); + + Config = view_as(HPBarConfig); + } + + if(Config == INVALID_HANDLE) + { + LogError("Invalid \"method\"(%s) in \"%s\"", sMethod, sSection); + continue; + } + + Config.SetName(sName); + Config.bMultiTrigger = bMultiTrigger; + Config.bNameFixup = bNameFixup; + Config.iTimeout = iTimeout; + + Config.SetTrigger(sTrigger); + Config.SetOutput(sTrigger[iTriggerDelim + 1]); + Config.fTriggerDelay = fTriggerDelay; + + if(sShowTrigger[0]) + { + Config.SetShowTrigger(sShowTrigger); + Config.SetShowOutput(sShowTrigger[iShowTriggerDelim + 1]); + Config.fShowTriggerDelay = fShowTriggerDelay; + } + + if(sKillTrigger[0]) + { + Config.SetKillTrigger(sKillTrigger); + Config.SetKillOutput(sKillTrigger[iKillTriggerDelim + 1]); + Config.fKillTriggerDelay = fKillTriggerDelay; + } + + g_aConfig.Push(Config); + } while(KvConfig.GotoNextKey(false)); + + delete KvConfig; + + if(!g_aConfig.Length) + { + delete g_aConfig; + LogError("Empty mapconfig: \"%s\"", sConfigFile); + return; + } + + g_aBoss = new ArrayList(); + g_aHadOnce = new StringMap(); + + /* Late Load */ + if(bLate) + { + int entity = INVALID_ENT_REFERENCE; + while((entity = FindEntityByClassname(entity, "*")) != INVALID_ENT_REFERENCE) + { + OnEntitySpawned(entity); + } + } +} + +public void Event_RoundEnd(Event event, const char[] name, bool dontBroadcast) +{ + if(!g_aConfig) + return; + + if(g_aBoss) + { + for(int i = 0; i < g_aBoss.Length; i++) + { + CBoss Boss = g_aBoss.Get(i); + delete Boss; + } + delete g_aBoss; + } + + g_aBoss = new ArrayList(); + + if(g_aHadOnce) + delete g_aHadOnce; + + g_aHadOnce = new StringMap(); +} + +public void OnEntityCreated(int entity, const char[] classname) +{ + if(!g_aConfig) + return; + + SDKHook(entity, SDKHook_SpawnPost, OnEntitySpawned); +} + +public void OnEntitySpawned(int entity) +{ + if(!g_aConfig) + return; + + char sTargetname[64]; + if(!GetEntPropString(entity, Prop_Data, "m_iName", sTargetname, sizeof(sTargetname))) + return; + + for(int i = 0; i < g_aConfig.Length; i++) + { + CConfig Config = g_aConfig.Get(i); + + char sTrigger[64]; + Config.GetTrigger(sTrigger, sizeof(sTrigger)); + + if(StrEqual(sTargetname, sTrigger)) + { + char sOutput[64]; + Config.GetOutput(sOutput, sizeof(sOutput)); + + if(StrEqual(sOutput, "OnTakeDamage")) + { + SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePost); + } + else + { + bool Once = !Config.bMultiTrigger; + HookSingleEntityOutput(entity, sOutput, OnEntityOutput, Once); + } + + LogMessage("Hooked trigger %s:%s", sTrigger, sOutput); + } + + char sShowTrigger[64]; + Config.GetShowTrigger(sShowTrigger, sizeof(sShowTrigger)); + + if(sShowTrigger[0] && StrEqual(sTargetname, sShowTrigger)) + { + char sShowOutput[64]; + Config.GetShowOutput(sShowOutput, sizeof(sShowOutput)); + + if(StrEqual(sShowOutput, "OnTakeDamage")) + { + SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostShow); + } + else + { + bool Once = !Config.bMultiTrigger; + HookSingleEntityOutput(entity, sShowOutput, OnEntityOutputShow, Once); + } + + LogMessage("Hooked showtrigger %s:%s", sShowTrigger, sShowOutput); + } + + char sKillTrigger[64]; + Config.GetKillTrigger(sKillTrigger, sizeof(sKillTrigger)); + + if(sKillTrigger[0] && StrEqual(sTargetname, sKillTrigger)) + { + char sKillOutput[64]; + Config.GetKillOutput(sKillOutput, sizeof(sKillOutput)); + + if(StrEqual(sKillOutput, "OnTakeDamage")) + { + SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostKill); + } + else + { + bool Once = !Config.bMultiTrigger; + HookSingleEntityOutput(entity, sKillOutput, OnEntityOutputKill, Once); + } + + LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput); + } + } +} + +void OnTrigger(int entity, const char[] output, SDKHookType HookType = view_as(-1)) +{ + char sTargetname[64]; + if(!GetEntPropString(entity, Prop_Data, "m_iName", sTargetname, sizeof(sTargetname))) + return; + + for(int i = 0; i < g_aConfig.Length; i++) + { + CConfig Config = g_aConfig.Get(i); + + char sTrigger[64]; + Config.GetTrigger(sTrigger, sizeof(sTrigger)); + + if(!StrEqual(sTargetname, sTrigger)) + continue; + + char sOutput[64]; + Config.GetOutput(sOutput, sizeof(sOutput)); + + if(!StrEqual(output, sOutput)) + continue; + + bool Once = !Config.bMultiTrigger; + char sTemp[8]; + + if(Once) + { + IntToString(i, sTemp, sizeof(sTemp)); + bool bHadOnce = false; + if(g_aHadOnce.GetValue(sTemp, bHadOnce) && bHadOnce) + continue; + } + + if(HookType != view_as(-1) && Once) + { + if(HookType == SDKHook_OnTakeDamagePost) + SDKUnhook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePost); + } + + CBoss Boss = view_as(INVALID_HANDLE); + + if(Config.IsBreakable) + Boss = new CBossBreakable(); + else if(Config.IsCounter) + Boss = new CBossCounter(); + else if(Config.IsHPBar) + Boss = new CBossHPBar(); + + if(Boss != INVALID_HANDLE) + { + Boss.dConfig = Config; + Boss.bActive = false; + + float fTriggerDelay = Config.fTriggerDelay; + if(fTriggerDelay > 0) + Boss.fWaitUntil = GetGameTime() + fTriggerDelay; + + char sShowTrigger[8]; + Config.GetShowTrigger(sShowTrigger, sizeof(sShowTrigger)); + if(sShowTrigger[0]) + Boss.bShow = false; + + g_aBoss.Push(Boss); + + if(Once) + g_aHadOnce.SetValue(sTemp, true); + + LogMessage("Triggered boss %s(%d) from output %s", sTargetname, entity, output); + } + } +} + +void OnShowTrigger(int entity, const char[] output, SDKHookType HookType = view_as(-1)) +{ + char sTargetname[64]; + if(!GetEntPropString(entity, Prop_Data, "m_iName", sTargetname, sizeof(sTargetname))) + return; + + int iTemplateNum = -1; + int iTemplateLoc = FindCharInString(sTargetname, '&', true); + if(iTemplateLoc != -1) + { + iTemplateNum = StringToInt(sTargetname[iTemplateLoc + 1]); + sTargetname[iTemplateLoc] = 0; + } + + for(int i = 0; i < g_aConfig.Length; i++) + { + CConfig Config = g_aConfig.Get(i); + + char sShowTrigger[64]; + Config.GetShowTrigger(sShowTrigger, sizeof(sShowTrigger)); + + if(!StrEqual(sTargetname, sShowTrigger)) + continue; + + char sShowOutput[64]; + Config.GetShowOutput(sShowOutput, sizeof(sShowOutput)); + + if(!StrEqual(output, sShowOutput)) + continue; + + LogMessage("Triggered show boss %s(%d) from output %s", sTargetname, entity, output); + + if(HookType != view_as(-1) && !Config.bMultiTrigger) + { + if(HookType == SDKHook_OnTakeDamagePost) + SDKUnhook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePost); + } + + float fShowTriggerDelay = Config.fShowTriggerDelay; + + for(int j = 0; j < g_aBoss.Length; j++) + { + CBoss Boss = g_aBoss.Get(j); + + if(Boss.dConfig != Config) + continue; + + if(Boss.iTemplateNum != iTemplateNum) + continue; + + if(fShowTriggerDelay > 0) + { + Boss.fShowAt = GetGameTime() + fShowTriggerDelay; + LogMessage("Scheduled show(%f) boss %d", fShowTriggerDelay, j); + } + else + { + Boss.bShow = true; + LogMessage("Showing boss %d", j); + } + } + } +} + +void OnKillTrigger(int entity, const char[] output, SDKHookType HookType = view_as(-1)) +{ + char sTargetname[64]; + if(!GetEntPropString(entity, Prop_Data, "m_iName", sTargetname, sizeof(sTargetname))) + return; + + int iTemplateNum = -1; + int iTemplateLoc = FindCharInString(sTargetname, '&', true); + if(iTemplateLoc != -1) + { + iTemplateNum = StringToInt(sTargetname[iTemplateLoc + 1]); + sTargetname[iTemplateLoc] = 0; + } + + for(int i = 0; i < g_aConfig.Length; i++) + { + CConfig Config = g_aConfig.Get(i); + + char sKillTrigger[64]; + Config.GetKillTrigger(sKillTrigger, sizeof(sKillTrigger)); + + if(!sKillTrigger[0] || !StrEqual(sTargetname, sKillTrigger)) + continue; + + char sKillOutput[64]; + Config.GetKillOutput(sKillOutput, sizeof(sKillOutput)); + + if(!StrEqual(output, sKillOutput)) + continue; + + LogMessage("Triggered kill boss %s(%d) from output %s", sTargetname, entity, output); + + if(HookType != view_as(-1) && !Config.bMultiTrigger) + { + if(HookType == SDKHook_OnTakeDamagePost) + SDKUnhook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePost); + } + + float fKillTriggerDelay = Config.fKillTriggerDelay; + + for(int j = 0; j < g_aBoss.Length; j++) + { + CBoss Boss = g_aBoss.Get(j); + + if(Boss.dConfig != Config) + continue; + + if(Boss.iTemplateNum != iTemplateNum) + continue; + + if(fKillTriggerDelay > 0) + { + Boss.fKillAt = GetGameTime() + fKillTriggerDelay; + LogMessage("Scheduled kill(%f) boss %d", fKillTriggerDelay, j); + } + else + { + delete Boss; + g_aBoss.Erase(j); + j--; + LogMessage("Killed boss %d", j + 1); + } + } + } +} + +public void OnEnvEntityMakerEntitySpawned(const char[] output, int caller, int activator, float delay) +{ + if(!g_aConfig) + return; + + char sClassname[64]; + if(!GetEntityClassname(caller, sClassname, sizeof(sClassname))) + return; + + if(!StrEqual(sClassname, "env_entity_maker")) + { + //LogError("[SOURCEMOD BUG] output: \"%s\", caller: %d, activator: %d, delay: %f, classname: \"%s\"", + // output, caller, activator, delay, sClassname); + return; + } + + char sPointTemplate[64]; + if(GetEntPropString(caller, Prop_Data, "m_iszTemplate", sPointTemplate, sizeof(sPointTemplate)) <= 0) + return; + + int iPointTemplate = FindEntityByTargetname(INVALID_ENT_REFERENCE, sPointTemplate, "point_template"); + if(iPointTemplate == INVALID_ENT_REFERENCE) + return; + + OnEntityOutput("OnEntitySpawned", iPointTemplate, caller, delay); +} + +public void OnEntityOutput(const char[] output, int caller, int activator, float delay) +{ + OnTrigger(caller, output); +} + +public void OnEntityOutputShow(const char[] output, int caller, int activator, float delay) +{ + OnShowTrigger(caller, output); +} + +public void OnEntityOutputKill(const char[] output, int caller, int activator, float delay) +{ + OnKillTrigger(caller, output); +} + +public void OnTakeDamagePost(int victim, int attacker, int inflictor, float damage, int damagetype) +{ + OnTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost); +} + +public void OnTakeDamagePostShow(int victim, int attacker, int inflictor, float damage, int damagetype) +{ + OnShowTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost); +} + +public void OnTakeDamagePostKill(int victim, int attacker, int inflictor, float damage, int damagetype) +{ + OnKillTrigger(victim, "OnTakeDamage", SDKHook_OnTakeDamagePost); +} + +public void OnGameFrame() +{ + if(!g_aBoss) + return; + + static bool s_bLastHudPrinted = false; + g_sHUDText[0] = 0; + + for(int i = 0; i < g_aBoss.Length; i++) + { + CBoss Boss = g_aBoss.Get(i); + + if(Boss.fKillAt && Boss.fKillAt < GetGameTime()) + { // Delete Boss + LogMessage("Deleting boss %d (KillAt)", i); + delete Boss; + g_aBoss.Erase(i); + i--; + continue; + } + + if(!Boss.bActive) + { + if(Boss.fWaitUntil) + { + if(Boss.fWaitUntil > GetGameTime()) + continue; + Boss.fWaitUntil = 0.0; + } + + if(!BossInit(Boss)) + continue; + } + + if(!BossProcess(Boss)) + { // Delete Boss + LogMessage("Deleting boss %d (dead)", i); + delete Boss; + g_aBoss.Erase(i); + i--; + } + } + + if(!IsVoteInProgress()) + { + if(g_sHUDText[0]) + { + for(int client = 1; client <= MaxClients; client++) + { + if(IsClientInGame(client)) + { + PrintHintText(client, g_sHUDText); + StopSound(client, SNDCHAN_STATIC, "UI/hint.wav"); + } + } + s_bLastHudPrinted = true; + } + else if(s_bLastHudPrinted) + { + for(int client = 1; client <= MaxClients; client++) + { + if(IsClientInGame(client)) + { + PrintHintText(client, ""); + StopSound(client, SNDCHAN_STATIC, "UI/hint.wav"); + } + } + s_bLastHudPrinted = false; + } + } +} + +bool BossInit(CBoss _Boss) +{ + CConfig _Config = _Boss.dConfig; + bool bNameFixup = _Config.bNameFixup; + int iTemplateNum = -1; + + if(_Boss.IsBreakable) + { + CBossBreakable Boss = view_as(_Boss); + CConfigBreakable Config = view_as(_Config); + + char sBreakable[64]; + Config.GetBreakable(sBreakable, sizeof(sBreakable)); + + int iBreakableEnt = INVALID_ENT_REFERENCE; + + if(!bNameFixup) + { + iBreakableEnt = FindEntityByTargetname(iBreakableEnt, sBreakable, "*"); + if(iBreakableEnt == INVALID_ENT_REFERENCE) + return false; + } + else + { + StrCat(sBreakable, sizeof(sBreakable), "&*"); + while((iBreakableEnt = FindEntityByTargetname(iBreakableEnt, sBreakable, "*")) != INVALID_ENT_REFERENCE) + { + bool bSkip = false; + for(int i = 0; i < g_aBoss.Length; i++) + { + CBoss _tBoss = g_aBoss.Get(i); + if(!_tBoss.IsBreakable) + continue; + + CBossBreakable tBoss = view_as(_tBoss); + if(tBoss.iBreakableEnt == iBreakableEnt) + { + bSkip = true; + break; + } + } + + if(!bSkip) + break; + } + + if(iBreakableEnt == INVALID_ENT_REFERENCE) + return false; + + GetEntPropString(iBreakableEnt, Prop_Data, "m_iName", sBreakable, sizeof(sBreakable)); + + int iTemplateLoc = FindCharInString(sBreakable, '&', true); + if(iTemplateLoc == -1) + return false; + + iTemplateNum = StringToInt(sBreakable[iTemplateLoc + 1]); + } + + Boss.iBreakableEnt = iBreakableEnt; + } + else if(_Boss.IsCounter) + { + CBossCounter Boss = view_as(_Boss); + CConfigCounter Config = view_as(_Config); + + char sCounter[64]; + Config.GetCounter(sCounter, sizeof(sCounter)); + + int iCounterEnt = INVALID_ENT_REFERENCE; + + if(!bNameFixup) + { + iCounterEnt = FindEntityByTargetname(iCounterEnt, sCounter, "math_counter"); + if(iCounterEnt == INVALID_ENT_REFERENCE) + return false; + } + else + { + StrCat(sCounter, sizeof(sCounter), "&*"); + while((iCounterEnt = FindEntityByTargetname(iCounterEnt, sCounter, "math_counter")) != INVALID_ENT_REFERENCE) + { + char sBuf[64]; + GetEntPropString(iCounterEnt, Prop_Data, "m_iName", sBuf, sizeof(sBuf)); + + bool bSkip = false; + for(int i = 0; i < g_aBoss.Length; i++) + { + CBoss _tBoss = g_aBoss.Get(i); + if(!_tBoss.IsCounter) + continue; + + CBossCounter tBoss = view_as(_tBoss); + if(tBoss.iCounterEnt == iCounterEnt) + { + bSkip = true; + break; + } + } + + if(!bSkip) + break; + } + + if(iCounterEnt == INVALID_ENT_REFERENCE) + return false; + + GetEntPropString(iCounterEnt, Prop_Data, "m_iName", sCounter, sizeof(sCounter)); + + int iTemplateLoc = FindCharInString(sCounter, '&', true); + if(iTemplateLoc == -1) + return false; + + iTemplateNum = StringToInt(sCounter[iTemplateLoc + 1]); + } + + Boss.iCounterEnt = iCounterEnt; + + int iCounterOnHitMinCount = GetOutputCount(iCounterEnt, "m_OnHitMin"); + int iCounterOnHitMaxCount = GetOutputCount(iCounterEnt, "m_OnHitMax"); + + Config.bCounterReverse = iCounterOnHitMaxCount > iCounterOnHitMinCount; + } + else if(_Boss.IsHPBar) + { + CBossHPBar Boss = view_as(_Boss); + CConfigHPBar Config = view_as(_Config); + + char sIterator[64]; + char sCounter[64]; + char sBackup[64]; + + Config.GetIterator(sIterator, sizeof(sIterator)); + Config.GetCounter(sCounter, sizeof(sCounter)); + Config.GetBackup(sBackup, sizeof(sBackup)); + + int iIteratorEnt = INVALID_ENT_REFERENCE; + int iCounterEnt = INVALID_ENT_REFERENCE; + int iBackupEnt = INVALID_ENT_REFERENCE; + + if(!bNameFixup) + { + iIteratorEnt = FindEntityByTargetname(iIteratorEnt, sIterator, "math_counter"); + if(iIteratorEnt == INVALID_ENT_REFERENCE) + return false; + + iCounterEnt = FindEntityByTargetname(iCounterEnt, sCounter, "math_counter"); + if(iCounterEnt == INVALID_ENT_REFERENCE) + return false; + + iBackupEnt = FindEntityByTargetname(iBackupEnt, sBackup, "math_counter"); + if(iBackupEnt == INVALID_ENT_REFERENCE) + return false; + } + else + { + StrCat(sIterator, sizeof(sIterator), "&*"); + while((iIteratorEnt = FindEntityByTargetname(iIteratorEnt, sIterator, "math_counter")) != INVALID_ENT_REFERENCE) + { + bool bSkip = false; + for(int i = 0; i < g_aBoss.Length; i++) + { + CBoss _tBoss = g_aBoss.Get(i); + if(!_tBoss.IsHPBar) + continue; + + CBossHPBar tBoss = view_as(_tBoss); + if(tBoss.iIteratorEnt == iIteratorEnt) + { + bSkip = true; + break; + } + } + + if(!bSkip) + break; + } + + if(iIteratorEnt == INVALID_ENT_REFERENCE) + return false; + + GetEntPropString(iIteratorEnt, Prop_Data, "m_iName", sIterator, sizeof(sIterator)); + + int iTemplateLoc = FindCharInString(sIterator, '&', true); + if(iTemplateLoc == -1) + return false; + + StrCat(sCounter, sizeof(sCounter), sIterator[iTemplateLoc]); + StrCat(sBackup, sizeof(sBackup), sIterator[iTemplateLoc]); + + iCounterEnt = FindEntityByTargetname(iCounterEnt, sCounter, "math_counter"); + if(iCounterEnt == INVALID_ENT_REFERENCE) + return false; + + iBackupEnt = FindEntityByTargetname(iBackupEnt, sBackup, "math_counter"); + if(iBackupEnt == INVALID_ENT_REFERENCE) + return false; + + iTemplateNum = StringToInt(sIterator[iTemplateLoc + 1]); + } + + Boss.iIteratorEnt = iIteratorEnt; + Boss.iCounterEnt = iCounterEnt; + Boss.iBackupEnt = iBackupEnt; + + int iIteratorOnHitMinCount = GetOutputCount(iIteratorEnt, "m_OnHitMin"); + int iIteratorOnHitMaxCount = GetOutputCount(iIteratorEnt, "m_OnHitMax"); + + Config.bIteratorReverse = iIteratorOnHitMaxCount > iIteratorOnHitMinCount; + + int iCounterOnHitMinCount = GetOutputCount(iCounterEnt, "m_OnHitMin"); + int iCounterOnHitMaxCount = GetOutputCount(iCounterEnt, "m_OnHitMax"); + + Config.bCounterReverse = iCounterOnHitMaxCount > iCounterOnHitMinCount; + } + + _Boss.bActive = true; + + if(iTemplateNum != -1) + { + _Boss.iTemplateNum = iTemplateNum; + + char sShowTrigger[64]; + _Config.GetShowTrigger(sShowTrigger, sizeof(sShowTrigger)); + + if(sShowTrigger[0]) + { + Format(sShowTrigger, sizeof(sShowTrigger), "%s&%04d", sShowTrigger, iTemplateNum); + + char sShowOutput[64]; + _Config.GetShowOutput(sShowOutput, sizeof(sShowOutput)); + + int entity = INVALID_ENT_REFERENCE; + while((entity = FindEntityByTargetname(entity, sShowTrigger)) != INVALID_ENT_REFERENCE) + { + if(StrEqual(sShowOutput, "OnTakeDamage")) + { + SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostShow); + } + else + { + HookSingleEntityOutput(entity, sShowOutput, OnEntityOutputShow, true); + } + + LogMessage("Hooked showtrigger %s:%s", sShowTrigger, sShowOutput); + } + } + + char sKillTrigger[64]; + _Config.GetKillTrigger(sKillTrigger, sizeof(sKillTrigger)); + + if(sKillTrigger[0]) + { + Format(sKillTrigger, sizeof(sKillTrigger), "%s&%04d", sKillTrigger, iTemplateNum); + + char sKillOutput[64]; + _Config.GetKillOutput(sKillOutput, sizeof(sKillOutput)); + + int entity = INVALID_ENT_REFERENCE; + while((entity = FindEntityByTargetname(entity, sKillTrigger)) != INVALID_ENT_REFERENCE) + { + if(StrEqual(sKillOutput, "OnTakeDamage")) + { + SDKHook(entity, SDKHook_OnTakeDamagePost, OnTakeDamagePostKill); + } + else + { + HookSingleEntityOutput(entity, sKillOutput, OnEntityOutputKill, true); + } + + LogMessage("Hooked killtrigger %s:%s", sKillTrigger, sKillOutput); + } + } + } + + char sBoss[64]; + _Config.GetName(sBoss, sizeof(sBoss)); + LogMessage("Initialized boss %s (template = %d)", sBoss, iTemplateNum); + + return true; +} + +bool BossProcess(CBoss _Boss) +{ + CConfig _Config = _Boss.dConfig; + + bool bInvalid = false; + int iHealth = 0; + int iLastHealth = _Boss.iHealth; + int iLastChange = _Boss.iLastChange; + + if(_Boss.IsBreakable) + { + CBossBreakable Boss = view_as(_Boss); + + int iBreakableEnt = Boss.iBreakableEnt; + + if(IsValidEntity(iBreakableEnt)) + iHealth = GetEntProp(iBreakableEnt, Prop_Data, "m_iHealth"); + else + bInvalid = true; + } + else if(_Boss.IsCounter) + { + CBossCounter Boss = view_as(_Boss); + CConfigCounter Config = view_as(_Config); + + int iCounterEnt = Boss.iCounterEnt; + + if(IsValidEntity(iCounterEnt)) + { + int iCounterVal = RoundFloat(GetOutputValueFloat(iCounterEnt, "m_OutValue")); + + if(!Config.bCounterReverse) + { + int iCounterMin = RoundFloat(GetEntPropFloat(iCounterEnt, Prop_Data, "m_flMin")); + iHealth = iCounterVal - iCounterMin; + } + else + { + int iCounterMax = RoundFloat(GetEntPropFloat(iCounterEnt, Prop_Data, "m_flMax")); + iHealth = iCounterMax - iCounterVal; + } + } + else + bInvalid = true; + } + else if(_Boss.IsHPBar) + { + CBossHPBar Boss = view_as(_Boss); + CConfigHPBar Config = view_as(_Config); + + int iIteratorEnt = Boss.iIteratorEnt; + int iCounterEnt = Boss.iCounterEnt; + int iBackupEnt = Boss.iBackupEnt; + + if(IsValidEntity(iIteratorEnt) && IsValidEntity(iCounterEnt) && IsValidEntity(iBackupEnt)) + { + int iIteratorVal = RoundFloat(GetOutputValueFloat(iIteratorEnt, "m_OutValue")); + int iCounterVal = RoundFloat(GetOutputValueFloat(iCounterEnt, "m_OutValue")); + int iBackupVal = RoundFloat(GetOutputValueFloat(iBackupEnt, "m_OutValue")); + + if(!Config.bIteratorReverse) + { + int iIteratorMin = RoundFloat(GetEntPropFloat(iIteratorEnt, Prop_Data, "m_flMin")); + iHealth = (iIteratorVal - iIteratorMin - 1) * iBackupVal; + } + else + { + int iIteratorMax = RoundFloat(GetEntPropFloat(iIteratorEnt, Prop_Data, "m_flMax")); + iHealth = (iIteratorMax - iIteratorVal - 1) * iBackupVal; + } + + if(!Config.bCounterReverse) + { + int iCounterMin = RoundFloat(GetEntPropFloat(iCounterEnt, Prop_Data, "m_flMin")); + iHealth += iCounterVal - iCounterMin; + } + else + { + int iCounterMax = RoundFloat(GetEntPropFloat(iCounterEnt, Prop_Data, "m_flMax")); + iHealth += iCounterMax - iCounterVal; + } + } + else + bInvalid = true; + } + + if(iHealth < 0) + iHealth = 0; + + if(iHealth != iLastHealth) + { + iLastChange = GetTime(); + _Boss.iLastChange = iLastChange; + } + + // Boss hasn't initialized HP yet. + if(iHealth == 0 && iLastHealth == 0) + { + // Boss invalid: Delete boss + if(bInvalid) + return false; + + return true; + } + + _Boss.iHealth = iHealth; + + bool bShow = _Boss.bShow; + if(!bShow && _Boss.fShowAt && _Boss.fShowAt < GetGameTime()) + { + bShow = true; + _Boss.bShow = true; + } + + if(bShow) + { + int iTimeout = _Config.iTimeout; + if(iTimeout < 0 || GetTime() - iLastChange < iTimeout) + { + char sFormat[64]; + if(g_sHUDText[0]) + { + sFormat[0] = '\n'; + _Config.GetName(sFormat[1], sizeof(sFormat) - 1); + } + else + _Config.GetName(sFormat, sizeof(sFormat)); + + int FormatLen = strlen(sFormat); + sFormat[FormatLen++] = ':'; + sFormat[FormatLen++] = ' '; + + FormatLen += IntToString(iHealth, sFormat[FormatLen], sizeof(sFormat) - FormatLen); + sFormat[FormatLen] = 0; + + StrCat(g_sHUDText, sizeof(g_sHUDText), sFormat); + } + } + + // Boss dead/invalid: Delete boss + if(!iHealth || bInvalid) + return false; + + return true; +} + +int FindEntityByTargetname(int entity, const char[] sTargetname, const char[] sClassname="*") +{ + int Wildcard = FindCharInString(sTargetname, '*'); + char sTargetnameBuf[64]; + while((entity = FindEntityByClassname(entity, sClassname)) != INVALID_ENT_REFERENCE) + { + if(GetEntPropString(entity, Prop_Data, "m_iName", sTargetnameBuf, sizeof(sTargetnameBuf)) <= 0) + continue; + + if(strncmp(sTargetnameBuf, sTargetname, Wildcard) == 0) + return entity; + } + + return INVALID_ENT_REFERENCE; +} diff --git a/BossHP/scripting/CBoss.inc b/BossHP/scripting/CBoss.inc new file mode 100644 index 00000000..feecce01 --- /dev/null +++ b/BossHP/scripting/CBoss.inc @@ -0,0 +1,271 @@ +#if defined _class_cboss_ + #endinput +#endif +#define _class_cboss_ + +methodmap CBoss < Basic +{ + public CBoss() + { + Basic myclass = new Basic(); + + myclass.SetHandle("dConfig", INVALID_HANDLE); + myclass.SetBool("bActive", false); + myclass.SetBool("bShow", true); + myclass.SetInt("iTemplateNum", -1); + myclass.SetInt("iHealth", 0); + myclass.SetInt("iLastChange", 0); + myclass.SetFloat("fWaitUntil", 0.0); + myclass.SetFloat("fShowAt", 0.0); + myclass.SetFloat("fKillAt", 0.0); + + return view_as(myclass); + } + + property CConfig dConfig + { + public get() + { + return view_as(this.GetHandle("dConfig")); + } + public set(CConfig value) + { + this.SetHandle("dConfig", value); + } + } + + property bool bActive + { + public get() + { + return this.GetBool("bActive"); + } + public set(bool value) + { + this.SetBool("bActive", value); + } + } + + property bool bShow + { + public get() + { + return this.GetBool("bShow"); + } + public set(bool value) + { + this.SetBool("bShow", value); + } + } + + property int iTemplateNum + { + public get() + { + return this.GetInt("iTemplateNum"); + } + public set(int value) + { + this.SetInt("iTemplateNum", value); + } + } + + property int iHealth + { + public get() + { + return this.GetInt("iHealth"); + } + public set(int value) + { + this.SetInt("iHealth", value); + } + } + + property int iLastChange + { + public get() + { + return this.GetInt("iLastChange"); + } + public set(int value) + { + this.SetInt("iLastChange", value); + } + } + + property float fWaitUntil + { + public get() + { + return this.GetFloat("fWaitUntil"); + } + public set(float value) + { + this.SetFloat("fWaitUntil", value); + } + } + + property float fShowAt + { + public get() + { + return this.GetFloat("fShowAt"); + } + public set(float value) + { + this.SetFloat("fShowAt", value); + } + } + + property float fKillAt + { + public get() + { + return this.GetFloat("fKillAt"); + } + public set(float value) + { + this.SetFloat("fKillAt", value); + } + } + + property bool IsBreakable { + public get() { + return this.dConfig.IsBreakable; + } + } + + property bool IsCounter { + public get() { + return this.dConfig.IsCounter; + } + } + + property bool IsHPBar { + public get() { + return this.dConfig.IsHPBar; + } + } +} + +methodmap CBossBreakable < CBoss +{ + public CBossBreakable() + { + CBoss myclass = new CBoss(); + + myclass.SetInt("iBreakableEnt", INVALID_ENT_REFERENCE); + + return view_as(myclass); + } + + property int iBreakableEnt + { + public get() + { + return this.GetInt("iBreakableEnt"); + } + public set(int value) + { + this.SetInt("iBreakableEnt", value); + } + } + + property CConfigBreakable Config + { + public get() + { + return view_as(this.dConfig); + } + public set(CConfigBreakable value) + { + this.dConfig = value; + } + } +} + +methodmap CBossCounter < CBoss +{ + public CBossCounter() + { + CBoss myclass = new CBoss(); + + myclass.SetInt("iCounterEnt", INVALID_ENT_REFERENCE); + + return view_as(myclass); + } + + property int iCounterEnt + { + public get() + { + return this.GetInt("iCounterEnt"); + } + public set(int value) + { + this.SetInt("iCounterEnt", value); + } + } + + property CConfigCounter Config + { + public get() + { + return view_as(this.dConfig); + } + public set(CConfigCounter value) + { + this.dConfig = value; + } + } +} + +methodmap CBossHPBar < CBossCounter +{ + public CBossHPBar() + { + CBoss myclass = new CBossCounter(); + + myclass.SetInt("iIteratorEnt", INVALID_ENT_REFERENCE); + myclass.SetInt("iBackupEnt", INVALID_ENT_REFERENCE); + + return view_as(myclass); + } + + property int iIteratorEnt + { + public get() + { + return this.GetInt("iIteratorEnt"); + } + public set(int value) + { + this.SetInt("iIteratorEnt", value); + } + } + + property int iBackupEnt + { + public get() + { + return this.GetInt("iBackupEnt"); + } + public set(int value) + { + this.SetInt("iBackupEnt", value); + } + } + + property CConfigHPBar Config + { + public get() + { + return view_as(this.dConfig); + } + public set(CConfigHPBar value) + { + this.dConfig = value; + } + } +} diff --git a/BossHP/scripting/CConfig.inc b/BossHP/scripting/CConfig.inc new file mode 100644 index 00000000..b2079793 --- /dev/null +++ b/BossHP/scripting/CConfig.inc @@ -0,0 +1,321 @@ +#if defined _class_cconfig_ + #endinput +#endif +#define _class_cconfig_ + +enum eConfigMethod +{ + eConfigMethod_Invalid = 0, + eConfigMethod_Breakable = 1, + eConfigMethod_Counter = 2, + eConfigMethod_HPBar = 3 +} + +methodmap CConfig < Basic +{ + public CConfig() + { + Basic myclass = new Basic(); + + myclass.SetString("sName", ""); + myclass.SetInt("iMethod", eConfigMethod_Invalid); + myclass.SetString("sTrigger", ""); + myclass.SetString("sOutput", ""); + myclass.SetFloat("fTriggerDelay", 0.0); + myclass.SetString("sShowTrigger", ""); + myclass.SetString("sShowOutput", ""); + myclass.SetFloat("fShowTriggerDelay", 0.0); + myclass.SetString("sKillTrigger", ""); + myclass.SetString("sKillOutput", ""); + myclass.SetFloat("fKillTriggerDelay", 0.0); + myclass.SetBool("bMultiTrigger", false); + myclass.SetBool("bNameFixup", false); + myclass.SetInt("iTimeout", -1); + + return view_as(myclass); + } + + public bool GetName(char[] buffer, int length) + { + return this.GetString("sName", buffer, length); + } + + public void SetName(const char[] buffer) + { + this.SetString("sName", buffer); + } + + property eConfigMethod iMethod + { + public get() + { + return view_as(this.GetInt("iMethod")); + } + public set(eConfigMethod value) + { + this.SetInt("iMethod", view_as(value)); + } + } + + public bool GetTrigger(char[] buffer, int length) + { + return this.GetString("sTrigger", buffer, length); + } + + public void SetTrigger(const char[] buffer) + { + this.SetString("sTrigger", buffer); + } + + public bool GetOutput(char[] buffer, int length) + { + return this.GetString("sOutput", buffer, length); + } + + public void SetOutput(const char[] buffer) + { + this.SetString("sOutput", buffer); + } + + property float fTriggerDelay + { + public get() + { + return this.GetFloat("fTriggerDelay"); + } + public set(float value) + { + this.SetFloat("fTriggerDelay", value); + } + } + + public bool GetShowTrigger(char[] buffer, int length) + { + return this.GetString("sShowTrigger", buffer, length); + } + + public void SetShowTrigger(const char[] buffer) + { + this.SetString("sShowTrigger", buffer); + } + + public bool GetShowOutput(char[] buffer, int length) + { + return this.GetString("sShowOutput", buffer, length); + } + + public void SetShowOutput(const char[] buffer) + { + this.SetString("sShowOutput", buffer); + } + + property float fShowTriggerDelay + { + public get() + { + return this.GetFloat("fShowTriggerDelay"); + } + public set(float value) + { + this.SetFloat("fShowTriggerDelay", value); + } + } + + public bool GetKillTrigger(char[] buffer, int length) + { + return this.GetString("sKillTrigger", buffer, length); + } + + public void SetKillTrigger(const char[] buffer) + { + this.SetString("sKillTrigger", buffer); + } + + public bool GetKillOutput(char[] buffer, int length) + { + return this.GetString("sKillOutput", buffer, length); + } + + public void SetKillOutput(const char[] buffer) + { + this.SetString("sKillOutput", buffer); + } + + property float fKillTriggerDelay + { + public get() + { + return this.GetFloat("fKillTriggerDelay"); + } + public set(float value) + { + this.SetFloat("fKillTriggerDelay", value); + } + } + + property bool bMultiTrigger + { + public get() + { + return this.GetBool("bMultiTrigger"); + } + public set(bool value) + { + this.SetBool("bMultiTrigger", value); + } + } + + property bool bNameFixup + { + public get() + { + return this.GetBool("bNameFixup"); + } + public set(bool value) + { + this.SetBool("bNameFixup", value); + } + } + + property int iTimeout + { + public get() + { + return this.GetInt("iTimeout"); + } + public set(int value) + { + this.SetInt("iTimeout", value); + } + } + + + + + property bool IsBreakable { + public get() { + return (this.iMethod == eConfigMethod_Breakable); + } + } + + property bool IsCounter { + public get() { + return (this.iMethod == eConfigMethod_Counter); + } + } + + property bool IsHPBar { + public get() { + return (this.iMethod == eConfigMethod_HPBar); + } + } +} + +methodmap CConfigBreakable < CConfig +{ + public CConfigBreakable() + { + CConfig myclass = new CConfig(); + + myclass.SetString("sBreakable", ""); + + myclass.iMethod = eConfigMethod_Breakable; + + return view_as(myclass); + } + + public bool GetBreakable(char[] buffer, int length) + { + return this.GetString("sBreakable", buffer, length); + } + + public void SetBreakable(const char[] buffer) + { + this.SetString("sBreakable", buffer); + } +} + +methodmap CConfigCounter < CConfig +{ + public CConfigCounter() + { + CConfig myclass = new CConfig(); + + myclass.SetString("sCounter", ""); + myclass.SetBool("bCounterReverse", false); + + myclass.iMethod = eConfigMethod_Counter; + + return view_as(myclass); + } + + public bool GetCounter(char[] buffer, int length) + { + return this.GetString("sCounter", buffer, length); + } + + public void SetCounter(const char[] buffer) + { + this.SetString("sCounter", buffer); + } + + property bool bCounterReverse + { + public get() + { + return this.GetBool("bCounterReverse"); + } + public set(bool value) + { + this.SetBool("bCounterReverse", value); + } + } +} + +methodmap CConfigHPBar < CConfigCounter +{ + public CConfigHPBar() + { + CConfigCounter myclass = new CConfigCounter(); + + myclass.SetString("sIterator", ""); + myclass.SetString("sBackup", ""); + myclass.SetBool("bIteratorReverse", false); + + myclass.iMethod = eConfigMethod_HPBar; + + return view_as(myclass); + } + + public bool GetIterator(char[] buffer, int length) + { + return this.GetString("sIterator", buffer, length); + } + + public void SetIterator(const char[] buffer) + { + this.SetString("sIterator", buffer); + } + + public bool GetBackup(char[] buffer, int length) + { + return this.GetString("sBackup", buffer, length); + } + + public void SetBackup(const char[] buffer) + { + this.SetString("sBackup", buffer); + } + + property bool bIteratorReverse + { + public get() + { + return this.GetBool("bIteratorReverse"); + } + public set(bool value) + { + this.SetBool("bIteratorReverse", value); + } + } +} diff --git a/BossHP/scripting/include/basic.inc b/BossHP/scripting/include/basic.inc new file mode 120000 index 00000000..daafdbb7 --- /dev/null +++ b/BossHP/scripting/include/basic.inc @@ -0,0 +1 @@ +../../../includes/basic.inc \ No newline at end of file diff --git a/BossHP/scripting/include/outputinfo.inc b/BossHP/scripting/include/outputinfo.inc new file mode 120000 index 00000000..1667222d --- /dev/null +++ b/BossHP/scripting/include/outputinfo.inc @@ -0,0 +1 @@ +../../../includes/outputinfo.inc \ No newline at end of file