Jump to content
Search In
  • More options...
Find results that contain...
Find results in...
  • 0
Sign in to follow this  
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;

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

Share this post


Link to post
Share on other sites

7 answers to this question

Recommended Posts

  • 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. Нахреначить несколько таких скриптов.

 

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

Share this post


Link to post
Share on other sites



  • 0

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

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

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

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

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

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

Share this post


Link to post
Share on other sites
  • 0

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

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

Share this post


Link to post
Share on other sites
  • 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"; перебивает изначальное значение

Share this post


Link to post
Share on other sites
  • 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> как и в предыдущем случае =(

Share this post


Link to post
Share on other sites
  • 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];
                  };
	};
};

Share this post


Link to post
Share on other sites
  • 0

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

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
Sign in to follow this  

×
×
  • 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.