kingkingyyk3
Visitor (Welcome to the Jungle, Baby!)
- Reaction score
- 216
JASS:
////////////////////////////////////////
//
// GetLatency ~v1.0.0~
// by kingking
//
// =====================
// What is GetLatency?
// =====================
// ~ GetLatency will let you know the delay
// between 2 players.
// ~ It is very useful because host can know
// which player is lagging.
//
// ====================
// How does it works?
// ====================
// ~ Create a timer.
// ~ Every several period, it will get
// the timer's value and store it.
// ~ Each player has his/her slot to store.
// ~ The value is stored in gamecache.
// ~ It is synced to other players later.
//
// =====================
// Function provided :
// =====================
// GetLatency(player,player) -> integer
// (milliseconds)
//
//
// Requires : Latest Jasshelper
////////////////////////////////////////
library GetLatency initializer Init
globals
private constant real PERIOD = .03125
//Update period.
endglobals
globals
private gamecache gc
private string array Number
private timer GameTimer
endglobals
private function Modules takes real r returns integer
if r < 0. then
return R2I(-r)
endif
return R2I(r)
//=.="
endfunction
function GetLatency takes player source, player object returns integer //(ms)
if GetPlayerController(source) == MAP_CONTROL_USER and GetPlayerSlotState(source) == PLAYER_SLOT_STATE_PLAYING and GetPlayerController(object) == MAP_CONTROL_USER and GetPlayerSlotState(object) == PLAYER_SLOT_STATE_PLAYING then
//Does not work on leaved players or computer players.
return Modules((GetStoredReal(gc,"Test",Number[GetPlayerId(source)]) - GetStoredReal(gc,"Test",Number[GetPlayerId(object)])) * 1000.)
endif
return 0
//return 0 for leaved players / computer players.
endfunction
private function Update takes nothing returns nothing
local integer i = GetPlayerId(GetLocalPlayer())
//Magic! Does not desync!
call StoreReal(gc,"Test",Number<i>,TimerGetRemaining(GameTimer))
//Store the value of timer.
call SyncStoredReal(gc,"Test",Number<i>)
//Sync the value to other players' gamecache.
endfunction
private function Init takes nothing returns nothing
set Number[0] = "Player 1"
set Number[1] = "Player 2"
set Number[2] = "Player 3"
set Number[3] = "Player 4"
set Number[4] = "Player 5"
set Number[5] = "Player 6"
set Number[6] = "Player 7"
set Number[7] = "Player 8"
set Number[8] = "Player 9"
set Number[9] = "Player 10"
set Number[10] = "Player 11"
set Number[11] = "Player 12"
//Data slot for players.
set GameTimer = CreateTimer()
call TimerStart(GameTimer,1000000000.,false,null)
//Game timer, used to measure the latency.
call FlushGameCache(InitGameCache("GetLatency"))
set gc = InitGameCache("GetLatency")
//Clear and init the gamecache.
call TimerStart(CreateTimer(),PERIOD,true,function Update)
//Updater.
endfunction
endlibrary
</i></i>
Extra : Tested with BlackRose, it works! The latency was around 400-600. Thanks to BlackRose for testing it.