Перейти к содержимому


Фотография

Cкрипты в мультиплеере. Глобальность, локальность


Лучший Ответ vlad333000 , 06 March 2018 - 15:02

Во-первых, любой скрипт всегда вызывается и работает локально для каждой машины
Во-вторых, каждая команда может иметь три эффекта:
1. LE - Local Effect - эффект от команды только на тех машинах, где команда была вызвана
2. GE - Global Effect - эффект от команды виден на всех машинах, независимо от того, на какой она была вызвана
3. SE - Server Effect - эффект от команды будет виден только, если команда будет вызвана на серверной машине
(Если не описан эффект, то считается LE, если обратное не сказано в описании команды)

Итого: все зависит от того какие команды используются и следовательно нужно либо использовать глобальные команды, либо крутить нужный скрипт на каждой машине (Например можно удаленно вызывать чере remoteExec/remoteExecCall или publicVariable/publicVariableClient/publicVariableServer/addPublicVariableEventHandler) Перейти к сообщению


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 16

#1 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 06 March 2018 - 14:08

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

#например

//notice.sqf//
player addaction ["notice",
{
["notice",["hello"]] call Bis_fnc_ShowNotification;
}];

но если вписать этот скрипт в триггер, или активировать в консоли отладки уже в игре, то все будет работать правильно и уведомление будет высвечиваться всем игрокам на сервере, а не только тому человеку который вызвал скрипт
 Подобная фигня случается в основном только с "AddAction" и насколько я понимаю скрипт внутри "AddAction" вызывается локально.
 Как исправить эту проблему? и можно-ли?
 Как вообще работает локальность и глобальность, как их менять и вообще взаимодействовать с этими понятиями?


  • 0

#2 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 06 March 2018 - 15:02   Лучший Ответ

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

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

может иметь три эффекта:
1. LE - Local Effect - эффект от команды только на тех машинах, где команда была вызвана
2. GE - Global Effect - эффект от команды виден на всех машинах, независимо от того, на какой она была вызвана
3. SE - Server Effect - эффект от команды будет виден только, если команда будет вызвана на серверной машине
(Если не описан эффект, то считается LE, если обратное не сказано в описании команды)

Итого: все зависит от того какие команды используются и следовательно нужно либо использовать глобальные команды, либо крутить нужный скрипт на каждой машине (Например можно удаленно вызывать чере remoteExec/remoteExecCall или publicVariable/publicVariableClient/publicVariableServer/addPublicVariableEventHandler)
  • 0

#3 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 06 March 2018 - 15:18

ясно понятно, спасибо большое за инфу 


Сообщение отредактировал Forsion: 06 March 2018 - 15:49

  • 0

#4 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 06 March 2018 - 15:50

а нельзя локальные команды сделать глобальными как нибудь?


  • 0

#5 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 06 March 2018 - 15:56

Forsion, как я написал выше, через удаленный вызов remoteExec/remoteExecCall или publicVariable/publicVariableClient/publicVariableServer/addPublicVariableEventHandler (Описание этих команд найдете по ссылке выше («каждая команды»)
  • 0

#6 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 06 March 2018 - 16:23

Forsion, как я написал выше, через удаленный вызов remoteExec/remoteExecCall или publicVariable/publicVariableClient/publicVariableServer/addPublicVariableEventHandler (Описание этих команд найдете по ссылке выше («каждая команды»)

жаль что только так можно, путаницы теперь много


  • 0

#7 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 06 March 2018 - 16:25

 

Forsion, как я написал выше, через удаленный вызов remoteExec/remoteExecCall или publicVariable/publicVariableClient/publicVariableServer/addPublicVariableEventHandler (Описание этих команд найдете по ссылке выше («каждая команды»)

жаль что только так можно, путаницы теперь много

 

 

Добро пожаловать в мультиплеер)


  • 0

#8 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 06 March 2018 - 17:55

 

Forsion, как я написал выше, через удаленный вызов remoteExec/remoteExecCall или publicVariable/publicVariableClient/publicVariableServer/addPublicVariableEventHandler (Описание этих команд найдете по ссылке выше («каждая команды»)

жаль что только так можно, путаницы теперь много

 

Нет там никакой путаницы.

Все зависит от условий задачи.

Если тебе надо, чтобы при входе в определенную зону любого игрока, у ВСЕХ игроков появлялось некое уведомление, то это делается достаточно элементарно, и можно разными способами -

1. Самый просто и в лоб.(скрипт миссионный)

 

при входе в некий триггер\или после выполнения каких либо действий, запускаем код:

{
    _x setVariable ["showmessageText", "show text", true];
    _x setVariable ["showmessage", true, true];
} forEach playableUnits;

Так же, где то в init.sqf миссии добавляем:

[] spawn
    {
        Private ["_show", "_msg"];
        while {true} do
            {
                _show = player getVariable ["showmessage", false];
                if (_show) then
                    {
                        player setVariable ["showmessage", false];
                        _msg = player getVariable ["showmessageText", ""];
                        if (_msg != "") then
                            {systemChat _msg;};
                    };
                sleep 1;
            };
    };

P.S. Пример тупой и "влоб"

Вариант 2, на PVEH.... Что более разумно... Есть и другие варианты.


  • 0

#9 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1793 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 06 March 2018 - 18:45

путаницы теперь много

Если тебе надо, чтобы при входе в определенную зону любого игрока, у ВСЕХ игроков появлялось некое уведомление, то это делается достаточно элементарно, и можно разными способами -
1. Самый просто и в лоб.(скрипт миссионный)
 
при входе в некий триггер\или после выполнения каких либо действий, запускаем код:
{
    _x setVariable ["showmessageText", "show text", true];
    _x setVariable ["showmessage", true, true];
} forEach playableUnits;
Так же, где то в init.sqf миссии добавляем:
[] spawn
    {
        Private ["_show", "_msg"];
        while {true} do
            {
                _show = player getVariable ["showmessage", false];
                if (_show) then
                    {
                        player setVariable ["showmessage", false];
                        _msg = player getVariable ["showmessageText", ""];
                        if (_msg != "") then
                            {systemChat _msg;};
                    };
                sleep 1;
            };
    };

Слишком просто. Надо так:
_message remoteExec ["systemChat", [0, -2] select isDedicated];

  • 0

#10 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 06 March 2018 - 20:53

чето я тут какой то фигни понаделал и все равно ниче не работает

intel addaction ["<t color='#1FCECB'>Download intel</t>",
{
 ["notice",["intel wuld be downloaded in 2 minute"]] RemoteExecCall ["BIS_fnc_showNotification", player];
 [intel,3] call BIS_fnc_dataTerminalAnimate;
 intel removeAction 0;
 sleep 120;
 [intel,0] call BIS_fnc_dataTerminalAnimate;
 Dcomplet = true;
}];

не могу разобраться, можете на примере этого кода показать как его правильно написать?


  • 0

#11 OFFLINE   NoNameUltima

NoNameUltima

    Сержант

  • Пользователи
  • 189 сообщений
  • Откуда:SPB

Отправлено 06 March 2018 - 21:15


Слишком просто

Ну в А2 нету такого, да и в А3 мб в фильтрах БЕ запрещено(от задачи зависит, и от того какой МП - для себя любимого и пары друзей, или...)


  • 0

#12 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 07 March 2018 - 00:21

Forsion, для remoteExecCall вы в правом операнде, во втором параметре указали как «цель» player - это то где будет удаленно вызвана команда - player один и это вы, соответственно вызовется только у тебя:
0 - везде
2 - на сервере
-2 - везде кроме сервера
clientID - конкретный клиент
-clientID - везде, кроме конкретного клиента
object - машина, которая владеет этим объектом (Для которой он локален) - на жтом вы и сломались - player локален только сам для себя и он один
NoNameUltima, вообще не понмал инкогда этих фильтров, только ограничивают автора миссии/аддонов, а пользы ноль. Их полезно ставить разве что как способ автокика игрока - когда спецаильно вызваешь скрипт с этой командой для неугодного игрока и он отправляется отдыхать вне твоего сервера

Сообщение отредактировал vlad333000: 07 March 2018 - 00:23

  • 0

#13 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1793 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 07 March 2018 - 01:34

Ну в А2 нету такого

А

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

что:

[nil, nil, "systemChat", _message] call RE;

?
 

да и в А3 мб в фильтрах БЕ запрещено

Решается запуском с сервера.


  • 0

#14 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 сообщений
  • Откуда:РФ

Отправлено 07 March 2018 - 05:54

[nil, nil, "systemChat", _message] call RE;

Это функция, а не прямая скриптовая команда.

Полноценный аналог функции

bis_fnc_mp

в арме 3.


  • 0

#15 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1793 сообщений
  • Откуда:Тбилиси, Грузия

Отправлено 07 March 2018 - 10:36

SteelRat, а речь шла про аналог вообще, а не про то, представлен ли этот аналог функцией или командой.


  • 0

#16 OFFLINE   Forsion

Forsion

    Ефрейтор

  • Пользователи
  • 38 сообщений
  • Откуда:акула
  • Отряд:Shark Squad

Отправлено 07 March 2018 - 22:32

Forsion, для remoteExecCall вы в правом операнде, во втором параметре указали как «цель» player - это то где будет удаленно вызвана команда - player один и это вы, соответственно вызовется только у тебя:
0 - везде
2 - на сервере
-2 - везде кроме сервера
clientID - конкретный клиент
-clientID - везде, кроме конкретного клиента
object - машина, которая владеет этим объектом (Для которой он локален) - на жтом вы и сломались - player локален только сам для себя и он один
NoNameUltima, вообще не понмал инкогда этих фильтров, только ограничивают автора миссии/аддонов, а пользы ноль. Их полезно ставить разве что как способ автокика игрока - когда спецаильно вызваешь скрипт с этой командой для неугодного игрока и он отправляется отдыхать вне твоего сервера

 а можно сам "addAction" через remoteExec написать? чтобы все что в нем написано у всех выполнялось.

["hi",{hint "hello"}] remoteExec ["adaction",0]

вот так у меня не работает.
или всё таки нужно уже внутри addAction все команды прописывать через remoteExec?

и еще 

intel addaction ["<t color='#1FCECB'>Download intel</t>",
{
["Notice",["hello there!"]] RemoteExecCall ["BIS_fnc_showNotification", 0];
}];

если на такой action нажму я, то все игроки увидят Notice, а если нажмет игрок то никто ничего не увидит.
почему?


  • 0

#17 OFFLINE   vlad333000

vlad333000

    Полковник

  • Пользователи
  • 3224 сообщений
  • Откуда:Кострома

Отправлено 07 March 2018 - 22:42

а можно сам "addAction" через remoteExec написать?

Ну вы учитывайте что программа тупо исполняет ваши действия, а не читает ваши мысли:
["hi",{hint "hello"}] remoteExec ["adaction",0]
Ок. Вы попросили движок игры удаленно на каждой машине выполнить команду addAction
Ок. Теперь у каждого игрока есть действие
Но! addAction вызывается код локально (См. мое "во-первых") - соответственно hint выполнится только у одного игрока

Идем дальше. Смотрим описание команд:
addAction:
object addAction [title, script, arguments, priority, showWindow, hideOnUse, shortcut, condition, radius, unconscious, selection, memoryPoint]
т. е.:
<param_left> addAction <param_right>
remoteExec/remoteExecCall:
// <params1> someScriptCommand <params2>;
[<params1>, <params2>] remoteExec/remoteExecCall ["someScriptCommand", targets, JIP];
т. е.:
[<param_left>, <param_right>] remoteExec/remoteExecCall ["addAction", <targets>, <JIP>];

  • 0




Яндекс.Метрика