Перейти к публикации
Поиск в
  • Дополнительно...
Искать результаты, содержащие...
Искать результаты в...
  • Нужна помощь?

    Создайте тему в соответствующем разделе
    Не нужно писать всё в чат!
  • Загляните на торговую площадку

    Там вы можете купить
    всё что касается игровых серверов
  • Не хотите бан?

    Пожалуйста, ознакомьтесь с нашими правилами
    Не нарушайте порядок!
  • Продаёте или покупаете?

    Пользуйтесь услугами гаранта
    Мы сделаем вашу сделку безопасной

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

Искал везде, пытался понять. Увы, не получилось. К слову, я не полный нуб в скриптинге Армы. Переписал 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 и что происходит непосредственно в вышенаписанном коде.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Рекомендованные сообщения

  • 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) или серверу).

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах





  • 0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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';
	};

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
19 часов назад, TheFirstNoob сказал:

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

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

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

 

Изменено пользователем TheLinsus (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 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';

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
16 часов назад, TheLinsus сказал:

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

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


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

 

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

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

 

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

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

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

swith - case

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

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

 

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

Изменено пользователем NoNameUltima (история изменений)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
4 часа назад, NoNameUltima сказал:

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

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

 

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

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

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

swith - case

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

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

 

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

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0
3 часа назад, RedMoon сказал:

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
  • 0

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас

  • Похожие публикации

    • Автор: Anton81
      Всем привет, кикает игроков, как исправить?
      publicvariable.txt
      Value Restriction #0 "MISSION_CHECK" = "#line 1 "mpmissions\__CUR_MP.Chernarus\init.sqf"
    • Автор: LAW
      Установил свой сервер в dayz epoch, побегал денек, решил установить инфистар, дабы избежать проблем с читерами и добавить в игру админ панель. Вроде всё сделал правильно, но при заходе на сервер всё прогружается, появляется персонаж и выскакивает ошибка  -"Вас изгнали из игры (Battleeye: PublicVariable Restriction #0)" Помогите :(
    • Автор: 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]". Может кто то сталкивался с такой проблемой, заранее спасибо
       
    • Автор: Seksoman
      Больше половины игроков кикает с ошибкой PublicVariable Restriction #0. Проделал все манипуляции которые есть на форуме, не помогло. Какие есть предложения? Как исправить?  
    • Автор: Serdce
      #0 "cba_network_joinN" = ["Serdce","144815302",<NULL-object>,true]
      как отключит защиту на это?
  • Наш выбор

×
×
  • Создать...

Важная информация

Используя этот сайт, вы автоматически обязуетесь соблюдать наши Правила и Политика конфиденциальности.
Чтобы сделать этот веб-сайт лучше, мы разместили cookies на вашем устройстве. Вы можете изменить свои настройки cookies, в противном случае мы будем считать, что вы согласны с этим.