library PlayerCameraData
/**
*
* EnableCameraBroadcast(player p, boolean flag)
* - Enables/disables the storage (and syncing) of camera data for that player.
* RegisterCameraDataUpdate(boolexpr b)
* - Fires the boolexpr whenever the camera data is resynced.
*
* PlayerCameraData.x[playerId] -> x-coordinate of camera for player
* PlayerCameraData.y[playerId] -> y-coordinate of camera for player
* PlayerCameraData.aoa[playerId] -> angle of attack for player
* PlayerCameraData.rotation[playerId] -> rotation for player
*
*/
globals
private constant string CACHE_NAME = "PlayerCameraData"
private constant string MISSION_PREFIX = "PCD_"
private gamecache cache
private player array playerStack
private integer array playerIndex
private integer stackIndex = 0
private trigger syncTrigger = CreateTrigger()
private trigger updateEvent = CreateTrigger()
endglobals
function RegisterCameraDataUpdate takes boolexpr b returns nothing
call TriggerAddCondition(updateEvent, b)
endfunction
private function SyncCameraData takes nothing returns nothing
local integer localStackIndex = stackIndex
local integer i = localStackIndex
local integer id
local string missionKey
if i == 0 then
return
endif
loop
exitwhen i == 0
set id = GetPlayerId(playerStack[i])
set missionKey = MISSION_PREFIX + I2S(id)
if GetLocalPlayer() == playerStack[i] then
call StoreReal(cache, missionKey, "x", GetCameraTargetPositionX())
call StoreReal(cache, missionKey, "y", GetCameraTargetPositionY())
call StoreReal(cache, missionKey, "aoa", GetCameraField(CAMERA_FIELD_ANGLE_OF_ATTACK) * bj_RADTODEG)
call StoreReal(cache, missionKey, "rot", GetCameraField(CAMERA_FIELD_ROTATION) * bj_RADTODEG)
call SyncStoredReal(cache, missionKey, "x")
call SyncStoredReal(cache, missionKey, "y")
call SyncStoredReal(cache, missionKey, "aoa")
call SyncStoredReal(cache, missionKey, "rot")
endif
set i = i - 1
endloop
call TriggerSyncReady()
set i = localStackIndex
loop
exitwhen i == 0
set id = GetPlayerId(playerStack[i])
set missionKey = MISSION_PREFIX + I2S(id)
set PlayerCameraData.x[id] = GetStoredReal(cache, missionKey, "x")
set PlayerCameraData.y[id] = GetStoredReal(cache, missionKey, "y")
set PlayerCameraData.aoa[id] = GetStoredReal(cache, missionKey, "aoa")
set PlayerCameraData.rotation[id] = GetStoredReal(cache, missionKey, "rot")
set i = i - 1
endloop
call TriggerEvaluate(updateEvent)
call TriggerExecute(syncTrigger)
endfunction
function EnableCameraBroadcast takes player p, boolean flag returns nothing
local integer id = GetPlayerId(p)
if flag then
if playerIndex[id] != 0 then
return
endif
set stackIndex = stackIndex + 1
set playerStack[stackIndex] = p
set playerIndex[id] = stackIndex
if stackIndex == 1 then
call TriggerExecute(syncTrigger)
endif
elseif playerIndex[id] != 0 then
set playerStack[playerIndex[id]] = playerStack[stackIndex]
set stackIndex = stackIndex - 1
set playerIndex[id] = 0
endif
endfunction
private module Init
private static method onInit takes nothing returns nothing
set cache = InitGameCache(CACHE_NAME)
call TriggerAddAction(syncTrigger, function SyncCameraData)
endmethod
endmodule
struct PlayerCameraData extends array
static real array x
static real array y
static real array aoa
static real array rotation
implement Init
endstruct
function GetCameraTargetLocation takes player p returns location
local integer id = GetPlayerId(p)
return Location(PlayerCameraData.x[i], PlayerCameraData.y[i])
endfunction
endlibrary