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


Фотография

Как запустить функцию на клиенте


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

#1 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 17 February 2019 - 02:02

Уже всю голову сломал с этим вопросом..

 

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

EyeEffect0 = compile preprocessfilelinenumbers "\PiR\Functions\EyeEffect0.sqf";

Её нужно запустить с сервера на клиенте.

 

Пробовал так:

[_unit, _anim, _shans ] remoteExec [ "EyeEffect0", _unit ];

И так...

[[_unit, _anim, _shans ], "\PiR\Functions\EyeEffect0.sqf"] remoteExec ["execVM", _unit];

Если _unit это серверный игрок, то функция запускается нормально. Но если игрок это клиент, запуска нет.

 

 


  • 0

#2 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 17 February 2019 - 02:45

Для начала нужно передать эту функцию на клиент.
 

EyeEffect0 = compile preprocessfilelinenumbers "\PiR\Functions\EyeEffect0.sqf";
publicVariable "EyeEffect0";

И после этого уже можно вызывать на клиенте, еще можно только определенному клиенту её передать с помощью 

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


  • 0

#3 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 17 February 2019 - 13:45

Добавил эту строчку, но ничего не поменялось.

Или вызываться оно должно как-то по другому?


  • 0

#4 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 17 February 2019 - 13:55

0-0, вопрос 1: файл со скриптом есть среди файлов клиента?
вопрос 2: если нет, то какого х*я вы так сделали?

0-0 сказал(а):
Добавил эту строчку, но ничего не поменялось.

Потому, что все сетевые функции в арме (Да и почти везде) не гарантируют порядок их выполнения, вы можете написать:
"1" remoteExec ["systemChat", 0, true];
"2" remoteExec ["systemChat", 0, true];
Но есть большая вероятность того, что клиент увидит:
systemChat: 2
systemChat: 1
У вас такая же ситуация, вы сначала передаете код функции, что:
1. Много данных - много времени
2. Не безопасно - в такие данные легко вставить "вредоносный" код
И без каких-либо проверок сразу отправляете еще одну команду на вызов этого кода и т. к. код еще не передался - он не выполнился
  • 0

#5 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 17 February 2019 - 14:18

Файл со скриптом есть на клиенте.

 

Порядок мне не важен... она там вообще никак не запускается))

 

 

Вот всё полностью, а то может я как-то не так объясняю, я хз:

 

 

Вот этот файл запускается при старте:

["PiR_injuriplayer_on", "CHECKBOX", ["Влючить ранения для игрока", "Enable injuries for player"], "Project injury Reaction", true] call cba_settings_fnc_init;

EyeEffect0 = compile preprocessfilelinenumbers "\PiR\Functions\EyeEffect0.sqf";
publicVariable "EyeEffect0";

if (isServer) then {
	
Uncondition = compile preprocessfilelinenumbers "\PiR\Functions\Uncondition.sqf";
Crawl = compile preprocessfilelinenumbers "\PiR\Functions\Crawl.sqf";
DropWeapon = compile preprocessfilelinenumbers "\PiR\Functions\DropWeapon.sqf";
Helmet = compile preprocessfilelinenumbers "\PiR\Functions\Helmet.sqf";
BendsDown = compile preprocessfilelinenumbers "\PiR\Functions\BendsDown.sqf";
UnconditionAnim = compile preprocessfilelinenumbers "\PiR\Functions\UnconditionAnim.sqf";
EyeEffect = compile preprocessfilelinenumbers "\PiR\Functions\EyeEffect.sqf";
PiR = compile preprocessfilelinenumbers "\PiR\Functions\PiR.sqf";


Uncondition0 = compile preprocessfilelinenumbers "\PiR\Functions\Uncondition0.sqf";
Crawl0 = compile preprocessfilelinenumbers "\PiR\Functions\Crawl0.sqf";
DropWeapon0 = compile preprocessfilelinenumbers "\PiR\Functions\DropWeapon0.sqf";
Helmet0 = compile preprocessfilelinenumbers "\PiR\Functions\Helmet0.sqf";
BendsDown0 = compile preprocessfilelinenumbers "\PiR\Functions\BendsDown0.sqf";
UnconditionAnim0 = compile preprocessfilelinenumbers "\PiR\Functions\UnconditionAnim0.sqf";

PiR0 = compile preprocessfilelinenumbers "\PiR\Functions\PiR0.sqf";


_null = [] execvm "\PiR\Functions\PiRstart.sqf";

};

Из него запускается файл PiRstart.sqf

В котором добавляется отслеживание попадания в юнита.



if (!isServer) exitWith {};
	 
dam_fnc_setunconscious = {
	params[ "_unit" ];
[ _unit, true ] remoteExec [ "setUnconscious", _unit ];
	
};

dam_fnc_wake = {
	params[ "_unit" ];
[ _unit, false ] remoteExec [ "setUnconscious", _unit ];
	
};

//Добавляем  юнитам отслеживание попадания
_units = [];
while { (true) } do {

	{



		
		if ((_x isKindOf "Man")) then
        {

            if (("INCAPACITATED" != lifeState _x) && (alive _x) && !(_x getVariable ["dam_ignore_hit0",false]) && (AnimationState _x != "ainjppnemrunsnonwnondb") && (AnimationState _x != "ainjppnemrunsnonwnondb_still") && (AnimationState _x != "UnconsciousFaceDown") && (AnimationState _x != "UnconsciousFaceUp") && (AnimationState _x != "UnconsciousReviveDefault_C") && (AnimationState _x != "UnconsciousOutProne")) then 
			{
			 _units pushBack _x; 

			 _x removeAllMPEventHandlers "MPHit";
 			 _x setVariable ["dam_ignore_hit0",true];
				IF (!isplayer _x) then {
				 _x addMPEventHandler ["MPHit", {_this spawn PiR}];
				} ELSE {
					IF !(PiR_injuriplayer_on) exitwith {};
				_x addMPEventHandler ["MPHit", {_this spawn PiR0}];
				};
			 };
	
		};
	
	} forEach allUnits;

sleep 60;

};









Из него уже запускается PiR0.sqf. В котором уже распределяются ранения для игрока на типы и запускается нужный эффект.

if (!isServer) exitWith {};



// Назначение действий на попадание игрок

     private ["_unit","_selection","_shans"];
	_unit = (_this select 0);




	
	
	
IF !(_unit getVariable ["dam_ignore_injured0",false]) then {



//________________________________Распределение анимаций по частям тела______________________________________________________________________		

	_anim = selectRandom [
	"UnconsciousReviveArms_A","UnconsciousReviveArms_B","UnconsciousReviveArms_C","UnconsciousReviveBody_A",
	"UnconsciousReviveBody_B","UnconsciousReviveDefault_A","UnconsciousReviveDefault_B","UnconsciousReviveDefault_C","UnconsciousReviveHead_A",
	"UnconsciousReviveHead_B","UnconsciousReviveHead_C","UnconsciousReviveLegs_A","UnconsciousReviveLegs_B"];
		
_shans = 0;

	if (vehicle _unit != _unit) exitWith {
	
		IF !(_unit getVariable ["dam_ignore_effect0",false]) then {

		 _unit setVariable ["dam_ignore_effect0",true];	
		 _null = [_unit, _anim, _shans] spawn EyeEffect0;
		};
	
	};

IF (damage _unit > 0) then {




		if ((_unit getHitPointDamage "HitFace" > 0) && (_unit getHitPointDamage "HitHead" > 0) && (_unit getHitPointDamage "HitNeck" > 0) && (_unit getHitPointDamage "HitPelvis" > 0) && (_unit getHitPointDamage "HitAbdomen" > 0) && (_unit getHitPointDamage "HitDiaphragm" > 0) && (_unit getHitPointDamage "HitChest" > 0) && (_unit getHitPointDamage "HitBody" > 0) && (_unit getHitPointDamage "HitHands" > 0) && (_unit getHitPointDamage "HitArms" > 0) && (_unit getHitPointDamage "HitLegs" > 0)) exitWith {

			_anim = selectRandom [
	"UnconsciousReviveArms_A","UnconsciousReviveArms_B","UnconsciousReviveArms_C","UnconsciousReviveBody_A",
	"UnconsciousReviveBody_B","UnconsciousReviveDefault_A","UnconsciousReviveDefault_B","UnconsciousReviveDefault_C","UnconsciousReviveHead_A",
	"UnconsciousReviveHead_B","UnconsciousReviveHead_C","UnconsciousReviveLegs_A","UnconsciousReviveLegs_B"];
		
_shans = 8;
		
		};
					
						

		if ((_unit getHitPointDamage "HitFace" > 0.25) or (_unit getHitPointDamage "HitHead" > 0.25) or (_unit getHitPointDamage "HitNeck" > 0.25)) exitWith {
		_anim = selectRandom [
		"UnconsciousReviveHead_A","UnconsciousReviveHead_B","UnconsciousReviveHead_C"];
_shans = 10;
		};


		if ((_unit getHitPointDamage "HitPelvis" > 0.25) or (_unit getHitPointDamage "HitAbdomen" > 0.25)) exitWith {
		_anim = selectRandom [
		"UnconsciousReviveBody_A","UnconsciousReviveBody_B","UnconsciousReviveDefault_A"];
_shans = 7;
		};

		if ((_unit getHitPointDamage "HitDiaphragm" > 0.25) or (_unit getHitPointDamage "HitChest" > 0.25) or (_unit getHitPointDamage "HitBody" > 0.25)) exitWith {
		_anim = selectRandom [
		"UnconsciousReviveDefault_A","UnconsciousReviveDefault_B","UnconsciousReviveDefault_C"];
_shans = 9;
		};	

		if (_unit getHitPointDamage "HitHands" > 0.25) exitWith {
		_anim = selectRandom [
		"UnconsciousReviveArms_A","UnconsciousReviveArms_B","UnconsciousReviveArms_C"];
_shans = 1;
		};

		if (_unit getHitPointDamage "HitArms" > 0.25) exitWith {
		_anim = selectRandom [
		"UnconsciousReviveArms_A","UnconsciousReviveArms_B","UnconsciousReviveArms_C"];
_shans = 3;
		};

		if (_unit getHitPointDamage "HitLegs" > 0.25) exitWith {
		_anim = selectRandom [
		"UnconsciousReviveLegs_A","UnconsciousReviveLegs_B"];
_shans = 5;
		};

};

//_____________________________________________________________________________________________________________________




// Голова	
IF ((_shans == 10) && !(_unit getVariable ["dam_ignore_injured0",false])) then {

		_unit setVariable ["dam_ignore_injured0",true];	
		_unit 	removeAllMPEventHandlers "MPHit";

		IF ((_shans - (random 25)) >=0) then {
		_null = [_unit, _anim, _shans] spawn Helmet0;
		} ELSE {

		_null = [_unit, _anim, _shans] spawn Uncondition0;	
		};
		};


//	Живот и Грудь		
IF (((_shans == 7) or (_shans == 9)) && ((_shans - (random 10)) >=0) && !(_unit getVariable ["dam_ignore_injured0",false])) then {

		_unit setVariable ["dam_ignore_injured0",true];	
		_unit 	removeAllMPEventHandlers "MPHit";

		IF ((_shans - (random 22)) >=0) then {
		_null = [_unit, _anim, _shans] spawn BendsDown0;
		} ELSE {
			IF ((_shans - (random 14)) >=0) then {
		     _null = [_unit, _anim, _shans] spawn Crawl0;	
			} ELSE {
			_null = [_unit, _anim, _shans] spawn Uncondition0;
			 };
		};	
		};

// Верх руки и Низ руки
IF (((_shans == 1) or (_shans == 3)) && ((7 - (random 10)) >=0) && !(_unit getVariable ["dam_ignore_injured0",false])) then {

		_unit setVariable ["dam_ignore_injured0",true];	
		_unit 	removeAllMPEventHandlers "MPHit";

		IF (((_shans - (random 8)) <=0) && !(_unit getVariable ["dam_ignore_dragger0",false])) then {
		_null = [_unit, _anim, _shans] spawn DropWeapon0;
		} ELSE {
			IF ((_shans - (random 10)) >=0) then {
		     _null = [_unit, _anim, _shans] spawn Uncondition0;	
			} ELSE {
			_null = [_unit, _anim, _shans] spawn Crawl0;
			 };
		};	
		};	

// Бедро, голень и стопа
IF (((_shans == 6) or (_shans == 4) or (_shans == 2)) && ((_shans - (random 10)) >=0) && !(_unit getVariable ["dam_ignore_injured0",false])) then {

		_unit setVariable ["dam_ignore_injured0",true];	
		_unit 	removeAllMPEventHandlers "MPHit";

		IF ((_shans - (random 22)) >=0) then {
		_null = [_unit, _anim, _shans] spawn Uncondition0;
		} ELSE {
		     _null = [_unit, _anim, _shans] spawn Crawl0;	

		};	
		};	

// Подрыв
IF ((_shans == 8) && ((_shans - (random 10)) >=0) && !(_unit getVariable ["dam_ignore_injured0",false])) then {

		_unit setVariable ["dam_ignore_injured0",true];	
		_unit 	removeAllMPEventHandlers "MPHit";

		IF ((_shans - (random 16)) >=0) then {
		_null = [_unit, _anim, _shans] spawn Crawl0;
		} ELSE {
			IF ((_shans - (random 12)) >=0) then {
		     _null = [_unit, _anim, _shans] spawn Uncondition0;	
			} ELSE {
			IF ((_shans - (random 12)) >=0) then {
		     _null = [_unit, _anim, _shans] spawn BendsDown0;	
			} ELSE {
			_null = [_unit, _anim, _shans] spawn Helmet0;
			 };
		};	
		};		
		};
	
	
	
	//_____________________________________________________________________________________________________________________	

//________________________________Крик при попадании_______________________________________________________________________
  IF (_shans !=10 ) then {
   [_unit, (selectRandom ["Hit1", "Hit2", "Hit3", "Hit4", "Hit5", "Hit6", "Hit7", "Hit8", "Hit9", "Hit10"]) ] remoteExec [ "say3D", 0];
  };
//__________________________________________________________________________________________________________________________


//________________________________Эффекты крови_____________________________________________________________________________

	IF !(_unit getVariable ["dam_ignore_effect0",false]) then {

	 _unit setVariable ["dam_ignore_effect0",true];	
	 [_unit, _anim, _shans ] remoteExec [ "EyeEffect0", 0 ];
//	 [[_unit, _anim, _shans ], "\PiR\Functions\EyeEffect0.sqf"] remoteExec ["execVM", _unit];


	};

//__________________________________________________________________________________________________________________________	
//________________________________Стоны при ранении_________________________________________________________________________
		while {true} do {

	 		 sleep (40 + random 20);		
				 
		 if (!(_unit getVariable ["dam_ignore_injured0",false]) or !(alive _unit)) exitWith {};	


	
		 [_unit, (selectRandom ["pain1", "pain2", "pain3", "pain4", "pain5", "pain6", "pain7", "pain8", "pain9"]) ] remoteExec [ "say3D", 0];


		 
		};
		
//___________________________________________________________________________________________________________________________

	

	sleep 1;	
	if !(alive _unit) then {

		_unit 	removeAllMPEventHandlers "MPHit";	
	
	};
	};









И вот до этого момента всё работает... но из раздела, где у меня там подписано "Эффект крови", на клиенте должен запускаться EyeEffect0.sqf. И вот он, не запускается.


Сообщение отредактировал 0-0: 17 February 2019 - 14:55

  • 0

#6 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 17 February 2019 - 22:52

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

["PiR_injuriplayer_on", "CHECKBOX", ["Влючить ранения для игрока", "Enable injuries for player"], "Project injury Reaction", true] call cba_settings_fnc_init;

EyeEffect0 = compile preprocessfilelinenumbers "\PiR\Functions\EyeEffect0.sqf";
publicVariable "EyeEffect0";

if (isServer) then {
	
Uncondition = compile preprocessfilelinenumbers "\PiR\Functions\Uncondition.sqf";
Crawl = compile preprocessfilelinenumbers "\PiR\Functions\Crawl.sqf";
DropWeapon = compile preprocessfilelinenumbers "\PiR\Functions\DropWeapon.sqf";
Helmet = compile preprocessfilelinenumbers "\PiR\Functions\Helmet.sqf";
BendsDown = compile preprocessfilelinenumbers "\PiR\Functions\BendsDown.sqf";
UnconditionAnim = compile preprocessfilelinenumbers "\PiR\Functions\UnconditionAnim.sqf";
EyeEffect = compile preprocessfilelinenumbers "\PiR\Functions\EyeEffect.sqf";
PiR = compile preprocessfilelinenumbers "\PiR\Functions\PiR.sqf";


Uncondition0 = compile preprocessfilelinenumbers "\PiR\Functions\Uncondition0.sqf";
Crawl0 = compile preprocessfilelinenumbers "\PiR\Functions\Crawl0.sqf";
DropWeapon0 = compile preprocessfilelinenumbers "\PiR\Functions\DropWeapon0.sqf";
Helmet0 = compile preprocessfilelinenumbers "\PiR\Functions\Helmet0.sqf";
BendsDown0 = compile preprocessfilelinenumbers "\PiR\Functions\BendsDown0.sqf";
UnconditionAnim0 = compile preprocessfilelinenumbers "\PiR\Functions\UnconditionAnim0.sqf";

PiR0 = compile preprocessfilelinenumbers "\PiR\Functions\PiR0.sqf";


_null = [] execvm "\PiR\Functions\PiRstart.sqf";

};

Исходя из этого когда, функции которые используются в той, которую вы передали, существуют только на сервере, это говорит нам то, что они в ифе isServer, поэтому оно не будет работать так как на клиенте этих функций нет. И вообще, немного непонятно, зачем вам с сервера передавать функции, "забивая канал", если они есть на клиенте, инициализируйте их на клиенте, и перестройте скрипты под них, было бы конечно легче если бы была еще информация что и от куда запускается, и что где находится.


  • 0

#7 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 17 February 2019 - 23:00

0-0, вопрос 1: файл со скриптом есть среди файлов клиента?

 

 А зачем иметь файл со скриптом который уже скомпилирован в функцию, и нормально передается на клиент ?


  • 0

#8 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 17 February 2019 - 23:58

А зачем иметь файл со скриптом который уже скомпилирован в функцию, и нормально передается на клиент ?

Вы либо не читали ВСЕ мое сообщение, либо не поняли вот эти два пункта:

1. Много данных - много времени
2. Не безопасно - в такие данные легко вставить "вредоносный" код

Поясню:
1. Много данных - кусок кода это не пара байт одним числом, а несколько сотен, если не тысяч и десятков тысяч байт. Все эти байты нужно передать, что требует времени и ширины канала передачи данных (Вы же не весь канал забьете вашим кодом, нужно еще другие игровые данные передавать). Конечно, можно сказать, что это нужно всего один раз, но зато какой один раз! Да еще помноженный на каждого нового клиента! Вот будет весело, когда во время игры подключится человек, и сервер начинает жрать канал для передачи ему всего этого кода, вместо передачи данных о других игроках и объектах - другие клиенты это точно оценят. А чем больше вы используете этот метод, тем больше вы начинаете передавать мусорный код, которому самое то быть в файлах на клиенте.
А что будет если вы будете использовать скомпилированный на клиенте файл? А все просто - весь ваш удаленный вызов будет весить всего пару байт и это минимально скажется на сети.
2. Не безопасно - вы хоть понимаете, что такое передача по сети исполняемого кода? Грубо говоря - это большая табличка "Хакни меня в каждый байт!". Тут нужно серьезно "маскировать" код, что ведет к дополнительной нагрузке на канал передачи.

Сообщение отредактировал vlad333000: 18 February 2019 - 00:01

  • 1

#9 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 February 2019 - 00:05

По этому поводу как то высказался один очень хороший и разбирающийся человек в Арма-сообществе Killzone Kid, который на пол ставки работал с БИСами:

One thing you definitely don’t want is to allow passing of a code over network and then letting all client machines to execute this code. Mainly because this is an invitation to all sorts of hacks and exploits and also because transferring chunks of code over network is pretty bad for bandwidth.


  • 0

#10 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 18 February 2019 - 00:16

 

0-0, вопрос 1: файл со скриптом есть среди файлов клиента?

 

 А зачем иметь файл со скриптом который уже скомпилирован в функцию, и нормально передается на клиент ?

 

 

 

Это мод, который, соответственно, стоит у каждого игрока.


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

 

Я уже разобрался в чём был у меня затык) Оказывается функция запускалась) Но не передавалась переменная, которая в функции стояла на проверке) По этому и не было эффекта.


 

А зачем иметь файл со скриптом который уже скомпилирован в функцию, и нормально передается на клиент ?

Вы либо не читали ВСЕ мое сообщение, либо не поняли вот эти два пункта:

1. Много данных - много времени
2. Не безопасно - в такие данные легко вставить "вредоносный" код

Поясню:
1. Много данных - кусок кода это не пара байт одним числом, а несколько сотен, если не тысяч и десятков тысяч байт. Все эти байты нужно передать, что требует времени и ширины канала передачи данных (Вы же не весь канал забьете вашим кодом, нужно еще другие игровые данные передавать). Конечно, можно сказать, что это нужно всего один раз, но зато какой один раз! Да еще помноженный на каждого нового клиента! Вот будет весело, когда во время игры подключится человек, и сервер начинает жрать канал для передачи ему всего этого кода, вместо передачи данных о других игроках и объектах - другие клиенты это точно оценят. А чем больше вы используете этот метод, тем больше вы начинаете передавать мусорный код, которому самое то быть в файлах на клиенте.
А что будет если вы будете использовать скомпилированный на клиенте файл? А все просто - весь ваш удаленный вызов будет весить всего пару байт и это минимально скажется на сети.
2. Не безопасно - вы хоть понимаете, что такое передача по сети исполняемого кода? Грубо говоря - это большая табличка "Хакни меня в каждый байт!". Тут нужно серьезно "маскировать" код, что ведет к дополнительной нагрузке на канал передачи.

 

 

У меня не стоит задачи бороться с хакерами)


  • 0

#11 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 February 2019 - 00:25

У меня не стоит задачи бороться с хакерами)

Очень жаль, что не стоит.
  • 0

#12 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 18 February 2019 - 00:57

 

У меня не стоит задачи бороться с хакерами)

Очень жаль, что не стоит.

 

 Мы играем своим очень небольшим коллективом) По этому нет смысла переживать об этом)

 

 

А то что выложу мод в общий доступ, предупрежу, что бы использовали на свой страх и риск.


  • 0

#13 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 18 February 2019 - 01:14

Исходя из этого когда, функции которые используются в той, которую вы передали, существуют только на сервере, это говорит нам то, что они в ифе isServer, поэтому оно не будет работать так как на клиенте этих функций нет. И вообще, немного непонятно, зачем вам с сервера передавать функции, "забивая канал", если они есть на клиенте, инициализируйте их на клиенте, и перестройте скрипты под них, было бы конечно легче если бы была еще информация что и от куда запускается, и что где находится.

 

 

Ну я уже с пониманием проблемы всё перестрою, а потом выложу сюда мод. Если не тяжело посмотрите, может подскажите как рационализировать.


  • 0

#14 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 18 February 2019 - 05:39

 

А зачем иметь файл со скриптом который уже скомпилирован в функцию, и нормально передается на клиент ?

Вы либо не читали ВСЕ мое сообщение, либо не поняли вот эти два пункта:

1. Много данных - много времени
2. Не безопасно - в такие данные легко вставить "вредоносный" код

Поясню:
1. Много данных - кусок кода это не пара байт одним числом, а несколько сотен, если не тысяч и десятков тысяч байт. Все эти байты нужно передать, что требует времени и ширины канала передачи данных (Вы же не весь канал забьете вашим кодом, нужно еще другие игровые данные передавать). Конечно, можно сказать, что это нужно всего один раз, но зато какой один раз! Да еще помноженный на каждого нового клиента! Вот будет весело, когда во время игры подключится человек, и сервер начинает жрать канал для передачи ему всего этого кода, вместо передачи данных о других игроках и объектах - другие клиенты это точно оценят. А чем больше вы используете этот метод, тем больше вы начинаете передавать мусорный код, которому самое то быть в файлах на клиенте.
А что будет если вы будете использовать скомпилированный на клиенте файл? А все просто - весь ваш удаленный вызов будет весить всего пару байт и это минимально скажется на сети.
2. Не безопасно - вы хоть понимаете, что такое передача по сети исполняемого кода? Грубо говоря - это большая табличка "Хакни меня в каждый байт!". Тут нужно серьезно "маскировать" код, что ведет к дополнительной нагрузке на канал передачи.

 

Единственное с чем я могу согласиться, так это с первым пунктом, второй мне кажется лишний. Если у человека есть экзекутор, то ему не нужны какие-то там функции менять, он может их сам создать.


  • 0

#15 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 February 2019 - 13:55

nIkRon, это само собой, но в данном случае ему приходится запускать exe на своей машине, на которой работает анти-чит и другие механизмы защиты игры... не факт что они сработают, но небольшой риск есть!
А вот при передаче по сети исполняемого кода - почти не реально отследить то, что какой-то промежуточный узел подменил пакет, без сильных дополнительных затрат... а анти-чит до последнего будет думать, что все нормально.
  • 0

#16 OFFLINE   nIkRon

nIkRon

    Сержант

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

Отправлено 18 February 2019 - 23:17

nIkRon, это само собой, но в данном случае ему приходится запускать exe на своей машине, на которой работает анти-чит и другие механизмы защиты игры... не факт что они сработают, но небольшой риск есть!
А вот при передаче по сети исполняемого кода - почти не реально отследить то, что какой-то промежуточный узел подменил пакет, без сильных дополнительных затрат... а анти-чит до последнего будет думать, что все нормально.

На сколько мне известно, процесс армы без допольнительных действий, не обнаружит, BE его скрывает, и если у человека есть способ его "расскрыть", то в таком случае он может уже делать что угодно, и передача данных по сети ему не сильно нужна.


  • 0

#17 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 18 February 2019 - 23:30

О чём был вообще то весь спор то).

Есть отработанные временем методы реализации игрового процесса на арме.

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


  • 0

#18 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 20 February 2019 - 23:22


Исходя из этого когда, функции которые используются в той, которую вы передали, существуют только на сервере, это говорит нам то, что они в ифе isServer, поэтому оно не будет работать так как на клиенте этих функций нет. И вообще, немного непонятно, зачем вам с сервера передавать функции, "забивая канал", если они есть на клиенте, инициализируйте их на клиенте, и перестройте скрипты под них, было бы конечно легче если бы была еще информация что и от куда запускается, и что где находится.

 

 

В общем, я вроде бы доделал) Надо ещё конечно тестировать, но на первый взгляд всё работает) Как уж это реализовано технически.. я старался как мог, но наверное для вменяемого человека, это будет выглядеть ужасно)))))

 

Сам мод про разные реакции на попадания. Вот один из примеров:

 

 

А вот ссылка на тестовую версию мода:

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

 

Там рядом с ПБОшкой разархивированная папка где можно посмотреть скрипты.

Стартовый скрипт это PiRInit.sqf. Ну а дальше он запускает следующий, тот следующий ну и тд)


  • 0

#19 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 20 February 2019 - 23:38

Там рядом с ПБОшкой разархивированная папка где можно посмотреть скрипты.

Зачем? PBO спокойно разархивируются любым PBO менеджером
Если уж использовали CfgFunctions, так и используйте его для компиляции всех функций, зачем все остальные компилировать из функции, которая вызывается этим конфигом?

Сообщение отредактировал vlad333000: 20 February 2019 - 23:34

  • 0

#20 OFFLINE   0-0

0-0

    Ефрейтор

  • Пользователи
  • 57 сообщений

Отправлено 20 February 2019 - 23:54

 

Там рядом с ПБОшкой разархивированная папка где можно посмотреть скрипты.

Зачем? PBO спокойно разархивируются любым PBO менеджером
Если уж использовали CfgFunctions, так и используйте его для компиляции всех функций, зачем все остальные компилировать из функции, которая вызывается этим конфигом?

 

 

Затем что мне так удобней его писать)) Заархивировал как у самого оно лежало и пояснил, что есть разархивированная папка)

 

Потому что я так и не понял как вызвать функцию, написанную в конфиге)


  • 0




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