- Joined
- Aug 1, 2013
- Messages
- 4,658
Hi all.
Something like 5-6 months ago, I created a small system to create a generic full screen window.
Ofcourse with my JASS coding skills back then, it wasnt really good (even though it worked) so I decided to recreate it.
The new system is very similar but I did not found a nice way to create the objects such as a unit, destructable or texttag easily.
This is how far I got the new system:
(Dont mind udg_LOCAL_PLAYER, that is just GetLocalPlayer())
Something like 5-6 months ago, I created a small system to create a generic full screen window.
Ofcourse with my JASS coding skills back then, it wasnt really good (even though it worked) so I decided to recreate it.
JASS:
globals
integer udg_FSW_Index = -1
integer array udg_FSW_Array_LocationX
integer array udg_FSW_Array_LocationY
integer array udg_FSW_Array_LocationCenterX
integer array udg_FSW_Array_LocationCenterY
integer array udg_FSW_Array_SizeX
integer array udg_FSW_Array_SizeY
unit array udg_FSW_Array_DummyUnit
integer array udg_FSW_Array_TerrainType
real array udg_FSW_Array_CameraDistance
integer udg_FSW_ObjectType_Destructable = 1
integer udg_FSW_ObjectType_Texttag = 2
integer udg_FSW_ObjectType_Unit = 3
trigger array udg_FSW_Trigger_WhileOpen
integer udg_FSW_Black_Terrain = 'Oaby'
trigger udg_FSW_Trigger_TrackableClick = CreateTrigger()
trigger udg_FSW_Trigger_TrackableHover = CreateTrigger()
string udg_FSW_Trackable_Model = "AutoImport\\Models\\Custom Window\\Trackable.mdx"
hashtable udg_FSW_Hashtable = InitHashtable()
endglobals
library fswSystem
function FSW_System_SaveStandardDestructable takes integer whichFSW, destructable d returns nothing
local integer i = 20
loop
exitwhen LoadInteger(udg_FSW_Hashtable, whichFSW, i) == 0
set i = i + 2
endloop
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, udg_FSW_ObjectType_Destructable)
call SaveDestructableHandle(udg_FSW_Hashtable, whichFSW, i+1, d)
endfunction
function FSW_System_SaveStandardTexttag takes integer whichFSW, texttag t returns nothing
local integer i = 20
loop
exitwhen LoadInteger(udg_FSW_Hashtable, whichFSW, i) == 0
set i = i + 2
endloop
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, udg_FSW_ObjectType_Texttag)
call SaveTextTagHandle(udg_FSW_Hashtable, whichFSW, i+1, t)
endfunction
function FSW_System_SaveStandardUnit takes integer whichFSW, unit u returns nothing
local integer i = 20
loop
exitwhen LoadInteger(udg_FSW_Hashtable, whichFSW, i) == 0
set i = i + 2
endloop
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, udg_FSW_ObjectType_Unit)
call SaveUnitHandle(udg_FSW_Hashtable, whichFSW, i+1, u)
endfunction
function FSW_System_ShowStandardObjects takes integer whichFSW, boolean show returns nothing
local integer i = 20
local integer objectType
loop
set objectType = LoadInteger(udg_FSW_Hashtable, whichFSW, i)
exitwhen objectType == 0
if objectType == udg_FSW_ObjectType_Destructable then
call ShowDestructable(LoadDestructableHandle(udg_FSW_Hashtable, whichFSW, i+1), show)
elseif objectType == udg_FSW_ObjectType_Texttag then
call SetTextTagVisibility(LoadTextTagHandle(udg_FSW_Hashtable, whichFSW, i+1), show)
elseif objectType == udg_FSW_ObjectType_Unit then
call ShowUnit(LoadUnitHandle(udg_FSW_Hashtable, whichFSW, i+1), show)
endif
set i = i + 2
endloop
endfunction
function FSW_System_SaveTempDestructable takes integer whichFSW, integer pId, destructable d returns nothing
local integer i = 2000
loop
exitwhen i > 3000
if LoadInteger(udg_FSW_Hashtable, whichFSW, i) == 0 then
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, udg_FSW_ObjectType_Destructable)
call SaveDestructableHandle(udg_FSW_Hashtable, whichFSW, i+1, d)
call SaveInteger(udg_FSW_Hashtable, whichFSW, i+2, pId)
return
endif
set i = i + 3
endloop
endfunction
function FSW_System_SaveTempTexttag takes integer whichFSW, integer pId, texttag t returns nothing
local integer i = 2000
loop
exitwhen i > 3000
if LoadInteger(udg_FSW_Hashtable, whichFSW, i) == 0 then
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, udg_FSW_ObjectType_Texttag)
call SaveTextTagHandle(udg_FSW_Hashtable, whichFSW, i+1, t)
call SaveInteger(udg_FSW_Hashtable, whichFSW, i+2, pId)
return
endif
set i = i + 3
endloop
endfunction
function FSW_Remove_Temp_Objects takes integer whichFSW, integer pId returns nothing
local integer i = 2000
local integer objectType
loop
exitwhen i > 3000
if LoadInteger(udg_FSW_Hashtable, whichFSW, i+2) == pId then
set objectType = LoadInteger(udg_FSW_Hashtable, whichFSW, i)
if objectType == udg_FSW_ObjectType_Destructable then
call RemoveDestructable(LoadDestructableHandle(udg_FSW_Hashtable, whichFSW, i+1))
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, 0)
elseif objectType == udg_FSW_ObjectType_Texttag then
call DestroyTextTag(LoadTextTagHandle(udg_FSW_Hashtable, whichFSW, i+1))
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, 0)
elseif objectType == udg_FSW_ObjectType_Unit then
call RemoveUnit(LoadUnitHandle(udg_FSW_Hashtable, whichFSW, i+1))
call SaveInteger(udg_FSW_Hashtable, whichFSW, i, 0)
endif
endif
set i = i + 3
endloop
endfunction
function FSW_System_Create_FSW takes integer x, integer y, integer sizeX, integer sizeY, real cameraDistance returns integer
set udg_FSW_Index = udg_FSW_Index + 1
set udg_FSW_Array_LocationX[udg_FSW_Index] = x
set udg_FSW_Array_LocationY[udg_FSW_Index] = y
set udg_FSW_Array_LocationCenterX[udg_FSW_Index] = x*64 + sizeX*32
set udg_FSW_Array_LocationCenterY[udg_FSW_Index] = y*64 - sizeY*32
set udg_FSW_Array_SizeX[udg_FSW_Index] = sizeX
set udg_FSW_Array_SizeY[udg_FSW_Index] = sizeY
set udg_FSW_Array_DummyUnit[udg_FSW_Index] = CreateUnit(Player(12), udg_Dummy_Unit_Type, udg_FSW_Array_LocationCenterX[udg_FSW_Index], udg_FSW_Array_LocationCenterY[udg_FSW_Index], 0)
set udg_FSW_Array_TerrainType[udg_FSW_Index] = GetTerrainType(udg_FSW_Array_LocationCenterX[udg_FSW_Index], udg_FSW_Array_LocationCenterY[udg_FSW_Index])
set udg_FSW_Array_CameraDistance[udg_FSW_Index] = cameraDistance
return udg_FSW_Index
endfunction
function FSW_System_Create_Trackable takes integer whichFSW, integer x, integer y returns trackable
local integer fswX = udg_FSW_Array_LocationX[whichFSW]
local integer fswY = udg_FSW_Array_LocationY[whichFSW]
local trackable t
local integer id
local integer i = 0
local player p
local string s
loop
exitwhen i > 12
set p = Player(i)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER then
if GetLocalPlayer() == p then
set s = udg_FSW_Trackable_Model
else
set s = ""
endif
set t = CreateTrackable(s, (fswX+x) * 64, (fswY-y) * 64, 0)
set id = GetHandleId(t)
//Register the events for the trackable.
call TriggerRegisterTrackableHitEvent(udg_FSW_Trigger_TrackableClick, t)
call TriggerRegisterTrackableTrackEvent(udg_FSW_Trigger_TrackableHover, t)
//Save the data to the hashtable.
call SaveInteger(udg_FSW_Hashtable, id, 0, i)
call SaveInteger(udg_FSW_Hashtable, id, 1, fswX + x)
call SaveInteger(udg_FSW_Hashtable, id, 2, fswY + y)
endif
set i = i + 1
endloop
return t
endfunction
function FSW_System_Create_Destructable takes integer whichFSW, integer destId, integer x, integer y returns destructable
local real fswX = udg_FSW_Array_LocationX[whichFSW]
local real fswY = udg_FSW_Array_LocationY[whichFSW]
local destructable d = CreateDestructable(destId, (fswX+x) * 64, (fswY-y) * 64, 0, 0.7, 0)
//local destructable d = CreateDeadDestructableZ(destId, (fswX+x) * 64, (fswY-y) * 64, 250, 0, 0.7, 0)
call FSW_System_SaveStandardDestructable(whichFSW, d)
call ShowDestructable(d, false)
return d
endfunction
function FSW_System_Create_Texttag takes integer whichFSW, string text, real size, real x, real y, integer RGBA_R, integer RGBA_G, integer RGBA_B, integer RGBA_A returns texttag
local real fswX = udg_FSW_Array_LocationX[whichFSW]
local real fswY = udg_FSW_Array_LocationY[whichFSW]
local texttag t = CreateTextTag()
call SetTextTagText(t, text, size * 0.0023)
call SetTextTagPos(t, fswX*64 + x, fswY*64 - y, 0)
call SetTextTagColor(t, RGBA_R, RGBA_G, RGBA_B, RGBA_A)
call SetTextTagPermanent(t, true)
call FSW_System_SaveStandardTexttag(whichFSW, t)
call SetTextTagVisibility(t, false)
return t
endfunction
function FSW_System_Create_Unit takes integer whichFSW, integer unitType, real x, real y, player whichPlayer, real facing returns unit
local real fswX = udg_FSW_Array_LocationX[whichFSW]
local real fswY = udg_FSW_Array_LocationY[whichFSW]
local unit u = CreateUnit(whichPlayer, unitType, fswX*64 + x, fswY*64 - y, facing)
call FSW_System_SaveStandardUnit(whichFSW, u)
call ShowUnit(u, false)
return u
endfunction
function FSW_System_Create_Temp_Destructable takes integer whichFSW, player whichPlayer, integer destId, integer x, integer y returns destructable
local real fswX = udg_FSW_Array_LocationX[whichFSW]
local real fswY = udg_FSW_Array_LocationY[whichFSW]
local destructable d = CreateDestructable(destId, (fswX+x) * 64, (fswY-y) * 64, 0, 0.7, 0)
local timer Timer
//local destructable d = CreateDeadDestructableZ(destId, (fswX+x) * 64, (fswY-y) * 64, 5, 0, 0.7, 0)
call FSW_System_SaveTempDestructable(whichFSW, GetPlayerId(whichPlayer), d)
if GetLocalPlayer() == whichPlayer then
call ShowDestructable(d, true)
else
call ShowDestructable(d, false)
endif
return d
endfunction
function FSW_System_Create_Temp_Texttag takes integer whichFSW, player whichPlayer, string text, real size, real x, real y, integer RGBA_R, integer RGBA_G, integer RGBA_B, integer RGBA_A returns texttag
local real fswX = udg_FSW_Array_LocationX[whichFSW]
local real fswY = udg_FSW_Array_LocationY[whichFSW]
local texttag t = CreateTextTag()
call SetTextTagText(t, text, size * 0.0023)
call SetTextTagPos(t, fswX*64 + x, fswY*64 - y, 0)
call SetTextTagColor(t, RGBA_R, RGBA_G, RGBA_B, RGBA_A)
call SetTextTagPermanent(t, true)
call FSW_System_SaveTempTexttag(whichFSW, GetPlayerId(whichPlayer), t)
if GetLocalPlayer() == whichPlayer then
call SetTextTagVisibility(t, true)
else
call SetTextTagVisibility(t, false)
endif
return t
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Handle Functions
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function FSW_System_Close_FSW takes integer whichFSW, player whichPlayer returns nothing
local integer pId = GetPlayerId(whichPlayer)
if (GetLocalPlayer() == whichPlayer) then
call ResetToGameCamera(0)
call PanCameraToTimed(GetUnitX(udg_Heroes[pId]), GetUnitY(udg_Heroes[pId]), 0)
endif
call SetTerrainType(udg_FSW_Array_LocationCenterX[udg_FSW_Index], udg_FSW_Array_LocationCenterY[udg_FSW_Index], udg_FSW_Array_TerrainType[udg_FSW_Index], -1, 8, 1)
call FSW_System_ShowStandardObjects(whichFSW, false)
call FSW_Remove_Temp_Objects(whichFSW, pId)
call SaveBoolean(udg_FSW_Hashtable, whichFSW, pId, false)
set udg_FSW_Selected_X[pId] = -1
set udg_FSW_Selected_Y[pId] = -1
set udg_FSW_Event_Window_Closed = 1
set udg_FSW_Event_Window_Closed = 0
endfunction
function FSW_System_Open_FSW takes integer whichFSW, player whichPlayer returns nothing
local integer pId = GetPlayerId(whichPlayer)
local integer i = 0
if LoadBoolean(udg_FSW_Hashtable, whichFSW, pId) then
return
endif
loop
exitwhen i > udg_FSW_Index
if LoadBoolean(udg_FSW_Hashtable, i, pId) then
call FSW_System_Close_FSW(i, whichPlayer)
exitwhen true
endif
set i = i + 1
endloop
if (GetLocalPlayer() == whichPlayer) then
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, -90, 0)
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, udg_FSW_Array_CameraDistance[whichFSW], 0)
call SetCameraTargetController(udg_FSW_Array_DummyUnit[whichFSW], 0, 0, false)
call SetTerrainType(udg_FSW_Array_LocationCenterX[whichFSW], udg_FSW_Array_LocationCenterY[whichFSW], udg_FSW_Black_Terrain, -1, 8, 1)
call FSW_System_ShowStandardObjects(whichFSW, true)
call SaveBoolean(udg_FSW_Hashtable, whichFSW, pId, true)
set udg_FSW_Selected_X[pId] = -1
set udg_FSW_Selected_Y[pId] = -1
set udg_FSW_Param_Player = whichPlayer
set udg_FSW_Param_FSW = whichFSW
call TriggerExecute(udg_FSW_Trigger_WhileOpen[whichFSW])
set udg_FSW_Event_Window_Opened = 1
set udg_FSW_Event_Window_Opened = 0
endif
endfunction
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// Create Trackable Events
//
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Trackable click event.
function FSW_System_Trackable_Clicked takes nothing returns boolean
local integer id = GetHandleId(GetTriggeringTrackable())
local integer whichFSW
local integer pId = LoadInteger(udg_FSW_Hashtable, id, 0)
local integer i = 0
loop
if i > udg_FSW_Index then
return false
endif
if LoadBoolean(udg_FSW_Hashtable, i, pId) then
set whichFSW = i
exitwhen true
endif
set i = i + 1
endloop
set udg_FSW_Param_LocationX = -udg_FSW_Array_LocationX[whichFSW] + LoadInteger(udg_FSW_Hashtable, id, 1)
set udg_FSW_Param_LocationY = -udg_FSW_Array_LocationY[whichFSW] + LoadInteger(udg_FSW_Hashtable, id, 2)
set udg_FSW_Param_FSW = whichFSW
set udg_FSW_Param_Player = Player(pId)
if LoadBoolean(udg_FSW_Hashtable, whichFSW, pId) then
set udg_FSW_Event_Trackable_Clicked = 1
set udg_FSW_Event_Trackable_Clicked = 0
endif
return false
endfunction
//Trackable hover event.
function FSW_System_Trackable_Hovered takes nothing returns boolean
local integer id = GetHandleId(GetTriggeringTrackable())
local integer whichFSW
local integer pId = LoadInteger(udg_FSW_Hashtable, id, 0)
local integer i = 0
loop
if i > udg_FSW_Index then
return false
endif
if LoadBoolean(udg_FSW_Hashtable, i, pId) then
set whichFSW = i
exitwhen true
endif
set i = i + 1
endloop
set udg_FSW_Param_LocationX = -udg_FSW_Array_LocationX[whichFSW] + LoadInteger(udg_FSW_Hashtable, id, 1)
set udg_FSW_Param_LocationY = -udg_FSW_Array_LocationY[whichFSW] + LoadInteger(udg_FSW_Hashtable, id, 2)
set udg_FSW_Param_FSW = whichFSW
set udg_FSW_Param_Player = Player(pId)
if LoadBoolean(udg_FSW_Hashtable, whichFSW, pId) then
set udg_FSW_Event_Trackable_Hovered = 1
set udg_FSW_Event_Trackable_Hovered = 0
endif
return false
endfunction
function FSW_System_While_Open takes nothing returns boolean
local integer pId = 0
local player p
local integer i = 0
loop
exitwhen pId > 3
set p = Player(pId)
loop
exitwhen i > udg_FSW_Index
if LoadBoolean(udg_FSW_Hashtable, i, pId) then
call FSW_Remove_Temp_Objects(i, pId)
set udg_FSW_Param_Player = p
set udg_FSW_Param_FSW = i
call TriggerEvaluate(udg_FSW_Trigger_WhileOpen[i])
exitwhen true
endif
set i = i + 1
endloop
set pId = pId + 1
endloop
return false
endfunction
endlibrary
function InitTrig_FSW_System takes nothing returns nothing
call TimerStart(CreateTimer(), 0.05, true, function FSW_System_While_Open)
call TriggerAddCondition(udg_FSW_Trigger_TrackableClick, Filter(function FSW_System_Trackable_Clicked))
call TriggerAddCondition(udg_FSW_Trigger_TrackableHover, Filter(function FSW_System_Trackable_Hovered))
endfunction
The new system is very similar but I did not found a nice way to create the objects such as a unit, destructable or texttag easily.
This is how far I got the new system:
JASS:
library fswSystem uses basicFunctions
globals
//Object Data
integer udg_FSW_Index = 0
integer array udg_FSW_Location_X
integer array udg_FSW_Location_Y
real array udg_FSW_Camera_X
real array udg_FSW_Camera_Y
real array udg_FSW_CameraDistance
integer array udg_FSW_Size
integer array udg_FSW_TerrainType
unit array udg_FSW_DummyUnit
real array udg_FSW_PlayerCamera_X
real array udg_FSW_PlayerCamera_Y
integer array udg_FSW_OpenedWindow
//Constants
integer udg_FSW_TERRAIN_BLACK = 'Oaby'
trigger udg_FSW_TRIGGER_TRACKABLE_CLICK = CreateTrigger()
trigger udg_FSW_TRIGGER_TRACKABLE_HOVER = CreateTrigger()
string udg_FSW_TRACKABLE_MODEL = "FSW\\Trackable.mdx"
hashtable udg_FSW_HASHTABLE = InitHashtable()
integer udg_FSW_GRID = 64
player udg_FSW_PLAYER_NEUTRAL = Player(0) //Player(12)
integer udg_FSW_DUMMY_UNIT = 'hfoo' //<dummy-unit>
timer udg_FSW_TIMER = CreateTimer()
real udg_FSW_INTERVAL = 0.05
//integer udg_FSW_STANDARD_OBJECTS_LIMIT = 10000
//Events
real udg_FSW_Event_Trackable_Clicked = 0
real udg_FSW_Event_Trackable_Hovered = 0
real udg_FSW_Event_Window_Opened = 0
real udg_FSW_Event_Window_Closed = 0
integer udg_FSW_EventResponse_LocX
integer udg_FSW_EventResponse_LocY
integer udg_FSW_EventResponse_Window
player udg_FSW_EventResponse_Player
endglobals
function FSW_CloseWindow takes integer windowIndex, player whichPlayer returns nothing
local real centerX = udg_FSW_Location_X[windowIndex]*udg_FSW_GRID + udg_FSW_Camera_X[windowIndex]
local real centerY = udg_FSW_Location_Y[windowIndex]*udg_FSW_GRID + udg_FSW_Camera_Y[windowIndex]
local integer pId = GetPlayerId(whichPlayer)
if udg_LOCAL_PLAYER == whichPlayer then
call ResetToGameCamera(0)
call PanCameraToTimed(udg_FSW_PlayerCamera_X[pId], udg_FSW_PlayerCamera_Y[pId], 0)
call SetTerrainType(centerX, centerY, udg_FSW_TerrainType[windowIndex], -1, udg_FSW_Size[windowIndex], 1)
endif
//call FSW_System_ShowStandardObjects(whichFSW, false)
//call FSW_Remove_Temp_Objects(whichFSW, pId)
call SaveBoolean(udg_FSW_HASHTABLE, windowIndex, pId, false)
set udg_FSW_OpenedWindow[pId] = 0
set udg_FSW_Event_Window_Closed = 1
set udg_FSW_Event_Window_Closed = 0
endfunction
function FSW_OpenWindow takes integer windowIndex, player whichPlayer returns nothing
local real centerX = udg_FSW_Location_X[windowIndex]*udg_FSW_GRID + udg_FSW_Camera_X[windowIndex]
local real centerY = udg_FSW_Location_Y[windowIndex]*udg_FSW_GRID + udg_FSW_Camera_Y[windowIndex]
local integer pId = GetPlayerId(whichPlayer)
if udg_FSW_OpenedWindow[pId] > 0 then
call FSW_CloseWindow(udg_FSW_OpenedWindow[pId], whichPlayer)
endif
if udg_LOCAL_PLAYER == whichPlayer then
set udg_FSW_PlayerCamera_X[pId] = GetCameraTargetPositionX()
set udg_FSW_PlayerCamera_Y[pId] = GetCameraTargetPositionY()
call SetCameraTargetController(udg_FSW_DummyUnit[windowIndex], 0, 0, false)
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, -90, 0)
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, udg_FSW_CameraDistance[windowIndex], 0)
call SetTerrainType(centerX, centerY, udg_FSW_TERRAIN_BLACK, 0, udg_FSW_Size[windowIndex], 1)
call SaveBoolean(udg_FSW_HASHTABLE, windowIndex, pId, true)
set udg_FSW_OpenedWindow[pId] = windowIndex
//call FSW_System_ShowStandardObjects(whichFSW, true)
set udg_FSW_EventResponse_Window = windowIndex
set udg_FSW_EventResponse_Player = whichPlayer
set udg_FSW_Event_Window_Opened = 1
set udg_FSW_Event_Window_Opened = 0
//call TriggerExecute(udg_FSW_Trigger_WhileOpen[whichFSW])
endif
endfunction
function FSW_CreateWindow takes integer x, integer y, real cameraX, real cameraY, real cameraDistance returns integer
set udg_FSW_Index = udg_FSW_Index +1
set udg_FSW_Location_X[udg_FSW_Index] = x
set udg_FSW_Location_Y[udg_FSW_Index] = y
set udg_FSW_Camera_X[udg_FSW_Index] = cameraX
set udg_FSW_Camera_X[udg_FSW_Index] = cameraY
set udg_FSW_CameraDistance[udg_FSW_Index] = cameraDistance
set udg_FSW_Size[udg_FSW_Index] = 9
set udg_FSW_TerrainType[udg_FSW_Index] = GetTerrainType(x*udg_FSW_GRID + cameraX, y*udg_FSW_GRID + cameraY)
set udg_FSW_DummyUnit[udg_FSW_Index] = CreateUnit(udg_FSW_PLAYER_NEUTRAL, udg_FSW_DUMMY_UNIT, cameraX, cameraY, 0)
return udg_FSW_Index
endfunction
function FSW_CreateTrackable takes integer windowIndex, integer x, integer y returns nothing
local integer fswX = udg_FSW_Location_X[windowIndex]+x
local integer fswY = udg_FSW_Location_Y[windowIndex]-y
local real locX = fswX * udg_FSW_GRID
local real locY = fswY * udg_FSW_GRID
local trackable t
local integer id
local integer i = 0
local player p
local string s
loop
exitwhen i > 12
set p = Player(i)
if GetPlayerSlotState(p) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(p) == MAP_CONTROL_USER then
if udg_LOCAL_PLAYER == p then
set s = udg_FSW_TRACKABLE_MODEL
else
set s = ""
endif
set t = CreateTrackable(s, locX, locY, 0)
set id = GetHandleId(t)
//Register the events for the trackable.
call TriggerRegisterTrackableHitEvent(udg_FSW_TRIGGER_TRACKABLE_CLICK, t)
call TriggerRegisterTrackableTrackEvent(udg_FSW_TRIGGER_TRACKABLE_HOVER, t)
//Save the data to the hashtable.
call SaveInteger(udg_FSW_HASHTABLE, id, 0, i)
call SaveInteger(udg_FSW_HASHTABLE, id, 1, fswX)
call SaveInteger(udg_FSW_HASHTABLE, id, 2, fswY)
endif
set i = i + 1
endloop
set t = null
set p = null
endfunction
function FSW_TrackableClick takes nothing returns boolean
local integer id = GetHandleId(GetTriggeringTrackable())
local integer windowIndex
local integer pId = LoadInteger(udg_FSW_HASHTABLE, id, 0)
local integer i = 0
loop
if i > udg_FSW_Index then
return false
endif
if LoadBoolean(udg_FSW_HASHTABLE, i, pId) then
set windowIndex = i
exitwhen true
endif
set i = i + 1
endloop
set udg_FSW_EventResponse_LocX = -udg_FSW_Location_X[windowIndex] + LoadInteger(udg_FSW_HASHTABLE, id, 1)
set udg_FSW_EventResponse_LocY = -udg_FSW_Location_Y[windowIndex] + LoadInteger(udg_FSW_HASHTABLE, id, 2)
set udg_FSW_EventResponse_Window = windowIndex
set udg_FSW_EventResponse_Player = Player(pId)
set udg_FSW_Event_Trackable_Clicked = 1
set udg_FSW_Event_Trackable_Clicked = 0
return false
endfunction
function FSW_TrackableHover takes nothing returns boolean
local integer id = GetHandleId(GetTriggeringTrackable())
local integer windowIndex
local integer pId = LoadInteger(udg_FSW_HASHTABLE, id, 0)
local integer i = 0
loop
if i > udg_FSW_Index then
return false
endif
if LoadBoolean(udg_FSW_HASHTABLE, i, pId) then
set windowIndex = i
exitwhen true
endif
set i = i + 1
endloop
set udg_FSW_EventResponse_LocX = -udg_FSW_Location_X[windowIndex] + LoadInteger(udg_FSW_HASHTABLE, id, 1)
set udg_FSW_EventResponse_LocY = -udg_FSW_Location_Y[windowIndex] + LoadInteger(udg_FSW_HASHTABLE, id, 2)
set udg_FSW_EventResponse_Window = windowIndex
set udg_FSW_EventResponse_Player = Player(pId)
set udg_FSW_Event_Trackable_Hovered = 1
set udg_FSW_Event_Trackable_Hovered = 0
return false
endfunction
function FSW_Interval takes nothing returns nothing
local integer pId = 0
loop
exitwhen pId > 12
if udg_FSW_OpenedWindow[pId] > 0 then
call SetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK, -90, 0)
call SetCameraField(CAMERA_FIELD_TARGET_DISTANCE, udg_FSW_CameraDistance[udg_FSW_OpenedWindow[pId]], 0)
endif
set pId = pId +1
endloop
endfunction
endlibrary
function InitTrig_FSW_System takes nothing returns nothing
call TimerStart(udg_FSW_TIMER, udg_FSW_INTERVAL, true, function FSW_Interval)
call TriggerAddCondition(udg_FSW_TRIGGER_TRACKABLE_CLICK, Filter(function FSW_TrackableClick))
call TriggerAddCondition(udg_FSW_TRIGGER_TRACKABLE_HOVER, Filter(function FSW_TrackableHover))
endfunction