• 🏆 Texturing Contest #33 is OPEN! Contestants must re-texture a SD unit model found in-game (Warcraft 3 Classic), recreating the unit into a peaceful NPC version. 🔗Click here to enter!
  • It's time for the first HD Modeling Contest of 2024. Join the theme discussion for Hive's HD Modeling Contest #6! Click here to post your idea!

[JASS] Pull unit not working! Help

Status
Not open for further replies.
Level 8
Joined
Jun 18, 2007
Messages
214
So, I'm making my first timer spell, and so far I did good (I hope). Map doesn't give me errors, everything is working except pull. I don't understand where I go wrong, and any help would be grateful.

JASS:
constant function Blast_Orb_SFX_Explosion takes nothing returns string
    return "Objects\\Spawnmodels\\NightElf\\NEDeathMedium\\NEDeath.mdl"
endfunction

constant function Blast_Orb_Rawcode takes nothing returns integer
    return 'A001'
endfunction

constant function Blast_DummyID takes nothing returns integer
    return 'h001'
endfunction

constant function Blast_Dummy_BuffID takes nothing returns integer
    return 'BTLF'
endfunction

constant function Blast_DummyCasterID takes nothing returns integer
    return 'h002'
endfunction

constant function Blast_Dummy_Damage_AbilityID takes nothing returns integer
    return 'A004'
endfunction

constant function Blast_Increment_Size takes nothing returns real
    return 1.00
endfunction

constant function Blast_CasterAnimation takes nothing returns string
    return "channel"
endfunction

constant function Blast_Orb_Pull_Loop takes nothing returns real
    return 0.03
endfunction

constant function Blast_Orb_Time takes integer i returns real
    return 2.00+i
endfunction 

constant function Blast_Orb_Radius takes integer i returns real
    return 150.00*i
endfunction

constant function Blast_Orb_Pull_Speed takes nothing returns real
    return 3.00
endfunction

constant function DummyCaster_Red takes nothing returns integer
    return 0.5
endfunction

constant function DummyCaster_Green takes nothing returns integer
    return 0.5
endfunction

constant function DummyCaster_Blue takes nothing returns integer
    return 0.5
endfunction

constant function DummyCaster_Transparent takes nothing returns integer
    return 60
endfunction

function Blast_Orb_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == Blast_Orb_Rawcode()
endfunction

function Blast_Orb_Filter takes nothing returns boolean // Filter function for picking units in group
    return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetTriggerUnit())) == true and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetWidgetLife(GetFilterUnit())>0.405)
endfunction 

function Blast_Orb_Pull_Group takes nothing returns nothing
    local timer t = GetExpiredTimer()
    
    local unit dummy = GetHandleUnit(t, "dummy")
    local unit w
    
    local real r = Blast_Orb_Radius(GetUnitAbilityLevel(dummy,Blast_Dummy_Damage_AbilityID())) 
    
    local location p = GetUnitLoc(dummy)
    local location p1
    
    local group g = GetUnitsInRangeOfLocMatching(r, p, Condition (function Blast_Orb_Filter))
    loop
        set w = FirstOfGroup(g)
        exitwhen w == null
        call GroupRemoveUnit(g,w)
        set p1 = GetUnitLoc(w)
        call SetUnitPositionLoc( w, PolarProjectionBJ(p, (DistanceBetweenPoints(p,p1) - Blast_Orb_Pull_Speed()), AngleBetweenPoints(p,p1)) )
        call RemoveLocation(p1)
    endloop
    set dummy = null
    set w = null
    call RemoveLocation(p)
    call DestroyGroup(g)
    set r = 0.00
endfunction
           
function Blast_Orb_Actions takes nothing returns nothing
 local timer t = CreateTimer()
 
 local unit c = GetTriggerUnit()
 local unit dummy
 local unit dummy1
 
 local integer i = 0
 local integer i1 = R2I(Blast_Orb_Time(GetUnitAbilityLevel(c, Blast_Orb_Rawcode()))) 
 
 local real size = Blast_Increment_Size()
 local real x = GetSpellTargetX()
 local real y = GetSpellTargetY()
 
 local real x1 = GetUnitX(c)
 local real y1 = GetUnitY(c)
 
 
    set dummy = CreateUnit(GetOwningPlayer(c), Blast_DummyID(), x, y, 0)
    call UnitApplyTimedLife(dummy, Blast_Dummy_BuffID(), Blast_Orb_Time(GetUnitAbilityLevel(c, Blast_Orb_Rawcode())))  
    set dummy1 = CreateUnit(GetOwningPlayer(c), Blast_DummyCasterID(), x1, y1, GetUnitFacing(c))
        call SetUnitAnimation(dummy1, Blast_CasterAnimation()) 
        call SetUnitVertexColor(dummy1, DummyCaster_Red(), DummyCaster_Green(), DummyCaster_Blue(), DummyCaster_Transparent()) 
    
    call SetHandleAgent(t, "dummy", dummy)
    call TimerStart(t, Blast_Orb_Pull_Loop(), true, function Blast_Orb_Pull_Group)
    
                            loop
                                set i = i+1
                                exitwhen i > i1
                                call SetUnitScale(dummy, size, size, size)
                                set size = size + Blast_Increment_Size()
                                call TriggerSleepAction(1)
                            endloop
    call FlushHandle(t)
    call DestroyTimer(t) 
    call PauseUnit(dummy1, true)
    call ShowUnit(dummy1, false)
    call DestroyEffect(AddSpecialEffect(Blast_Orb_SFX_Explosion(), x, y))
    set c = null
    set dummy1 = null
    set i = 0
    set i1 = 0
    set size = 0.00
    set x = 0.00
    set y = 0.00
    set x1 = 0.00
    set y1 = 0.00
endfunction

function InitTrig_Blast_Orb takes nothing returns nothing
    local trigger t = CreateTrigger()
    
    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t, Condition(function Blast_Orb_Conditions))
    call TriggerAddAction(t, function Blast_Orb_Actions)
    
    call Preload(Blast_Orb_SFX_Explosion())
    
    set t = null
endfunction

JASS:
function HATable takes nothing returns hashtable
    return udg_HATable
endfunction
function InitHA takes nothing returns nothing
    local hashtable ha = HATable()
    set ha = InitHashtable()
    set ha = null
endfunction

function SetHandleAgent takes handle subject, string name, agent value returns nothing
    call SaveAgentHandle(HATable(), GetHandleId(subject), StringHash(name), value)
endfunction
function SetHandleInt takes handle subject, string name, integer value returns nothing
    call SaveInteger(HATable(), GetHandleId(subject), StringHash(name), value)
endfunction
function SetHandleBoolean takes handle subject, string name, boolean value returns nothing
    call SaveBoolean(HATable(), GetHandleId(subject), StringHash(name), value)
endfunction
function SetHandleReal takes handle subject, string name, real value returns nothing
    call SaveReal(HATable(), GetHandleId(subject), StringHash(name), value)
endfunction
function SetHandleString takes handle subject, string name, string value returns nothing
    call SaveStr(HATable(), GetHandleId(subject), StringHash(name), value)
endfunction

function GetHandleInt takes handle subject, string name returns integer
    return LoadInteger(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleBoolean takes handle subject, string name returns boolean
    return LoadBoolean(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleReal takes handle subject, string name returns real
    return LoadReal(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleString takes handle subject, string name returns string
    return LoadStr(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleUnit takes handle subject, string name returns unit
    return LoadUnitHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleItem takes handle subject, string name returns item
    return LoadItemHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleTimer takes handle subject, string name returns timer
    return LoadTimerHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleTrigger takes handle subject, string name returns trigger
    return LoadTriggerHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleEffect takes handle subject, string name returns effect
    return LoadEffectHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleGroup takes handle subject, string name returns group
    return LoadGroupHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleLightning takes handle subject, string name returns lightning
    return LoadLightningHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleWidget takes handle subject, string name returns widget
    return LoadWidgetHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleLocation takes handle subject, string name returns location
    return LoadLocationHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandlePlayer takes handle subject, string name returns player
    return LoadPlayerHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleRegion takes handle subject, string name returns region
    return LoadRegionHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleRect takes handle subject, string name returns rect
    return LoadRectHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleForce takes handle subject, string name returns force
    return LoadForceHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleFogmodifier takes handle subject, string name returns fogmodifier
    return LoadFogModifierHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function GetHandleTimerDialog takes handle subject, string name returns timerdialog
    return LoadTimerDialogHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction

function HaveHandleHandle takes handle subject, string name returns boolean
    return HaveSavedHandle(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function HaveHandleInt takes handle subject, string name returns boolean
    return HaveSavedInteger(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function HaveHandleReal takes handle subject, string name returns boolean
    return HaveSavedReal(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function HaveHandleString takes handle subject, string name returns boolean
    return HaveSavedString(HATable(), GetHandleId(subject), StringHash(name))
endfunction
function HaveHandleBoolean takes handle subject, string name returns boolean
    return HaveSavedBoolean(HATable(), GetHandleId(subject), StringHash(name))
endfunction

function RemoveHandle takes handle subject, string name returns nothing
    call SaveAgentHandle(HATable(),GetHandleId(subject),StringHash(name), null)
    call RemoveSavedHandle(HATable(),GetHandleId(subject),StringHash(name))
endfunction
function RemoveInt takes handle subject, string name returns nothing
    call SaveInteger(HATable(),GetHandleId(subject),StringHash(name), 0)
    call RemoveSavedInteger(HATable(),GetHandleId(subject),StringHash(name))
endfunction
function RemoveReal takes handle subject, string name returns nothing
    call SaveReal(HATable(),GetHandleId(subject),StringHash(name), 0.0)
    call RemoveSavedReal(HATable(),GetHandleId(subject),StringHash(name))
endfunction
function RemoveBoolean takes handle subject, string name returns nothing
    call SaveBoolean(HATable(),GetHandleId(subject),StringHash(name), false)
    call RemoveSavedBoolean(HATable(),GetHandleId(subject),StringHash(name))
endfunction
function RemoveStr takes handle subject, string name returns nothing
    call SaveStr(HATable(),GetHandleId(subject),StringHash(name), null)
    call RemoveSavedString(HATable(),GetHandleId(subject),StringHash(name))
endfunction

function FlushHandle takes handle subject returns nothing
    call FlushChildHashtable(HATable(), GetHandleId(subject) )
endfunction

The spell should summon one dummy unit (bolt) and grow it over time, and that is working. Summon other dummy unit (dummy caster) that is transparent and channeling the spell, that's working as well. The only problem is the timer function, that should pull the enemy units to the bolt, it doesn't give me errors, but it's not working.

Oh, yea, please notice that GetHandleHandle has been changed to GetHandleAgent, and FlushHandleLocals to FlushHandle..
 
Last edited by a moderator:
Level 8
Joined
Jun 18, 2007
Messages
214
1. To much imports
2. Only like 10 % users use it
3. I'm still learning JASS as it is
4. I'm trying to do it step by step :p

The problem is, this kind of function (Blast_Orb_Pull_Group) worked before patch 1.24 and 1.24b. I'm trying to find out what changed during it and how to improve my code with just using JASS and handles.

Well I found out where the problem if, GetHandleAgent(t, "dummy", dummy), it doesn't save the unit at all. I tried some debugg messages so he can show me the name of the dummy unit (which is used in function Blast_Orb_Pull_Group, with local dummy = GetHandleUnit(t, "dummy"). It doesn't return the unit at all, it just gives me null messages. But, I still don't know how to fix it. Do I have to use some other Handle calling, or w/e? :(

I also tried using FauxHandleVars, that you rewrote Element, but same thing happens. It doesn't return the unit....
 
Last edited by a moderator:

Dr Super Good

Spell Reviewer
Level 63
Joined
Jan 18, 2005
Messages
27,180
JASS:
    return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetTriggerUnit())) == true and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetWidgetLife(GetFilterUnit())>0.405)

GetTriggerUnit() returns null, as GetTriggerUnit() only works for event driven triggers and not timers.

Secondly you save an agent, yet try and recall it as a unit. WC3 does not permit this as it is illegal typecasting. To prevent bugs you can only recall stuff of the same type as you saved. Thus you must save a unit and recall it as a unit, or save an agent and recall it as an agent.
 
Level 8
Joined
Jun 18, 2007
Messages
214
JASS:
    return IsUnitEnemy(GetFilterUnit(),GetOwningPlayer(GetTriggerUnit())) == true and IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetWidgetLife(GetFilterUnit())>0.405)

GetTriggerUnit() returns null, as GetTriggerUnit() only works for event driven triggers and not timers.

Secondly you save an agent, yet try and recall it as a unit. WC3 does not permit this as it is illegal typecasting. To prevent bugs you can only recall stuff of the same type as you saved. Thus you must save a unit and recall it as a unit, or save an agent and recall it as an agent.

I don't understand, in the old KaTTaNa's i would just use SetHandleHandle and save the unit, the guy that rewrote this, changed the same thing to GetHandleAgent. Could you be more specific, to what exactly do I have to type? And also, i changed the filter. Ty for that
 

Dr Super Good

Spell Reviewer
Level 63
Joined
Jan 18, 2005
Messages
27,180
Well, whoever rewrote them was an idiot. Basically, you have to initilize them by calling the handlevar init function. And then add the correct types to them so it can take and return units.

I advise getting the proper rewrite of them made by someone decent which do not leak and work.
 
Level 8
Joined
Jun 18, 2007
Messages
214
Well, whoever rewrote them was an idiot. Basically, you have to initilize them by calling the handlevar init function. And then add the correct types to them so it can take and return units.

I advise getting the proper rewrite of them made by someone decent which do not leak and work.

Well I know I see what you mean, and I found the native SaveUnitHandle
but it takes hashtable (this i understand), but I don't understand what is integer parentKey and childKey? Integers of what? What value exactly is looking for here

This is what I did so far: made a hashtable Hash, called SaveUnitHandle(udg_Hash, Parent_Key(), Parent_Child(), dummy). Made 2 constant functions for 2 integers Parent_Key and Child_key. Gave them value of 1. In the function Group_Pull added local unit dummy = LoadUnitHandle(udg_Hash, Parent_Key(), Child_Key). At the end of the trigger where i remove leaks added call FlushParentHashtable(udg_Hash). And again it didn't work, again I didn't get a unit, again it returned as null. Where did I go wrong? I also removed the HandleVars
 
Last edited by a moderator:
1. To much imports
2. Only like 10 % users use it
3. I'm still learning JASS as it is
4. I'm trying to do it step by step :p

The problem is, this kind of function (Blast_Orb_Pull_Group) worked before patch 1.24 and 1.24b. I'm trying to find out what changed during it and how to improve my code with just using JASS and handles.

1. No imports - just download a program and use that as your editor.
2. Almost every Jasser uses vJass.
3. You seem to be decent enough with Jass. Now learn vJass.
4. Doing it all at once is quicker and just as easy.
 
Level 8
Joined
Jun 18, 2007
Messages
214
Here's what I did. The spell is now working, but now, it's not MUI

JASS:
constant function Blast_Orb_SFX_Explosion takes nothing returns string
    return "Objects\\Spawnmodels\\NightElf\\NEDeathMedium\\NEDeath.mdl"
endfunction

constant function Blast_Orb_Rawcode takes nothing returns integer
    return 'A001'
endfunction

constant function Blast_DummyID takes nothing returns integer
    return 'h001'
endfunction

constant function Blast_Dummy_BuffID takes nothing returns integer
    return 'BTLF'
endfunction

constant function Blast_DummyCasterID takes nothing returns integer
    return 'h002'
endfunction

constant function Blast_Dummy_Damage_AbilityID takes nothing returns integer
    return 'A004'
endfunction

constant function Blast_Increment_Size takes nothing returns real
    return 1.00
endfunction

constant function Blast_CasterAnimation takes nothing returns string
    return "channel"
endfunction

constant function Blast_Orb_Pull_Loop takes nothing returns real
    return 0.03
endfunction

constant function Blast_Orb_Time takes integer i returns real
    return 2.00+i
endfunction

constant function Blast_Orb_Radius takes integer i returns real
    return 400.00*i
endfunction

constant function Blast_Orb_Pull_Speed takes nothing returns real
    return 3.00
endfunction

constant function DummyCaster_Red takes nothing returns integer
    return 0.5
endfunction

constant function DummyCaster_Green takes nothing returns integer
    return 0.5
endfunction

constant function DummyCaster_Blue takes nothing returns integer
    return 0.5
endfunction

constant function DummyCaster_Transparent takes nothing returns integer
    return 60
endfunction

function Blast_Orb_Conditions takes nothing returns boolean
    return GetSpellAbilityId() == Blast_Orb_Rawcode()
endfunction

function Blast_Orb_Filter takes nothing returns boolean // Filter function for picking units in group
    return IsUnitType(GetFilterUnit(), UNIT_TYPE_STRUCTURE) == false and IsUnitType(GetFilterUnit(), UNIT_TYPE_MAGIC_IMMUNE) == false and (GetWidgetLife(GetFilterUnit())>0.405)
endfunction

function Blast_Orb_Pull_Group takes nothing returns nothing
    local timer t = GetExpiredTimer()
        
    local integer i = LoadInteger(udg_Hash, 1, 2)    
 
    local unit dummy = LoadUnitHandle(udg_Hash, i, i)
    local unit w      

    local location p = GetUnitLoc(dummy)
    local location p1
    local location p3

    local group g = GetUnitsInRangeOfLocAll(Blast_Orb_Radius(GetUnitAbilityLevel(dummy, Blast_Dummy_Damage_AbilityID())), p)
    loop
        set w = FirstOfGroup(g)
        exitwhen w == null
        call GroupRemoveUnit(g,w)
        
        if IsUnitEnemy(w, GetOwningPlayer(dummy)) and IsUnitType(w, UNIT_TYPE_STRUCTURE) == false and IsUnitType(w, UNIT_TYPE_MAGIC_IMMUNE) == false and (GetWidgetLife(w)>0.405) then
                       set p1 = GetUnitLoc(w)
                       set p3 = PolarProjectionBJ(p,(DistanceBetweenPoints(p, p1) - Blast_Orb_Pull_Speed()), AngleBetweenPoints(p, p1))
                       call SetUnitPositionLoc( w, p3)
                       call RemoveLocation(p1)
                       call RemoveLocation(p3)
        endif
    endloop
    set dummy = null
    set w = null
    set i = 0
    call RemoveLocation(p)
    call DestroyGroup(g)
endfunction

function Blast_Orb_Actions takes nothing returns nothing
 local timer t = CreateTimer()
   
 local unit c = GetTriggerUnit()
 local unit dummy
 local unit dummy1

 local integer i = 0
 local integer i1 = R2I(Blast_Orb_Time(GetUnitAbilityLevel(c, Blast_Orb_Rawcode())))

 local real size = Blast_Increment_Size()
 local real x = GetSpellTargetX()
 local real y = GetSpellTargetY()

 local real x1 = GetUnitX(c)
 local real y1 = GetUnitY(c)

    set dummy = CreateUnit(GetOwningPlayer(c), Blast_DummyID(), x, y, 0)
    call UnitApplyTimedLife(dummy, Blast_Dummy_BuffID(), Blast_Orb_Time(GetUnitAbilityLevel(c, Blast_Orb_Rawcode())))
    set dummy1 = CreateUnit(GetOwningPlayer(c), Blast_DummyCasterID(), x1, y1, GetUnitFacing(c))
        call SetUnitAnimation(dummy1, Blast_CasterAnimation())
        call SetUnitVertexColor(dummy1, DummyCaster_Red(), DummyCaster_Green(), DummyCaster_Blue(), DummyCaster_Transparent())
    call InitHashtableBJ()
    set udg_Hash = GetLastCreatedHashtableBJ()
    call SaveUnitHandle (udg_Hash, GetHandleId(dummy), GetHandleId(dummy), dummy)
    call SaveInteger(udg_Hash, 1, 2, GetHandleId(dummy))
    call TimerStart(t, Blast_Orb_Pull_Loop(), true, function Blast_Orb_Pull_Group)
                            loop
                                set i = i+1
                                exitwhen i > i1
                                call SetUnitScale(dummy, size, size, size)
                                set size = size + Blast_Increment_Size()
                                call TriggerSleepAction(1)
                            endloop
    call FlushParentHashtable(udg_Hash)
    call DestroyTimer(t)
    call PauseUnit(dummy1, true)
    call ShowUnit(dummy1, false)
    call DestroyEffect(AddSpecialEffect(Blast_Orb_SFX_Explosion(), x, y))
    set c = null
    set dummy1 = null
    set i = 0
    set i1 = 0
    set size = 0.00
    set x = 0.00
    set y = 0.00
    set x1 = 0.00
    set y1 = 0.00
endfunction

function InitTrig_Blast_Orb takes nothing returns nothing
    local trigger t = CreateTrigger()

    call TriggerRegisterAnyUnitEventBJ(t, EVENT_PLAYER_UNIT_SPELL_EFFECT)
    call TriggerAddCondition(t, Condition(function Blast_Orb_Conditions))
    call TriggerAddAction(t, function Blast_Orb_Actions)

    call Preload(Blast_Orb_SFX_Explosion())

    set t = null
endfunction
 
Level 8
Joined
Jun 18, 2007
Messages
214
About the handle vars: Initialize the global hashtable in the init function of the spell, and have the handle vars function return the global.

I initialized the hashtable in another trigger on map init. But it seem that handle vars are missing SetHandleUnit, it can't save a unit..... So, I didn't use them later, instead I used my own hashtable, saved the unit, but now the loop function for pulling the unit is not MUI. Does anyone knows what do I have to do, to make it MUI?
 
Level 8
Joined
Jun 18, 2007
Messages
214
Here's update: Made global variable udg_Hash, local timer t = CreateTimer() ..skip to: call InitHashtable(), then set udg_Hash = GetLastCreatedHashtableBJ(), then call SaveUnitHandle(udg_Hash, GetHandleId(t(t stands for timer)), 2, dummy(which is the unit that i need to save)). The to timer function Blast_Orb_Pull_Group, local timer t = GetExpiredTimer(), then to local unit dummy = LoadUnitHandle(h, GetHandleId(t), 2). I get a return unit, but spell still remains NOT MUI.... Help anyone?
 
Level 8
Joined
Jun 18, 2007
Messages
214
set udg_Hash = InitHashtable()

Do this only once in an initialization trigger.

Thank you so much for your help. It's working perfectly now, and it's MUI. I don't know how you could stand up with me constantly asking noob questions :).... Thank you so much, it seems I got everything right this time. It seems that you are now the one that thought me JASS xD.. Thx man +Rep
 
Status
Not open for further replies.
Top