Problem with my trigger? Global var problem?

neo34rd

New Member
Reaction score
3
Hi guys I have a problem coding my spell:

Spell Name: Paramorph
What it does: 25% outright chance to turn the damaging unit into a random critter (hex)
Current Issue(s): Random units across the board are getting hexed!

Btw Im using some guys damage detection system so far its worked nicely and its claimed to be mui here it is:

Init Trigger:
Trigger:
  • GDD Variable Creator
    • Events
    • Conditions
    • Actions
      • Set GDD_Event = 0.00
      • Set GDD_Damage = 0.00
      • Set GDD_DamagedUnit = No unit
      • Set GDD_DamageSource = No unit
      • Set GDD__TriggerArray[0] = (This trigger)
      • Set GDD__Integers[0] = 0
      • Set GDD__UnitArray[0] = No unit
      • Set GDD__LeftMapGroup = GDD__LeftMapGroup
    • [\wc3]
    • Actual Trigger:
    • <div class="bbCodeBlock bbCodeBlock--screenLimited bbCodeBlock--code">
      • <div class="bbCodeBlock-title">
        • Code:
      • </div>
      • <div class="bbCodeBlock-content" dir="ltr">
        • <pre class="bbCodeCode" dir="ltr" data-xf-init="code-block" data-lang=""><code>// GUI-Friendly Damage Detection -- v1.2.1 -- by Weep
    • // http:// www.thehelper.net/forums/showthread.php?t=137957
    • //
    • // Requires: only this trigger and its variables.
    • //
    • // -- What? --
    • // This snippet provides a leak-free, GUI-friendly implementation of an &quot;any unit takes
    • // damage&quot; event. It requires no JASS knowledge to use.
    • //
    • // It uses the Game - Value Of Real Variable event as its method of activating other
    • // triggers, and passes the event responses through a few globals.
    • //
    • // -- Why? --
    • // The traditional GUI method of setting up a trigger than runs when any unit is damaged
    • // leaks trigger events. This snippet is easy to implement and removes the need to do
    • // you own GUI damage detection setup.
    • //
    • // -- How To Implement --
    • // 0. Before you copy triggers that use GDD into a new map, you need to copy over GDD
    • // with its GDD Variable Creator trigger, or there will be a problem: the variables
    • // won&#039;t be automatically created correctly.
    • //
    • // 1. Be sure &quot;Automatically create unknown variables while pasting trigger data&quot; is
    • // enabled in the World Editor general preferences.
    • // 2. Copy this trigger category (&quot;GDD&quot;) and paste it into your map.
    • // (Alternately: create the variables listed in the globals block below, create a
    • // trigger named &quot;GUI Friendly Damage Detection&quot;, and paste in this entire text.)
    • // 3. Create your damage triggers using Game - Value Of Real Variable as the event,
    • // select GDD_Event as the variable, and leave the rest of the settings to the default
    • // &quot;becomes Equal to 0.00&quot;.
    • // The event responses are the following variables:
    • // GDD_Damage is the amount of damage, replacing Event Response - Damage Taken.
    • // GDD_DamagedUnit is the damaged unit, replacing Event Response - Triggering Unit.
    • // Triggering Unit can still be used, if you need to use waits.
    • // Read the -- Notes -- section below for more info.
    • // GDD_DamageSource is the damaging unit, replacing Event Response - Damage Source.
    • //
    • // -- Notes --
    • // GDD&#039;s event response variables are not wait-safe; you can&#039;t use them after a wait in
    • // a trigger. If you need to use waits, Triggering Unit (a.k.a. GetTriggerUnit()) can
    • // be used in place of GDD_DamageSource. There is no usable wait-safe equivalent to
    • // Event Damage or Damage Source; you&#039;ll need to save the values yourself.
    • //
    • // Don&#039;t write any values to the variables used as the event responses, or it will mess
    • // up any other triggers using this snippet for their triggering. Only use their values.
    • //
    • // This uses arrays, so can detect damage for a maximum of 8190 units at a time, and
    • // cleans up data at a rate of 33.33 per second, by default. This should be enough for
    • // most maps, but if you want to change the rate, change the value returned in the
    • // GDD_RecycleRate function at the top of the code, below.
    • //
    • // By default, GDD will not register units that have Locust at the moment of their
    • // entering the game, and will not recognize when they take damage (which can only
    • // happen if the Locust ability is later removed from the unit.) To allow a unit to have
    • // Locust yet still cause GDD damage events if Locust is removed, you can either design
    • // the unit to not have Locust by default and add it via triggers after creation, or
    • // edit the GDD_Filter function at the top of the code, below.
    • //
    • // -- Credits --
    • // Captain Griffin on wc3c.net for the research and concept of GroupRefresh.
    • //
    • // Credit in your map not needed, but please include this README.
    • //
    • // -- Version History --
    • // 1.2.1: Minor code cleaning. Added configuration functions. Updated documentation.
    • // 1.2.0: Made this snippet work properly with recursive damage.
    • // 1.1.1: Added a check in order to not index units with the Locust ability (dummy units).
    • // If you wish to check for damage taken by a unit that is unselectable, do not
    • // give the unit-type Locust in the object editor; instead, add the Locust ability
    • // &#039;Aloc&#039; via a trigger after its creation, then remove it.
    • // 1.1.0: Added a check in case a unit gets moved out of the map and back.
    • // 1.0.0: First release.
    • //===================================================================
    • // Configurables.
    • function GDD_RecycleRate takes nothing returns real //The rate at which the system checks units to see if they&#039;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, &#039;Aloc&#039;) == 0 //By default, the system ignores Locust units, because they normally can&#039;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&#039;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] &gt; 8190) then
    • // call BJDebugMsg(&quot;GDD: Too many damage events! Decrease number of units present in the map or increase recycle rate.&quot;)
    • // ***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] &lt;= 0) then
        • return
      • elseif(udg_GDD__Integers[1] &lt;= 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] &lt; 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 InitTrig_GUI_Friendly_Damage_Detection 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</code></pre>
      • </div>
    • </div>
    • And this is my spell&#039;s trigger:
    • <div class="bbCodeBlock bbCodeBlock--screenLimited bbCodeBlock--code"><div class="bbCodeBlock-title">Trigger:</div><div class="wc3trigger"><ul class="wc3" id="wc3_1">
    • <li class="lastopen"><span class="default">Paramorph</span>
    • <ul>
    • <li class="open"><span class="events">Events</span>
    • <ul>
    • <li class="lasttree"><span class="game">Game - GDD_Event becomes Equal to 0.00</span></li>
    • </ul>
    • </li>
    • <li class="open"><span class="conditions">Conditions</span>
    • <ul>
    • <li class="tree"><span class="default">(GDD_DamagedUnit has buff Paramorph (Self Buff)) Equal to True</span></li>
    • <li class="tree"><span class="default">GDD_Damage Greater than 0.00</span></li>
    • <li class="lasttree"><span class="default">(Random integer number between 1 and 100) Less than or equal to 25</span></li>
    • </ul>
    • </li>
    • <li class="lastopen"><span class="actions">Actions</span>
    • <ul>
    • <li class="tree"><span class="quest">Quest - Display to (All players) the Quest Update message: Starting Paramorph!</span></li>
    • <li class="tree"><span class="unit">Unit - Create 1 dummy for (Owner of GDD_DamagedUnit) at (Position of GDD_DamageSource) facing Default building facing degrees</span></li>
    • <li class="tree"><span class="unit">Unit - Add Hex (Paramorph) to (Last created unit)</span></li>
    • <li class="tree"><span class="unit">Unit - Order (Last created unit) to Orc Shadow Hunter - Hex GDD_DamageSource</span></li>
    • <li class="tree"><span class="unit">Unit - Add a 2.00 second Generic expiration timer to (Last created unit)</span></li>
    • <li class="lasttree"><span class="quest">Quest - Display to (All players) the Quest Update message: Paramorph finished!</span></li>
    • </ul>
    • </li>
    • </ul>
    • </li>
    • </ul>
    • </div></div>
    • PS: Im not sure where to post this since its a bit of both JASS and GUI
 

Dirac

22710180
Reaction score
147
Well this has almost no JASS in it because the library isn't the issue, its your code, and it's made in GUI.
To post JASS coding use the [noparse]
JASS:
[/noparse] tags
Your code leaks 1 location
There's nothing wrong with your trigger, maybe something else is causing the issue? Remember that anything that damages an unit with the buff gets hexed.
 

neo34rd

New Member
Reaction score
3
I did somemore testing and it turns out that only "MY" units (Player controlled units I think) with the paramorph ability fire off properly. However when I give the skill to a non-player controlled unit it seems to fire off randomly.. I can't figure out whats happening =.= I have no where in my code where it checks what type of unit or who it even belongs to.

Will the base spell effect the outcome of the trigger?
btw, I have only 1 enemy unit in the game with that ability. After you kill it you get to keep it. Will that have any effect?
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Staff online

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top