PC_fn_get_unit_position_id = { params ["_unit"]; private ["_position_in_group"]; for "_i" from 0 to (count units group _unit) - 1 do { if (units group _unit select _i == _unit) then { _position_in_group = _i + 1; }; }; _position_in_group; }; PC_fn_unstuck = { params ["_unit"]; //if ((isPlayer _unit) || (lifeState _unit in PC_UNSATISFACTORY_LIFESTATE)) exitWith {}; private _group = group _unit; private _position_in_group = _unit call PC_fn_get_unit_position_id; private _face = face _unit; private _name = name _unit; private _name_and_surname = (name _unit splitString "([ ]/:)"); private _type = typeOf _unit; private _rank = rank _unit; private _skill = skill _unit; private _damage = damage _unit; private _suppression = getSuppression _unit; private _animation_speed = getAnimSpeedCoef _unit; private _behaviour = behaviour _unit; private _position = position _unit; private _direction = getDir _unit; private _unit_pos = unitPos _unit; private _animation = animationState _unit; private _assigned_items = assignedItems _unit; private _uniform_items = uniformItems _unit; private _vest_items = vestItems _unit; private _backpack_items = backpackItems _unit; private _magazines = magazines _unit; private _magazinesAmmoFull = magazinesAmmoFull _unit; private _primary_weapon = primaryWeapon _unit; private _primary_weapon_items = primaryWeaponItems _unit; private _secondary_weapon = secondaryWeapon _unit; private _secondary_weapon_items = secondaryWeaponItems _unit; private _handgun_weapon = handgunWeapon _unit; private _handgun_weapon_items = handgunItems _unit; private _headgear = headgear _unit; private _uniform = uniform _unit; private _vest = vest _unit; private _backpack = backpack _unit; private _hmd = hmd _unit; private _goggles = goggles _unit; private _magazines_to_add_after_weapon = []; //private _all_traits = getAllUnitTraits _unit; private _all_traits = []; { _all_traits pushBack [_x, (_unit getUnitTrait _x)]; } forEach ["audibleCoef","camouflageCoef","loadCoef","engineer","explosiveSpecialist","medic","UAVHacker"]; private _all_hit_points = getAllHitPointsDamage _unit; /// Убираем магазины из списка экипировки, они добавляются с учетом зарядов в них: { if (_x in _magazines) then { _uniform_items = _uniform_items - [_x]; }; } forEach _uniform_items; { if (_x in _magazines) then { _backpack_items = _backpack_items - [_x]; }; } forEach _backpack_items; { if (_x in _magazines) then { _vest_items = _vest_items - [_x]; }; } forEach _vest_items; /// Создаем копию юнита, переносим личные характеристики: private _new_unit = (createGroup [side _unit, true]) createUnit [_type, _position, [], 0, "CAN_COLLIDE"]; _new_unit setDir _direction; _new_unit setUnitPos _unit_pos; _new_unit switchMove _animation; _new_unit setSkill _skill; _new_unit setRank _rank; _new_unit setName [_name, _name_and_surname select 0, _name_and_surname select 1]; _new_unit setFace _face; if (_unit == leader _group) then { _group selectLeader _new_unit; _group setCurrentWaypoint [_group,((currentWaypoint _group))]; }; if (_unit in switchableUnits) then { addSwitchableUnit _new_unit; }; _new_unit setSuppression _suppression; _new_unit setDamage _damage; _new_unit setAnimSpeedCoef _animation_speed; _new_unit setBehaviour _behaviour; { _new_unit setUnitTrait [(_x select 0), (_x select 1)]; } forEach _all_traits; for "_i" from 0 to 11 do { _new_unit setHitPointDamage [(_all_hit_points select 0 select _i), (_all_hit_points select 2 select _i)]; }; /// Меняем экипировку: removeUniform _new_unit; _new_unit forceAddUniform _uniform; removeVest _new_unit; _new_unit addVest _vest; removeBackpack _new_unit; _new_unit addBackpack _backpack; removeHeadgear _new_unit; _new_unit addHeadgear _headgear; _new_unit unlinkItem (goggles _new_unit); _new_unit addGoggles _goggles; _new_unit linkItem _goggles; /// Добавляем магазины: { if (_new_unit canAdd (_x select 0)) then { _new_unit addMagazine [_x select 0, _x select 1]; } else { _magazines_to_add_after_weapon = _magazines_to_add_after_weapon + [_x]; }; } forEach _magazinesAmmoFull; /// Заменяем оружие: _new_unit removeWeapon (primaryWeapon _new_unit); _new_unit addWeapon _primary_weapon; { _new_unit addPrimaryWeaponItem _x; } forEach _primary_weapon_items; _new_unit removeWeapon (secondaryWeapon _new_unit); _new_unit addWeapon _secondary_weapon; { _new_unit addSecondaryWeaponItem _x; } forEach _secondary_weapon_items; _new_unit removeWeapon (handgunWeapon _new_unit); _new_unit addWeapon _handgun_weapon; { _new_unit addHandgunItem _x; } forEach _handgun_weapon_items; { _new_unit addMagazine [_x select 0, _x select 1]; } forEach _magazines_to_add_after_weapon; /// Добавляем вещи по карманам: { _new_unit addItem _x; } forEach (_uniform_items)+(_vest_items)+(_backpack_items); /// Меняем все закрепленные вещи: { _new_unit unassignItem _x; _new_unit removeItem _x; } forEach assignedItems _new_unit; { _new_unit addItem _x; _new_unit assignItem _x; } forEach _assigned_items; /// Удаляем старого юнита и подключаем к группе нового: deleteVehicle _unit; _new_unit joinAsSilent [_group, _position_in_group]; }; /// Запуск перезагрузки: [_unit] call PC_fn_unstuck;
Скрипт полной перезагрузки забагованного AI юнита
Автор:
Ibragim
, 27 Jan 2021 01:32
В этой теме нет ответов
#1 OFFLINE
Отправлено 27 January 2021 - 01:32