Перейти к содержимому


Фотография

RemoteExec


Лучший Ответ vlad333000 , 20 November 2017 - 00:12

Ветераны, такой к вам вопрос про RemoteExec:
На сервере есть функция Func
На клиенте её нету.
Исполнит ли клиент эту функцию, если сервер ему прикажет?

Суть проблемы вообще такая...
Не палить клиенту функцию, но заставить ее исполнить.
Это возможно?

Функции определены локально, если у вас есть функция A то не факт, что она есть на другом клиенте, и если её там нету, то вы можете хоть с бубном танцевать - удаленно вы просто так ее не вызовите
Но это возможно: вам как-то нужно определить код этой функции на клиентах (Можете передавать код функций во время загрузки миссий и на клиенте уже определять их по этим данным с сервера, но как вы понимаете - это будет экстремальная нагрузка для канала передачи данных как сервера, так и клиента (А при одновременном подключении большого числа клиентов может и вовсе положить сервер)
Где-то в ините игрока на сервере:
[“func1”, “hint ‘func1’”] remoteExecCall [“MyTag_fnc_myFunction”, _clientID, false];
[“func2”, “hint ‘func2’”] remoteExecCall [“MyTag_fnc_myFunction”, _clientID, false];
На клиенте fn_myFunction:
params [
  [“_funcName”, “”, [“”]],
  [“_funcCode”, “”, [“”]]
];

missionNamespace setVariable [_funcName, compileFinal _funcCode];
После чего, можно будет эту функцию вызывать удаленно, но без возможности писать скрипты в миссии при подключению к серверу код этих функций никак не узнать (Можно еще хакать, но хто другая тема)
[“Hello World!”] remoteExecCall [“func1”, _clientID, false];
Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 9

#1 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

  • Пользователи
  • 264 сообщений
  • Откуда:Moscow

Отправлено 19 November 2017 - 22:35

Ветераны, такой к вам вопрос про RemoteExec:

На сервере есть функция Func

На клиенте её нету.

Исполнит ли клиент эту функцию, если сервер ему прикажет?

 

Суть проблемы вообще такая...

Не палить клиенту функцию, но заставить ее исполнить.

Это возможно?


  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 20 November 2017 - 00:12   Лучший Ответ

Ветераны, такой к вам вопрос про RemoteExec:
На сервере есть функция Func
На клиенте её нету.
Исполнит ли клиент эту функцию, если сервер ему прикажет?

Суть проблемы вообще такая...
Не палить клиенту функцию, но заставить ее исполнить.
Это возможно?

Функции определены локально, если у вас есть функция A то не факт, что она есть на другом клиенте, и если её там нету, то вы можете хоть с бубном танцевать - удаленно вы просто так ее не вызовите
Но это возможно: вам как-то нужно определить код этой функции на клиентах (Можете передавать код функций во время загрузки миссий и на клиенте уже определять их по этим данным с сервера, но как вы понимаете - это будет экстремальная нагрузка для канала передачи данных как сервера, так и клиента (А при одновременном подключении большого числа клиентов может и вовсе положить сервер)
Где-то в ините игрока на сервере:
[“func1”, “hint ‘func1’”] remoteExecCall [“MyTag_fnc_myFunction”, _clientID, false];
[“func2”, “hint ‘func2’”] remoteExecCall [“MyTag_fnc_myFunction”, _clientID, false];
На клиенте fn_myFunction:
params [
  [“_funcName”, “”, [“”]],
  [“_funcCode”, “”, [“”]]
];

missionNamespace setVariable [_funcName, compileFinal _funcCode];
После чего, можно будет эту функцию вызывать удаленно, но без возможности писать скрипты в миссии при подключению к серверу код этих функций никак не узнать (Можно еще хакать, но хто другая тема)
[“Hello World!”] remoteExecCall [“func1”, _clientID, false];

Сообщение отредактировал vlad333000: 20 November 2017 - 00:26

  • 1

#3 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

  • Пользователи
  • 264 сообщений
  • Откуда:Moscow

Отправлено 20 November 2017 - 00:37

Влад, огромное тебе спасибо!!!

Очень информативный ответ


Сообщение отредактировал ReXcOr: 20 November 2017 - 00:42

  • 0

#4 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 20 November 2017 - 22:29

// функция только на сервере
Tag_fnc_serverFunction = {
	_param1 = _this select 0;
	_param2 = _this select 1;
	// и так далее	

	// code
	hintSilent format ["Result: %1", _param1 + _param2];
};

// отправка функции клиенту и вызов
_param1 = 1;
_param2 = 2;
[[_param1, _param2], Tag_fnc_serverFunction] remoteExec [“BIS_fnc_spawn”, _clientID, false];

  • 1

#5 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

  • Пользователи
  • 264 сообщений
  • Откуда:Moscow

Отправлено 21 November 2017 - 12:58

Спасибо вам парни, это то что нужно!
А вот ещё :
Ведь по идее, вместо _clientId, я ещё могу давать ссылку на игрока?

Сообщение отредактировал ReXcOr: 21 November 2017 - 13:00

  • 0

#6 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 21 November 2017 - 17:11

Пожалуйста Войдите или Зарегистрируйтесь чтобы увидеть скрытое содержание


  • 0

#7 OFFLINE   Dimon UA

Dimon UA

    Ст.сержант

  • Пользователи
  • 304 сообщений
  • Откуда:Севастополь

Отправлено 22 November 2017 - 18:05

слушайте, а по-моему достаточно:
 

if isserver then
{
  func = {hint "olala"};
  missionNamespace setVariable ["func", func, True];
};

if (local player) then
{
  call func;
};

простой пример без компиляции


  • 0

#8 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 22 November 2017 - 18:40

Dimon UA, способов много, через remoteExecCall ты просто можешь точечно рассылать функцию (А не спамить на все клиенты), а Call-версия гарантирует что нужный код появится как можно раньше на целевом клиенте.
  • 1

#9 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 24 November 2017 - 22:59

Вообще, если стоит цель скрыть на стороне сервера часть реализации геймплея, то при подключении клиента имеет смысл сразу пачкой отправить все требуемые для корректной игры функции и данные, и передать именно скомпилированный код, это более оптимизированный вариант. Можете проверить, конечно не знаю будет выведен нынче этот мессидж или нет, отправьте клиенту через remoteExec не скомпилированную функцию, то есть просто текст функции, в лог придёт мессидж что такой манёвр не оптимален, передавайте лучше код, это логично, скомпилированный код это уже нечто более оптимальное чем функция описанная строкой, и весит меньше.

 

Так вот, если ваш геймплей прячет часть своей реализации на стороне сервера создайте функцию, или назовите это скрипт, не важно, желательно скомпилированную функцию, причина описана выше, и внутри этой функции опишите все те функции которые нужны для реализации, и при инициализации тела на сервере отдайте клиенту это, вызов кода тупо объявит и определит всё что нужно.

ClientFnc = {
	// global variables
	g_var1 = 0;
	g_var2 = "hello";

	// functions
	fnc1 = {};
	fnc2 = {};
};

[0, ClientFnc] remoteExec ["BIS_fnc_spawn", _clientID, false];

  • 1

#10 OFFLINE   ReXcOr

ReXcOr

    Ст.сержант

  • Пользователи
  • 264 сообщений
  • Откуда:Moscow

Отправлено 27 November 2017 - 10:30


Вообще, если стоит цель скрыть на стороне сервера часть реализации геймплея, то при подключении клиента имеет смысл сразу пачкой отправить все требуемые для корректной игры функции и данные, и передать именно скомпилированный код, это более оптимизированный вариант. Можете проверить, конечно не знаю будет выведен нынче этот мессидж или нет, отправьте клиенту через remoteExec не скомпилированную функцию, то есть просто текст функции, в лог придёт мессидж что такой манёвр не оптимален, передавайте лучше код, это логично, скомпилированный код это уже нечто более оптимальное чем функция описанная строкой, и весит меньше.

Так вот, если ваш геймплей прячет часть своей реализации на стороне сервера создайте функцию, или назовите это скрипт, не важно, желательно скомпилированную функцию, причина описана выше, и внутри этой функции опишите все те функции которые нужны для реализации, и при инициализации тела на сервере отдайте клиенту это, вызов кода тупо объявит и определит всё что нужно.

ClientFnc = {
	// global variables
	g_var1 = 0;
	g_var2 = "hello";

	// functions
	fnc1 = {};
	fnc2 = {};
};

[0, ClientFnc] remoteExec ["BIS_fnc_spawn", _clientID, false];
Уловил вашу мысль, SteelRat
Спасибо форумчане, за разнообразие способов, буду тестировать, что более оптимально подойдёт под мои цели!
  • 0




Яндекс.Метрика