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

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

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

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

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

DayZ Standalone v0.62.142963 Server Files + рабочий респавн персонажа и лута

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

Нашел в compiles.sqf такой вот скрипт:

//Infected Zone  (not active and not tested, maybe not work) (thanks MizeV for this work)
startGas = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\startGas.sqf"; 
stopGas = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\stopGas.sqf"; 
startBlood = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\startBlood.sqf";
startPoison = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\startPoison.sqf";

 

 

и в папке со скриптами есть вот это:

 

 

diag_log "Start startGas.sqf";
_uid = _this select 0;
_pos = _this select 1;
_dist= _this select 2;

{

/*             _source = player getVariable ["DZ_Smog_Person",true];
            if (_source) then
            {
                player setVariable ["DZ_Smog_Person",false];
 */
    if (_x getVariable['UID',''] == _uid) then 
    {
        _id = owner _x;
        [_id,_pos,_dist] spawnForClient {
        //_source = player getVariable ["DZ_Smog_Person",objNull];

            _xdistanz = _this select 2;
            _mdistanz = 1;
            _dichte = _xdistanz;
            //_dichte = 10;
            _msize = 3;
            _xsize = 7;
            _height = -0.3;
            _transparency = 0.5;
            _col1 = 1;
            _col2 = 0;
            _col3 = 0;
            _spawn = 15 + (random 1);
            _mlifetime = 5 + (random 1);
            _xlifetime = 15 + (random 1);
            
            _dirPeroid =  0;
            _dirIntensity =  0;
            _forward2 = 0;
            _right2 = 0;
            _up = 0;
            _wind = true;
            _windstrength = 1;
            _Pos = _this select 1;
            _right = 0;
            _forward = 0;
            if (_wind) then 
            {
                _right = (wind select 0) * _windstrength;
                _forward = (wind select 1) * _windstrength
            } 
            else
            {
                _right = _right2;
                _forward = _forward2
            };
Я так понимаю он тоже закомментирован? Ни кто не провбовал включать?

Это ж вроде зоны заражения?

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


Ссылка на сообщение
Поделиться на других сайтах
MagicByte MagicByte MagicByte
10 часов назад, 123new сказал:

Inqwizitor restock как я понял это что-то типа количества переспавнов этого ивента до рестарта сервера. И спавнятся они на игрока в городах, а после выхода с него как я понял еще и удаляются, дабы не снижать нагружки (заметить это легко, достаточно войти на сервер вблизи города и поглядеть консоль сервера, аналогично и с выходом). А в целом верно, это зомби в городе. и как я понял, эти подтипы ивентов заранее разделены по всему серверу где-то по зданиям и зонам спавна в городах, и в зависимости от ситуации сервер их сам подспавнивает и выбирает нужных.

И получается геморройная и бесполезная в большинстве своем система. Наверное правильнее будет спанить в городах статических зомби в большем количестве задать им время жизни (общее) и время респавна. В случае их убийства в силу вступает время респа. Для хеликрашей можно ничего не менять там они есть в нужном впринципе количестве. А зомби которые спавнятся на игрока впринципе не нужны при наличии достаточного количества статичных.

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


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

Splinter После того как раскоментировал (если я всё правильно сделал) статические зомби и животные перестали спавнится совсем. Зомби остались только на военныз обьектах и хеликрашах. Там больше ничего включать не нужно кроме этого кода? 

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


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

И получается геморройная и бесполезная в большинстве своем система. Наверное правильнее будет спанить в городах статических зомби в большем количестве задать им время жизни (общее) и время респавна. В случае их убийства в силу вступает время респа. Для хеликрашей можно ничего не менять там они есть в нужном впринципе количестве. А зомби которые спавнятся на игрока впринципе не нужны при наличии достаточного количества статичных.

ну никто не запрещает динамических зомбей отключить, для этого достаточно лишь удалить блок с ними с events.xml и перегенерировать storage. Уж не знаю как вы собрались задавать им время жизни общее, но не забываем, что скрипт есть скрипт. Более чем уверен офииальная система спавна зомбей еще себя покажет, но в текущем виде она сыровата.

13 часа назад, Inqwizitor сказал:

Подскажите как раскомментировать вот этот код:

 

/* commented out 02.11.2015
we want to try exact numbers of zombies defined in cfgSpawns.hpp
    //calculate dependency on max server population
    if ( _mult < 0.5 && _max <= _maxBase ) then
    {
        _max = _max;
        _min = _min;
    }
    else
    {
        _max = _max * _mult;
        _min = _min * _mult;
    };
*/

 

просто * убрать?

убрать /* и */

10 часов назад, Inqwizitor сказал:

Нашел в compiles.sqf такой вот скрипт:

//Infected Zone  (not active and not tested, maybe not work) (thanks MizeV for this work)
startGas = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\startGas.sqf"; 
stopGas = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\stopGas.sqf"; 
startBlood = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\startBlood.sqf";
startPoison = compile preprocessFileLineNumbers "scripts\gaszone\scripts\functions\startPoison.sqf";

 

 

и в папке со скриптами есть вот это:

 

 

diag_log "Start startGas.sqf";
_uid = _this select 0;
_pos = _this select 1;
_dist= _this select 2;

{

/*             _source = player getVariable ["DZ_Smog_Person",true];
            if (_source) then
            {
                player setVariable ["DZ_Smog_Person",false];
 */
    if (_x getVariable['UID',''] == _uid) then 
    {
        _id = owner _x;
        [_id,_pos,_dist] spawnForClient {
        //_source = player getVariable ["DZ_Smog_Person",objNull];

            _xdistanz = _this select 2;
            _mdistanz = 1;
            _dichte = _xdistanz;
            //_dichte = 10;
            _msize = 3;
            _xsize = 7;
            _height = -0.3;
            _transparency = 0.5;
            _col1 = 1;
            _col2 = 0;
            _col3 = 0;
            _spawn = 15 + (random 1);
            _mlifetime = 5 + (random 1);
            _xlifetime = 15 + (random 1);
            
            _dirPeroid =  0;
            _dirIntensity =  0;
            _forward2 = 0;
            _right2 = 0;
            _up = 0;
            _wind = true;
            _windstrength = 1;
            _Pos = _this select 1;
            _right = 0;
            _forward = 0;
            if (_wind) then 
            {
                _right = (wind select 0) * _windstrength;
                _forward = (wind select 1) * _windstrength
            } 
            else
            {
                _right = _right2;
                _forward = _forward2
            };
Я так понимаю он тоже закомментирован? Ни кто не провбовал включать?

Это ж вроде зоны заражения?

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

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


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

Хотелось бы понять еще одну вещь про переменные

1 можно ли создавать переменные с индексами типа a[1], а индекс задавать так же с помощью переменной?

2 глобальная переменная заданная в init.sqf, а так же во всех скриптах выпоняемыех из него доступна везде. А если задать глобальную переменную в скрипте/процедуре выполняемом для клиента (например event_playerKilled.sqf выполняется отдельно для каждого пользователя),  ее значение будет доступно для всех и везде или только клиенту для которого был выполнен код?

 

Продолжил изучение что как работает

В данный момент изучаю момент гибели персонажа

 

Самоубийство самострелом/самозарезом

1. В случае самоубийства (самострела) event_playerKilled вызывается 2 раза - все переменные на входе корректны оба раза

_this select 0; сам агент (игрок которого грохнули)

_this select 1; убийца - содержит агента - того жа самого что и _this select 0;

lastdamage unknown

 

Самоубийство методом падения с высоты

2. Аналогично пункту 1.

 

Смерть из ванкунсии (от потери крови/повреждений) неважно кем вызванных

3. event_playerKilled вызывается 1 раз

на входе то же что и в пункте 1, те все выглядит как самоубийство.

нужно читать переменную lastdamage из окружения агента, что бы понять кто/что убило агента

 

Смерть от зомби (без ванкунсии)

4. event_playerKilled вызывается 2 раза

на входе - первый раз как и в пункте 1

на входе во второй раз

_this select 0; сам агент (игрок которого грохнули)

_this select 0; агент зомби - например ZmbM_PatrolNormal_Autumn:2:35219

нужно читать переменную lastdamage из окружения агента, что бы понять кто/что убило агента

 

Смерть от другого игрока пока не удалось проверить (((

 

 

 

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

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


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

На сервере в течение длительного времени возникают следующие проблемы:

Exe timestamp: 2017/11/08 22:31:43
Current time:  2018/04/15 06:00:55

...

...

2018/04/15,  7:07:47 "Players info script: Sended message 'Online survivors:  0.' in channel chat 'colorStatusChannel' in time '4057.75'"
2018/04/15,  7:07:52 Saved [Houses] data file 5860 items.
2018/04/15,  7:08:27 Saved [Houses] data file 5858 items.
2018/04/15,  7:09:02 Saved [Houses] data file 5858 items.
2018/04/15,  7:09:37 Saved [Houses] data file 5856 items.
2018/04/15,  7:10:12 Saved [Houses] data file 5838 items.
2018/04/15,  7:10:31 Warning: No overcharged memory can be released
2018/04/15,  7:10:36 Warning: No overcharged memory can be released
2018/04/15,  7:10:41 Warning: No overcharged memory can be released
2018/04/15,  7:10:46 Warning: No overcharged memory can be released
2018/04/15,  7:10:49 Saved [Houses] data file 5789 items.

Наконец, указывается ошибка

===ErrorMessage====>>>>>>BEG
===ErrorMessage====>>>>>>END
ErrorMessage: Out of memory (requested 0 KB).
  footprint 1232879616 KB.
  pages 32768 KB.

Задача МП BorizzK , которую я использую

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

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


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

Хотелось бы понять еще одну вещь про переменные

1 можно ли создавать переменные с индексами типа a[1], а индекс задавать так же с помощью переменной?

2 глобальная переменная заданная в init.sqf, а так же во всех скриптах выпоняемыех из него доступна везде. А если задать глобальную переменную в скрипте/процедуре выполняемом для клиента (например event_playerKilled.sqf выполняется отдельно для каждого пользователя),  ее значение будет доступно для всех и везде или только клиенту для которого был выполнен код?

 

 

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

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


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

123new Я наверное не правильно выразился- не время жизни как токовой а время его существования до респавна.

 

Идея вот в чем:

При старте сервера у вас спавнится определенное количество зомби в населенных пунтктах- например в Черногорске (незнаю правильно ли будет им задать спавн в радиусе от центра черно, ну да ладно условно назовем пока это "Черногорск"). Допустим заспавнилось там 1000 зомби которые ходят бродят определенное количество времени. Ну а так как они разбредаются со временем дабы не шлялись по всей карте просто задать им время существование "жизни".

Вот появились они, побродили например час затем исчезли и переспавнились по новой. Но не все, а только те которых не убили. В итоге получается была 1000, далее в течении 1 часа игроки убили скажем 400. Остальные 600 переспавнились, далее ещё через час убили из тех кто переспавнился 300, а 300 респнулись. Тех которых убили респавнятся уже после ресарта сервера. Как то так. Я не знаю сложно ли это сделать или вообще невозможно просто вот такая есть идея которая мне кажется больше подойдет для зомби чем нынешний вариант.

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


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

Я включил у себя эти действия. Эффета нет. Видимо самих "зон заражения" дейсвительно не задано.

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


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

Inqwizitor ну по зонам я сказал, это лишь сами дейстия для этих зон, а где эти зоны будут и какие они тут каждый сам решает, дописыванием своих скриптов. Чисто в теории реально это. на практике не проверялось.
по поводу времени жизни думаю то реально сделать, а вообще можно и проще, тупо спавним их при рестарте и на каждог овешаем событие на его респавн в течении минут 2-5 например, после чего они снова появятся там же. И так по кругу, пока не рестартнется.

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

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

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


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

123new Про переменные

Обнаружил вот что

 

например в скрипте входа/респавна пользователя выполнить

spawnforclient {

 TESTVAR = true;

};

 

теперь переменная TESTVAR будет доступна при любом вызове для клиента

 

те если в любом другом скрипте на сервере выполнить

spawnforclient {

 if (TESTVAR) then {

  //Этот код будет выполнен для клиента

 };

};

 

как только клиент сделает exit (отключится) от сервера переменная пропадет

но если сделать респавн - переменная все так же будет доступна

 

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

понятно что можно задавать переменные агенту, но в случае если его deletevehicle, то и переменной уже не получить

интересно - а на id переменные вешать можно?

 

или может есть такой вариант?

_servertestvar = spawnforclient {

TESTVAR

};

те получить значение переменной TESTVAR с клиента в переменную _servertestvar на сервере...

 

 

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


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

BorizzK только если с клиента игры publicvariable какой-нить вызывать и сервером его ловить, ради примера глянь админку 0.59 от baddass что выложена тут, там насколько понимаю именно так и вызов идет.

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


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

BorizzK Ну мне как бы нужно чисто на сервере поймать момент:

Если после смерти игрок жамкнул респавн и начался процесс респавна, мне нужно это узнать при вызове скрипта автореспавна

 

те в процедуре респавна (агент не создан) создать переменную и обьявить ee true, в скрипте автореспавна проверить - если она false или nil, то продолжать, если нет, exitwith

 

просто с глобальной переменной это прокатывает

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


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

Екарный бабай, есть же profileNamespace и sertvariable/getvariable

profileNamespace судя по всему действует  на сервере в рамках окружения конкретного клиента везде, но недоступен в missionnamespace и profileNamespace других клиентов

 

profileNamespace setVariable ["variable",123];"

_var = profileNamespace getVariable "variable";

 

на сервере между скриптами выполняемыми в контексте конкретного клиента все прекрасно передается

передать на клиента можно и через spawnforclient

а больше вобщем-то и не нужно пока

хотя вопрос получения переменной с клиента (причем не доступной остальным) остается открытым

 

И уточняющий вопрос

_ClientRespawn = false;

_ClientRespawnAuto = false;

 

условие с or корректно?

if (!(_ClientRespawn) || !(_ClientRespawnAuto)) then { работаем };

 

 

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

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


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

BorizzK насчет условия вроде как да.

насчет админки с 0.59 версии - я о серверке

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

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


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

123new С условием и profileNamespace все получилось )))

Про админку

Это та которая

modulesDayZ\server\scripts\dayzdevru\admin_tools.sqf и тп что там лежит?

 

А не пробовали это к 0.62 прикручивать?

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

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


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

123new С условием и profileNamespace все получилось )))

Про админку

Это та которая

modulesDayZ\server\scripts\dayzdevru\admin_tools.sqf и тп что там лежит?

 

А не пробовали это к 0.62 прикручивать?

угу, она самая, и admin_tools_server.sqf в том числе.
а по поводу profileNamespace  можно подробнее?

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


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

123new 

 

Вот пример применения в event_playerKilled.sqf

 

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

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

А если в конце мы добавили вызов экрана смерти, вызов автопереспавна - они могут наложиться (я с этим уже столкнулся неск раз)

Использовать глобальные нельзя, тк это повлияет на всех клиентов

Можно использовать переменные привязанные к агенту - тогда просто вместо profileNamespace пишем _agent

Но если сервер грохнет агента, то тогда и переменная пропадет

 

потому сразу после сообщуг

 

... код 1 ...

_eventKilledClient = profileNamespace getVariable ["eventKilledClient",false];
if (_eventKilledClient) exitWith {};
profileNamespace setVariable ["eventKilledClient",true];

... код 2...

 

в итоге код 1 будет выполнен сколько серверной душе угодно

а код 2 только 1 раз

 

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

 

в процедуре _clientRespawn  которая в dbLoadPlayer.sqf в самом начале

	_clientRespawnAuto = profileNamespace getVariable ["ClientRespawnAuto",false];
	if (_clientRespawnAuto) exitWith {
		diag_log format["RESPAWN: Client %1 with UID %2 alredy automatically respawn!",_id, _uid];
		profileNamespace setVariable ["ClientRespawn",false];
	};
	profileNamespace setVariable ["ClientRespawn",true];

в скрипте который организует автореспавн (та же процедура _clientRespawn, только ее содержимое вынесено в отдельный файл (forcedRespawnCustom.sqf)  и обьявлено в compilse.sqf как forcedRespawnCustom и эта процедура вызывается после задержки в конце event_playerKilled.sqf) _id туда передается в качестве параметра - [_id]  call forcedRespawnCustom; [тк я не уверен, что _id будет там содержать корректный _id] можно конечно передать _id и через profileNamespace.

	_id = _this select 0;
	if (isNil "_id") exitWith {diag_log format["FORCECLIENTRESPAWN: _id == isNil, Exit!"]};

	_uid 	= getClientUID _id;
	if (isNil "_uid") exitWith {diag_log format["FORCECLIENTRESPAWN: _uid == isNil, Exit!"]};
	
	_clientRespawn = profileNamespace getVariable ["ClientRespawn",false];
	if (_clientRespawn) exitWith {
		diag_log format["FORCECLIENTRESPAWN: Client %1 with UID %2 alredy manual respawn!",_id, _uid];
		profileNamespace setVariable ["ClientRespawnAuto",false];
	};
	profileNamespace setVariable ["ClientRespawnAuto",true];

 

заодно зупулил переменную в код который отправляется и запускается на клиенте и которую так же проверяю в том же коде

но это на предмет если потребуется затемнения детскрина

 

так же добавил доппроверкку_ClientRespawn непосредственно перед вызовом процедуры автореспавна

 

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

 

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

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


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

BorizzK понял, возьму на заметку себе.

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


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

123new Плюс переменных в profileNamespace - они сохраняют свои значения до тех пор, пока клиент не отключится от сервера - потому их надо обязательно обнулять в процедуре респавна

я в респавне обнуляю

eventKilledClient и eventKilledClientCount (эта переменная для подсчета интераций)

а переменные ClientRespawn и ClientRespawnAuto непосредственно в eventPlayerKilled, но обнуляю только 1 раз

Вдруг игрок очень шустрый и быра нажмет на респавн ))))

 

Теперь

Как отправить код на клиента разобрался

 

_myProc = {
 //тут код
};

[_id,_myProc] spawnForClient {
 _myProc = _this select 1;
 call _myProc; //будет выполнеy код определенный на сервере и переданный как параметр. чем больше код, тем больше трафик!
};

 

осталось разобраться в 3х моментах

 

1. Передача кода/переменной (а собственно какая разница?) с клиента на сервер. только publicvariables?

2. Управление камерой для клиента - рою

3. fnc_addHandsItem; - укладка оружия в руги новому игроку при входе (в прицнипе разобрался, надо только проверить)

4. перезарядка этого оружия что бы при входе он был готов стрелять (вероятно это playerAcation или что-то вроде этого) - рою

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

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


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

Выкладываю миссию от комрада 123new  с моими текущими доработками

 

Только что внес неск микроизменений в проверки, тк по результатм испытаний 3х игроков один раз автореспавн умудрился наложиться на респавн ручной.

 

Внес изменения (внедрил именованные переменные для проверок) и выложил заново

https://drive.google.com/drive/folders/1Hq1lLMDBp8wB0K-x1DZFgXcfENDTo6pG

 

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

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


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

Вобщем эксперементирую с отправкой клиенту brain_player_client.fsm с сервера вместо того что бы клиент подгружал его локально

 

Загнал содержимое в глобальную переменную в compules.sqf

brainPlayerFSM = preprocessFile "scripts\fsm\brain_player_client.fsm";

 

Теперь нужно корректно отправить его клиенту в скомпиленом виде

В оригинале процедура такая

[_id] spawnForClient compile "player execFSM '\dz\modulesDayZ\fsm\brain_player_client.fsm'";

 

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

[_id,brainPlayerFSM] spawnForClient {
 _brainPlayerFSM = _this select 1;
 compile player execFSM _brainPlayerFSM;
};

 

не арбайтен

 

 

 

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

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


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

BorizzK а если в виде:

[_id,brainPlayerFSM] spawnForClient {
 _brainPlayerFSM = _this select 1;
_text = format["player execFSM %1",_brainPlayerFSM];
 compile _text;
}; 

 

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


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

123new Пасип :smile:

Попробовал

Не работает :sad:

 

Вобщем погоняли сегодня миссию в 10 человек

 

profileNamespace не работает как должно ((

как-то странно, но оказалось, что эти переменные доступны всем или почти всем клиентам на стороге сервера в какой-то момент

 

похоже ноги растут оттуда же, откуда missionNamespace setVariable больше не работает в 62 патче и вместо нее просто используется присвоение значения глобальной переменной самым обычным способом: VARIABLE = значение;

 

Вобщем появилась еще одна идея, не получится, надо искать что-то еще

 

изучив скрипты в pbo пришел к выводу, что ИМЯ ПЕРЕМЕННОЙ в setVariable и getVariable возможно задавать то же переменной содержащей имя переменной,  значение которой требуется присвоить или получить.

Касается это любой переменной с которой работаем через setVariable и getVariable

P.S. Переменные имена которых задаются с помощью переменной в shell-скриптинге (и не только) называются именованными переменными

 

вот пример

 

_keyString = "BIS_IShouldSupportTheDeveloper";
_timesActivated = profileNamespace getVariable [_keyString, 1];

 

тут  в локальную переменную _timesActivated  извлекается из profileNamespace переменная с именем BIS_IShouldSupportTheDeveloper, те команда аналогична

_timesActivated = profileNamespace getVariable ["BIS_IShouldSupportTheDeveloper",1];

 

Таким образом можно предположить, что, нужно создавать переменные в profileNamespace с индексом в виде ID клиента

 

Предположим _id = 3;

например _keyString = format ["ClientRespawn_%1",_id];

profileNamespace setVariable [_keyString,true];

 

Что аналогично profileNamespace setVariable ["ClientRespawn_3",true];

 

Попробовал, получилось ))))

 

Подсчет кол-ва интераций event_playerKilled (для теста и понимания в  каких случаях сколько раз он выполняется)

Где event_playerKilled навешивается на событие смерти известно

А есть ли событие unconscious ?

_vname_eventKilledClientCount = format["eventKilledClientCount_%1",_id];
_eventKilledClientCount = profileNamespace getVariable [_vname_eventKilledClientCount,0];
_eventKilledClientCount = _eventKilledClientCount + 1;
profileNamespace setVariable [_vname_eventKilledClientCount,_eventKilledClientCount];

 

Защита кода от повторного выполнения в event_playerKilled

 

_vname_eventKilledClient = format["eventKilledClient_%1",_id];
_eventKilledClient = profileNamespace getVariable [_vname_eventKilledClient,false];
if (_eventKilledClient) exitWith {};
profileNamespace setVariable [_vname_eventKilledClient,true];

 

Главное при респавне/отключении пользователя от сервера грохать эти переменные в profileNamespace

В идеале это делать в месте где id клиента удаляется из массива players

Так же можно и нужно их нулить в процедуре подключения клиента к серверу.

 

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

А вот переменные для проверки респавна по другому походу не сделать.

 

Завтра очередные тесты

 

Кстати. Можно какнить найти время и потестить/погонять совместно

 

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

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


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

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

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

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

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

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

Войти

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

Войти сейчас

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

    • Автор: Troy1
      Всем привет. пишу мод и столкнулся с проблемой в реализации.
      Суть: Пытаюсь сделать проверку, если игрок стоит прям у окна или у дверного проёма он должен получать урон.
      Делал вот так.
      int wallHits = 0; float d = 2.2; // Дистанция до стены. Если стена дальше — считаем, что там окно или проем. // 8 направлений "снежинкой" для проверки стен вокруг игрока // Используем Vector(x, y, z) для точности ref array<vector> checkDirs = { Vector(d,0,0), Vector(-d,0,0), Vector(0,0,d), Vector(0,0,-d), Vector(d,0,d), Vector(-d,0,-d), Vector(d,0,-d), Vector(-d,0,d) }; foreach (vector dir : checkDirs) { // Пускаем горизонтальные лучи от позиции игрока (from) if (DayZPhysics.RayCastBullet(from, from + dir, collisionLayerMask, this, hitObject, hitPosition, hitNormal, hitFraction)) { // ПРОВЕРКА: Это должна быть вертикальная стена (Y нормали < 0.5) // Чтобы не засчитать низкий потолок за стену if (Math.AbsFloat(hitNormal[1]) < 0.5) { wallHits++; } } } // УСЛОВИЕ БЕЗОПАСНОСТИ: // В комнате wallHits будет 6-8. У окна или в проеме — 1-4. if (wallHits < 5) { hasSafeCeiling = false; // Слишком открытое пространство (окно/дверь) } Пытался менять дистанции, но всё ровно не как не хочет работать.
      Что я делаю не так, или я вообще делаю не то?
      Мне нужно проверять игрока, в укрытии он или нет.
      С высотой я разобрался, а вот с боковыми лучами у меня траблы и не во всех помещениях работает как нужно.
      В некоторых помещениях вообще не работает, удаляешь строки проверки, начинает работать и то по высоте.
      Просто забегаешь по навес и игрок под защитой, так не должно быть.
      Помогите пожалуйста  решить задачу.
    • Автор: Troy1
      Всем привет. Суть в чём, пишу мод на событие и когда происходит событие, параллельно должна меняться скорость ветра, не могу понять как заставить скрипт управлять силой ветра. Понижать силу ветра получилось сделать, а вот повышать не как. Только после перезагрузки сервера сила ветра задаётся в нужном значение.
      Как сделать, что бы по вызову функции менялась сила ветра в большую или в меньшую сторону?
      protected void SetWind(float wind, float time) { if (!g_Game) return; Weather m_Weather = g_Game.GetWeather(); if (!m_Weather) return; m_Weather.SetWindMaximumSpeed(wind); m_Weather.SetWind(Vector(1/Math.Sqrt(3), 1/Math.Sqrt(3), 1/Math.Sqrt(3)) * wind); m_Weather.SetWindSpeed(wind); m_Weather.SetWindFunctionParams(1.0, 1.0, -1); } Это скрипт на понижение силы ветра.
      Работает понижение силы ветра в том случае, если до этого сила ветра была выше.
      Пример:
      Изначально на сервере сила ветра = 20 m/s А нужно понизить до 10 m/s
      Только в этом случае сработает скрипт который я приложил выше.
      Помогите пожалуйста решить этот вопрос.
      За ранние благодарю.
    • Автор: Troy1
      Пока ждал помощи, решил вопрос!
      Тема закрыта!!!
    • Автор: magliner
      Привет ! Ну вот моя история с вопросом в конце.. Я фанат Дэйз ванилы черноруси, заколебало сидеть на бездушных серверах со слабой админкой и терять лут от софтеров, решил создать под свои скромные запросы около ванильный сервер.. Нашел хорошего исполнителя, быстро и четко запустили отладили и ВОТ я имею СВОЙ сервер.. клас! вечер восторга и изучения
      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.

      Пожалуйста, Войдите или Зарегистрируйтесь, чтобы увидеть это: Вложение.
  • Наш выбор

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

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

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