kingkingyyk3
Visitor (Welcome to the Jungle, Baby!)
- Reaction score
- 216
Agent Index
Requires : JassHelper 0.9.J.1, Warcraft 3 1.24b or later
It works like unit indexing, but it is designed for indexing agents.
Handle's Id is known it is a big number. To make the id small enough to fit into variables' array and make use of it, some people like Cohadar(using hashing to lower the id and store it), Vexorian(Handle's Id - Starting Id) tried their way to solve it.
By the way, this is my method to make the id small.
This stuff can generate new id for agents, starting from 1.. So, it is well to fit in the variables' array(limit : 8191).
You may use it for safe type data attaching, example :
Requires : JassHelper 0.9.J.1, Warcraft 3 1.24b or later
JASS:
/////////////////////////////////////////////////////////////////////////////////////////////
// __ _____ _____ _ _ _____ _____ _ _ __ _____ _ _
// / | / __ \ | ___| | \ | ||__ __||__ __| | \ | | | _\ | ___| \ \ / /
// / _ | | | |_| | |___ | \ | | | | | | | \ | | || \\ | |__ \ \/ /
// / /_|| | | ___ | ___| | |\\| | | | | | | |\\| | || || | ___| | |
// / _ | | |__| | | |___ | | \ | | | _| |_ | | \ | ||_// | |___ / /\ \
///__| |_| \_____/ |_____| |_| \_| |_| |_____| |_| \_| |__/ |_____| /_/ \_\
//
// by kingking ~> ~Version 1.0.1~ <~
//
// You may heard unit indexing, but agent indexing is possible too.
//
// How to use?
// GetAgentIndex(agent) -> index
//
// When you use this, always remove leaks to free up indexes.
// If you failed to do so, the index generated will flow over 8190,
// Means it can't be put in array more, put it in hashtable instead.
// Once you remove leak, it will free up the index.
//
// Reminder : Don't put any type other than the type supported.(See below)
//
// Supported types :
// Trigger, Timer, Unit, Effect, Group, Force, Location, Rect, Region, Boolexpr
/////////////////////////////////////////////////////////////////////////////////////////////
library AgentIndex
globals
private hashtable IndexStorage = InitHashtable()
private integer Counter = 0
private integer array FreeIndexes
private integer FreeIndexCount = 0
private integer Index
endglobals
function GetAgentIndex takes agent g returns integer
set Index = LoadInteger(IndexStorage,GetHandleId(g),0)
if Index == 0 then
if FreeIndexCount > 0 then
set Index = FreeIndexes[FreeIndexCount]
set FreeIndexCount = FreeIndexCount - 1
else
set Counter = Counter + 1
set Index = Counter
endif
debug if Counter > 8190 then
debug call BJDebugMsg("Too many indexed agents!")
debug endif
call SaveInteger(IndexStorage,GetHandleId(g),0,Index)
endif
return Index
endfunction
private function ReleaseIndex takes agent g returns nothing
set Index = LoadInteger(IndexStorage,GetHandleId(g),0)
if Index > 0 then
set FreeIndexCount = FreeIndexCount + 1
set FreeIndexes[FreeIndexCount] = Index
call FlushParentHashtable(IndexStorage,Index)
endif
endfunction
//Hook destroying native to release index
hook DestroyTrigger ReleaseIndex
hook DestroyTimer ReleaseIndex
hook DestroyGroup ReleaseIndex
hook DestroyForce ReleaseIndex
hook KillUnit ReleaseIndex
hook RemoveUnit ReleaseIndex
hook RemoveLocation ReleaseIndex
hook RemoveRect ReleaseIndex
hook RemoveRegion ReleaseIndex
hook DestroyBoolExpr ReleaseIndex
hook DestroyEffect ReleaseIndex
endlibrary
It works like unit indexing, but it is designed for indexing agents.
Handle's Id is known it is a big number. To make the id small enough to fit into variables' array and make use of it, some people like Cohadar(using hashing to lower the id and store it), Vexorian(Handle's Id - Starting Id) tried their way to solve it.
By the way, this is my method to make the id small.
This stuff can generate new id for agents, starting from 1.. So, it is well to fit in the variables' array(limit : 8191).
You may use it for safe type data attaching, example :
JASS:
library AgentData
globals
private agent array agents
private integer array dataz
endglobals
function SetAgentData takes agent g, integer data returns nothing
local integer index = GetAgentIndex(g)
set agents[index] = g
set dataz[index] = data
endfunction
function GetAgentData takes agent g returns integer
local integer index = GetAgentIndex(g)
if agents[index] == g then
return dataz[index]
endif
return 0
endfunction
endlibrary