Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • Need help?

    Create a topic in the appropriate section
    Don't write everything in the chat!
  • Take a look at the marketplace

    There you can buy
    everything related to game servers
  • Don't want a ban?

    Please read our rules
    Don't disturb the order!
  • Sell or buy?

    Use services of the guarantor
    We will make your deal safe

Всех приветствую! Давно не писал тут ничего, но вот нахлынули эмоции и решил всё же доделать свой сервер.

Искал везде, пытался понять. Увы, не получилось. К слову, я не полный нуб в скриптинге Армы. Переписал 90% скриптов сам, а также написал немало собственных скриптов, в том числе собственную торговлю (занимаюсь сервером около 1,5 года с перерывами). Так что скриптить умею, но не хватает теории. Скриптил всегда на стороне клиента и о сервере ничего не знаю. Основной вопрос кроется в publicvariable, а именно как это работает. 

 

Итак, требуется прикрутить к Инфи доп функции, к примеру, добавление/снятие денег у игрока. Все функции в Инфи выполняются через PVAH_AdminReq.

Пример функции лечения игрока:

adminheal =
	{
		{
			if(name _x == _this select 0)then
			{
				PVAH_AdminReq = [5,player,_x];
				publicVariableServer "PVAH_AdminReq";
				hint format["Healing %1", _this select 0];
				
				_sl = format["%1 AdminHeal %2",name player,name _x];
				PVAH_WriteLogReq = [player,toArray _sl];
				publicVariableServer 'PVAH_WriteLogReq';
			};
		} forEach playableUnits;
	};

 

Что за PVAH_AdminReq и как это работает? Нигде больше эта переменная не принимается, поэтому не имею никакого понятия как всё умудряется работать. Выглядит как функция, принимающая параметры.

Помогите, кто разбирается в этом. 

Код писать не прошу, мне лишь объяснить как работает PV и что происходит непосредственно в вышенаписанном коде.

Share this post


Link to post
Share on other sites

11 answers to this question

Recommended Posts

  • 0

publicvariableserver предназначается конкретно серверу.

publicvariableclient  предназначается конктетному игроку.

publicvariable предназначается всем.

----------

К примеру небольшой набросок инициализации игрока на сервере:

игрок:

//отправляю запрос на логин, то есть сервер должен знать кто я

INT_LOGIN = [player,(getPlayerUID player)]; // player - объект, UID объекта

publicVariableServer 'INT_LOGIN';

запрос отправлен, сервер:

"INT_LOGIN "  addPublicVariableEventHandler {(_this select 1) call player_login;}; // у сервера уже стоит обработчик, на событие INT_LOGIN

далее, данные с переменной INT_LOGIN поступают в функцию player_login:

_player = _this select 0; // player

_uid = _this select 1; // getplayeruid player

у себя в сборке, я получаю инфо о игроке с БД исключительно по UID, далее, получив инфо о игроке, отправляем его игроку (тут то и пригодится, первая переменная _player, чтобы знать, кому отправлять )):

INT_CLIENT = [ID,HUMANITY,и тд];

(owner _player) publicVariableClient "INT_CLIENT";

собственно, у клиента уже есть зарегестрированное событие:

"INT_CLIENT"  addPublicVariableEventHandler {(_this select 1) call player_setup;};

в котором ему начисляется состояние здоровья, хумка и тд.

-----------------------------------------------------------

В общем, PublicVariable есть некий транспорт, для обмена инфо между сервером и клиентом, либо всеми сразу.

Для приема нужно только объявить ее, естественно написав обработчик, что с ней делать при получении.

Для отсылки нужно лишь объявить переменную у себя, и отправить ее по адресу, либо всем. (PublicVariable - для всех, PublicVariableClient/PublicVariableServer - конкретно игроку (используя owner) или серверу).

Share this post


Link to post
Share on other sites



  • 0

вот пример как устанавливать игроку деньги по принципу хуманить (пример взят со старого сервака 1,0,5 и старой системой ZSC, так что под 1,0,6,1 подогнать особого труда не составит)

	changeMoney =
	{
		disableSerialization;
		_plr = objNull;	
		{if (name _x == _this select 0) exitWith {_plr = _x;};} forEach playableUnits;
		if (isNull _plr) exitWith {
			systemchat 'Select a Player!';
		};
		if (isNull findDisplay 24) exitWith {
			systemchat 'open the chat, type the Amount of Coins you want to set and doubleClick again!';
		};
		_chat = (findDisplay 24) displayCtrl 101;
		_txt = ctrlText _chat;
		_num = 0;
		if (_txt != '') then {
			_num = parseNumber _txt;
			if (typeName _num != 'SCALAR') then {systemchat 'INSERT A NUMBER!';};
			(findDisplay 24) closeDisplay 0;
		};
		
		_plr setVariable["headShots",_num, true];
		_plr setVariable["moneychanged",1,true];
		hint format['Gave %1 %2 Coins!',_this select 0,_num];
		
		_sl = format['%1 %2 Coins to %3',name player,_num,_this select 0];
		PVAH_WriteLogReq = [player,toArray _sl];
		publicVariableServer 'PVAH_WriteLogReq';
	};

 

Share this post


Link to post
Share on other sites
  • 0
19 часов назад, TheFirstNoob сказал:

Естественно, я первым делом это всё прочитал.

У меня вопрос как действует код написанный выше, а именно почему игра лечит игрока при этих строках:

PVAH_AdminReq = [5,player,_x];
publicVariableServer "PVAH_AdminReq";

 

Edited by TheLinsus (see edit history)

Share this post


Link to post
Share on other sites
  • 0
12 часа назад, RedLink сказал:

вот пример как устанавливать игроку деньги по принципу хуманить (пример взят со старого сервака 1,0,5 и старой системой ZSC, так что под 1,0,6,1 подогнать особого труда не составит)


	changeMoney =
	{
		disableSerialization;
		_plr = objNull;	
		{if (name _x == _this select 0) exitWith {_plr = _x;};} forEach playableUnits;
		if (isNull _plr) exitWith {
			systemchat 'Select a Player!';
		};
		if (isNull findDisplay 24) exitWith {
			systemchat 'open the chat, type the Amount of Coins you want to set and doubleClick again!';
		};
		_chat = (findDisplay 24) displayCtrl 101;
		_txt = ctrlText _chat;
		_num = 0;
		if (_txt != '') then {
			_num = parseNumber _txt;
			if (typeName _num != 'SCALAR') then {systemchat 'INSERT A NUMBER!';};
			(findDisplay 24) closeDisplay 0;
		};
		
		_plr setVariable["headShots",_num, true];
		_plr setVariable["moneychanged",1,true];
		hint format['Gave %1 %2 Coins!',_this select 0,_num];
		
		_sl = format['%1 %2 Coins to %3',name player,_num,_this select 0];
		PVAH_WriteLogReq = [player,toArray _sl];
		publicVariableServer 'PVAH_WriteLogReq';
	};

 

Огромное спасибо за данный код! Работает отлично! 

Но вопрос остаётся открытым - как работает PV и почему, например, этот код:

_sl = format['%1 %2 Coins to %3',name player,_num,_this select 0];
PVAH_WriteLogReq = [player,toArray _sl];
publicVariableServer 'PVAH_WriteLogReq';

пишет лог. Где это прописано, какая переменная что делает? Я не пойму

Share this post


Link to post
Share on other sites
  • 0
16 часов назад, TheLinsus сказал:

Естественно, я первым делом это всё прочитал.

У меня вопрос как действует код написанный выше, а именно почему игра лечит игрока при этих строках:


PVAH_AdminReq = [5,player,_x];
publicVariableServer "PVAH_AdminReq";

 

На сервере создается обработчки публичной переменной, если таковая прийдет.

На клиенте по коду выше - в переменную кладутся данные, и вторая строка отправляет их серверу, где их ловит обработчик.

 

Для того чтобы не создавать 100500 обработчиков и 100500 переменных, делается простая вещь -

единый обработчик для всех команд.

В связи с чем, внутри обработчика ставится условия -

swith - case

а первым параметром массива должен быть некий идентификатор, который и будет указывать - какой case выполнить.

В данном примере - 5 - идентификатор(в обработчике будет означать, что надо вылечить игрока), далее игрок который лечит(админ), далее - игрок которого надо вылечить.

 

Все это продумывает программист при написании кода. т.е. создает 3 обязательных параметра, четкую последовательность, и .. готово.

Edited by NoNameUltima (see edit history)

Share this post


Link to post
Share on other sites
  • 0
4 часа назад, NoNameUltima сказал:

На сервере создается обработчки публичной переменной, если таковая прийдет.

На клиенте по коду выше - в переменную кладутся данные, и вторая строка отправляет их серверу, где их ловит обработчик.

 

Для того чтобы не создавать 100500 обработчиков и 100500 переменных, делается простая вещь -

единый обработчик для всех команд.

В связи с чем, внутри обработчика ставится условия -

swith - case

а первым параметром массива должен быть некий идентификатор, который и будет указывать - какой case выполнить.

В данном примере - 5 - идентификатор(в обработчике будет означать, что надо вылечить игрока), далее игрок который лечит(админ), далее - игрок которого надо вылечить.

 

Все это продумывает программист при написании кода. т.е. создает 3 обязательных параметра, четкую последовательность, и .. готово.

Не смог найти обработчик,  точнее не знал, что это addPublicVariableEventHandler. Вот и была загадка, что при изменении переменной что-то происходит:)

 

Огромное спасибо за все ответы! Теперь понял что это и как использовать! Надеюсь, с практикой всё получится.

Share this post


Link to post
Share on other sites
  • 0
3 часа назад, RedMoon сказал:

TheLinsus можно обойтись и без addPublicVariableEventHandler, используй call RE .

 

Во 1, это задаст RE  - броадкаст, и сработает на всех машинах. Во вторых - с сервера RE - OK. А если надо от клиента на сервер послать инициацию чего либо?как ты это сделаешь через RE?

Share this post


Link to post
Share on other sites
  • 0

call RE это лишь набор функций, использующих PublicVariable (2шт).

Share this post


Link to post
Share on other sites
  • 0

NoNameUltima я пользую call RE для отправки с сервера, с клиента данные отправляю через PublicVariableServer

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Anton81
      Всем привет, кикает игроков, как исправить?
      publicvariable.txt
      Value Restriction #0 "MISSION_CHECK" = "#line 1 "mpmissions\__CUR_MP.Chernarus\init.sqf"
    • By LAW
      Установил свой сервер в dayz epoch, побегал денек, решил установить инфистар, дабы избежать проблем с читерами и добавить в игру админ панель. Вроде всё сделал правильно, но при заходе на сервер всё прогружается, появляется персонаж и выскакивает ошибка  -"Вас изгнали из игры (Battleeye: PublicVariable Restriction #0)" Помогите :(
    • By MLIIIN
      Всем привет! Суть проблемы, при смерти игрока его кикает  has been kicked by BattlEye: PublicVariable Value Restriction #32. Прописывая релог комбат. Строка из PV     Line 27823: 21:29:56 "DISCONNECT: BoRlAnD (76561198178877891) Object: B 1-2-E:1 (BoRlAnD) REMOTE, _characterID: 2843 at loc [10484.4,2356.9,0.353242]". Может кто то сталкивался с такой проблемой, заранее спасибо
       
    • By Seksoman
      Больше половины игроков кикает с ошибкой PublicVariable Restriction #0. Проделал все манипуляции которые есть на форуме, не помогло. Какие есть предложения? Как исправить?  
    • By Serdce
      #0 "cba_network_joinN" = ["Serdce","144815302",<NULL-object>,true]
      как отключит защиту на это?
  • Our picks

×
×
  • Create New...

Important Information

By using this site, you automaticly agree to our Guidelines and Privacy Policy.
We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.