mods/heromods/xalatath.stormmod/base.stormdata/libhxal.galaxy

libhxal.galaxy
include "TriggerLibs/NativeLib"
include "TriggerLibs/HeroesLib"
include "TriggerLibs/GameLib"

include "LibHXAL_h"

//--------------------------------------------------------------------------------------------------
// Library: Xal'atath
//--------------------------------------------------------------------------------------------------
// External Library Initialization
void libHXAL_InitLibraries () {
    libNtve_InitVariables();
    libCore_InitVariables();
    libGame_InitVariables();
}

// Variable Initialization
bool libHXAL_InitVariables_completed = false;

void libHXAL_InitVariables () {
    int init_i;

    if (libHXAL_InitVariables_completed) {
        return;
    }

    libHXAL_InitVariables_completed = true;

    for (init_i = 0; init_i <= libCore_gv_bALMaxPlayers; init_i += 1) {
        libHXAL_gv_heroXalatathVoidStepUnitGroup[init_i] = UnitGroupEmpty();
    }
}

// Functions
void libHXAL_gf_HeroXalatathIncrementHeroCountFunction () {
    // Automatic Variable Declarations
    // Implementation
    libHXAL_gv_heroXalatathTriggerRegistrationVariable += 1;
    if ((libHXAL_gv_heroXalatathTriggerRegistrationVariable == 1)) {
        TriggerEnable(libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit, true);
        TriggerEnable(libHXAL_gt_HeroXalatathTargetAcquired, true);
        TriggerEnable(libHXAL_gt_HeroXalatathForceAcquireTargetTaunt, true);
        TriggerEnable(libHXAL_gt_HeroXalatathHoldFire, true);
        TriggerEnable(libHXAL_gt_HeroXalatathVoidVolleyCooldownReset, true);
    }

}

void libHXAL_gf_HeroXalatathDecrementHeroCountFunction () {
    // Automatic Variable Declarations
    // Implementation
    libHXAL_gv_heroXalatathTriggerRegistrationVariable -= 1;
    if ((libHXAL_gv_heroXalatathTriggerRegistrationVariable < 0)) {
        libHXAL_gv_heroXalatathTriggerRegistrationVariable = 0;
    }

    if ((libHXAL_gv_heroXalatathTriggerRegistrationVariable == 0)) {
        TriggerEnable(libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit, false);
        TriggerEnable(libHXAL_gt_HeroXalatathTargetAcquired, false);
        TriggerEnable(libHXAL_gt_HeroXalatathForceAcquireTargetTaunt, false);
        TriggerEnable(libHXAL_gt_HeroXalatathHoldFire, false);
        TriggerEnable(libHXAL_gt_HeroXalatathVoidVolleyCooldownReset, false);
    }

}

// Triggers
//--------------------------------------------------------------------------------------------------
// Trigger: New Trigger: Hero - Xalatath - Void Volley - Cooldown Reset
//--------------------------------------------------------------------------------------------------
bool libHXAL_gt_HeroXalatathVoidVolleyCooldownReset_Func (bool testConds, bool runActions) {
    // Variable Declarations
    int lv_player;
    unit lv_playerHero;

    // Automatic Variable Declarations
    // Variable Initialization
    lv_player = libGame_gf_SpecialCaseTalentCooldownResetPlayer();
    lv_playerHero = libGame_gv_players[lv_player].lv_heroUnit;

    // Conditions
    if (testConds) {
        if (!((UnitHasBehavior2(lv_playerHero, "XalatathVoidVolleyChargeTokenCounter") == true))) {
            return false;
        }
    }

    // Actions
    if (!runActions) {
        return true;
    }

    UnitCreateEffectUnit(lv_playerHero, "XalatathVoidVolleyChargeApplyAllStacksSet", lv_playerHero);
    return true;
}

//--------------------------------------------------------------------------------------------------
void libHXAL_gt_HeroXalatathVoidVolleyCooldownReset_Init () {
    libHXAL_gt_HeroXalatathVoidVolleyCooldownReset = TriggerCreate("libHXAL_gt_HeroXalatathVoidVolleyCooldownReset_Func");
    TriggerEnable(libHXAL_gt_HeroXalatathVoidVolleyCooldownReset, false);
    libGame_gf_SpecialCaseTalentCooldownReset(libHXAL_gt_HeroXalatathVoidVolleyCooldownReset);
}

//--------------------------------------------------------------------------------------------------
// Trigger: Hero - Xalatath - Hero Weapon Apply Targeting Unit
//--------------------------------------------------------------------------------------------------
bool libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit_Func (bool testConds, bool runActions) {
    // Variable Declarations
    unit lv_XalatathUnit;
    unit lv_targetUnit;
    point lv_targetPoint;
    int lv_XalatathPlayer;
    bool lv_hadHoldFire;
    bool lv_hadDisabler;
    bool lv_hadMountedDisabler;

    // Automatic Variable Declarations
    // Variable Initialization

    // Conditions
    if (testConds) {
        if (!((UnitGetType(EventUnit()) == "HeroXalatath"))) {
            return false;
        }
    }

    // Actions
    if (!runActions) {
        return true;
    }

    lv_XalatathUnit = EventUnit();
    lv_XalatathPlayer = UnitGetOwner(EventUnit());
    lv_targetUnit = EventUnitTargetUnit();
    if ((lv_targetUnit != null) && (UnitFilterMatch(lv_targetUnit, lv_XalatathPlayer, UnitFilter(0, 0, (1 << c_targetFilterPlayer) | (1 << c_targetFilterAlly) | (1 << c_targetFilterMissile) | (1 << c_targetFilterItem), (1 << (c_targetFilterStasis - 32)) | (1 << (c_targetFilterDead - 32)) | (1 << (c_targetFilterInvulnerable - 32)))) == true)) {
        if ((lv_targetUnit == libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer]) && (UnitHasBehavior2(libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer], "XalatathWeaponTargeting") == true)) {
            return true;
        }

        if ((libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer] != null) && (libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer] != lv_targetUnit) && (UnitHasBehavior2(libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer], "XalatathWeaponTargeting") == true)) {
            UnitCreateEffectUnit(lv_XalatathUnit, "XalatathWeaponRemoveTargetingBehavior", libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer]);
        }

        UnitBehaviorRemove(lv_XalatathUnit, "XalatathHeroWeaponDisablerHoldFire", 1);
        UnitCreateEffectUnit(lv_XalatathUnit, "XalatathWeaponClearWeaponTargets", lv_XalatathUnit);
        UnitCreateEffectUnit(lv_XalatathUnit, "XalatathWeaponApplyTargetingBehavior", lv_targetUnit);
        libHXAL_gv_heroXalatathCurrentAttackTarget[lv_XalatathPlayer] = lv_targetUnit;
        UnitBehaviorAdd(lv_XalatathUnit, "XalatathWeaponCasterTargetFinderDisabler", lv_XalatathUnit, 1);
    }
    else {
        if ((EventUnitTargetPoint() != null) && (DistanceBetweenPoints(EventUnitTargetPoint(), UnitGetPosition(lv_XalatathUnit)) > 0.0)) {
            if ((UnitHasBehavior2(lv_XalatathUnit, "XalatathWeaponCasterTargetFinderDisabler") == true)) {
                lv_hadDisabler = true;
                UnitBehaviorRemove(lv_XalatathUnit, "XalatathWeaponCasterTargetFinderDisabler", 1);
            }

            if ((UnitHasBehavior2(lv_XalatathUnit, "XalatathHeroWeaponCasterTargetFinderDisablerMounted") == true)) {
                lv_hadMountedDisabler = true;
                UnitBehaviorRemove(lv_XalatathUnit, "XalatathHeroWeaponCasterTargetFinderDisablerMounted", 1);
            }

            if ((UnitHasBehavior2(lv_XalatathUnit, "HoldFire") == true)) {
                lv_hadHoldFire = true;
                UnitBehaviorAdd(lv_XalatathUnit, "XalatathHoldFireDisabler", lv_XalatathUnit, 1);
            }

            lv_targetPoint = EventUnitTargetPoint();
            while (!((UnitOrder(lv_XalatathUnit, 0) != OrderTargetingPoint(AbilityCommand("XalatathAttack", 0), lv_targetPoint)))) {
                Wait(0.125, c_timeGame);
            }
            if ((lv_hadDisabler == true)) {
                lv_hadDisabler = false;
                UnitBehaviorAdd(lv_XalatathUnit, "XalatathWeaponCasterTargetFinderDisabler", lv_XalatathUnit, 1);
            }

            if ((lv_hadMountedDisabler == true)) {
                lv_hadMountedDisabler = false;
                UnitBehaviorAdd(lv_XalatathUnit, "XalatathHeroWeaponCasterTargetFinderDisablerMounted", lv_XalatathUnit, 1);
            }

            if ((lv_hadHoldFire == true)) {
                lv_hadHoldFire = false;
                UnitBehaviorRemove(lv_XalatathUnit, "XalatathHoldFireDisabler", 1);
            }

        }

    }
    return true;
}

//--------------------------------------------------------------------------------------------------
void libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit_Init () {
    libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit = TriggerCreate("libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit_Func");
    TriggerEnable(libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit, false);
    TriggerAddEventUnitAbility(libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit, null, AbilityCommand("XalatathSmartTargetingRightClick", 0), c_abilEffectStageApproach, false);
    TriggerAddEventUnitAbility(libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit, null, AbilityCommand("XalatathSmartTargetingRightClick", 0), c_abilEffectStageCast, false);
    TriggerAddEventUnitAbility(libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit, null, AbilityCommand("XalatathTargetingAttackClick", 0), c_unitAbilStageExecute, false);
}

//--------------------------------------------------------------------------------------------------
// Trigger: Hero - Xalatath - Target Acquired
//--------------------------------------------------------------------------------------------------
bool libHXAL_gt_HeroXalatathTargetAcquired_Func (bool testConds, bool runActions) {
    // Variable Declarations
    unit lv_targetUnit;
    int lv_xalatathPlayer;
    unit lv_xalatath;

    // Automatic Variable Declarations
    // Variable Initialization
    lv_targetUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);
    lv_xalatathPlayer = UnitGetOwner(EventPlayerEffectUsedUnit(c_effectUnitCaster));

    // Conditions
    if (testConds) {
        if (!((UnitIsAlive(lv_targetUnit) == true))) {
            return false;
        }

        if (!((lv_targetUnit != libHXAL_gv_heroXalatathCurrentAttackTarget[lv_xalatathPlayer]))) {
            return false;
        }
    }

    // Actions
    if (!runActions) {
        return true;
    }

    lv_xalatath = EventPlayerEffectUsedUnit(c_effectUnitCaster);
    if ((libHXAL_gv_heroXalatathCurrentAttackTarget[lv_xalatathPlayer] != null) && (UnitHasBehavior2(libHXAL_gv_heroXalatathCurrentAttackTarget[lv_xalatathPlayer], "XalatathWeaponTargeting") == true)) {
        UnitCreateEffectUnit(lv_xalatath, "XalatathWeaponRemoveTargetingBehavior", libHXAL_gv_heroXalatathCurrentAttackTarget[lv_xalatathPlayer]);
    }

    UnitCreateEffectUnit(lv_xalatath, "XalatathWeaponCasterTargetApplyDisablerBehavior", lv_xalatath);
    libHXAL_gv_heroXalatathCurrentAttackTarget[lv_xalatathPlayer] = lv_targetUnit;
    return true;
}

//--------------------------------------------------------------------------------------------------
void libHXAL_gt_HeroXalatathTargetAcquired_Init () {
    libHXAL_gt_HeroXalatathTargetAcquired = TriggerCreate("libHXAL_gt_HeroXalatathTargetAcquired_Func");
    TriggerEnable(libHXAL_gt_HeroXalatathTargetAcquired, false);
    TriggerAddEventPlayerEffectUsed(libHXAL_gt_HeroXalatathTargetAcquired, c_playerAny, "XalatathWeaponNewTargetImpactSet");
}

//--------------------------------------------------------------------------------------------------
// Trigger: Hero - Xalatath - Force Acquire Target (Taunt)
//--------------------------------------------------------------------------------------------------
bool libHXAL_gt_HeroXalatathForceAcquireTargetTaunt_Func (bool testConds, bool runActions) {
    // Variable Declarations
    unit lv_unittoAttack;
    unit lv_xalatathUnit;
    int lv_xalatathPlayer;

    // Automatic Variable Declarations
    // Variable Initialization
    lv_unittoAttack = EventPlayerEffectUsedUnit(c_effectUnitCaster);
    lv_xalatathUnit = EventPlayerEffectUsedUnit(c_effectUnitTarget);
    lv_xalatathPlayer = UnitGetOwner(lv_xalatathUnit);

    // Conditions
    if (testConds) {
        if (!((UnitGetType(lv_xalatathUnit) == "HeroXalatath"))) {
            return false;
        }
    }

    // Actions
    if (!runActions) {
        return true;
    }

    UnitIssueOrder(lv_xalatathUnit, OrderTargetingUnit(AbilityCommand("XalatathSmartTargetingRightClick", 0), lv_unittoAttack), c_orderQueueReplace);
    return true;
}

//--------------------------------------------------------------------------------------------------
void libHXAL_gt_HeroXalatathForceAcquireTargetTaunt_Init () {
    libHXAL_gt_HeroXalatathForceAcquireTargetTaunt = TriggerCreate("libHXAL_gt_HeroXalatathForceAcquireTargetTaunt_Func");
    TriggerEnable(libHXAL_gt_HeroXalatathForceAcquireTargetTaunt, false);
    TriggerAddEventPlayerEffectUsed(libHXAL_gt_HeroXalatathForceAcquireTargetTaunt, c_playerAny, "ForceTargetToAttackCasterUnitScriptDummy");
}

//--------------------------------------------------------------------------------------------------
// Trigger: Hero - Xalatath - Hold Fire
//--------------------------------------------------------------------------------------------------
bool libHXAL_gt_HeroXalatathHoldFire_Func (bool testConds, bool runActions) {
    // Variable Declarations
    unit lv_xalatath;

    // Automatic Variable Declarations
    // Variable Initialization
    lv_xalatath = EventUnit();

    // Conditions
    if (testConds) {
        if (!((UnitIsAlive(lv_xalatath) == true))) {
            return false;
        }

        if (!((UnitGetType(lv_xalatath) == "HeroXalatath"))) {
            return false;
        }
    }

    // Actions
    if (!runActions) {
        return true;
    }

    UnitBehaviorAdd(lv_xalatath, "XalatathHeroWeaponDisablerHoldFire", lv_xalatath, 1);
    return true;
}

//--------------------------------------------------------------------------------------------------
void libHXAL_gt_HeroXalatathHoldFire_Init () {
    libHXAL_gt_HeroXalatathHoldFire = TriggerCreate("libHXAL_gt_HeroXalatathHoldFire_Func");
    TriggerEnable(libHXAL_gt_HeroXalatathHoldFire, false);
    TriggerAddEventUnitOrder(libHXAL_gt_HeroXalatathHoldFire, null, AbilityCommand("HoldFire", 1));
}

void libHXAL_InitTriggers () {
    libHXAL_gt_HeroXalatathVoidVolleyCooldownReset_Init();
    libHXAL_gt_HeroXalatathHeroWeaponApplyTargetingUnit_Init();
    libHXAL_gt_HeroXalatathTargetAcquired_Init();
    libHXAL_gt_HeroXalatathForceAcquireTargetTaunt_Init();
    libHXAL_gt_HeroXalatathHoldFire_Init();
}

//--------------------------------------------------------------------------------------------------
// Library Initialization
//--------------------------------------------------------------------------------------------------
bool libHXAL_InitLib_completed = false;

void libHXAL_InitLib () {
    if (libHXAL_InitLib_completed) {
        return;
    }

    libHXAL_InitLib_completed = true;

    libHXAL_InitLibraries();
    libHXAL_InitVariables();
    libHXAL_InitTriggers();
}