Null?

13lade619

is now a game developer :)
Reaction score
399
Ok.. main question of this thread is:
How do you wrongfully have a "(null)" unit in run-time / in-game

I know that my problem is not in scripting/syntax because
a) the problem does not happen always.,
b) it is minimally replicable (i have not found the EXACT cause.)

So i figured it might be some weird conflict with something in my map.

The problem is this generated error message:
JASS:
    function GetUnitId takes unit u returns integer
        debug if u==null then
        debug   call BJDebugMsg("|cFFFF0000Error using AIDS:|r Trying to get the id (inlines) of null unit.")
        debug   call BJDebugMsg(GetUnitName(u))
        debug endif
        return GetUnitUserData(u)
    endfunction


What i found out regarding probable errors on syntax:

JASS:

    call GetUnitId(null) //This will correctly show the error message.


    local unit x = null
    call GetUnitId(x) //This will correctly show the error message.


    local unit x = null
    set x = CreateUnit(Player(0),'n00B',0,0,0)
    call KillUnit(x)
    call TriggerSleepAction(1) //A unit dies before getting processed, index goes through the recycler.
    call GetUnitId(x) //This NOT show any error... it proceeds normally.

    

    //however...

    local unit x //undeclared
    call GetUnitId(x) //This will STOP the entire thread.

    //But AFAIK, i'm not having this kind of error.
 

kingkingyyk3

Visitor (Welcome to the Jungle, Baby!)
Reaction score
216
It is normal. When compare a undeclared variables to a value, it will be paused. This teached you to declare a value for every variables, for less hassling.
 

Sevion

The DIY Ninja
Reaction score
413
Method 3 proceeds correctly because the unit is technically not null. Why? I don't know.

You can even try this test code:

JASS:
scope test initializer initTest
    private function initTest takes nothing returns nothing
        local unit u = CreateUnit(Player(0), 'hfoo', 0, 0, 0)
        call SetUnitUserData(u, 1)
        call KillUnit(u)
        if ( u == null ) then
            call BJDebugMsg("ZOMG IT HAS TEH NULLZ!!!!")
        else
            call BJDebugMsg(I2S(GetUnitUserData(u)))
        endif
    endfunction
endscope


It'll correctly display 1.

However, if you change it to this:

JASS:
scope test initializer initTest
    private function initTest takes nothing returns nothing
        local unit u = CreateUnit(Player(0), 'hfoo', 0, 0, 0)
        call SetUnitUserData(u, 1)
        call KillUnit(u)
        if ( IsUnitType(u, UNIT_TYPE_DEAD) ) then
            call BJDebugMsg("ZOMG IT BE DEAD! IT HAS NO DATA (lolz I jk I has lies. It has, but I haxxor you!)")
        else
            call BJDebugMsg(I2S(GetUnitUserData(u)))
        endif
    endfunction
endscope


It instead displays the long string I put in there.
 

the Immortal

I know, I know...
Reaction score
51
> the unit is technically not null. Why? I don't know.
Because it exists. A dead unit is still an unit nonetheless. It just has one classification more- [ljass]UNIT_TYPE_DEAD[/ljass].

On your problem, try debugging more. Obviously you are sending a null unit (the reasons may be many - incorrectly indexed unit arrays, forgetting to clean/re-set a reused variable, etcetc..). If you are unable to find it manually (i.e. inspecting the code), put debug msgs with calling stack info wherever you use GetUnitId (err, <[ljass]if u == null then print("function XXX sending a null unit while enumerating units in range")[/ljass]> .. something like this), and try to reproduce the bug. It can't be that random. (hope you don't have lines like <[ljass]if GetRandomInt(0, 1) == 0 then set u = null[/ljass]> after all =D).
 
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