cleeezzz
The Undead Ranger.
- Reaction score
- 268
Build Queue v1.0
by cleeezzz
CODE: vJASS
REQUIRES: AIDS, NEWGEN
What is it?
The ability to retrieve a structure's Build Queue (Unit training/Researching)
(I don't really expect this to be used but for the people who DO need it, here it is) This was made as a request and i thought i might as well post it.
Pros:
Dunno, if you wanted to know the build queue.. then its a pro.
Cons:
The system can not return a "research name" but it can distinguish researches in the build queue.
The event response "GetLastCancelledUnitType" is global and changes as soon as another unit is cancelled.
Usage:
unit u is the structure, integer queue is the queue position you want to retrieve from, (Note that it is 0-6 instead of 1-7) Function returns either a "Unit Type" or "Research Id"
Also, a little udg global variable is added for the lack of a "Unit event response" for the event "Unit cancels training a unit." This global variable is called GetLastCancelledUnitType and should ONLY be used with the event, "Unit cancels training a unit"
Importing:
Copy Libraries and Building Queue folder. (Optional, create a gui variable called "GetLastCancelledUnitType" of type "Unit-type"
Credits:
Jesus4lyf for AIDS
(I dont know where i got the conversion math from so sorry.)
Gwafu for requesting this in the GUI forum. (which is why there is the GUI variable)
Code:
JASS:
scope BQInit
globals
constant integer BQ_MAX_QUEUE = 7
endglobals
struct BQ
//! runtextmacro PUI()
integer array BuildQueue[BQ_MAX_QUEUE]
integer newest
static method create takes nothing returns BQ
local BQ d = BQ.allocate()
local integer i = 0
loop
exitwhen i == BQ_MAX_QUEUE
set d.BuildQueue<i> = 0
set i = i + 1
endloop
return d
endmethod
endstruct
endscope</i>
JASS:
library BQFunctions
function RefreshQueue takes BQ z returns nothing
local BQ d = z
local integer i = 0
local integer i2
set d.newest = -1
loop
exitwhen i == BQ_MAX_QUEUE
if d.BuildQueue<i> == 0 then
set i2 = i + 1
loop
exitwhen i2 == BQ_MAX_QUEUE
if d.BuildQueue[i2] != 0 then
set d.BuildQueue<i> = d.BuildQueue[i2]
set d.newest = i
set d.BuildQueue[i2] = 0
exitwhen true
endif
set i2 = i2 + 1
endloop
endif
set i = i + 1
endloop
endfunction
function GetUnitBuildQueueId takes unit u, integer queue returns integer
local BQ d = BQ<u>
if d == 0 then
return 0
endif
return d.BuildQueue[queue]
endfunction
endlibrary</u></i></i>
JASS:
scope BQStore initializer Init
private function Conditions takes nothing returns boolean
return IsUnitType(GetTriggerUnit(), UNIT_TYPE_STRUCTURE)
endfunction
private function Actions takes nothing returns nothing
local BQ d
local unit u = GetTriggerUnit()
local integer id = GetIssuedOrderId()
local unit check = CreateUnit(GetOwningPlayer(u),id,GetUnitX(u),GetUnitY(u),0.)
if SubString(Id2String(id),0,1) == "R" or check != null then
set d = BQ<u>
if d == 0 then
set d = BQ.create()
set BQ<u> = d
set d.newest = -1
endif
set d.newest = d.newest + 1
set d.BuildQueue[d.newest] = id
endif
call RemoveUnit(check)
set check = null
set u = null
endfunction
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger()
call TriggerRegisterAnyUnitEventBJ(trig, EVENT_PLAYER_UNIT_ISSUED_ORDER)
call TriggerAddCondition(trig, Condition(function Conditions))
call TriggerAddAction(trig, function Actions)
endfunction
endscope</u></u>
JASS:
scope BQUFinish initializer Init
private function Actions takes nothing returns nothing
local BQ d
local unit u = GetTriggerUnit()
local unit t
set d = BQ<u>
if d == 0 then
debug call BJDebugMsg("BQ ERROR")
set u = null
return
endif
set t = GetTrainedUnit()
if d.BuildQueue[0] == GetUnitTypeId(t) then
set d.BuildQueue[0] = 0
call RefreshQueue(d)
else
debug call BJDebugMsg("BQ ERROR: BQ SYNC")
endif
set u = null
set t = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trig, EVENT_PLAYER_UNIT_TRAIN_FINISH )
call TriggerAddAction( trig, function Actions )
endfunction
endscope</u>
JASS:
scope BQUCancel initializer Init
private function Actions takes nothing returns nothing
local BQ d
local unit u = GetTriggerUnit()
local unit check
set d = BQ<u>
if d == 0 then
debug call BJDebugMsg("BQ ERROR")
set u = null
return
endif
set check = CreateUnit(Player(0),d.BuildQueue[0],GetUnitX(u),GetUnitY(u),0)
//call BJDebugMsg(GetUnitName(check) + " has been cancelled")
call RemoveUnit(check)
set udg_GetLastCancelledUnitType = d.BuildQueue[0]
set d.BuildQueue[0] = 0
call RefreshQueue(d)
set u = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trig, EVENT_PLAYER_UNIT_TRAIN_CANCEL)
call TriggerAddAction( trig, function Actions )
endfunction
endscope</u>
JASS:
scope BQRCancel initializer Init
private function Actions takes nothing returns nothing
local BQ d
local unit u = GetTriggerUnit()
set d = BQ<u>
if d == 0 then
debug call BJDebugMsg("BQ ERROR")
set u = null
return
endif
set d.BuildQueue[0] = 0
call RefreshQueue(d)
set u = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trig, EVENT_PLAYER_UNIT_RESEARCH_CANCEL)
call TriggerAddAction( trig, function Actions )
endfunction
endscope</u>
JASS:
scope BQRFinish initializer Init
private function Actions takes nothing returns nothing
local BQ d
local unit u = GetTriggerUnit()
set d = BQ<u>
if d == 0 then
debug call BJDebugMsg("BQ ERROR")
set u = null
return
endif
set d.BuildQueue[0] = 0
call RefreshQueue(d)
set u = null
endfunction
//===========================================================================
private function Init takes nothing returns nothing
local trigger trig = CreateTrigger( )
call TriggerRegisterAnyUnitEventBJ( trig, EVENT_PLAYER_UNIT_RESEARCH_FINISH)
call TriggerAddAction( trig, function Actions )
endfunction
endscope</u>
EDIT: fixed a small leak.
Testing Tips
Enable the trigger "CheckQueue"
While in game, select a building that has researches/unit training, type "-check" (without quotations) to view its current queue.
(You will notice that all researches are just called "Research." They are different by ID, but i could not find a way to get the name of the research)