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


Фотография

Вопросы по скриптингу

Arma3 как плотформа для созда Скритпы

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

#1381 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 18 January 2019 - 01:08

TopDen, нет такой команды.

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

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

.


Сообщение отредактировал Schatten: 18 January 2019 - 01:13

  • 0

#1382 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 18 January 2019 - 02:35

Schatten, Да, это в курсе.  Просто мне почему-то казалось, что без вмешательства в конфиг можно было бы изменить объем скриптово. Значит я сам ошибся. В любом случае спасибо за ответы. Еще вопрос. есть скрипт
 

while {true} do {
  _allHCs = entities "HeadlessClient_F";
  _allHPs = allPlayers - _allHCs;
  {
    _playerInvToCheck = _x;
    if ((lifeState _x) == "INCAPACITATED") then {
      _playerItems = items _x;
      if ("Medikit" in _playerItems) then {
        [_playerInvToCheck, false] remoteExec ["setUnconscious", 0];
        [ "#rev", 1, _playerInvToCheck ] remoteExecCall ["BIS_fnc_reviveOnState", _playerInvToCheck];
        _playerInvToCheck switchMove "PlayerStand";
        _playerInvToCheck removeItem "Medikit";
        [_playerInvToCheck] remoteExec ["dc_fnc_revivePlayer", 2];
      };
    };
  } forEach _allHPs;
};

в момент ранения игрока он отправляется в "300" и тут же ревайвается благодаря наличию аптечки у него, которая потом удаляется. Проблемка: Если у игрока 2 аптечки или 3, то они удалятся все. Как подправить этот код, чтобы удалялась только одна аптечка?


Сообщение отредактировал TopDen: 18 January 2019 - 10:35

  • 0

#1383 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 18 January 2019 - 11:50

TopDen, не использовать while
  • 1

#1384 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 18 January 2019 - 11:51

TopDen, поскольку используется команда removeItem, то удаляется одна аптечка. Удаляются все скорее всего из-за того, что life state юнита меняется не сразу, а к тому времени когда он поменяется, все аптечки будут удалены. Для решения надо или переделать этот код, или перенести оживление на сторону юнитов. Второй вариант мне нравится больше.


Сообщение отредактировал Schatten: 18 January 2019 - 11:51

  • 1

#1385 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 24 January 2019 - 02:48

Еще нубский вопрос: например мне нужно убрать из рюкзака игрока три медпакета. я могу написать
player removeItemFromBackpack "FirstAidKit";

player removeItemFromBackpack "FirstAidKit";

player removeItemFromBackpack "FirstAidKit";

три раза и все работает. Думаю можно написать это по другому. Помогите с образцом, пожалуйста.


Сообщение отредактировал TopDen: 24 January 2019 - 02:56

  • 0

#1386 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 24 January 2019 - 11:48

TopDen,

for "_i" from 1 to 3 do {
    player removeItemFromBackpack "FirstAidKit";
};

  • 1

#1387 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 24 January 2019 - 11:55

TopDen, Google >> циклы
  • 1

#1388 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 01 February 2019 - 13:57

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


  • 0

#1389 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 01 February 2019 - 15:13

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

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

 -- не поможет, если что-то взято в обход инвентаря.

Возможно, обработка события

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

является более лучшим решением.


Сообщение отредактировал Schatten: 01 February 2019 - 15:19

  • 0

#1390 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 01 February 2019 - 18:11

Schatten, благодарю.


  • 0

#1391 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 01 February 2019 - 21:47

TopDen,
inGameUISetEventHandler [
    "Action",
    "
    params [""_target"", """", """", ""_action"", """", """", """", """", """", """", """"];
    
    if (_action in [""Gear"", ""Rearm"", ""TakeWeapon"", ""TakeMagazine"", ""TakeItem""]) then {
        if (((_target isKindOf ""Man"") && (!alive _target)) || (typeOf _target == ""WeaponHolderSimulated"")) then {
            true;
        } else {
            false;
        };
    } else {
        false;
    };
    "
];

player addEventHandler [
    "InventoryOpened",
    {
        params ["", "_container", ""];

        if (((_container isKindOf "Man") && (!alive _container)) || (typeOf _container == "WeaponHolderSimulated")) then {
            true;
        } else {
            false;
        };
    }
];
PS Но нужно учитывать работу модов, т. к. если эту штуку использует кто-то еще, то нужно будет объединять код.

Сообщение отредактировал vlad333000: 01 February 2019 - 22:01

  • 1

#1392 OFFLINE   Scully

Scully

    Рядовой

  • Пользователи
  • 13 сообщений

Отправлено 04 February 2019 - 00:28

Привет парни. есть зацикленный скрипт, где безоружный бот подбирает себе оружие:

while {primaryWeapon _unit == ""} do {
     _corp = (_unit nearObjects ["WeaponHolderSimulated", 50]) select 0;
     _corpContents = weaponCargo _corp;
     _Weapon = _corpContents select 0;
     _unit action ["TakeWeapon", _corp, _Weapon];

    sleep 1;
     _unit action ["rearm", _corp];
    sleep 3;
 };

Не работает, когда боту нечего подбирать, насколько я понял переменная _corp не создается и последующий код будет с ошибкой.  Т. е нужна проверка условия на "WeaponHolderSimulated", но я не знаю как это записать, подскажите пожалуйста нубасу как ее записать, если проблема в этом)

 


  • 0

#1393 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 04 February 2019 - 04:30

Scully, да вы сударь вообще не запаривались какими-либо проверками.
А что если рядом нет WeaponHolderSimulated? А что, если рядом есть только GroundWeaponHolder? А что, если выбранный вами контейнер не содержит оружия? А что, если выбранное ваше оружие не является основным?
Идем по порядку вопросов, заданных мной:
1.

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


2.

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

или использовать родительский класс объекта для поиска
3. Как и с первым ответом
4. Что-то посложнее, комбинируя проверку и второстепенного оружия
В добавок:
1. Насколько я помню, TaleWeapon и Rearm, срабатывают на любой дистанции. Вы же нехотите, что бы ваш бот взял винтовку, лежащую от него в 20 метрах? Поэтому "попросите" его подойти и только потом выполняйте действия.
2.

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


3. А еще, используемая вами команда не сортирует результат по дальности. Вы же не хотите, что бы бот потопал за 100 метров за винтовкой, когда под его ногами лежит другая?

Сообщение отредактировал vlad333000: 04 February 2019 - 04:32

  • 0

#1394 OFFLINE   Scully

Scully

    Рядовой

  • Пользователи
  • 13 сообщений

Отправлено 04 February 2019 - 12:59

vlad333000,

Ага, поторопился, спасибо за разъяснение. сейчас немного запарился и записал так:

 

_hls2 = nearestObject [bot, "WeaponHolderSimulated"];


while {primaryWeapon bot == "" && handgunWeapon bot == "" } do {
   sleep 2;
   bot doMove (getPosATL _hls2); 
      waitUntil {bot distance _hls2 < 6};
           _box = (bot nearObjects ["WeaponHolderSimulated", 6]) select 0; 
          _boxContents = weaponCargo _box; 
          _weapon = _boxContents select 0; 
          bot action ["TakeWeapon", _box, _weapon];
	  sleep 2;
	  bot action ["rearm", _box];
   sleep 5;
}:

Все еще есть проблема с WeaponHolderSimulated

А что если рядом нет WeaponHolderSimulated? А что, если рядом есть только GroundWeaponHolder?

Не хотелось мудрить, не нашел о них подробной инфы. Исключил остальные холдеры, задействовал только лутания трупов. Сейчас, если WeaponHolderSimulated (т. е. трупов) рядом нет, бот врубает бесконечный бег и убегает куда-то за карту. Сейчас нужно прописать условие на присутствие WeaponHolderSimulated поблизости, я не могу понять как это записать.


Сообщение отредактировал Scully: 04 February 2019 - 13:17

  • 0

#1395 OFFLINE   Scully

Scully

    Рядовой

  • Пользователи
  • 13 сообщений

Отправлено 04 February 2019 - 14:27

разобрался, с условием isNull вроде нормально теперь


  • 0

#1396 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 01 March 2019 - 00:49

есть два скрипта. взяты с просторов инета. первый запрещает садиться в авиацию "не пилотам и командирам"(допустим)
 

player addEventhandler ["GetInMan", {
	params ["_unit", "", "_vehicle"];
	
	if (_vehicle isKindOf "Air" && {!(_vehicle isKindOf "ParachuteBase") && {assignedVehicleRole _unit in [['driver'], ['Turret', [0]]] && {!(((toUpper typeOf _unit find toUpper "Pilot") > -1) || ((typeof player) in ["B_Soldier_SL_F","O_Soldier_SL_F"]))}}}) then {
		moveOut _unit;
		hintSilent parseText format["<t size='1.25' color='#ff0000'>Управлять авиацией могут только пилоты и командиры!</t>"];
	};
}];

и второй. Zealot'а на запрет снятия формы, броника и каски игроком (чтобы не могли снимать с ботов и переодеться.

 

zlt_checkGear = {
    [] spawn {
       zlt_ch_run = true;
       sleep 5;
       zlt_ch_uniform  = uniform player;
       zlt_ch_headgear = headgear player;
       zlt_ch_vest = vest player;
       while {alive player} do {
          if (zlt_ch_run) then {
             if (uniform player != zlt_ch_uniform) then {
                _items = uniformItems player;
                removeUniform player;
                player addUniform zlt_ch_uniform;
                {player addItemToUniform _x} foreach _items;
             };
             if (headgear player != zlt_ch_headgear) then {
                removeHeadgear player;
                player addHeadgear zlt_ch_headgear;
             };
             if (vest player != zlt_ch_vest) then {
                _items = vestItems player;
                removeVest player;
                player addVest zlt_ch_vest;
                {player addItemToVest _x} foreach _items;
             };
          };
          sleep 1.5;
       };

    };
};

zlt_lockInvSlots = {
    waitUntil {!(isNull (findDisplay 602))};
    while {!(isNull (findDisplay 602))} do {// Keep the "uniform slot" control on lockdown. Else there are loop holes. No pun intended.
       ctrlEnable [6331, false];  
       ctrlEnable [6381, false]; // vest
       ctrlEnable [6240, false]; // headgear
       sleep 0.001;
    };   
};  

if (!isDedicated && hasInterface) then {
    [] spawn {
       waitUntil {!(isNull player)};
       player addEventHandler ["inventoryOpened", {_this spawn zlt_lockInvSlots;}];
       [] spawn zlt_checkGear;
    };
};

Но со временем они в миссии перестают работать, т.е кто-то может переодеть форму, а кто-то сесть за пилота, но не у всех клиентов одновременно. т.е. у кого-то скрипт все еще работает, у кого-то перестает. Может в них что-то не так? Посмотрите, пожалуйста, у кого есть время.
запускаются оба отдельными sqf файлами в init.sqf через [] execVM "script.sqf";


Сообщение отредактировал TopDen: 01 March 2019 - 00:50

  • 0

#1397 OFFLINE   vlad333000

vlad333000

    Полковник

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

Отправлено 01 March 2019 - 02:08

TopDen, если смотреть с моей колокольни, то все эти скрипты нацелены только на одну жизнь игрока, т. е. не подразумевают возможное возрождение игрока, следовательно после возрождения скрипты перестают оказывать эффект
  • 0

#1398 OFFLINE   TopDen

TopDen

    Мл. лейтенант

  • Пользователи
  • 803 сообщений
  • Откуда:Москва
  • Отряд:[АТР] АРМАТОП

Отправлено 01 March 2019 - 06:16

да. я предположил такой вариант...спасибо Vlad333000, что подтвердили . (по ходу игр выяснили, что функционал не повторялся после респавна игрока). а если я их просто повторю в onPlayerRespawn.sqf (сам текст скриптов), это нормально будет,
или как-то по другому это делается, чтобы после возрождения игроку "вернуть некий функционал"?

Я таким образом возвращал игрокам некие addaction'ы, но не знаю как со скриптом это правильнее сделать


Сообщение отредактировал TopDen: 01 March 2019 - 06:18

  • 0

#1399 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 сообщений

Отправлено 01 March 2019 - 11:27

TopDen, насколько я понял, после убийства перестаёт работать только zlt_checkGear. Так что достаточно только его запустить после возрождения:

[] spawn zlt_checkGear;

  • 1

#1400 OFFLINE   SteelRat

SteelRat

    Полковник

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

Отправлено 01 March 2019 - 20:06

zlt_lockInvSlots = {
    waitUntil {!(isNull (findDisplay 602))};
    while {!(isNull (findDisplay 602))} do {
		// Какой смысл вызывать код в данном цикле каждую 1 тысячную секунды.
		// Данная функция вызывается только когда игрок открывает инвентарь, и завершает работу по закрытии инвентаря.
		// Код в цикле достаточно вызвать один раз, что бы блокировать контроли.
		// И по факту, можно завершать работу функции не дожидаясь закрытия инвентаря.
       ctrlEnable [6331, false];  
       ctrlEnable [6381, false]; // vest
       ctrlEnable [6240, false]; // headgear
       sleep 0.001;
    };   
};  

Далее, вместо того что бы крутить всю сессию ещё один цикл каждые полторы секунды перетрахивать инвентарь, это zlt_checkGear, эффективнее повесить плаеру хандлер Take, который срабатывает когда игрок что то подбирает даже в обход дисплея инвентаря.


  • 0




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