What are these functions for? And how to...

cryowraith

New Member
Reaction score
7
What are...


I'm trying to replace a hero spell with another (including their research buttons) when this hero casts a certain spell. Some sort like engineering upgrade, but this happens on the event of casting a spell. UnitRemoveAbility does not remove the research button so I'm looking for a solution here. Anyone knows how?

Thanks in advance.
 

Sooda

Diversity enchants
Reaction score
318
First should be GUI Disable/enable ability for player. Make permanent native should keep added abilities even after morph ability is used.

To check convert GUI trigger with Disable/Enable ability for player and look is it same as your native. I doubt Make Permanent native is in GUI.
 

cryowraith

New Member
Reaction score
7
Thanks for the response. And the solution was to use Enable/Disable instead of Add/Remove. Can anyone check if my code can be further improved or not? This is my first time using vJass.

There are 2 parts in the code. 1st part is upgrading the skills in the spellbook when the skill is leveled. 2nd part is switching spellbooks when a skill is casted.

JASS:
scope LearnWarriorSkills initializer Init
    globals
        private constant integer WarriorBookID = 'A001'   //Warrior Skills
        private constant integer Spell1ID = 'A002'      //Taunt
        private constant integer Spell2ID = 'A003'      //Strike
        
        private constant integer AdvCrusader = 'A004'   //Crusader Advancement
        private constant integer AdvBerserker = 'A005'  //Berserker Advancement
        
        private constant integer CrusaderBookID = 'A000'    //Crusader Skills
    endglobals
    
    //=================== START OF LEARN ==================

    private function Learn_Conditions takes nothing returns boolean
        return GetLearnedSkill() == WarriorBookID
    endfunction

    private function Learn_Actions takes nothing returns nothing
        local integer SpellbookLevel = GetLearnedSkillLevel()
        
        if (SpellbookLevel > 1) then
            call SetUnitAbilityLevel( GetTriggerUnit(), Spell1ID, SpellbookLevel)
        else
            return
        endif
        if (SpellbookLevel > 2) then
            call SetUnitAbilityLevel( GetTriggerUnit(), Spell2ID, SpellbookLevel-1)
        endif
    endfunction
    
    //========================== END OF LEARN ======================
    //======================= START OF ADVANCEMENT ==================
    
    private function Crusader_Conditions takes nothing returns boolean
        return GetSpellAbilityId() == AdvCrusader
    endfunction
    
    private function Crusader_Actions takes nothing returns nothing
        local unit u = GetTriggerUnit()
        
        call UnitRemoveAbility(u, WarriorBookID)
        call SetPlayerAbilityAvailable(GetOwningPlayer(u), WarriorBookID, false)
        call SetPlayerAbilityAvailable(GetOwningPlayer(u), CrusaderBookID, true)
        call UnitAddAbility(u, CrusaderBookID)
        call SetUnitAbilityLevel(u, CrusaderBookID, 1)
    endfunction
    
    //========================== END OF ADVANCEMENT ==================

//===========================================================================
    private function Init takes nothing returns nothing
        local trigger LearnWarriorSkillsTrg = CreateTrigger(  )
        local trigger CrusaderAdvTrg = CreateTrigger(  )
        
        //Learning Trigger
        call TriggerRegisterAnyUnitEventBJ( LearnWarriorSkillsTrg, EVENT_PLAYER_HERO_SKILL )
        call TriggerAddCondition( LearnWarriorSkillsTrg, Condition( function Learn_Conditions ) )
        call TriggerAddAction( LearnWarriorSkillsTrg, function Learn_Actions )
        
        //Advancement Triggers
        call TriggerRegisterAnyUnitEventBJ( CrusaderAdvTrg, EVENT_PLAYER_UNIT_SPELL_EFFECT )
        call TriggerAddCondition( CrusaderAdvTrg, Condition( function Crusader_Conditions ) )
        call TriggerAddAction( CrusaderAdvTrg, function Crusader_Actions )
        
        call SetPlayerAbilityAvailable(GetLocalPlayer(), CrusaderBookID, false)
    endfunction
endscope


Thanks in advance.
 

Komaqtion

You can change this now in User CP.
Reaction score
469
Here's what I'd suggest ;)

JASS:
scope LearnWarriorSkills initializer Init

    globals
        private constant integer WarriorBookID = 'A001'   //Warrior Skills
        private constant integer Spell1ID = 'A002'      //Taunt
        private constant integer Spell2ID = 'A003'      //Strike
        
        private constant integer AdvCrusader = 'A004'   //Crusader Advancement
        private constant integer AdvBerserker = 'A005'  //Berserker Advancement
        
        private constant integer CrusaderBookID = 'A000'    //Crusader Skills
    endglobals
    
    //=================== START OF LEARN ==================

    private function Learn_Conditions takes nothing returns boolean
        return GetLearnedSkill() == WarriorBookID and GetLearnedSkillLevel() >= 1
    endfunction

    private function Learn_Actions takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local integer SpellbookLevel = GetLearnedSkillLevel()
        
        if ( SpellbookLevel == 1 ) then
            call SetUnitAbilityLevel( u, Spell1ID, SpellbookLevel )
        elseif ( SpellbookLevel == 2 ) then
            call SetUnitAbilityLevel( u, Spell2ID, SpellbookLevel - 1 )
        endif
        
    endfunction
    
    //========================== END OF LEARN ======================
    //======================= START OF ADVANCEMENT ==================
    
    private function Crusader_Conditions takes nothing returns boolean
        return GetSpellAbilityId() == AdvCrusader
    endfunction
    
    private function Crusader_Actions takes nothing returns nothing
        local unit u = GetTriggerUnit()
        local player p = GetOwningPlayer( u )
        
        call UnitRemoveAbility( u, WarriorBookID )
        call SetPlayerAbilityAvailable( p, WarriorBookID, false )
        call SetPlayerAbilityAvailable( p, CrusaderBookID, true )
        call UnitAddAbility( u, CrusaderBookID )
        call SetUnitAbilityLevel( u, CrusaderBookID, 1 )
        
        set u = null
        set p = null
    endfunction
    
    //========================== END OF ADVANCEMENT ==================

//===========================================================================
    private function Init takes nothing returns nothing
        local trigger t = CreateTrigger()
        local integer i = 0
        
        //Learning Trigger
        loop
            call TriggerRegisterPlayerUnitEvent( t, Player( i ), EVENT_PLAYER_HERO_SKILL, null )
            call SetPlayerAbilityAvailable( Player( i ), CrusaderBookID, false)
            
            set i = i + 1
            exitwhen i >= 12
        endloop
        
        call TriggerAddCondition( t, Condition( function Learn_Conditions ) )
        call TriggerAddAction( t, function Learn_Actions )
        
        //Advancement Triggers
        set t = CreateTrigger()
        set i = 0
        
        loop
            call TriggerRegisterPlayerUnitEvent( t, Player( i ), EVENT_PLAYER_HERO_SKILL, null )
            
            set i = i + 1
            exitwhen i >= 12
        endloop
        
        call TriggerAddCondition( t, Condition( function Crusader_Conditions ) )
        call TriggerAddAction( t, function Crusader_Actions )
    endfunction
    
endscope


Just some optimization here and there :D
 

cryowraith

New Member
Reaction score
7
Aha. I see that I forgot to remove leaks.

But this part was intended to be this way, since every time I level the spellbook I want to increase all the spells' levels by 1, and certain spells only appear after certain level of the spellbook ability. Perhaps I should put them in an array and loop through it. Yes I'll do that tomorrow.

JASS:
if (SpellbookLevel > 1) then
            call SetUnitAbilityLevel( GetTriggerUnit(), Spell1ID, SpellbookLevel)
        else
            return
        endif
        if (SpellbookLevel > 2) then
            call SetUnitAbilityLevel( GetTriggerUnit(), Spell2ID, SpellbookLevel-1)
        endif


Thanks for the help. +rep
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      No members online now.

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top