Взял из классической, проверенной статьи функцию синхронизации
code
library TestLib initializer Iinit_TestLib


globals
	gamecache cache = InitGameCache("cache")
endglobals

function SyncReal takes player p, real val returns real
	if (GetLocalPlayer() == p) then
		call StoreReal(cache, "", "", val)
	endif
	call TriggerSyncStart()
	if (GetLocalPlayer() == p) then
		call SyncStoredReal(cache, "", "")
	endif
	call TriggerSleepAction(2.)
	call TriggerSyncReady()
	return GetStoredReal(cache, "", "")
endfunction

function Test1 takes nothing returns nothing
local real loc_r
local real loc_r1
if(Player(0) == GetLocalPlayer())then
	set loc_r = 5
endif

if(Player(1) == GetLocalPlayer())then
	set loc_r = 10
endif

call BJDebugMsg("loc_r: " + R2S(loc_r))
set loc_r1 = SyncReal(Player(0),loc_r)
call BJDebugMsg("loc_r1: " + R2S(loc_r1))

endfunction


function Iinit_TestLib takes nothing returns nothing
	call TimerStart(CreateTimer(), 1, false, function Test1)	
endfunction


endlibrary
и не_работает, пишу в 1.31. Знаю, что какие-то есть новые нативные функции для этого, но не нашел новых решений проблемы.

Принятый ответ

в другую систему счисления
Так понимаю, что на jass так должно быть лучше, хотя я большой разницы не заметил =(
library LibSENDSTR
code
library LibSENDSTR initializer Init_LibSENDSTR


globals
	private string BOOK = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	private integer BOOK_cout
endglobals


private function Char2Int takes string char returns integer
	local integer i = 0
	loop
		exitwhen(char == SubString(BOOK,i,i+1))
		set i = i + 1
	endloop
	return i
endfunction


function SEND_STR2Unsigint takes string SEND_STR returns integer
	local integer INT = 0
	local integer g = 1
	local integer Length = StringLength(SEND_STR)
	//
	loop
		set INT = INT + Char2Int(SubString(SEND_STR,Length-1,Length))*g
		set g = g*BOOK_cout
		set Length = Length - 1
		exitwhen(Length == 0)
	endloop
	return INT
endfunction


function Unsigint2SEND_STR takes integer INT returns string
	local integer quot
	local integer residue
	local string SEND_STR = ""
	
	loop
		set quot = INT/BOOK_cout
		set residue = INT - quot*BOOK_cout
		set SEND_STR = SubString(BOOK,residue,residue+1) + SEND_STR
		exitwhen(quot == 0)
		set INT = quot
	endloop
	return SEND_STR
endfunction


function Int2SEND_STR takes integer INT returns string
	if(INT < 0)then
		return "-" + Unsigint2SEND_STR(-INT)
	else
		return Unsigint2SEND_STR(INT)
	endif
endfunction


function SEND_STR2Int takes string SEND_STR returns integer
	if(SubString(SEND_STR,0,1) == "-")then
		return -SEND_STR2Unsigint(SubString(SEND_STR,1,StringLength(SEND_STR)))
	else
		return SEND_STR2Unsigint(SEND_STR)
	endif
endfunction


private function Test takes nothing returns nothing
	local integer INT = -3675967
	local string SEND_STR
	local integer OUTINT
	//
	//
	call BJDebugMsg("ORI: " + I2S(INT))
	//
	set SEND_STR = Int2SEND_STR(INT)
	call BJDebugMsg("SEND: " + SEND_STR)
	//
	set OUTINT = SEND_STR2Int(SEND_STR)
	call BJDebugMsg("GET: " + I2S(OUTINT))

endfunction


private function Init_LibSENDSTR  takes nothing returns nothing
	set BOOK_cout = StringLength(BOOK)
	
	//call TimerStart(CreateTimer(), 1, false, function Test)
endfunction

endlibrary
TestLib
code
library TestLib initializer Iinit_TestLib uses LibSENDSTR

function SyncActionTrg takes nothing returns nothing
	local string SyncData = BlzGetTriggerSyncData()
	local real SyncReal = SEND_STR2Int(SyncData)*0.0001
	//
	call BJDebugMsg("GetSTR: " + SyncData)
 	call BJDebugMsg("GetReal: " + R2S(SyncReal))
endfunction

function Test1 takes nothing returns nothing
local real loc_r
local real loc_r1
if(Player(0) == GetLocalPlayer())then
	set loc_r = 5.873
endif

if(Player(1) == GetLocalPlayer())then
	set loc_r = 10.56
endif

call BJDebugMsg("Send: " + R2S(loc_r))
if(Player(0) == GetLocalPlayer())then
	call BlzSendSyncData("mission",Int2SEND_STR(R2I(loc_r*10000)))
endif
endfunction

function Iinit_TestLib takes nothing returns nothing
	local trigger loc_trg = CreateTrigger()
	call BlzTriggerRegisterPlayerSyncEvent(loc_trg,Player(0),"mission",false)
	call BlzTriggerRegisterPlayerSyncEvent(loc_trg,Player(1),"mission",false)
	call TriggerAddAction(loc_trg,function SyncActionTrg)
	//
	call TimerStart(CreateTimer(), 1, false, function Test1)	
endfunction
endlibrary
Загруженные файлы
`
ОЖИДАНИЕ РЕКЛАМЫ...
0
32
4 года назад
Отредактирован Берги
0
дык это уже технология прошлого века
я ещё не проверял, но в 131 есть лучше
native BlzTriggerRegisterPlayerSyncEvent           takes trigger whichTrigger, player whichPlayer, string prefix, boolean fromServer
native BlzSendSyncData                             takes string prefix, string data returns booleanreturns event

и самое что крутое (тоже ещё не проверял)
время синхронизации снижено с 2 секунд, до... 0,1?
0
9
4 года назад
0
131 есть лучше
Да я их видел, но в том то и дело. Примеров решений с ними не найдешь =( Единственное, что есть, использующее это. Но тут я без бутылки не могу разобраться, для чего это тут и как с ним работать. Простой пример бы.
0
32
4 года назад
0
Тут есть работа для NazarPunk
0
9
4 года назад
0
Так, вот такой код работает как надо, но остается вопрос как инты в char запихивать без такого трудоемкого(долгого) преобразования типов =(
code
library TestLib initializer Iinit_TestLib

function SyncActionTrg takes nothing returns nothing
	local string SyncData = BlzGetTriggerSyncData()
	local real SyncReal = S2R(SyncData)
 	call BJDebugMsg(R2S(SyncReal))
endfunction

function Test1 takes nothing returns nothing
local real loc_r
local real loc_r1
if(Player(0) == GetLocalPlayer())then
	set loc_r = 5
endif

if(Player(1) == GetLocalPlayer())then
	set loc_r = 10
endif

call BJDebugMsg("loc_r: " + R2S(loc_r))

if(Player(0) == GetLocalPlayer())then
	call BlzSendSyncData("mission",R2S(loc_r))
endif


endfunction


function Iinit_TestLib takes nothing returns nothing
	local trigger loc_trg = CreateTrigger()
	call BlzTriggerRegisterPlayerSyncEvent(loc_trg,Player(0),"mission",false)
	call BlzTriggerRegisterPlayerSyncEvent(loc_trg,Player(1),"mission",false)
	call TriggerAddAction(loc_trg,function SyncActionTrg)
	//
	call TimerStart(CreateTimer(), 1, false, function Test1)	
endfunction


endlibrary
0
32
4 года назад
0
Koladik, что там по скорости?
0
9
4 года назад
Отредактирован Koladik
0
по скорости?
Да делает то он быстро, я не знаю как тут точно подсчитать, но навскидку пол секунды. Просто в данном случае преобразование нецелесообразно.
0
17
4 года назад
0
Koladik:
Так, вот такой код работает как надо, но остается вопрос как инты в char запихивать без такого трудоемкого(долгого) преобразования типов =(
я делал алгоритм для луа, можете переписать например или сделать что-то подобное
0
29
4 года назад
Отредактирован Doc
0
В жассе - скорее всего никак (недостаточно функций для получения информации о числе с плавающей точкой). В луа есть string.pack и string.unpack, но потом нужно конвертировать в base64 (иначе не получится послать по сети). «Алгоритм» из поста сверху даже открывать не советую, тихий ужас.
0
9
4 года назад
0
недостаточно функций для получения информации о числе с плавающей точкой
да хотя бы инт научиться по человечески передавать
Doc:
даже открывать не советую, тихий ужас
Да никто и не спорил, только более элегантного способа та и нет, как я понимаю. Но да, по всей видимости, это веская причина на луа писать.
1
29
4 года назад
1
"по человечески" никак не получится, все что можно сделать - перевести число в другую систему счисления в строковом виде и передать так.
0
9
4 года назад
0
в другую систему счисления
Так понимаю, что на jass так должно быть лучше, хотя я большой разницы не заметил =(
library LibSENDSTR
code
library LibSENDSTR initializer Init_LibSENDSTR


globals
	private string BOOK = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
	private integer BOOK_cout
endglobals


private function Char2Int takes string char returns integer
	local integer i = 0
	loop
		exitwhen(char == SubString(BOOK,i,i+1))
		set i = i + 1
	endloop
	return i
endfunction


function SEND_STR2Unsigint takes string SEND_STR returns integer
	local integer INT = 0
	local integer g = 1
	local integer Length = StringLength(SEND_STR)
	//
	loop
		set INT = INT + Char2Int(SubString(SEND_STR,Length-1,Length))*g
		set g = g*BOOK_cout
		set Length = Length - 1
		exitwhen(Length == 0)
	endloop
	return INT
endfunction


function Unsigint2SEND_STR takes integer INT returns string
	local integer quot
	local integer residue
	local string SEND_STR = ""
	
	loop
		set quot = INT/BOOK_cout
		set residue = INT - quot*BOOK_cout
		set SEND_STR = SubString(BOOK,residue,residue+1) + SEND_STR
		exitwhen(quot == 0)
		set INT = quot
	endloop
	return SEND_STR
endfunction


function Int2SEND_STR takes integer INT returns string
	if(INT < 0)then
		return "-" + Unsigint2SEND_STR(-INT)
	else
		return Unsigint2SEND_STR(INT)
	endif
endfunction


function SEND_STR2Int takes string SEND_STR returns integer
	if(SubString(SEND_STR,0,1) == "-")then
		return -SEND_STR2Unsigint(SubString(SEND_STR,1,StringLength(SEND_STR)))
	else
		return SEND_STR2Unsigint(SEND_STR)
	endif
endfunction


private function Test takes nothing returns nothing
	local integer INT = -3675967
	local string SEND_STR
	local integer OUTINT
	//
	//
	call BJDebugMsg("ORI: " + I2S(INT))
	//
	set SEND_STR = Int2SEND_STR(INT)
	call BJDebugMsg("SEND: " + SEND_STR)
	//
	set OUTINT = SEND_STR2Int(SEND_STR)
	call BJDebugMsg("GET: " + I2S(OUTINT))

endfunction


private function Init_LibSENDSTR  takes nothing returns nothing
	set BOOK_cout = StringLength(BOOK)
	
	//call TimerStart(CreateTimer(), 1, false, function Test)
endfunction

endlibrary
TestLib
code
library TestLib initializer Iinit_TestLib uses LibSENDSTR

function SyncActionTrg takes nothing returns nothing
	local string SyncData = BlzGetTriggerSyncData()
	local real SyncReal = SEND_STR2Int(SyncData)*0.0001
	//
	call BJDebugMsg("GetSTR: " + SyncData)
 	call BJDebugMsg("GetReal: " + R2S(SyncReal))
endfunction

function Test1 takes nothing returns nothing
local real loc_r
local real loc_r1
if(Player(0) == GetLocalPlayer())then
	set loc_r = 5.873
endif

if(Player(1) == GetLocalPlayer())then
	set loc_r = 10.56
endif

call BJDebugMsg("Send: " + R2S(loc_r))
if(Player(0) == GetLocalPlayer())then
	call BlzSendSyncData("mission",Int2SEND_STR(R2I(loc_r*10000)))
endif
endfunction

function Iinit_TestLib takes nothing returns nothing
	local trigger loc_trg = CreateTrigger()
	call BlzTriggerRegisterPlayerSyncEvent(loc_trg,Player(0),"mission",false)
	call BlzTriggerRegisterPlayerSyncEvent(loc_trg,Player(1),"mission",false)
	call TriggerAddAction(loc_trg,function SyncActionTrg)
	//
	call TimerStart(CreateTimer(), 1, false, function Test1)	
endfunction
endlibrary
Загруженные файлы
Принятый ответ
0
29
4 года назад
0
Ну если удовлетворяет пересылка одного значения, то да.
Чтобы оставить комментарий, пожалуйста, войдите на сайт.