Jump to content


Photo

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

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

  • Please log in to reply
1486 replies to this topic

#1381 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 18 January 2019 - 01:08

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

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

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

.


Edited by Schatten, 18 January 2019 - 01:13.

  • 0

#1382 OFFLINE   TopDen

TopDen

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

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

Posted 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, то они удалятся все. Как подправить этот код, чтобы удалялась только одна аптечка?


Edited by TopDen, 18 January 2019 - 10:35.

  • 0

#1383 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 18 January 2019 - 11:50

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

#1384 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 18 January 2019 - 11:51

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


Edited by Schatten, 18 January 2019 - 11:51.

  • 1

#1385 OFFLINE   TopDen

TopDen

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

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

Posted 24 January 2019 - 02:48

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

player removeItemFromBackpack "FirstAidKit";

player removeItemFromBackpack "FirstAidKit";

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


Edited by TopDen, 24 January 2019 - 02:56.

  • 0

#1386 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 24 January 2019 - 11:48

TopDen,

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

  • 1

#1387 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 24 January 2019 - 11:55

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

#1388 OFFLINE   TopDen

TopDen

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

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

Posted 01 February 2019 - 13:57

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


  • 0

#1389 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 01 February 2019 - 15:13

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

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

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

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

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

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


Edited by Schatten, 01 February 2019 - 15:19.

  • 0

#1390 OFFLINE   TopDen

TopDen

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

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

Posted 01 February 2019 - 18:11

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


  • 0

#1391 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 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 Но нужно учитывать работу модов, т. к. если эту штуку использует кто-то еще, то нужно будет объединять код.

Edited by vlad333000, 01 February 2019 - 22:01.

  • 1

#1392 OFFLINE   Scully

Scully

    Рядовой

  • Пользователи
  • 13 posts

Posted 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 posts
  • Откуда:Кострома

Posted 04 February 2019 - 04:30

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

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


2.

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

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

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


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

Edited by vlad333000, 04 February 2019 - 04:32.

  • 0

#1394 OFFLINE   Scully

Scully

    Рядовой

  • Пользователи
  • 13 posts

Posted 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 поблизости, я не могу понять как это записать.


Edited by Scully, 04 February 2019 - 13:17.

  • 0

#1395 OFFLINE   Scully

Scully

    Рядовой

  • Пользователи
  • 13 posts

Posted 04 February 2019 - 14:27

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


  • 0

#1396 OFFLINE   TopDen

TopDen

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

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

Posted 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";


Edited by TopDen, 01 March 2019 - 00:50.

  • 0

#1397 OFFLINE   vlad333000

vlad333000

    Полковник

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

Posted 01 March 2019 - 02:08

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

#1398 OFFLINE   TopDen

TopDen

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

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

Posted 01 March 2019 - 06:16

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

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


Edited by TopDen, 01 March 2019 - 06:18.

  • 0

#1399 OFFLINE   Schatten

Schatten

    Капитан

  • Пользователи
  • 1844 posts

Posted 01 March 2019 - 11:27

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

[] spawn zlt_checkGear;

  • 1

#1400 OFFLINE   SteelRat

SteelRat

    Полковник

  • Пользователи
  • 3241 posts
  • Откуда:РФ

Posted 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




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