• Listen to a special audio message from Bill Roper to the Hive Workshop community (Bill is a former Vice President of Blizzard Entertainment, Producer, Designer, Musician, Voice Actor) 🔗Click here to hear his message!
  • Read Evilhog's interview with Gregory Alper, the original composer of the music for WarCraft: Orcs & Humans 🔗Click here to read the full interview.

Make Weep's GDD JASS

Status
Not open for further replies.
Level 17
Joined
Feb 11, 2011
Messages
1,860
Hi,

I want to use Weep's GDD, but the JASS version (without user-defined globals). I saw that the documentation says you can just uncomment a section instead of creating the user-defined variables. I did this, and it saves fine, but in-game nothing happens. Then, when I try the GUI version, it works. How can I make it into JASS? Here is what I tried, but doesn't work:

JASS:
library GDD initializer onInit

    function GDD_RecycleRate takes nothing returns real //The rate at which the system checks units to see if they've been removed from the game
        return 0.03
    endfunction

    function GDD_Filter takes unit u returns boolean //The condition a unit has to pass to have it registered for damage detection
        return GetUnitAbilityLevel(u, 'Aloc') == 0 //By default, the system ignores Locust units, because they normally can't take damage anyway
    endfunction

    //===================================================================
    // This is just for reference.
    // If you use JassHelper, you could uncomment this section instead of creating the variables in the trigger editor.

     globals
      real udg_GDD_Event = 0.
      real udg_GDD_Damage = 0.
      unit udg_GDD_DamagedUnit
      unit udg_GDD_DamageSource
      trigger array udg_GDD__TriggerArray
      integer array udg_GDD__Integers
      unit array udg_GDD__UnitArray
      group udg_GDD__LeftMapGroup = CreateGroup()
     endglobals

    //===================================================================
    // System code follows.  Don't touch!
    function GDD_Event takes nothing returns boolean
        local unit damagedcache = udg_GDD_DamagedUnit
        local unit damagingcache = udg_GDD_DamageSource
        local real damagecache = udg_GDD_Damage
        set udg_GDD_DamagedUnit = GetTriggerUnit()
        set udg_GDD_DamageSource = GetEventDamageSource()
        set udg_GDD_Damage = GetEventDamage()
        set udg_GDD_Event = 1.
        set udg_GDD_Event = 0.
        set udg_GDD_DamagedUnit = damagedcache
        set udg_GDD_DamageSource = damagingcache
        set udg_GDD_Damage = damagecache
        set damagedcache = null
        set damagingcache = null
        return false
    endfunction

    function GDD_AddDetection takes nothing returns boolean
    //  if(udg_GDD__Integers[0] > 8190) then
    //      call BJDebugMsg("GDD: Too many damage events!  Decrease number of units present in the map or increase recycle rate.")
    //      ***Recycle rate is specified in the GDD_RecycleRate function at the top of the code.  Smaller is faster.***
    //      return
    //  endif
        if(IsUnitInGroup(GetFilterUnit(), udg_GDD__LeftMapGroup)) then
            call GroupRemoveUnit(udg_GDD__LeftMapGroup, GetFilterUnit())
        elseif(GDD_Filter(GetFilterUnit())) then
            set udg_GDD__Integers[0] = udg_GDD__Integers[0]+1
            set udg_GDD__UnitArray[udg_GDD__Integers[0]] = GetFilterUnit()
            set udg_GDD__TriggerArray[udg_GDD__Integers[0]] = CreateTrigger()
            call TriggerRegisterUnitEvent(udg_GDD__TriggerArray[udg_GDD__Integers[0]], udg_GDD__UnitArray[udg_GDD__Integers[0]], EVENT_UNIT_DAMAGED)
            call TriggerAddCondition(udg_GDD__TriggerArray[udg_GDD__Integers[0]], Condition(function GDD_Event))
        endif
        return false
    endfunction

    function GDD_PreplacedDetection takes nothing returns nothing
        local group g = CreateGroup()
        local integer i = 0
        loop
            call GroupEnumUnitsOfPlayer(g, Player(i), Condition(function GDD_AddDetection))
            set i = i+1
            exitwhen i == bj_MAX_PLAYER_SLOTS
        endloop
        call DestroyGroup(g)
        set g = null
    endfunction

    function GDD_GroupRefresh takes nothing returns nothing
    // Based on GroupRefresh by Captain Griffen on wc3c.net
        if (bj_slotControlUsed[5063] == true) then
            call GroupClear(udg_GDD__LeftMapGroup)
            set bj_slotControlUsed[5063] = false
        endif
        call GroupAddUnit(udg_GDD__LeftMapGroup, GetEnumUnit())
    endfunction

    function GDD_Recycle takes nothing returns nothing
        if(udg_GDD__Integers[0] <= 0) then
            return
        elseif(udg_GDD__Integers[1] <= 0) then
            set udg_GDD__Integers[1] = udg_GDD__Integers[0]
        endif
        if(GetUnitTypeId(udg_GDD__UnitArray[udg_GDD__Integers[1]]) == 0) then
            call DestroyTrigger(udg_GDD__TriggerArray[udg_GDD__Integers[1]])
            set udg_GDD__TriggerArray[udg_GDD__Integers[1]] = null
            set udg_GDD__TriggerArray[udg_GDD__Integers[1]] = udg_GDD__TriggerArray[udg_GDD__Integers[0]]
            set udg_GDD__UnitArray[udg_GDD__Integers[1]] = udg_GDD__UnitArray[udg_GDD__Integers[0]]
            set udg_GDD__UnitArray[udg_GDD__Integers[0]] = null
            set udg_GDD__Integers[0] = udg_GDD__Integers[0]-1
        endif
        set udg_GDD__Integers[1] = udg_GDD__Integers[1]-1
    endfunction

    function GDD_LeaveMap takes nothing returns boolean
        local boolean cached = bj_slotControlUsed[5063]
        if(udg_GDD__Integers[2] < 64) then
            set udg_GDD__Integers[2] = udg_GDD__Integers[2]+1
        else
            set bj_slotControlUsed[5063] = true
            call ForGroup(udg_GDD__LeftMapGroup, function GDD_GroupRefresh)
            set udg_GDD__Integers[2] = 0
        endif
        call GroupAddUnit(udg_GDD__LeftMapGroup, GetFilterUnit())
        set bj_slotControlUsed[5063] = cached
        return false
    endfunction

    // ===========================================================================
    function onInit takes nothing returns nothing
        local region r = CreateRegion()
        call RegionAddRect(r, GetWorldBounds())
        call TriggerRegisterEnterRegion(CreateTrigger(), r, Condition(function GDD_AddDetection))
        call TriggerRegisterLeaveRegion(CreateTrigger(), r, Condition(function GDD_LeaveMap))
        call GDD_PreplacedDetection()
        call TimerStart(CreateTimer(), GDD_RecycleRate(), true, function GDD_Recycle)
        set r = null
    endfunction

endlibrary

I put it in a library with initializer onInit. But nothing. Ideas?

Thanks,

Mr_Bean
 
Status
Not open for further replies.
Top