Struct Issues

Naga'sShadow

Ultra Cool Member
Reaction score
49
I'm very new to structs, so my issue may just be one of a basic error on my part.

JASS:
scope Meld initializer Init

globals
    private integer SpellID = 'A0AU' //Spells Rawcode
    private integer AbilID = 'A0AV' //Ability Rawcode
    private constant string SFX = "Abilities\\Spells\\Orc\\EtherealForm\\SpiritWalkerChange.mdl" //SFX
endglobals

struct meld
    unit u
    real X
    real Y
endstruct

private function Meld_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == SpellID
endfunction

private function Meld_Loop takes nothing returns boolean
    local meld Data = meld.create()
    local unit cast = Data.u
    local real castX = Data.X
    local real castY = Data.Y
    
    return GetUnitCurrentOrder(GetTriggerUnit()) != String2OrderIdBJ("channel")
endfunction

private function Meld_Actions takes nothing returns nothing
    local unit cast = GetTriggerUnit()
    local real castX = GetLocationX(GetUnitLoc(cast))
    local real castY = GetLocationY(GetUnitLoc(cast))
    local meld Data = meld.create()
    
    set Data.u = cast
    set Data.X = castX
    set Data.Y = castY
    call AddSpecialEffect( SFX, castX, castY)
    call UnitAddAbility(cast, AbilID)
    loop
        exitwhen( Meld_Loop())
        call TriggerSleepAction(RMaxBJ(bj_WAIT_FOR_COND_MIN_INTERVAL, 0.50))
    endloop
    
    call UnitRemoveAbility(cast, AbilID)
    set cast = null
endfunction

//===========================================================================
function Init takes nothing returns nothing
    local trigger trg = CreateTrigger( )
    call TriggerRegisterAnyUnitEventBJ( trg, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition( trg, Condition(function Meld_Conditions))
    call TriggerAddAction( trg, function Meld_Actions )
    set trg = null
endfunction

endscope


In this trigger the unit gets an ability, ghost, as long as it casts channel. I wanted to have it check if the unit has moved as well as if it has changed orders. But currently I'm not able to pass the data between functions via structs. A debug message already informed me the "cast" in Meld_Loop was staying null. I've worked around it using GetTriggerUnit() but that won't give me the X and the Y of the unit to compare with the X and the Y on cast.

1.) Can anyone point out how I would fix that?
2.) Is there a simpler way of setting this type of trigger up?

Thanks.
 

Romek

Super Moderator
Reaction score
963
It's not working because you're creating a new struct instance in here:
JASS:
private function Meld_Loop takes nothing returns boolean
    local meld Data = meld.create() // New struct instance
    local unit cast = Data.u
    local real castX = Data.X
    local real castY = Data.Y
    
    return GetUnitCurrentOrder(GetTriggerUnit()) != String2OrderIdBJ("channel")
endfunction


You could make MeldLoop either take "meld" as an argument:
JASS:
private function Meld_Loop takes meld Data returns boolean
    local unit cast = Data.u
    local real castX = Data.X
    local real castY = Data.Y
    
    return GetUnitCurrentOrder(GetTriggerUnit()) != String2OrderIdBJ("channel")
endfunction


or make it a method inside the struct.
 
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