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

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

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

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

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

как правильно делать спаун на стороне сервера?

Я все никак не могу разобраться, сторона клиента - сторона сервера.
Суть вот в чем, хочу по карте в момент запуска сервера раскидать объекты. И потом на каждом игроке висит проверка таких объектов в определенном радиусе, если находит то запускает этот объект в работу, то есть на каждый найденный объект вешает скрипт который работает до тех пор пока объект в радиусе.
Вот не могу понять как заспаунить их на стороне сервера, пробовал по принципу подключения ботов: в server_monitor над строкой allow_conection делал вызов скрипта который спаунит эти объекты. В конце скрипта стоит глобальная переменная spawn_finished = true;
вот так выглядит server_monitor :
 

[] ExecVM "\z\addons\dayz_server\script.sqf";
waitUntil {spawn_finished};
diag_log "Spawn finished";
allowConnection = true;	

а вот так скрипт:
 

_position = [7500, 7500, 0];
_type = "quest_object";
_spawn_qty = 500;
_spawned = 0;

while {_spawn_qty > _spawned} do {	
_quest_obj = createVehicle [_type, _position, [], 500, "NONE"];
_quest_obj setvariable ["active", false];
_spawned = _spawned + 1;
};

spawn_finished = true;

В итоге объекты не спаунятся =( Если делаю это через инит в миссии спаунится но фпс проседает катастофически даже когда объекты не активны.
И как я понимаю если спаунить через инит будет десинхронизация между игроками, каждый будет видеть свои объекты?
 

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


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

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

  • 0

Я от тя скоро устану)

 

В server_function.sqf В САМЫЙ НИЗ

 

execVM "\z\addons\dayz_server\custom\custom.sqf";
 

 

 

В корне сервака, создаешь папку custom, и файл custom.sqf

в custom.sqf пишем -

 

 

 

execVM "\z\addons\dayz_server\custom\myObj.sqf";
execVM "\z\addons\dayz_server\custom\myTriggers.sqf";
 

 

Создаем файл myObj.sqf

В нем создаем объекты:

 

 

_bldObj = objNull;
if (true) then
{  
  _bldObj = createVehicle ["Info_Board_EP1", [6339.74, 7693.68, 0], [], 0, "CAN_COLLIDE"];
  _bldObj setDir 486.70212;
  _bldObj setVehicleInit "this allowDammage false;";
  _bldObj setPos [6339.74, 7693.68, 0];

  _bldObj = createVehicle ["Land_Fire_barrel", [6345.0723, 7717.5425, 0.11172744], [], 0, "CAN_COLLIDE"];
  _bldObj setPos [6345.0723, 7717.5425, 0.11172744];

  _bldObj = createVehicle ["Land_Misc_GContainer_Big", [6356.8916, 7705.6553, 0.029829683], [], 0, "CAN_COLLIDE"];
  _bldObj setDir 34.310238;
  _bldObj setPos [6356.8916, 7705.6553, 0.029829683];
};
 

Вот так создаются объекты на серваке.

 

По поводу вешалки скрипта на объекты:

У всех объектов как видишь, есть координаты, => можно накидать серверный триггер:

 

Создаем файл:

myTriggers.sqf

В нем пишем:

 

 

 

if (isServer) then
    {
        private ["_sectors"];
        //Радиус триггера, координата Х, координата Y
        _sectors =
            [
                [100,6337,7690],
                [100,4063,11664]
            ];
        //Спавним триггеры -
        {
            [_x] spawn
                {
                    private ["_pos","_radius","_sector","_players"];
                    _sector = (_this select 0);
                    _radius = (_sector select 0);
                    _pos = [(_sector select 1),(_sector select 2),0];
                    //Каждый триггер работает, - пока работает сервер -
                    while { true } do
                        {
                            //Ищем игроков в радиусе триггера
                            _players = _pos nearEntities ["CAManBase",_radius];
                            {
                                //Тут что то делаем с игроками(доп. проверки isAlive,... in playableUnits и т.п. - сам допиши)
                            } forEach _players;
                            sleep 5;//Пауза триггера
                        };
                };
        } forEach _sectors;
    };
 

Это если все триггеры одинаковые.

Если они разные, то у тебя 2 пути -

1. Дописать конфиг (см._sectors), добавив паузы, для каждого триггера, еще какие бы то ни было установки.....

2. Нахреначить несколько таких скриптов.

 

Еще вариант, каждому юзеру в миску совать триггеры. Можно конечно и так. Но нафига?

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


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





  • 0

Без меня пришлось бы отвечать на скучные вопросы =)

А могу я объекты раскидать рандомом? 
Еще вот такую штуку не понимаю еще, почему все же через server_function?
Ведь вот на примере ВАЙ ботов, их инит загружается в server_monitor, он же под себя загружает конфиги и инит самих миссий. Инит миссий тоже загружает конфиги и исполняющий файл который миссии запускает. Вот через рандомный промежуток времени он запустил миссию, которая рандомом по карте выбрала позицию.

Думал по такому же принципу сделать спаун, то есть загрузить файл через сервер_монитор и в нем уже спаунить то что мне нужно по такому же принципу как спаунятся миссии.

По поводу вешалки. Объекты будут спаунится по всей карте, то есть придется вешать или порядка 150 триггеров на сервер (1000*1000м) или их же в миску игрокам. 
Если каждый квадрат будет триггером то если тригеры весят в миске то на стороне игрока постоянно будет висеть такая проверка. Потому вместо триггеров решил вешать проверка на игрока, то есть он сам получается ходячий триггер который реагирует на попадение предметов в его радиус =) А если на сервере запустить 150 циклов проверок это ж серверу по ходу будет айайай.

Смысл в том что я хочу раскидать порядка 1000-3000 трупов по карте, но каждый раз рандомом. Труп из себя будет представлять юнита в лежачем положении как без сознания. Но дабы не нагружать сервак спавнить их неактивными, а когда такой труп попадет в радиус игрока, на каждый найденный вешается скрипт который его запускает. Вышел из радиуса - цикл который запустился в скрипте вызванном на труп выходит из цикла ставит переменную активейтед в фолс и опять принимает лежачее положение. Прикол в чем, что трупы то с лутом, и есть шанс что тебя такой труп укусит =).

+ такой подход нужен для некоторых миссий.
Я же говорил я просто пытаюсь переработать зомбей и квесты сделать  в общем добавляем сюжетность в дейз, а появление зомби, миссий и чегобы то нибыло из воздуха прямо на глазах игрока - не комильфо. 

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


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

о и еще сразу такой вопрос на счет вешалки.
Сейчас получается так, в ините вызываю скрипт который на игроке запускает бесконечный цикл проверки объектов в радиусе, скрипт лежит в миске, если находит то на этот объект вешается скрипт обработчик.
Вот вопрос если я скрипт который запускает цикл проверки на игроке кину в папку сервера и буду его оттуда вызывать, кто в таком случае будет обрабатывать этот цикл поиска, клиент или сервер?
Я просто думаю может лучше что бы по максимум разгрузить клиент что бы сервер на игроке такую проверку делал?

При каком раскладе будет меньше лагов? Когда у каждого игрока клиент выполняет такой цикл или когда сервер выполняет цикл для каждого игрока в отдельности?

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


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

так спаун тестовый получился, добавил функцию в server_functions и потом вызываю ее в server_monitor 
Вот возник вопрос если я в server_functions при спауне вешаю на спаунищиеся объекты глобальные переменные 

Смогу ли я их потом получать в скрипте из миски?

Просто пробовал что то нифига.

Вот функция в server_functions:
 

spawn_test = {
	private ["_spawn_min","_spawn_max","_spawn_radius","_spawn_type","_spawn_position","_spawn_qty","_spawned","_test"];
	_spawn_min = 50;
	_spawn_max = 100;
	_spawn_radius = 50;
	_spawn_type = ["citizen1","citizen2"];
	_spawn_position = [4884.9492, 9664.1211, 0];
	_spawn_qty = (round(random _anomality_spawn_max)) max _anomality_spawn_min;
	_spawned = 0;

	while {_spawn_qty > _spawned} do {
	{
		_test = createAgent [_x, _spawn_position, [], _spawn_radius, "NONE"];
		_test setvariable ["active", false];
		_spawned = _spawned + 1;
	}foreach _spawn_type;
	};
	diag_log format["%1 of %2 citizens have been spawned at %3 in %4 meter radius", _spawned, _spawn_qty, _spawn_position, _spawn_radius];
};

А вот скрипт который из инита вешается на игрока:
 

private ["_istest","_active"];

while {true} do {

		_istest = (position player) nearEntities ["Citizen", 10];
		{
			_active = _x getvariable "active";
			if (!_active) then {
				switch (true) do {
					case (_x isKindOf "citizen1") : {[_x]execVM "scripts\script1.sqf"; titleText ["Активация citizen1", "PLAIN DOWN", 1];};
					case (_x isKindOf "citizen2") : {[_x]execVM "scripts\script2.sqf"; titleText ["Активация citizen2", "PLAIN DOWN", 1];};
				};
			};
		}forEach _istest;
	sleep 1;
};

В script1 и script2 при вызове ставится значение глобальной переменной актив, когда игрок выйдет из радиуса (там так же начинается отслеживание дистанции до игрока)  актив опять получит фолс и выйдет из скрипта.

Вот вопрос, когда спавнил из инита глобальная переменная передавалась, из сервера не передается.

По сколько у всех изначальаня фолс, как бы так может сделать что пока из вызываемого скрипта не получена глоьальная переменная использовать то значение что в скрипте?
Пробовал так:
 

private ["_istest","_active"];
_active = false;
while {true} do {

		_istest = (position player) nearEntities ["Citizen", 10];
		{
			_active = _x getvariable "active";
			hint str _active;
			if (!_active) then {
				switch (true) do {
					case (_x isKindOf "citizen1") : {[_x]execVM "scripts\script1.sqf"; titleText ["Активация citizen1", "PLAIN DOWN", 1];};
					case (_x isKindOf "citizen2") : {[_x]execVM "scripts\script2.sqf"; titleText ["Активация citizen2", "PLAIN DOWN", 1];};
				};
			};
		}forEach _istest;
	sleep 1;
};

Но не хинтует т.к. строка _active = _x getvariable "active"; перебивает изначальное значение

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


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

while {_spawn_qty > _spawned} do {
	{
		_test = createAgent [_x, _spawn_position, [], _spawn_radius, "NONE"];
                active = false;
		publicvariable "active";
		_spawned = _spawned + 1;
	}foreach _spawn_type;
	};

Пробовал в сервере так передавать глобальную переменную, та же фигня =(

Хинтит <null> как и в предыдущем случае =(

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


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

в идеале было бы обойтись без передачи переменной.

Получается сейчас так:
скрипт который на игроке висит ищет в радиусе объекты, если нашел то проверят в каком состоянии на них висит переменная ектив, если фолс тогда запускать скрипт, в скрипте объект получает ектив = тру, объект начинает мерять дистанцию до игрока, как только дистанция превышает допустимое значение выход из скрипта с установкой ектив - фолс.

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

Пробовал так, но не работает:
 

_active = _x getvariable "active";
if ((isnil _active) or (!_active)) then {
	switch (true) do {
		case (_x isKindOf "citizen1") : {
                  [_x]execVM "scripts\script1.sqf";
                  titleText ["Активация citizen1", "PLAIN DOWN", 1];
                  };
		case (_x isKindOf "citizen2") : {
                  [_x]execVM "scripts\script2.sqf";
                  titleText ["Активация citizen2", "PLAIN DOWN", 1];
                  };
	};
};

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


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

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

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

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