• 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.
  • Create a faction for Warcraft 3 and enter Hive's 19th Techtree Contest: Co-Op Commanders! Click here to enter!
  • Create a void inspired texture for Warcraft 3 and enter Hive's 34th Texturing Contest: Void! Click here to enter!
  • The Hive's 21st Texturing Contest: Upgrade is now concluded, time to vote for your favourite set of icons! Click here to vote!

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