In Need of Hashtable Tutorial

CrackUps

New Member
Reaction score
7
Hey,
With the recent patch to 1.23b I'm in need of a brief run down on how to use the new natives. Specifically I need to know how to use the Save and Load Handle functions. What are the parent and child key? And how would I use the new natives to store handles in a hashtable the same way you would using H2I and game cache?

Thanks in advance for any help given.
+rep for help:thup:
 

Viikuna

No Marlo no game.
Reaction score
265
Id recommend you to just to use Table. It uses now hashtables instead of gamecache, so it does what you want and with nicer syntax too IMO. link


If you have some other systems that use H2I, you should replace it with GetHandleId.

edit. How to use Table:

Lets say you are making a spell, you need a HandleTable to store data.

JASS:
globals
    private HandleTable UnitSpellData
endglobals


You must create your HandleTable, do this in your InitTrig
JASS:
private fucntion InitTrig takes nothing returns nothing
    local trigger t=CreateTrigger()
    call TriggerRegisterAnyUnitEventBJ( ... 
    // other stuff
    set UnitSpellData=HandleTable.create()
endfunction


Table looks like an array, you can store stuff to it like this:
JASS:
    set SomeTable[ 10 ] = 2
    set SomeTable[ i ] = 3


There are 3 Table types, normal table, HandleTable and StringTable.

Table uses integers as keys:
JASS:
   set SomeTable[ someInteger ] = 1

HandleTable uses handles as keys:
JASS:
   set SomeHandleTable[ someUnit ]    =  1
   set SomeHandleTable[ someTimer ]  =  1
   set SomeHandleTable[ someGroup ]  = 1

StringTable uses strings as keys:
JASS:
   set SomeStringTable[ "omg" ] = 1
   set SomeStringTable[ "lol" ] = 1


Because structs are really integers, you can store them to Table with no problems.

( more info about structs )

JASS:
private struct ability

    unit caster // struct ability holds all the data we need for this spell
    unit target
    real damage

endstruct


This is how you store your data to UnitSpellData HandleTable:

JASS:
private function SpellCast takes nothing returns nothing
    // create struct and save our data:
    local ability a=ability.create()
    set a.caster=GetTriggerUnit()
    set a.target=GetSpellTargetUnit()
    set a.damage=GetSpellDamage(GetUnitAbilityLevel( a.caster, ABILITY_ID ))
    // now we store data to our Table
    set UnitSpellData[ a.caster ] = a
endfucntion


This is how you get your data out and use it:

JASS:
private function SpellEffect takes nothing returns nothing
    // get our data from TriggerUnit:
    local unit u=GetTriggerUnit()
    local ability a=UnitSpellData[ u ]
    // use our data for something:
    call UnitDamageTargetEx(a.caster,a.target,a.damage,false)
    // clear leaks, and destroy struct:
    call a.destroy()
    set u=null
endfucntion
 

CrackUps

New Member
Reaction score
7
I really don't have much of a clue when it comes to vJass and structs. Are you just able to explain to me what the parentKey and childKey are?
 

Viikuna

No Marlo no game.
Reaction score
265
well, they are just keys.

for example:

SaveShit( parent , child)

You pick some nice integers and store.

SaveShit( 10,2 )

When you want to get your data you just use those same keys:

LoadShit( 10,2 )

Save something else with different keys:

SaveShit( 10,3 )

And load it:

LoadShit( 10,3 )

Parent and child are usefull, for exampel, when you want to flush all data from parent key 10. Then you can just use that FlushParentTableThingy and erase all data which uses parent key 10.

Just create a hashtable, and attach your struct using different parent keys for different spells and child key can be GetHandleId( timer ) or whatever attaching you need.
 
General chit-chat
Help Users
  • No one is chatting at the moment.

      The Helper Discord

      Members online

      Affiliates

      Hive Workshop NUON Dome World Editor Tutorials

      Network Sponsors

      Apex Steel Pipe - Buys and sells Steel Pipe.
      Top