SetUnitZ problem

BlueMirage

Trust, but doubt.
Reaction score
39
I'm trying to make a trigger that will allow a player to capture a base.
It's supposed to make only one building visible at a time by making the other two invisible by raising their Z values locally. Problem is, nothing happens. Sometimes the base isn't captured either.

Here's the full trigger:
JASS:
function SetUnitZ takes unit u, real z returns nothing
    local location l = Location(GetUnitX(u), GetUnitY(u))
    local real rz = z - GetLocationZ(l)
    call UnitAddAbility(u, 'Amrf')
    call SetUnitFlyHeight(u, rz, 0.)
    call UnitRemoveAbility(u, 'Amrf')
    call RemoveLocation(l)
    set l = null
endfunction

function UncaptureCon takes nothing returns boolean //Added to local trigger
    return GetEventDamage() > 0.00
endfunction

function UncaptureAct takes nothing returns nothing //Added to local trigger
    call UnitRemoveAbility(GetTriggerUnit(), 'B000')
    call DestroyTrigger(GetTriggeringTrigger())
endfunction

function Trig_Capture_Conditions takes nothing returns boolean
    return GetItemTypeId(GetSoldItem()) == 'I000'
endfunction

function Trig_Capture_Filters takes nothing returns boolean
    local unit u = GetFilterUnit()
    local boolean b = IsUnitType(u, UNIT_TYPE_STRUCTURE) == true and GetUnitTypeId(u) != 'n000' and GetUnitTypeId(u) != 'n007' and GetUnitTypeId(u) != 'n008' //Unit types = the buildings I'm trying to manipulate.
    set u = null
    return b
endfunction

function Trig_Capture_ConvertBase takes nothing returns nothing
    local unit u = GetEnumUnit()
    call SetUnitOwner(u, GetOwningPlayer(udg_TempUnit), true)
    set u = null
endfunction

function Trig_Capture_ReviveHeroes takes nothing returns nothing
    local unit u = GetEnumUnit()
    
    if IsUnitAlly(u, GetOwningPlayer(udg_TempUnit)) == true then
        call ReviveHero(u, GetUnitX(udg_TempUnit), GetUnitY(udg_TempUnit), true)
        call GroupRemoveUnit(udg_DeadHeroes, u)
    endif
    
    set u = null
endfunction

function Trig_Capture_Actions takes nothing returns nothing
    local unit ub = GetBuyingUnit()
    local unit um = GetTriggerUnit()
    local integer i = GetUnitUserData(um) //Used to determine which structures are involved using a table. Set at map init.
    local integer i2
    local unit uc = udg_Circle<i>

    local real x = GetUnitX(uc)
    local real y = GetUnitY(uc)
    local trigger t = CreateTrigger()
    local group g
    local player p
    
    call SetUnitX(ub, x)
    call SetUnitY(ub, y)
    call SetUnitFacing(ub, Angle(x, y, GetUnitX(um), GetUnitY(um)))

    call DummySpell(ub, &#039;A001&#039;, &quot;thunderbolt&quot;) //Orders a dummy to stun the buyer, works fine.
    call SetUnitAnimation(ub, &quot;channel&quot;)

    call TriggerRegisterUnitEvent(t, ub, EVENT_UNIT_DAMAGED)
    call TriggerAddCondition(t, Condition(function UncaptureCon))
    call TriggerAddAction(t, function UncaptureAct)
    
    call TriggerSleepAction(6.00)
    
    if GetUnitAbilityLevel(ub, &#039;B000&#039;) &gt; 0 then

        set p = GetOwningPlayer(ub)       
        set i2 = 0
        loop
            if GetLocalPlayer() == Player(i2) then
                call SetUnitZ(udg_RodsNeut<i>, 3000.)
                if IsPlayerAlly(Player(i2), p) == true then
                    call SetUnitZ(udg_RodsAlly<i>, 0.)
                else
                    call SetUnitZ(udg_RodsHost<i>, 0.)
                endif
            endif 
            exitwhen i2 == 11
            set i2 = i2 + 1
        endloop

        set udg_TempUnit = ub
        set g = CreateGroup()

        call GroupEnumUnitsInRange(g, x, y, 700., Filter(function Trig_Capture_Filters))
        call ForGroup(g, function Trig_Capture_ConvertBase)

        call ForGroup(udg_DeadHeroes, function Trig_Capture_ReviveHeroes) //Irrelevant for now

        call DestroyGroup(g)
        set g = null

    endif
    
    call UnitRemoveAbility(ub, &#039;B000&#039;)
    call SetUnitAnimation(ub, &quot;stand&quot;)
    call DestroyTrigger(t)
    set t = null
    set ub = null
    set um = null
    set uc = null
endfunction

//===========================================================================
function InitTrig_Capture takes nothing returns nothing
    local trigger t = CreateTrigger() 
    call TriggerRegisterAnyUnitEventBJ( t, EVENT_PLAYER_UNIT_SELL_ITEM )
    call TriggerAddCondition( t, Condition( function Trig_Capture_Conditions ) )
    call TriggerAddAction( t, function Trig_Capture_Actions )
endfunction</i></i></i></i>
 

Crazy_Dead

New Member
Reaction score
24
JASS:
function SetUnitZ takes unit u, real z returns nothing
    local location l = Location(GetUnitX(u), GetUnitY(u))
    local real rz = z - GetLocationZ(l)
    call UnitAddAbility(u, &#039;Amrf&#039;)
    call SetUnitFlyHeight(u, rz, 0.)
    call UnitRemoveAbility(u, &#039;Amrf&#039;)
    call RemoveLocation(l)
    set l = null
endfunction


-->

JASS:
function SetUnitZ takes unit u, real z returns nothing
    local location l = Location(GetUnitX(u), GetUnitY(u))
    local real rz = z - GetLocationZ(l)
    call UnitAddAbility(u, &#039;Amrf&#039;)
    call UnitRemoveAbility(u, &#039;Amrf&#039;)
    call SetUnitFlyHeight(u, rz, 0.)
    call RemoveLocation(l)
    set l = null
endfunction


Tested?
 

Jedi

New Member
Reaction score
63
You are not changing fly height, you are just getting Z of unit and set same fly height again.(btw, what is the value of z that function takes?)
 

BlueMirage

Trust, but doubt.
Reaction score
39
Not tested in that way.
You are not changing fly height, you are just getting Z of unit and set same fly height again.
JASS:
function SetUnitZ takes unit u, real z returns nothing
    local location l = Location(GetUnitX(u), GetUnitY(u))
    local real rz = z - GetLocationZ(l)
    call UnitAddAbility(u, &#039;Amrf&#039;)
    call SetUnitFlyHeight(u, rz, 0.)
    call UnitRemoveAbility(u, &#039;Amrf&#039;)
    call RemoveLocation(l)
    set l = null
endfunction

Btw this takes Z = 3000 in my main trigger.

From my understanding, it only changes the fly height to account for terrain. This is because the same function will be used for changing the Z of units when it comes to normal spells and it would look bad if the unit's Z suddenly increased just because it went over a wall.

Tested setting the Z on a normal unit, works fine.

EDIT:

I think I found the problem. I gave the buildings a fly height through the object editor, and this shows up when I'm in the editor but when I test the map they appear as normal, stuck to the ground. Maybe buildings can't get their Z values changed?
 

Rushhour

New Member
Reaction score
46
are you sure about setting the rate of the flyingheight changing native to 0. ? I always bike some random real big values and I don't have any problems with delay or stuff.
 

BlueMirage

Trust, but doubt.
Reaction score
39
Well, I think 0 is instant set, but since it worked on another unit quite perfectly I suppose that having 0 as a value works.
 

BlueMirage

Trust, but doubt.
Reaction score
39
Bump.

Maybe there's some value that the unit can't have from the object editor, like Hover or something?
 
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