Kill units in a group effeciently

Matrixboy

New Member
Reaction score
1
Hello there everyone. I used to be quite adept at JASS, and left a while ago. I am taking up a new map project now, however. Trying to get back in the groove, I started with something really simple. A "if the player slot wasn't filled, remove their hero." I did a long line of if statements to solve this, with it acting on map initialization. It went from that, to finally these two functions that I have it at now.

Code:
function remove_player_unit takes integer x returns nothing
    local unit character = udg_character[x] *
    call TriggerSleepAction( 120.00 )
    call PingMinimap (GetUnitX(character), GetUnitY(character), 2.00)
    call KillUnit( character )
    set character = null 
endfunction
and

Code:
function check_empty takes nothing returns nothing
local integer x = 0
    loop
    exitwhen x==12
      if ( GetPlayerSlotState(Player(x)) != PLAYER_SLOT_STATE_PLAYING ) then
                call remove_player_unit(x)
        endif
        set x = x+1
    endloop 
endfunction
* udg_character is a global array that has been preset with each corresponding player's hero. (e.g. udg_character[0] is red's hero, udg_character[11] is brown's). A variable is used because this unit _will_ change over time. Transformations and etc. are going to be applied, leaving it as a separate unit.

Two functions are used in this case, because I want to be able to call remove_player_unit in other situations (i.e. if someone is kicked, not just doing one check at the initialization).


I have one question, however. Some of the players have multiple heroes. Mainly purple and yellow. Purple's will go back and forth between one and two, and yellow will go from three to one, and remain that way. Is there any way I can efficiently write "kill all units owned by player(x)" or "kill all units in group X?" I am trying to keep the code as efficient as possible, as it is going to be quite a big map.

thanks in advance!

Travis
 

Azlier

Old World Ghost
Reaction score
461
Well, you should look into vJass. Those godforsaken udg_ globals are unneeded.

The most efficient way to kill all units of a player?

This comes close.

JASS:
globals
    group KillGroup = CreateGroup()
endglobals

function KillAllUnits takes nothing returns boolean
    call KillUnit(GetFilterUnit())
    return false
endfunction

function Whatever takes nothing returns nothing
    call GroupEnumUnitsOfPlayer(KillGroup, Player(0), Filter(function KillAllUnits))
endfunction

This requires NewGen, because normal Jass won't accept freeform globals. I've also neglected to use scopes or anything, to make it easier to understand.
 

Matrixboy

New Member
Reaction score
1
Well, you should look into vJass. Those godforsaken udg_ globals are unneeded.

The most efficient way to kill all units of a player?

This comes close.

JASS:
globals
    group KillGroup = CreateGroup()
endglobals

function KillAllUnits takes nothing returns boolean
    call KillUnit(GetFilterUnit())
    return false
endfunction

function Whatever takes nothing returns nothing
    call GroupEnumUnitsOfPlayer(KillGroup, Player(0), Filter(function KillAllUnits))
endfunction

This requires NewGen, because normal Jass won't accept freeform globals. I've also neglected to use scopes or anything, to make it easier to understand.

I have a copy of newgen open right now, studying the differences. I also have the vjass reference manual opened up for a little reading material. However, you state that udg_variables are bad. I completely agree, however how is the newgen method of globals any better? From what I can tell, all it does is it carries it to the top of the .j file, as that's where globals are really defined. In my case, I cannot find an option other than using globals, unless I went for one of the handle methods that carry locals over, which I would need to do a considerable amount of reading on.

Thank you for recommending me vjass/newgen, it seems like it'll make a lot of writing this easier. And thank you for the code example, I'll use that as a base to impliment what I'm trying to do. Thanks :)
 

Azlier

Old World Ghost
Reaction score
461
Well, think of it this way. With udg_ variables, porting code from map to map is a pain. You would have to open the GUI variable editor and create the variables with strict names and instructions. With freeform globals, you can make your variables without needing to depend on the user (and fill the WE Help forums with threads on why the code won't work...).
 

Matrixboy

New Member
Reaction score
1
Well, think of it this way. With udg_ variables, porting code from map to map is a pain. You would have to open the GUI variable editor and create the variables with strict names and instructions. With freeform globals, you can make your variables without needing to depend on the user (and fill the WE Help forums with threads on why the code won't work...).
Sounds a good enough reason to switch :)

Thanks for all of your help azlier.
 
General chit-chat
Help Users
  • No one is chatting at the moment.
  • jonas jonas:
    That sounds like fun!
    +1
  • The Helper The Helper:
    it was a blast!
  • The Helper The Helper:
    I am going to post the Youtube of the investigation in the forums when it is ready
    +1
  • jonas jonas:
    cool!
  • vypur85 vypur85:
    Sounds cool TH.
  • tom_mai78101 tom_mai78101:
    I was on a Legend of Zelda marathon...
  • tom_mai78101 tom_mai78101:
    Am still doing it now
    +1
  • jonas jonas:
    which one(s) are you playing?
  • jonas jonas:
    I played a little bit of the switch title two weeks ago and found it quite boring
  • The Helper The Helper:
    just got back from San Antonio this weekend had the best Buffalo Chicken Cheesesteak sandwhich in Universal City, TX - place was called Yous Guys freaking awesome! Hope everyone had a fantastic weekend!
    +1
  • The Helper The Helper:
    Happy Tuesday!
  • The Helper The Helper:
    We have been getting crazy numbers reported by the forum of people online the bots are going crazy on us I think it is AI training bots going at it at least that is what it looks like to me.
  • The Helper The Helper:
    Most legit traffic is tracked on multiple Analytics and we have Cloud Flare setup to block a ton of stuff but still there is large amount of bots that seem to escape detection and show up in the user list of the forum. I have been watching this bullshit for a year and still cannot figure it out it is drving me crazy lol.
    +1
  • Ghan Ghan:
    Beep boop
    +1
  • The Helper The Helper:
    hears robot sounds while 250 bots are on the forum lol
  • The Helper The Helper:
    Happy Saturday!
    +1
  • The Helper The Helper:
    and then it was Thursday...
    +2
  • tom_mai78101 tom_mai78101:
    And then Monday
    +1
  • The Helper The Helper:
    I got the day off today!
    +1
  • tom_mai78101 tom_mai78101:
    How...? (T-T)
  • The Helper The Helper:
    I took the day off. I work for myself so I can do that.
    +1
  • Varine Varine:
    Well I'm already over summer
  • jonas jonas:
    varine! good to see you
  • jonas jonas:
    what's going on, what's got you going
  • The Helper The Helper:
    good to see you varine hope you are well my friend

    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