Merge branch 'master' into pr/8215

This commit is contained in:
PabstMirror 2022-05-24 12:00:12 -05:00
commit 2041c88cee
293 changed files with 3283 additions and 1013 deletions

View File

@ -34,7 +34,7 @@ We welcome anyone to contribute to this repository. Issues that we are actively
## Pull Request process ## Pull Request process
When contributing to this repository, please first discuss the change you wish to make via issue or [Slack](https://acemod.org/slack) with the [ACE3 project maintainers](https://ace3.acemod.org/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already. When contributing to this repository, please first discuss the change you wish to make via issue or [Discord](https://acemod.org/discord) with the [ACE3 project maintainers](https://ace3.acemod.org/team.html) before making a change. This may not be necessary if you are contributing for something which has an existing issue in our repository already.
1. Please make a pull request (PR) as early as possible. This lets use help you in the proces of developing it. When opening a work in progress pull request, mark your PR with a `WIP:` prefix. 1. Please make a pull request (PR) as early as possible. This lets use help you in the proces of developing it. When opening a work in progress pull request, mark your PR with a `WIP:` prefix.
2. Describe what this pull request will do and how it solves this in the description of your PR. A clear intent and description of the way the issue is resolved will help us to review the PR more efficiently. 2. Describe what this pull request will do and how it solves this in the description of your PR. A clear intent and description of the way the issue is resolved will help us to review the PR more efficiently.
@ -47,4 +47,4 @@ Please note that all contributors to this project are volunteers and do this in
## Assistance with contributing ## Assistance with contributing
If you require assistance with contributing, check out the #dev channel on our [Slack](https://acemod.org/slack). Additional documentation can be found on our [Development wiki](https://ace3.acemod.org/wiki/development/). If you require assistance with contributing, check out the #dev channel on our [Discord](https://acemod.org/discord). Additional documentation can be found on our [Development wiki](https://ace3.acemod.org/wiki/development/).

View File

@ -175,6 +175,7 @@ VyMajoris(W-Cephei)<vycanismajoriscsa@gmail.com>
Walthzer <walthzer.69@gmail.com> Walthzer <walthzer.69@gmail.com>
Winter <simon@agius-muscat.net> Winter <simon@agius-muscat.net>
wizpig64 wizpig64
YetheSamartaka
xrufix xrufix
Zakant <Zakant@gmx.de> Zakant <Zakant@gmx.de>
zGuba zGuba

View File

@ -4,7 +4,7 @@
<p align="center"> <p align="center">
<a href="https://github.com/acemod/ACE3/releases/latest"> <a href="https://github.com/acemod/ACE3/releases/latest">
<img src="https://img.shields.io/badge/Version-3.14.1-blue.svg?style=flat-square" alt="ACE3 Version"> <img src="https://img.shields.io/badge/Version-3.15.0-blue.svg?style=flat-square" alt="ACE3 Version">
</a> </a>
<a href="https://github.com/acemod/ACE3/issues"> <a href="https://github.com/acemod/ACE3/issues">
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Issues"> <img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?style=flat-square&label=Issues" alt="ACE3 Issues">
@ -18,8 +18,8 @@
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE"> <a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
<img src="https://img.shields.io/badge/License-GPLv2-red.svg?style=flat-square" alt="ACE3 License"> <img src="https://img.shields.io/badge/License-GPLv2-red.svg?style=flat-square" alt="ACE3 License">
</a> </a>
<a href="https://acemod.org/slack"> <a href="https://acemod.org/discord">
<img src="https://img.shields.io/badge/Slack-Join-darkviolet.svg?style=flat-square" alt="ACE3 Slack"> <img src="https://img.shields.io/badge/Discord-Join-darkviolet.svg?style=flat-square" alt="ACE3 Discord">
</a> </a>
<a href="https://circleci.com/gh/acemod/ACE3"> <a href="https://circleci.com/gh/acemod/ACE3">
<img src="https://circleci.com/gh/acemod/ACE3.svg?style=svg" alt="ACE3 Build Status"> <img src="https://circleci.com/gh/acemod/ACE3.svg?style=svg" alt="ACE3 Build Status">
@ -105,8 +105,8 @@ To help us test the latest development changes, download our master branch ([dir
<table> <table>
<tr> <tr>
<td><a href="https://acemod.org/slack">Slack</a></td> <td><a href="https://acemod.org/discord">Discord</a></td>
<td>We have a public Slack team that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td> <td>We have a public Discord server that anyone can join. This is where all our developers and contributors hang out and where we make announcements</td>
</tr> </tr>
<tr> <tr>

View File

@ -9,3 +9,9 @@ class Extended_PreInit_EventHandlers {
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit)); init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
}; };
}; };
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_FILE(XEH_postInit));
};
};

View File

@ -1,2 +1,6 @@
PREP(initEjectAction);
PREP(canShowEject); PREP(canShowEject);
PREP(droneAddActions);
PREP(droneGetTurretTargetPos);
PREP(droneModifyWaypoint);
PREP(droneSetWaypoint);
PREP(initEjectAction);

View File

@ -0,0 +1,8 @@
#include "script_component.hpp"
[QGVAR(droneModifyWaypoint), LINKFUNC(droneModifyWaypoint)] call CBA_fnc_addEventHandler;
[QGVAR(droneSetWaypoint), LINKFUNC(droneSetWaypoint)] call CBA_fnc_addEventHandler;
if (hasInterface) then {
["ACE_controlledUAV", LINKFUNC(droneAddActions)] call CBA_fnc_addEventHandler;
};

View File

@ -0,0 +1,121 @@
#include "script_component.hpp"
/*
* Author: PabstMirror
* Adds actions to a drone
*
* Arguments:
* 0: vehicle <OBJECT>
*
* Return Value:
* None
*
* Example:
* [v] call ace_aircraft_fnc_droneAddActions
*
* Public: No
*/
params ["_vehicle"];
TRACE_1("droneAddActions",_vehicle);
if (!alive _vehicle) exitWith {};
if (_vehicle getVariable [QGVAR(droneActionsAdded), false]) exitWith {};
_vehicle setVariable [QGVAR(droneActionsAdded), true];
// move to location
private _condition = {
params ["_vehicle"];
(missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]}
};
private _statement = {
params ["_vehicle"];
private _group = group driver _vehicle;
private _pos = ([_vehicle, [0]] call FUNC(droneGetTurretTargetPos)) select 0;
[QGVAR(droneSetWaypoint), [_vehicle, _group, _pos, "MOVE"], _group] call CBA_fnc_targetEvent;
};
private _action = [QGVAR(droneSetWaypointMove), localize "$STR_AC_MOVE",
"\a3\3DEN\Data\CfgWaypoints\Move_ca.paa", _statement, _condition] call EFUNC(interact_menu,createAction);
[_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject);
if (_vehicle isKindOf "Air") then {
// loiter at location
_condition = {
params ["_vehicle"];
(missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]}
};
_statement = {
params ["_vehicle"];
private _group = group driver _vehicle;
private _pos = ([_vehicle, [0]] call FUNC(droneGetTurretTargetPos)) select 0;
[QGVAR(droneSetWaypoint), [_vehicle, _group, _pos, "LOITER"], _group] call CBA_fnc_targetEvent;
};
_action = [QGVAR(droneSetWaypointLoiter), localize "$STR_AC_LOITER",
"\a3\3DEN\Data\CfgWaypoints\Loiter_ca.paa", _statement, _condition] call EFUNC(interact_menu,createAction);
[_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject);
// set height
_condition = {
params ["_vehicle"];
(missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]}
};
_statement = {
params ["_vehicle", "", "_args"];
private _group = group driver _vehicle;
[QGVAR(droneModifyWaypoint), [_vehicle, _group, "height", _args], _group] call CBA_fnc_targetEvent;
};
_action = [QGVAR(setAltitude), localize "$STR_3den_waypoint_attribute_loiteraltitude_displayname",
"", {}, _condition] call EFUNC(interact_menu,createAction);
private _base = [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject);
{
_action = [str _x, str _x, "", _statement, { true }, {}, _x] call EFUNC(interact_menu,createAction);
[_vehicle, 1, _base, _action] call EFUNC(interact_menu,addActionToObject);
} forEach [20, 50, 200, 500, 2000];
// set loiter radius
_condition = {
params ["_vehicle"];
private _group = group driver _vehicle;
private _index = (currentWaypoint _group) min count waypoints _group;
private _waypoint = [_group, _index];
(missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]}
&& {(waypointType _waypoint) == "LOITER"}
};
_statement = {
params ["_vehicle", "", "_args"];
private _group = group driver _vehicle;
[QGVAR(droneModifyWaypoint), [_vehicle, _group, "radius", _args], _group] call CBA_fnc_targetEvent;
};
_action = [QGVAR(lotierRadius), localize "$STR_3den_waypoint_attribute_loiterradius_displayname",
"", {}, _condition] call EFUNC(interact_menu,createAction);
_base = [_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject);
{
_action = [str _x, str _x, "", _statement, { true }, {}, _x] call EFUNC(interact_menu,createAction);
[_vehicle, 1, _base, _action] call EFUNC(interact_menu,addActionToObject);
} forEach [500, 750, 1000, 1250, 1500];
// set loiter direction
_condition = {
params ["_vehicle", "", "_args"];
private _group = group driver _vehicle;
private _index = (currentWaypoint _group) min count waypoints _group;
private _waypoint = [_group, _index];
(missionNamespace getVariable [QGVAR(droneWaypoints), true]) && {waypointsEnabledUAV _vehicle} && {(ACE_controlledUAV select 2) isEqualTo [0]}
&& {(waypointType _waypoint) == "LOITER"} && {(waypointLoiterType _waypoint) != _args}
};
_statement = {
params ["_vehicle", "", "_args"];
private _group = group driver _vehicle;
[QGVAR(droneModifyWaypoint), [_vehicle, _group, "dir", _args], _group] call CBA_fnc_targetEvent;
};
_action = [QGVAR(lotierTypeR), localize "$STR_3den_waypoint_attribute_loiterdirection_displayname",
"\a3\3DEN\Data\Attributes\LoiterDirection\cw_ca.paa", _statement, _condition, {}, "CIRCLE"] call EFUNC(interact_menu,createAction);
[_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject);
_action = [QGVAR(lotierTypeR), localize "$STR_3den_waypoint_attribute_loiterdirection_displayname",
"\a3\3DEN\Data\Attributes\LoiterDirection\ccw_ca.paa", _statement, _condition, {}, "CIRCLE_L"] call EFUNC(interact_menu,createAction);
[_vehicle, 1, ["ACE_SelfActions"], _action] call EFUNC(interact_menu,addActionToObject);
};

View File

@ -0,0 +1,46 @@
#include "script_component.hpp"
/*
* Author: PabstMirror
* Get drone's target location, if aimed at infinity it will return a virtual point
*
* Arguments:
* 0: vehicle <OBJECT>
*
* Return Value:
* [PosASL <ARRAY>, Real <BOOL>]
*
* Example:
* [v] call ace_aircraft_fnc_droneGetTurretTargetPos
*
* Public: No
*/
params ["_vehicle"];
private _turret = [0];
TRACE_2("droneGetTurretTargetPos",_vehicle,_turret);
private _turretConfig = [_vehicle, _turret] call CBA_fnc_getTurret;
private _gunBeg = _vehicle selectionPosition getText (_turretConfig >> "gunBeg");
private _gunEnd = _vehicle selectionPosition getText (_turretConfig >> "gunEnd");
if (_gunEnd isEqualTo _gunBeg) then {
// e.g. Darter doesn't have valid gunBeg/gunEnd
private _vehicleConfig = configOf _vehicle;
_gunBeg = _vehicle selectionPosition getText (_vehicleConfig >> "uavCameraGunnerDir");
_gunEnd = _vehicle selectionPosition getText (_vehicleConfig >> "uavCameraGunnerPos");
};
_gunBeg = AGLToASL (_vehicle modelToWorld _gunBeg);
_gunEnd = AGLToASL (_vehicle modelToWorld _gunEnd);
private _turretDir = _gunEnd vectorFromTo _gunBeg;
private _farPoint = _gunEnd vectorAdd (_turretDir vectorMultiply 4999);
private _intersections = lineIntersectsSurfaces [_gunEnd, _farPoint, _vehicle, objNull, true, 1];
if (_intersections isNotEqualTo []) then {
[_intersections select 0 select 0, true]
} else {
// Not looking at anything, just get a virtual point where the camera is pointing
_farPoint set [2, 0 max getTerrainHeightASL _farPoint];
[_farPoint, false]
};

View File

@ -0,0 +1,36 @@
#include "script_component.hpp"
/*
* Author: PabstMirror
* Modify the current waypoint of a drone
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: Group <GROUP>
* 2: Type <STRING>
* 3: Value <ANY>
*
* Return Value:
* None
*
* Example:
* [v, group v, "height", 2000] call ace_aircraft_fnc_droneModifyWaypoint
*
* Public: No
*/
params ["_vehicle", "_group", "_type", "_value"];
TRACE_4("droneModifyWaypoint",_vehicle,_group,_type,_value);
private _index = (currentWaypoint _group) min count waypoints _group;
private _waypoint = [_group, _index];
switch (toLower _type) do {
case ("height"): {
private _pos = waypointPosition _waypoint;
_pos set [2, _value];
_waypoint setWaypointPosition [_pos, 0];
_vehicle flyInHeight _value;
};
case ("radius"): { _waypoint setWaypointLoiterRadius _value; };
case ("dir"): { _waypoint setWaypointLoiterType _value; };
};
_group setCurrentWaypoint _waypoint;

View File

@ -0,0 +1,43 @@
#include "script_component.hpp"
/*
* Author: PabstMirror
* Set new waypoint of a drone
*
* Arguments:
* 0: Vehicle <OBJECT>
* 1: Group <GROUP>
* 2: Pos 2D <ARRAY>
* 3: Type <STRING>
*
* Return Value:
* None
*
* Example:
* [v, group v, [2000,5000], "LOITER"] call ace_aircraft_fnc_droneSetWaypoint
*
* Public: No
*/
params ["_vehicle", "_group", "_pos", "_type"];
TRACE_4("droneSetWaypoint",_vehicle,_group,_pos,_type);
private _index = (currentWaypoint _group) min count waypoints _group;
private _waypoint = [_group, _index];
// Try to save attributes from existing waypoint
private _currentHeight = round ((waypointPosition _waypoint) select 2);
private _currentLoiterRadius = waypointLoiterRadius _waypoint;
private _currentLoiterType = waypointLoiterType _waypoint;
// Set pos to ATL
_pos set [2, if (_currentHeight >= 50) then { _currentHeight } else { 0 }];
// [_group] call CBA_fnc_clearWaypoints;
_waypoint = _group addWaypoint [_pos, 0];
_waypoint setWaypointType _type;
TRACE_3("",_currentHeight,_currentLoiterRadius,_currentLoiterType);
if (_currentHeight > 1) then { _vehicle flyInHeight _currentHeight; };
if (_currentLoiterRadius > 1) then { _waypoint setWaypointLoiterRadius _currentLoiterRadius; };
if (_currentLoiterType != "") then { _waypoint setWaypointLoiterType _currentLoiterType; };
_group setCurrentWaypoint _waypoint;

View File

@ -89,7 +89,7 @@ private _compatibleMagazines = [[[], []], [[], []], [[], []]];
// Magazine groups // Magazine groups
{ {
private _magazineGroups = uiNamespace getVariable [QGVAR(magazineGroups),["#CBA_HASH#",[],[],[]]]; private _magazineGroups = uiNamespace getVariable [QGVAR(magazineGroups), createHashMap];
private _magArray = _magazineGroups get (toLower _x); private _magArray = _magazineGroups get (toLower _x);
{((_compatibleMagazines select _index) select _subIndex) pushBackUnique _x} forEach _magArray; {((_compatibleMagazines select _index) select _subIndex) pushBackUnique _x} forEach _magArray;
} foreach ([getArray (_weaponConfig >> _x >> "magazineWell"), getArray (_weaponConfig >> "magazineWell")] select (_x == "this")); } foreach ([getArray (_weaponConfig >> _x >> "magazineWell"), getArray (_weaponConfig >> "magazineWell")] select (_x == "this"));

View File

@ -322,6 +322,11 @@ class CfgVehicles {
GVAR(canLoad) = 1; GVAR(canLoad) = 1;
}; };
// Invisible Target Soldier
class TargetSoldierBase: StaticWeapon {
GVAR(canLoad) = 0;
};
class StaticMortar; class StaticMortar;
class Mortar_01_base_F: StaticMortar { class Mortar_01_base_F: StaticMortar {
GVAR(size) = 2; // 1 = small, 2 = large GVAR(size) = 2; // 1 = small, 2 = large

View File

@ -19,5 +19,6 @@ PREP(setSize);
PREP(setSpace); PREP(setSpace);
PREP(startLoadIn); PREP(startLoadIn);
PREP(startUnload); PREP(startUnload);
PREP(unloadCarryItem);
PREP(unloadItem); PREP(unloadItem);
PREP(validateCargoSpace); PREP(validateCargoSpace);

View File

@ -50,8 +50,6 @@
GVAR(interactionParadrop) = false; GVAR(interactionParadrop) = false;
createDialog QGVAR(menu); createDialog QGVAR(menu);
}; };
// TOOO maybe drag/carry the unloaded item?
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
[QGVAR(serverUnload), { [QGVAR(serverUnload), {

View File

@ -35,7 +35,8 @@ if (_item isEqualType "") then {
} else { } else {
_validItem = _validItem =
(alive _item) && (alive _item) &&
{_ignoreInteraction || {([_item, _vehicle] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}}; {_ignoreInteraction || {([_item, _vehicle] call EFUNC(interaction,getInteractionDistance)) < MAX_LOAD_DISTANCE}} &&
{!(_item getVariable [QEGVAR(cookoff,isCookingOff), false])};
}; };
_validItem && _validItem &&

View File

@ -19,6 +19,7 @@ private _display = uiNamespace getVariable QGVAR(menuDisplay);
if (isNil "_display") exitWith {}; if (isNil "_display") exitWith {};
private _ctrlEditText = ctrlText 100; private _ctrlEditText = ctrlText 100;
_ctrlEditText = _ctrlEditText select [0,32];
if (_ctrlEditText isEqualTo "") then { // custom name has been removed if (_ctrlEditText isEqualTo "") then { // custom name has been removed
[LSTRING(clearedCustomName), 3] call EFUNC(common,displayTextStructured); [LSTRING(clearedCustomName), 3] call EFUNC(common,displayTextStructured);
} else { } else {

View File

@ -0,0 +1,39 @@
#include "script_component.hpp"
/*
* Author: GhostIsSpooky
* Dragging integration. Unloader starts carrying unloaded object.
*
* Arguments:
* 0: Unloader <OBJECT>
* 1: Item <OBJECT>
*
* Return Value:
* None
*
* Example:
* [player, object] call ace_cargo_fnc_unloadCarryItem
*
* Public: No
*/
params ["_unloader", "_object"];
TRACE_2("unloadCarryItem-start",_unloader,_object);
if !(["ace_dragging"] call EFUNC(common,isModLoaded)) exitWith {};
// When unloading attached objects, this code will run before server has finished moving object to the safe position
[{
params ["_unloader", "_object"];
(_unloader distance _object) < 10
}, {
params ["_unloader", "_object"];
TRACE_2("unloadCarryItem-unloaded",_unloader,_object);
if ([_unloader, _object] call EFUNC(dragging,canCarry)) exitWith {
[_unloader, _object] call EFUNC(dragging,startCarry);
};
if ([_unloader, _object] call EFUNC(dragging,canDrag)) exitWith {
[_unloader, _object] call EFUNC(dragging,startDrag);
};
}, _this, 1.0, { // delay is based on how long it will take server event to trigger and take effect
// not a hard error if this fails, could have just unloaded to other side of vehicle because of findSafePos
TRACE_1("unloadCarryItem-failed to unload nearby player",_this);
}] call CBA_fnc_waitUntilAndExecute;

View File

@ -60,6 +60,10 @@ if (_object isEqualType objNull) then {
[QEGVAR(common,fixCollision), _object] call CBA_fnc_localEvent; [QEGVAR(common,fixCollision), _object] call CBA_fnc_localEvent;
[QEGVAR(common,fixPosition), _object] call CBA_fnc_localEvent; [QEGVAR(common,fixPosition), _object] call CBA_fnc_localEvent;
}; };
// Dragging integration
[_unloader, _object] call FUNC(unloadCarryItem);
// Invoke listenable event // Invoke listenable event
["ace_cargoUnloaded", [_object, _vehicle, "unload"]] call CBA_fnc_globalEvent; ["ace_cargoUnloaded", [_object, _vehicle, "unload"]] call CBA_fnc_globalEvent;
true true

View File

@ -0,0 +1 @@
z\ace\addons\casings

View File

@ -0,0 +1,17 @@
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
};
};
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
};
};

4
addons/casings/README.md Normal file
View File

@ -0,0 +1,4 @@
ace_casings
===============
Create persistent empty casing when bullets are fired by infantry weapons.

View File

@ -0,0 +1 @@
PREP(createCasing);

View File

@ -0,0 +1,7 @@
#include "script_component.hpp"
if (!hasInterface || !GVAR(enabled)) exitWith {};
GVAR(cachedCasings) = createHashMap;
GVAR(casings) = [];
["CAManBase", "FiredMan", {call FUNC(createCasing)}] call CBA_fnc_addClassEventHandler;

View File

@ -0,0 +1,11 @@
#include "script_component.hpp"
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
ADDON = true;

View File

@ -0,0 +1,3 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"

17
addons/casings/config.cpp Normal file
View File

@ -0,0 +1,17 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_common"};
author = ECSTRING(common,ACETeam);
authors[] = {"esteldunedain","Cyruz","diwako"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgEventHandlers.hpp"

View File

@ -0,0 +1,68 @@
#include "script_component.hpp"
/*
* Author: esteldunedain / Cyruz / diwako
* Produces a casing matching the fired weapons caliber on the ground around the unit
*
* Arguments:
* 0: unit - Object the event handler is assigned to <OBJECT>
* 1: ammo - Ammo used <STRING>
*
* Return Value:
* None
*
* Example:
* [player, "", "","", "B_556x45_Ball"] call ace_casings_fnc_createCasing
*
* Public: No
*/
params ["_unit", "", "", "", "_ammo"];
if (!isNull objectParent _unit) exitWith {};
private _modelPath = GVAR(cachedCasings) get _ammo;
if (isNil "_modelPath") then {
private _cartridge = getText (configFile >> "CfgAmmo" >> _ammo >> "cartridge");
//Default cartridge is a 5.56mm model
_modelPath = switch (_cartridge) do {
case "FxCartridge_9mm": { "A3\Weapons_f\ammo\cartridge_small.p3d" };
case "FxCartridge_65": { "A3\weapons_f\ammo\cartridge_65.p3d" };
case "FxCartridge_762": { "A3\weapons_f\ammo\cartridge_762.p3d" };
case "FxCartridge_127": { "A3\weapons_f\ammo\cartridge_127.p3d" };
case "FxCartridge_slug": { "A3\weapons_f\ammo\cartridge_slug.p3d" };
case "": { "" };
default { "A3\Weapons_f\ammo\cartridge.p3d" };
};
GVAR(cachedCasings) set [_ammo, _modelPath];
};
if (_modelPath isEqualTo "") exitWith {};
private _unitPos = getposASL _unit;
// Distant shooters don't produce as many cases
if ((AGLToASL positionCameraToWorld [0,0,0]) vectorDistance _unitPos > 100 && {random 1 < 0.9}) exitWith {};
private _weapDir = _unit weaponDirection currentWeapon _unit;
private _ejectDir = _weapDir vectorCrossProduct [0, 0, 1];
private _pos = _unitPos
vectorAdd (_weapDir vectorMultiply (-0.5 + random 2))
vectorAdd (_ejectDir vectorMultiply (0.2 + random 2));
[
{
params ["_modelPath", "_pos"];
private _lisPos = (lineIntersectsSurfaces [_pos, _pos vectorAdd [0,0,-1e11], objNull, objNull, true, 1, "ROADWAY", "FIRE"]) #0;
private _casing = createSimpleObject [_modelPath, (_lisPos #0 vectorAdd [0,0,0.005]), true];
_casing setDir (random 360);
_casing setVectorUp _lisPos #1;
private _idx = GVAR(casings) pushBack _casing;
for "_" from 0 to (_idx - GVAR(maxCasings)) do {
deleteVehicle (GVAR(casings) deleteAt 0);
};
},
[_modelPath,_pos],
0.4
] call CBA_fnc_waitAndExecute;

View File

@ -0,0 +1 @@
#include "\z\ace\addons\casings\script_component.hpp"

View File

@ -0,0 +1,17 @@
[
QGVAR(enabled), "CHECKBOX",
[LSTRING(displayName), LSTRING(description)],
LSTRING(Settings_DisplayName),
true,
false,
{},
true
] call CBA_fnc_addSetting;
[
QGVAR(maxCasings), "SLIDER",
[LSTRING(maxCasings_displayName), LSTRING(maxCasings_description)],
LSTRING(Settings_DisplayName),
[100, 500, 250, -1],
false
] call CBA_fnc_addSetting;

View File

@ -0,0 +1,17 @@
#define COMPONENT casings
#define COMPONENT_BEAUTIFIED Casings
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_CASINGS
#define DEBUG_MODE_FULL
#endif
#ifdef DEBUG_SETTINGS_CASINGS
#define DEBUG_SETTINGS DEBUG_SETTINGS_CASINGS
#endif
#include "\z\ace\addons\main\script_macros.hpp"

View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="utf-8"?>
<Project name="ACE">
<Package name="Casings">
<Key ID="STR_ACE_Casings_Settings_DisplayName">
<English>ACE Casings</English>
</Key>
<Key ID="STR_ACE_Casings_displayName">
<English>Casings Enabled</English>
</Key>
<Key ID="STR_ACE_Casings_description">
<English>Enable persistent casings (POTENTIAL performance impact on old/weak systems)</English>
</Key>
<Key ID="STR_ACE_Casings_maxCasings_displayName">
<English>Maximum casings</English>
</Key>
<Key ID="STR_ACE_Casings_maxCasings_description">
<English>Maximum amount of casings to display</English>
</Key>
</Package>
</Project>

View File

@ -111,7 +111,6 @@ PREP(inTransitionAnim);
PREP(isAwake); PREP(isAwake);
PREP(isEngineer); PREP(isEngineer);
PREP(isEOD); PREP(isEOD);
PREP(isFeatureCameraActive);
PREP(isInBuilding); PREP(isInBuilding);
PREP(isMedic); PREP(isMedic);
PREP(isModLoaded); PREP(isModLoaded);
@ -127,7 +126,6 @@ PREP(muteUnitHandleInitPost);
PREP(muteUnitHandleRespawn); PREP(muteUnitHandleRespawn);
PREP(nearestVehiclesFreeSeat); PREP(nearestVehiclesFreeSeat);
PREP(numberToDigits); PREP(numberToDigits);
PREP(numberToDigitsString);
PREP(numberToString); PREP(numberToString);
PREP(onAnswerRequest); PREP(onAnswerRequest);
PREP(owned); PREP(owned);
@ -187,6 +185,7 @@ PREP(uniqueElements);
PREP(uniqueItems); PREP(uniqueItems);
PREP(unloadPerson); PREP(unloadPerson);
PREP(unloadPersonLocal); PREP(unloadPersonLocal);
PREP(unloadUnitWeapon);
PREP(unmuteUnit); PREP(unmuteUnit);
PREP(useItem); PREP(useItem);
PREP(useMagazine); PREP(useMagazine);

View File

@ -27,6 +27,7 @@
["blockThrow", false, ["ACE_Attach", "ACE_concertina_wire", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_rearm", "ACE_refuel", "ACE_Sandbag", "ACE_Trenches", "ACE_tripod"]] call FUNC(statusEffect_addType); ["blockThrow", false, ["ACE_Attach", "ACE_concertina_wire", "ACE_dragging", "ACE_Explosives", "ACE_Ladder", "ACE_rearm", "ACE_refuel", "ACE_Sandbag", "ACE_Trenches", "ACE_tripod"]] call FUNC(statusEffect_addType);
["setHidden", true, ["ace_unconscious"]] call FUNC(statusEffect_addType); ["setHidden", true, ["ace_unconscious"]] call FUNC(statusEffect_addType);
["blockRadio", false, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType); ["blockRadio", false, [QEGVAR(captives,Handcuffed), QEGVAR(captives,Surrendered), "ace_unconscious"]] call FUNC(statusEffect_addType);
["blockSpeaking", false, ["ace_unconscious"]] call FUNC(statusEffect_addType);
[QGVAR(forceWalk), { [QGVAR(forceWalk), {
params ["_object", "_set"]; params ["_object", "_set"];
@ -86,6 +87,17 @@
}; };
}] call CBA_fnc_addEventHandler; }] call CBA_fnc_addEventHandler;
[QGVAR(blockSpeaking), {
params ["_object", "_set"];
TRACE_2("blockSpeaking EH",_object,_set);
if (["acre_main"] call FUNC(isModLoaded)) then {
_object setVariable ["acre_sys_core_isDisabled", _set > 0, true];
};
if (["task_force_radio"] call FUNC(isModLoaded)) then {
_object setVariable ["tf_voiceVolume", [1, 0] select (_set > 0), true];
};
}] call CBA_fnc_addEventHandler;
[QGVAR(blockDamage), { //Name reversed from `allowDamage` because we want NOR logic [QGVAR(blockDamage), { //Name reversed from `allowDamage` because we want NOR logic
params ["_object", "_set"]; params ["_object", "_set"];
if ((_object isKindOf "CAManBase") && {(["ace_medical"] call FUNC(isModLoaded))}) then { if ((_object isKindOf "CAManBase") && {(["ace_medical"] call FUNC(isModLoaded))}) then {
@ -527,4 +539,21 @@ GVAR(deviceKeyCurrentIndex) = -1;
{false}, {false},
[0xC7, [true, false, false]], false] call CBA_fnc_addKeybind; //SHIFT + Home Key [0xC7, [true, false, false]], false] call CBA_fnc_addKeybind; //SHIFT + Home Key
["ACE3 Weapons", QGVAR(unloadWeapon), localize LSTRING(unloadWeapon), {
// Conditions:
if !([ACE_player, objNull, ["isNotInside"]] call FUNC(canInteractWith)) exitWith {false};
private _currentWeapon = currentWeapon ACE_player;
if !(_currentWeapon != primaryWeapon _unit && {_currentWeapon != handgunWeapon _unit} && {_currentWeapon != secondaryWeapon _unit}) exitWith {false};
private _currentMuzzle = currentMuzzle ACE_player;
private _currentAmmoCount = ACE_player ammo _currentMuzzle;
if (_currentAmmoCount < 1) exitWith {false};
// Statement:
[ACE_player, _currentWeapon, _currentMuzzle, _currentAmmoCount, false] call FUNC(unloadUnitWeapon);
true
}, {false}, [19, [false, false, true]], false] call CBA_fnc_addKeybind; //ALT + R Key
GVAR(commonPostInited) = true; GVAR(commonPostInited) = true;

View File

@ -1,39 +0,0 @@
#include "script_component.hpp"
/*
* Author: Sniperwolf572
* Checks if one of the following common feature cameras is active:
*
* - Curator
* - ACE Spectator
* - Arsenal camera (BIS_fnc_arsenal)
* - Nexus Spectator (BIS_fnc_EGSpectator)
* - Establishing shot (BIS_fnc_establishingShot)
* - Splendid camera (BIS_fnc_camera)
* - Animation viewer (BIS_fnc_animViewer)
* - Classic camera (BIS_fnc_cameraOld)
*
* Arguments:
* 0: None <NIL>
*
* Return Value:
* A feature camera is active <BOOL>
*
* Example:
* [] call ace_common_fnc_isFeatureCameraActive
*
* Public: Yes
*/
ACE_DEPRECATED(QFUNC(isFeatureCameraActive),"3.14.0","CBA_fnc_getActiveFeatureCamera");
!(
isNull curatorCamera && // Curator
{!GETMVAR(EGVAR(spectator,isSet),false)} && // ACE Spectator
{GETMVAR(EGVAR(huntir,stop),true)} && // ACE Hunt IR
{isNull GETMVAR(BIS_EGSpectatorCamera_camera, objNull)} && // BIS Nexus Spectator
{isNull GETUVAR(BIS_fnc_arsenal_cam, objNull)} && // Arsenal camera
{isNull GETMVAR(BIS_fnc_establishingShot_fakeUAV, objNull)} && // Establishing shot camera
{isNull GETMVAR(BIS_fnc_camera_cam, objNull)} && // Splendid camera
{isNull GETUVAR(BIS_fnc_animViewer_cam, objNull)} && // Animation viewer camera
{isNull GETMVAR(BIS_DEBUG_CAM, objNull)} // Classic camera
) // return

View File

@ -1,21 +0,0 @@
#include "script_component.hpp"
/*
* Author: commy2
* Transforms a number to an string of the correspondending digits.
*
* Arguments:
* 0: Number to 'digitize' <NUMBER>
* 1: Set the minimal length of the returned string. Useful for getting left hand zeroes. (Optional) <NUMBER>
*
* Return Value:
* Digits. The maximum length is six digits. <STRING>
*
* Example:
* [5, 5] call ace_common_fnc_numberToDigitsString
*
* Public: Yes
*/
ACE_DEPRECATED(QFUNC(numberToDigitsString),"3.14.0","CBA_fnc_formatNumber");
_this call CBA_fnc_formatNumber

View File

@ -31,7 +31,6 @@ if (_setVolume) then {
2 fadeSound NORMAL_LEVEL; 2 fadeSound NORMAL_LEVEL;
// TFAR // TFAR
_unit setVariable ["tf_voiceVolume", NORMAL_LEVEL, true];
_unit setVariable ["tf_globalVolume", NORMAL_LEVEL]; _unit setVariable ["tf_globalVolume", NORMAL_LEVEL];
// ACRE2 // ACRE2
@ -42,7 +41,6 @@ if (_setVolume) then {
2 fadeSound MUTED_LEVEL; 2 fadeSound MUTED_LEVEL;
// TFAR // TFAR
_unit setVariable ["tf_voiceVolume", NO_SOUND, true];
_unit setVariable ["tf_globalVolume", MUTED_LEVEL]; _unit setVariable ["tf_globalVolume", MUTED_LEVEL];
// ACRE2 // ACRE2

View File

@ -0,0 +1,87 @@
#include "script_component.hpp"
/*
* Author: drofseh & Commy2
* Unload the magazine from the unit's weapon and attempt to put it in a sensible place.
*
* Arguments:
* 0: Player <OBJECT>
* 1: Weapon <STRING>
* 2: Muzzle (optional, default: Weapon)<STRING>
* 3: Ammo count (optional, default: ammo currentMuzzle Player) <NUMBER>
* 4: Skip animation? (optional, default: false) <BOOL>
*
* Return Value:
* None
*
* Example:
* [ACE_player, currentWeapon ACE_player, currentMuzzle ACE_player, 23, false] call ace_common_fnc_unloadUnitWeapon
*
* Public: No
*/
params ["_unit", "_weapon", ["_muzzle", _weapon], ["_ammoCount", _unit ammo _muzzle ], ["_skipAnim", false]];
TRACE_5("params",_unit,_weapon,_muzzle,_ammoCount,_skipAnim);
// audiovisual effects
private _delay = 0;
if !(_skipAnim) then {
_delay = 1.5;
private _config = configFile >> "CfgWeapons" >> _weapon;
if (_weapon != _muzzle) then {
_config = _config >> _muzzle;
};
// get and play animation
private _unloadAction = getText (_config >> "ACE_unloadAction");
if (_unloadAction == "") then {
_unloadAction = getText (_config >> "reloadAction");
};
[_unit, _unloadAction, 1] call FUNC(doGesture);
// get and play sound
private _unloadSound = getText (_config >> "ACE_unloadSound");
if (_unloadSound == "") then {
_unloadSound = "A3\Sounds_F\arsenal\weapons\Rifles\Katiba\reload_Katiba.wss";
private _unloadSoundArray = getArray (_config >> "reloadMagazineSound");
// file extention is required for playSound3D
if (_unloadSoundArray isNotEqualTo []) then {
private _wssTest = format ["%1.wss", _unloadSoundArray select 0];
if (fileExists _wssTest) then {
_unloadSound = _wssTest;
} else {
private _wavTest = format ["%1.wav", _unloadSoundArray select 0];
if (fileExists _wavTest) then {
_unloadSound = _wavTest;
};
};
};
};
playSound3D [_unloadSound, _unit];
};
// remove magazine from weapon and add it to inventory
[{
params ["_unit", "_weapon", "_ammoCount"];
// remove weapon item
private _magazineClass = currentMagazine _unit;
switch true do {
case (_weapon == primaryWeapon _unit): {
_unit removePrimaryWeaponItem _magazineClass;
};
case (_weapon == handgunWeapon _unit): {
_unit removeHandgunItem _magazineClass;
};
case (_weapon == secondaryWeapon _unit): {
_unit removeSecondaryWeaponItem _magazineClass;
};
};
[_unit, _magazineClass, _ammoCount, true] call CBA_fnc_addMagazine;
}, [_unit, _weapon, _ammoCount], _delay] call CBA_fnc_waitAndExecute;

View File

@ -890,7 +890,7 @@
<Russian>Проверять все аддоны</Russian> <Russian>Проверять все аддоны</Russian>
<Italian>Controlla tutti gli addon</Italian> <Italian>Controlla tutti gli addon</Italian>
<Japanese>全アドオンを検査</Japanese> <Japanese>全アドオンを検査</Japanese>
<Korean>모든 드온 검사</Korean> <Korean>모든 드온 검사</Korean>
<Chinese>檢查所有模組</Chinese> <Chinese>檢查所有模組</Chinese>
<Chinesesimp>检查所有模组</Chinesesimp> <Chinesesimp>检查所有模组</Chinesesimp>
</Key> </Key>
@ -939,7 +939,7 @@
<Russian>Какие аддоны дополнительно разрешены?</Russian> <Russian>Какие аддоны дополнительно разрешены?</Russian>
<Italian>Quali addon sono permessi in ogni caso?</Italian> <Italian>Quali addon sono permessi in ogni caso?</Italian>
<Japanese>どのようなアドオンを許可しますか?</Japanese> <Japanese>どのようなアドオンを許可しますか?</Japanese>
<Korean>허가되는 에드온은 어느것입니까?</Korean> <Korean>허가되는 애드온은 어느 것입니까?</Korean>
<Chinese>哪些模組是可被允許/忽略的?</Chinese> <Chinese>哪些模組是可被允許/忽略的?</Chinese>
<Chinesesimp>无论如何都允许的附加组件</Chinesesimp> <Chinesesimp>无论如何都允许的附加组件</Chinesesimp>
</Key> </Key>
@ -1635,5 +1635,8 @@
<Chinese>受所在位置影響提升醫療能力</Chinese> <Chinese>受所在位置影響提升醫療能力</Chinese>
<Turkish>Konumlar Tedaviyi Hızlandırır</Turkish> <Turkish>Konumlar Tedaviyi Hızlandırır</Turkish>
</Key> </Key>
<Key ID="STR_ACE_Common_unloadWeapon">
<English>Unload Weapon</English>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -96,7 +96,7 @@ if (_smokeDelayEnabled) then {
_fireSource = selectRandom _positions; _fireSource = selectRandom _positions;
}; };
[QGVAR(cookOffEffect), [_vehicle, true, _ring, _time, _fireSource]] call CBA_fnc_globalEvent; [QGVAR(cookOffEffect), [_vehicle, true, _ring, _time, _fireSource, _intensity]] call CBA_fnc_globalEvent;
_intensity = _intensity - (0.5 max random 1); _intensity = _intensity - (0.5 max random 1);
_vehicle setVariable [QGVAR(intensity), _intensity]; _vehicle setVariable [QGVAR(intensity), _intensity];

View File

@ -9,6 +9,7 @@
* 2: Spawn fire ring <Boolean> * 2: Spawn fire ring <Boolean>
* 3: How long effect will last (Max 20 seconds) <Number> * 3: How long effect will last (Max 20 seconds) <Number>
* 4: What selection will fire originate from <String> * 4: What selection will fire originate from <String>
* 5: Cookoff intensity value <Number>
* *
* Return Value: * Return Value:
* None * None
@ -19,7 +20,7 @@
* Public: No * Public: No
*/ */
params ["_obj", "_jet", "_ring", "_time", "_fireSelection"]; params ["_obj", "_jet", "_ring", "_time", "_fireSelection", "_intensity"];
private _light = "#lightpoint" createVehicleLocal [0,0,0]; private _light = "#lightpoint" createVehicleLocal [0,0,0];
_light setLightBrightness 5; _light setLightBrightness 5;
_light setLightAmbient [0.8, 0.6, 0.2]; _light setLightAmbient [0.8, 0.6, 0.2];
@ -43,12 +44,14 @@ if (isServer) then {
[{ [{
params ["_args", "_pfh"]; params ["_args", "_pfh"];
_args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound"]; _args params ["_obj", "_jet", "_ring", "_time", "_startTime", "_light", "_fireSelection", "_sound", "_intensity"];
private _elapsedTime = CBA_missionTime - _startTime; private _elapsedTime = CBA_missionTime - _startTime;
if (_elapsedTime >= _time) exitWith { if (_elapsedTime >= _time) exitWith {
deleteVehicle _light; deleteVehicle _light;
deleteVehicle _sound; deleteVehicle _sound;
[QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_globalEvent; if (isServer) then {
[QEGVAR(fire,removeFireSource), [_obj]] call CBA_fnc_localEvent;
};
[_pfh] call CBA_fnc_removePerFrameHandler; [_pfh] call CBA_fnc_removePerFrameHandler;
}; };
private _factor = (1 + (_elapsedTime / 2) min 2); private _factor = (1 + (_elapsedTime / 2) min 2);
@ -183,5 +186,14 @@ if (isServer) then {
[2 + random 1], 1, 0, "", "", _obj [2 + random 1], 1, 0, "", "", _obj
]; ];
}; };
}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound]] call cba_fnc_addPerFrameHandler;
(getVehicleTIPars _obj) params ["_tiEngine", "_tiWheels", "_tiWeapon"];
_obj setVehicleTIPars [
// formula is designed to have the temperature ramp up quickly and then level out
(_tiEngine + (_intensity * 0.01))/1.005,
(_tiWheels + (_intensity * 0.004))/1.002, // wheels//tracks are further away from burning parts
(_tiWeapon + (_intensity * 0.01))/1.005
];
}, 0, [_obj, _jet, _ring, _time, CBA_missionTime, _light, _fireSelection, _sound, _intensity]] call CBA_fnc_addPerFrameHandler;

View File

@ -19,6 +19,7 @@ PREP(assemble_pickupWeapon);
PREP(canGetIn); PREP(canGetIn);
PREP(getIn); PREP(getIn);
PREP(getCarryMagazine);
PREP(proxyWeapon); PREP(proxyWeapon);
PREP(reload_actionsLoad); PREP(reload_actionsLoad);

View File

@ -31,13 +31,7 @@ private _allCarryMags = [];
private _weapon = _x; private _weapon = _x;
{ {
private _xMag = _x; private _xMag = _x;
private _carryMag = GVAR(vehicleMagCache) get _xMag; private _carryMag = _xMag call FUNC(getCarryMagazine);
if (isNil "_carryMag") then {
private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups));
_carryMag = configName (_groups param [0, configNull]);
GVAR(vehicleMagCache) set [_x, _carryMag];
TRACE_2("setting cache",_xMag,_carryMag);
};
if (_carryMag != "") then { if (_carryMag != "") then {
_turretMagsCSW pushBackUnique _xMag; _turretMagsCSW pushBackUnique _xMag;
_allCarryMags pushBackUnique _carryMag; _allCarryMags pushBackUnique _carryMag;

View File

@ -21,12 +21,14 @@
// Remove the tripod from the launcher slot // Remove the tripod from the launcher slot
private _secondaryWeaponClassname = secondaryWeapon _player; private _secondaryWeaponClassname = secondaryWeapon _player;
// handle loaded launchers which can become csw like CUP Metis
private _secondaryWeaponMagazine = secondaryWeaponMagazine _player param [0, ""];
_player removeWeaponGlobal (secondaryWeapon _player); _player removeWeaponGlobal (secondaryWeapon _player);
private _onFinish = { private _onFinish = {
params ["_args"]; params ["_args"];
_args params ["_player", "_secondaryWeaponClassname"]; _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"];
TRACE_2("deployTripod finish",_player,_secondaryWeaponClassname); TRACE_3("deployTripod finish",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine);
private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy"); private _tripodClassname = getText(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deploy");
@ -34,6 +36,9 @@
private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"]; private _cswTripod = createVehicle [_tripodClassname, [0, 0, 0], [], 0, "NONE"];
// Because the tripod can be a "full weapon" we disable any data that will allow it to be loaded // Because the tripod can be a "full weapon" we disable any data that will allow it to be loaded
_cswTripod setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set enabled&unload assembly mode and broadcast _cswTripod setVariable [QGVAR(assemblyMode), 2, true]; // Explicitly set enabled&unload assembly mode and broadcast
if (_secondaryWeaponMagazine isNotEqualTo "") then {
_cswTripod setVariable [QGVAR(secondaryWeaponMagazine), _secondaryWeaponMagazine];
};
if (!GVAR(defaultAssemblyMode)) then { if (!GVAR(defaultAssemblyMode)) then {
TRACE_1("global disableVanillaAssembly event",_cswTripod); // handles it being assembled when setting is disabled TRACE_1("global disableVanillaAssembly event",_cswTripod); // handles it being assembled when setting is disabled
[QGVAR(disableVanillaAssembly), [_cswTripod]] call CBA_fnc_globalEvent; [QGVAR(disableVanillaAssembly), [_cswTripod]] call CBA_fnc_globalEvent;
@ -61,12 +66,15 @@
private _onFailure = { private _onFailure = {
params ["_args"]; params ["_args"];
_args params ["_player", "_secondaryWeaponClassname"]; _args params ["_player", "_secondaryWeaponClassname", "_secondaryWeaponMagazine"];
TRACE_2("deployTripod failure",_player,_secondaryWeaponClassname); TRACE_3("deployTripod failure",_player,_secondaryWeaponClassname,_secondaryWeaponMagazine);
_player addWeaponGlobal _secondaryWeaponClassname; _player addWeaponGlobal _secondaryWeaponClassname;
if (_secondaryWeaponMagazine isNotEqualTo "") then {
_player addWeaponItem [_secondaryWeaponClassname, _secondaryWeaponMagazine, true];
};
}; };
private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime"); private _deployTime = getNumber(configFile >> "CfgWeapons" >> _secondaryWeaponClassname >> QUOTE(ADDON) >> "deployTime");
[TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar); [TIME_PROGRESSBAR(_deployTime), [_player, _secondaryWeaponClassname, _secondaryWeaponMagazine], _onFinish, _onFailure, localize LSTRING(PlaceTripod_progressBar)] call EFUNC(common,progressBar);
}, _this] call CBA_fnc_execNextFrame; }, _this] call CBA_fnc_execNextFrame;

View File

@ -37,16 +37,18 @@
_weaponPos set [2, (_weaponPos select 2) + 0.1]; _weaponPos set [2, (_weaponPos select 2) + 0.1];
private _weaponDir = getDir _staticWeapon; private _weaponDir = getDir _staticWeapon;
private _carryWeaponMag = "";
private _carryWeaponMags = getArray (configFile >> "CfgWeapons" >> _carryWeaponClassname >> "magazines") apply {toLower _x};
LOG("remove ammo"); LOG("remove ammo");
{ {
_x params ["_xMag", "", "_xAmmo"]; _x params ["_xMag", "", "_xAmmo"];
if (_xAmmo == 0) then {continue};
private _carryMag = GVAR(vehicleMagCache) get _xMag; private _carryMag = _xMag call FUNC(getCarryMagazine);
if (isNil "_carryMag") then { if (_carryWeaponMag isEqualTo "" && {toLower _carryMag in _carryWeaponMags}) then {
private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups)); TRACE_3("Adding mag to secondary weapon",_xMag,_xAmmo,_carryMag);
_carryMag = configName (_groups param [0, configNull]); _carryWeaponMag = _carryMag;
GVAR(vehicleMagCache) set [_xMag, _carryMag]; DEC(_xAmmo);
TRACE_2("setting cache",_xMag,_carryMag);
}; };
if ((_xAmmo > 0) && {_carryMag != ""}) then { if ((_xAmmo > 0) && {_carryMag != ""}) then {
TRACE_2("Removing ammo",_xMag,_carryMag); TRACE_2("Removing ammo",_xMag,_carryMag);
@ -68,16 +70,23 @@
}; };
[{ [{
params ["_player", "_weaponPos", "_carryWeaponClassname"]; params ["_player", "_weaponPos", "_carryWeaponClassname", "_carryWeaponMag"];
if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith { if ((alive _player) && {(secondaryWeapon _player) == ""}) exitWith {
_player addWeapon _carryWeaponClassname; _player addWeapon _carryWeaponClassname;
if (_carryWeaponMag isNotEqualTo "") then {
_player addWeaponItem [_carryWeaponClassname, _carryWeaponMag, true];
};
}; };
private _weaponRelPos = _weaponPos getPos RELATIVE_DIRECTION(90); private _weaponRelPos = _weaponPos getPos RELATIVE_DIRECTION(90);
private _weaponHolder = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"]; private _weaponHolder = createVehicle ["groundWeaponHolder", [0, 0, 0], [], 0, "NONE"];
_weaponHolder setDir random [0, 180, 360]; _weaponHolder setDir random [0, 180, 360];
_weaponHolder setPosATL [_weaponRelPos select 0, _weaponRelPos select 1, _weaponPos select 2]; _weaponHolder setPosATL [_weaponRelPos select 0, _weaponRelPos select 1, _weaponPos select 2];
if (_carryWeaponMag isEqualTo "") then {
_weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1]; _weaponHolder addWeaponCargoGlobal [_carryWeaponClassname, 1];
}, [_player, _weaponPos, _carryWeaponClassname]] call CBA_fnc_execNextFrame; } else {
_weaponHolder addWeaponWithAttachmentsCargoGlobal [[_carryWeaponClassname, "", "", "", [_carryWeaponMag, 1], [], ""], 1];
};
}, [_player, _weaponPos, _carryWeaponClassname, _carryWeaponMag]] call CBA_fnc_execNextFrame;
LOG("delete weapon"); LOG("delete weapon");
deleteVehicle _staticWeapon; deleteVehicle _staticWeapon;

View File

@ -0,0 +1,28 @@
#include "script_component.hpp"
/*
* Author: PabstMirror, Dystopian
* Gets magazine that the player can carry, suitable to vehicle magazine
*
* Arguments:
* 0: Vehicle Magazine <STRING>
*
* Return Value:
* Carry Magazine <STRING>
*
* Example:
* "1Rnd_GAT_missiles" call ace_csw_fnc_getCarryMagazine
*
* Public: No
*/
params ["_vehicleMag"];
private _carryMag = GVAR(vehicleMagCache) get _vehicleMag;
if (isNil "_carryMag") then {
private _groups = "getNumber (_x >> _vehicleMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups));
_carryMag = configName (_groups param [0, configNull]);
GVAR(vehicleMagCache) set [_vehicleMag, _carryMag];
TRACE_2("setting cache",_vehicleMag,_carryMag);
};
_carryMag

View File

@ -60,14 +60,7 @@ private _cfgMagazines = configFile >> "CfgMagazines";
if ((_xAmmo > 0) && {!(_xMag in _handeledMagTypes)}) then { if ((_xAmmo > 0) && {!(_xMag in _handeledMagTypes)}) then {
_handeledMagTypes pushBack _xMag; _handeledMagTypes pushBack _xMag;
private _carryMag = GVAR(vehicleMagCache) get _xMag; private _carryMag = _xMag call FUNC(getCarryMagazine);
if (isNil "_carryMag") then {
private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups));
_carryMag = configName (_groups param [0, configNull]);
GVAR(vehicleMagCache) set [_xMag, _carryMag];
TRACE_2("setting cache",_xMag,_carryMag);
};
if (_carryMag == "") exitWith {}; if (_carryMag == "") exitWith {};
private _displayName = getText (_cfgMagazines >> _carryMag >> "displayName"); private _displayName = getText (_cfgMagazines >> _carryMag >> "displayName");

View File

@ -4,8 +4,9 @@
* Finds the best vehicle magazines to create from a carryable magazine for a given weapon. * Finds the best vehicle magazines to create from a carryable magazine for a given weapon.
* *
* Arguments: * Arguments:
* 0: Weapon <STRING> * 0: Vehicle <OBJECT>
* 1: Magazine that is carryable <STRING> * 1: Turret <ARRAY>
* 2: Magazine that is carryable <STRING>
* *
* Return Value: * Return Value:
* Vehicle Magazine <STRING> * Vehicle Magazine <STRING>

View File

@ -36,13 +36,7 @@ private _containerMagazineCount = [];
{ {
_x params ["_xMag", "_xTurret", "_xAmmo"]; _x params ["_xMag", "_xTurret", "_xAmmo"];
private _carryMag = GVAR(vehicleMagCache) get _xMag; private _carryMag = _xMag call FUNC(getCarryMagazine);
if (isNil "_carryMag") then {
private _groups = "getNumber (_x >> _xMag) == 1 && {isClass (configFile >> 'CfgMagazines' >> configName _x)}" configClasses (configFile >> QGVAR(groups));
_carryMag = configName (_groups param [0, configNull]);
GVAR(vehicleMagCache) set [_xMag, _carryMag];
TRACE_2("setting cache",_xMag,_carryMag);
};
if (_carryMag != "") then { if (_carryMag != "") then {
if ((_desiredAmmo > 0) && {_loadedMagazineInfo isEqualTo []}) then { if ((_desiredAmmo > 0) && {_loadedMagazineInfo isEqualTo []}) then {
private _loadedMagAmmo = _desiredAmmo min _xAmmo; private _loadedMagAmmo = _desiredAmmo min _xAmmo;
@ -74,6 +68,15 @@ TRACE_1("Remove all loaded magazines",_magsToRemove);
}; };
} forEach _magsToRemove; } forEach _magsToRemove;
if (_staticWeapon getVariable [QGVAR(secondaryWeaponMagazine), ""] isNotEqualTo "") then {
private _secondaryWeaponMagazine = _staticWeapon getVariable QGVAR(secondaryWeaponMagazine);
private _turret = allTurrets _staticWeapon param [0, []];
private _vehicleMag = [_staticWeapon, _turret, _secondaryWeaponMagazine] call FUNC(reload_getVehicleMagazine);
TRACE_3("Re-add previous mag",_secondaryWeaponMagazine,_turret,_vehicleMag);
if (!isClass (configFile >> "CfgMagazines" >> _vehicleMag)) exitWith {};
_staticWeapon addMagazineTurret [_vehicleMag, _turret, 1];
_staticWeapon setVariable [QGVAR(secondaryWeaponMagazine), nil];
};
if (_storeExtraMagazines) then { if (_storeExtraMagazines) then {
TRACE_1("saving extra mags to container",_containerMagazineCount); TRACE_1("saving extra mags to container",_containerMagazineCount);

View File

@ -18,6 +18,12 @@ class CfgVehicles {
GVAR(canDrag) = 0; GVAR(canDrag) = 0;
}; };
// Invisible Target Soldier
class TargetSoldierBase: StaticWeapon {
GVAR(canCarry) = 0;
GVAR(canDrag) = 0;
};
class StaticMortar; class StaticMortar;
class Mortar_01_base_F: StaticMortar { class Mortar_01_base_F: StaticMortar {
GVAR(canCarry) = 1; GVAR(canCarry) = 1;

View File

@ -824,7 +824,7 @@
<Russian>Штраф не-специалистам?</Russian> <Russian>Штраф не-специалистам?</Russian>
<Italian>Punisci non-specialisti?</Italian> <Italian>Punisci non-specialisti?</Italian>
<Japanese>非特技兵へ足かせ</Japanese> <Japanese>非特技兵へ足かせ</Japanese>
<Korean>-전문가에 불이익을 줍니까?</Korean> <Korean>비전문가에 불이익을 줍니까?</Korean>
<Chinesesimp>惩罚非专业人士?</Chinesesimp> <Chinesesimp>惩罚非专业人士?</Chinesesimp>
<Chinese>折磨非專業人員?</Chinese> <Chinese>折磨非專業人員?</Chinese>
</Key> </Key>
@ -840,7 +840,7 @@
<Russian>Увеличивать время завершения действий для не-специалистов? По-умолчанию: Нет</Russian> <Russian>Увеличивать время завершения действий для не-специалистов? По-умолчанию: Нет</Russian>
<Italian>Aumenta il tempo richiesto per completare azioni per non-specialisti? Default: Si</Italian> <Italian>Aumenta il tempo richiesto per completare azioni per non-specialisti? Default: Si</Italian>
<Japanese>非特技兵は動作完了までの時間を増加させますか? 標準: 有効化</Japanese> <Japanese>非特技兵は動作完了までの時間を増加させますか? 標準: 有効化</Japanese>
<Korean>-전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예</Korean> <Korean>비전문가가 폭발물을 해제시 더욱 많은 시간을 소요합니까? 기본설정: 예</Korean>
<Chinesesimp>增加非专业人员相关操作的时间? 预设:是</Chinesesimp> <Chinesesimp>增加非专业人员相关操作的时间? 预设:是</Chinesesimp>
<Chinese>增加非專業人員相關操作的時間? 預設: 是</Chinese> <Chinese>增加非專業人員相關操作的時間? 預設: 是</Chinese>
</Key> </Key>

View File

@ -1,16 +1,3 @@
#define EQUIP_FRIES_ATTRIBUTE class Attributes { \
class GVAR(equipFRIES) { \
property = QGVAR(equipFRIES); \
control = "Checkbox"; \
displayName = CSTRING(Eden_equipFRIES); \
tooltip = CSTRING(Eden_equipFRIES_Tooltip); \
expression = QUOTE(if (_value) then {[_this] call FUNC(equipFRIES)}); \
typeName = "BOOL"; \
condition = "objectVehicle"; \
defaultValue = "(false)"; \
}; \
}
class CfgVehicles { class CfgVehicles {
class Logic; class Logic;
class Module_F: Logic { class Module_F: Logic {
@ -221,8 +208,10 @@ class CfgVehicles {
GVAR(friesAttachmentPoint)[] = {0.035, 2.2, -0.15}; GVAR(friesAttachmentPoint)[] = {0.035, 2.2, -0.15};
GVAR(onPrepare) = QFUNC(onPrepareCommon); GVAR(onPrepare) = QFUNC(onPrepareCommon);
GVAR(onCut) = QFUNC(onCutCommon); GVAR(onCut) = QFUNC(onCutCommon);
class Attributes {
EQUIP_FRIES_ATTRIBUTE; EQUIP_FRIES_ATTRIBUTE;
}; };
};
class Heli_Transport_02_base_F: Helicopter_Base_H { class Heli_Transport_02_base_F: Helicopter_Base_H {
GVAR(enabled) = 1; GVAR(enabled) = 1;
GVAR(ropeOrigins)[] = {{0.94, -4.82, -1.16}, {-0.94, -4.82, -1.16}}; GVAR(ropeOrigins)[] = {{0.94, -4.82, -1.16}, {-0.94, -4.82, -1.16}};
@ -254,15 +243,20 @@ class CfgVehicles {
GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"};
GVAR(friesType) = "ACE_friesGantryReverse"; GVAR(friesType) = "ACE_friesGantryReverse";
GVAR(friesAttachmentPoint)[] = {-1.04, 2.5, -0.34}; GVAR(friesAttachmentPoint)[] = {-1.04, 2.5, -0.34};
class Attributes {
EQUIP_FRIES_ATTRIBUTE; EQUIP_FRIES_ATTRIBUTE;
}; };
};
class Heli_light_03_unarmed_base_F: Heli_light_03_base_F { class Heli_light_03_unarmed_base_F: Heli_light_03_base_F {
GVAR(enabled) = 2; GVAR(enabled) = 2;
GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"}; GVAR(ropeOrigins)[] = {"ropeOriginRight", "ropeOriginLeft"};
GVAR(friesType) = "ACE_friesGantry"; GVAR(friesType) = "ACE_friesGantry";
GVAR(friesAttachmentPoint)[] = {1.07, 2.5, -0.5}; GVAR(friesAttachmentPoint)[] = {1.07, 2.5, -0.5};
class Attributes {
EQUIP_FRIES_ATTRIBUTE; EQUIP_FRIES_ATTRIBUTE;
}; };
};
class Heli_Transport_04_base_F: Helicopter_Base_H { class Heli_Transport_04_base_F: Helicopter_Base_H {
class UserActions; class UserActions;
}; };

View File

@ -16,6 +16,7 @@
#endif #endif
#include "\z\ace\addons\main\script_macros.hpp" #include "\z\ace\addons\main\script_macros.hpp"
#include "script_macros.hpp"
#define DEFAULT_ROPE_LENGTH 34.5 #define DEFAULT_ROPE_LENGTH 34.5

View File

@ -0,0 +1,10 @@
#define EQUIP_FRIES_ATTRIBUTE class EGVAR(fastroping,equipFRIES) { \
property = QEGVAR(fastroping,equipFRIES); \
control = "Checkbox"; \
displayName = ECSTRING(fastroping,Eden_equipFRIES); \
tooltip = ECSTRING(fastroping,Eden_equipFRIES_Tooltip); \
expression = QUOTE(if (_value) then {[_this] call EFUNC(fastroping,equipFRIES)}); \
typeName = "BOOL"; \
condition = "objectVehicle"; \
defaultValue = false; \
}

View File

@ -83,7 +83,7 @@
<Hungarian>Terepi adagok engedélyezése / letiltása</Hungarian> <Hungarian>Terepi adagok engedélyezése / letiltása</Hungarian>
<Italian>Abilita / disabilita le razioni di campo</Italian> <Italian>Abilita / disabilita le razioni di campo</Italian>
<Japanese>フィールド レーションを有効/無効化します</Japanese> <Japanese>フィールド レーションを有効/無効化します</Japanese>
<Korean>전투식량 활성화/비활서오하</Korean> <Korean>전투식량 활성화/비활성화</Korean>
<Polish>Włącz / wyłącz racje polowe</Polish> <Polish>Włącz / wyłącz racje polowe</Polish>
<Portuguese>Ativar / Desativar rações de campo</Portuguese> <Portuguese>Ativar / Desativar rações de campo</Portuguese>
<Russian>Включение/отключение жажды и голода</Russian> <Russian>Включение/отключение жажды и голода</Russian>
@ -100,7 +100,7 @@
<Hungarian>Víz nélküli idő</Hungarian> <Hungarian>Víz nélküli idő</Hungarian>
<Italian>Tempo senza acqua</Italian> <Italian>Tempo senza acqua</Italian>
<Japanese>水なしの時間</Japanese> <Japanese>水なしの時間</Japanese>
<Korean>물 없이 생존 시간</Korean> <Korean>물 없이 생존 가능 시간</Korean>
<Polish>Czas bez wody</Polish> <Polish>Czas bez wody</Polish>
<Portuguese>Tempo sem água</Portuguese> <Portuguese>Tempo sem água</Portuguese>
<Russian>Время без воды</Russian> <Russian>Время без воды</Russian>
@ -134,7 +134,7 @@
<Hungarian>Élelmiszer nélkül</Hungarian> <Hungarian>Élelmiszer nélkül</Hungarian>
<Italian>Tempo senza cibo</Italian> <Italian>Tempo senza cibo</Italian>
<Japanese>食べ物なしの時間</Japanese> <Japanese>食べ物なしの時間</Japanese>
<Korean>밥 없이 생존 시간</Korean> <Korean>밥 없이 생존 가능 시간</Korean>
<Polish>Czas bez jedzenia</Polish> <Polish>Czas bez jedzenia</Polish>
<Portuguese>Tempo sem comida</Portuguese> <Portuguese>Tempo sem comida</Portuguese>
<Russian>Время без еды</Russian> <Russian>Время без еды</Russian>
@ -151,7 +151,7 @@
<Hungarian>Mennyi ideig kell egy egység élni nélkül (óra)</Hungarian> <Hungarian>Mennyi ideig kell egy egység élni nélkül (óra)</Hungarian>
<Italian>Per quanto tempo un'unità dovrebbe essere in grado di andare senza cibo (ore)</Italian> <Italian>Per quanto tempo un'unità dovrebbe essere in grado di andare senza cibo (ore)</Italian>
<Japanese>ユニットが食糧なしでどれくらい時間を過ごすことができるか (一時間単位)</Japanese> <Japanese>ユニットが食糧なしでどれくらい時間を過ごすことができるか (一時間単位)</Japanese>
<Korean>밥을 안먹고 얼마나 생존할 수 있는지 정합니다 (시간)</Korean> <Korean>밥을 안 먹고 얼마나 생존할 수 있는지 정합니다 (시간)</Korean>
<Polish>Jak długo jednostka powinna przetrwać bez jedzenia (godziny)</Polish> <Polish>Jak długo jednostka powinna przetrwać bez jedzenia (godziny)</Polish>
<Portuguese>Quanto tempo uma unidade pode ir sem alimentos (horas)</Portuguese> <Portuguese>Quanto tempo uma unidade pode ir sem alimentos (horas)</Portuguese>
<Russian>Как долго персонаж может обходиться без пищи (часы)</Russian> <Russian>Как долго персонаж может обходиться без пищи (часы)</Russian>
@ -929,7 +929,7 @@
<Hungarian>A csirke leves tartalmú MRE. Keverjük össze vízzel és hővel a legjobb hatás érdekében</Hungarian> <Hungarian>A csirke leves tartalmú MRE. Keverjük össze vízzel és hővel a legjobb hatás érdekében</Hungarian>
<Italian>Un MRE contenente zuppa di pollo. Mescolare con acqua e calore per ottenere il massimo effetto</Italian> <Italian>Un MRE contenente zuppa di pollo. Mescolare con acqua e calore per ottenere il massimo effetto</Italian>
<Japanese>チキン スープの MRE。水と混ぜて温めるとなお美味しい</Japanese> <Japanese>チキン スープの MRE。水と混ぜて温めるとなお美味しい</Japanese>
<Korean>치킨 수프가 MRE입니다. 물과 섞어 뜨겁게 먹을 때 가장 좋습니다</Korean> <Korean>치킨 수프가 들어 있는 MRE입니다. 물과 섞어 뜨겁게 먹을 때 가장 좋습니다</Korean>
<Polish>MRE zawierające rosół. Wymieszaj z wodą i podgrzej, aby uzyskać najlepszy efekt</Polish> <Polish>MRE zawierające rosół. Wymieszaj z wodą i podgrzej, aby uzyskać najlepszy efekt</Polish>
<Portuguese>Um MRE contendo Sopa de Frango. Misture com água e calor para melhor efeito</Portuguese> <Portuguese>Um MRE contendo Sopa de Frango. Misture com água e calor para melhor efeito</Portuguese>
<Russian>Сухой паёк, содержащий сублимированный куриный крем-суп. Перед употреблением растворить в воде и разогреть</Russian> <Russian>Сухой паёк, содержащий сублимированный куриный крем-суп. Перед употреблением растворить в воде и разогреть</Russian>
@ -1031,7 +1031,7 @@
<Hungarian>Húsgombócokat és tésztát tartalmazó MRE. Hő a legjobb hatás érdekében</Hungarian> <Hungarian>Húsgombócokat és tésztát tartalmazó MRE. Hő a legjobb hatás érdekében</Hungarian>
<Italian>Un MRE contenente polpette e pasta. Calore per il miglior effetto</Italian> <Italian>Un MRE contenente polpette e pasta. Calore per il miglior effetto</Italian>
<Japanese>ミートボールとパスタの MRE。温めるとなお美味しい</Japanese> <Japanese>ミートボールとパスタの MRE。温めるとなお美味しい</Japanese>
<Korean>미트볼과 파스타를 포함한 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다</Korean> <Korean>미트볼과 파스타가 들어 있는 MRE입니다. 뜨겁게 먹을 때 가장 좋습니다</Korean>
<Polish>MRE zawierające klopsiki i makaron. Podgrzej dla najlepszego efektu</Polish> <Polish>MRE zawierające klopsiki i makaron. Podgrzej dla najlepszego efektu</Polish>
<Portuguese>Um MRE contendo Meatballs e Pasta. Calor para melhor efeito</Portuguese> <Portuguese>Um MRE contendo Meatballs e Pasta. Calor para melhor efeito</Portuguese>
<Russian>Сухой паёк, содержащий макароны с фрикадельками. Перед употреблением рекомендуется разогреть</Russian> <Russian>Сухой паёк, содержащий макароны с фрикадельками. Перед употреблением рекомендуется разогреть</Russian>
@ -1108,7 +1108,7 @@
<English>Sunflower Seeds</English> <English>Sunflower Seeds</English>
<German>Sonnenblumenkerne</German> <German>Sonnenblumenkerne</German>
</Key> </Key>
<Key ID="STR_ACE_Field_Rations_SunflowerSeeds_Descriptione"> <Key ID="STR_ACE_Field_Rations_SunflowerSeeds_Description">
<English>Roasted And Salted</English> <English>Roasted And Salted</English>
<German>Geröstet und Gesalzen</German> <German>Geröstet und Gesalzen</German>
</Key> </Key>

View File

@ -88,18 +88,22 @@
<Key ID="STR_ACE_Finger_sizeCoef_displayName"> <Key ID="STR_ACE_Finger_sizeCoef_displayName">
<English>Visual Marker Size Coefficient</English> <English>Visual Marker Size Coefficient</English>
<German>Visueller Markergrößenkoeffizient</German> <German>Visueller Markergrößenkoeffizient</German>
<Korean>보이는 마커 크기 계수</Korean>
</Key> </Key>
<Key ID="STR_ACE_Finger_sizeCoef_description"> <Key ID="STR_ACE_Finger_sizeCoef_description">
<English>Adjusts the size of the visual marker.</English> <English>Adjusts the size of the visual marker.</English>
<German>Passt die Größe der visuellen Markierung an.</German> <German>Passt die Größe der visuellen Markierung an.</German>
<Korean>눈에 보이는 마커의 크기를 조정합니다.</Korean>
</Key> </Key>
<Key ID="STR_ACE_Finger_proximityScaling_displayName"> <Key ID="STR_ACE_Finger_proximityScaling_displayName">
<English>Proximity Scaling</English> <English>Proximity Scaling</English>
<German>Näherungsskalierung</German> <German>Näherungsskalierung</German>
<Korean>근접 스케일링</Korean>
</Key> </Key>
<Key ID="STR_ACE_Finger_proximityScaling_description"> <Key ID="STR_ACE_Finger_proximityScaling_description">
<English>Scales the size of the visual marker based on the distance between the player observing and the player pointing.</English> <English>Scales the size of the visual marker based on the distance between the player observing and the player pointing.</English>
<German>Skaliert die Größe der visuellen Markierung basierend auf der Entfernung zwischen dem beobachtenden Spieler und dem zeigenden Spieler.</German> <German>Skaliert die Größe der visuellen Markierung basierend auf der Entfernung zwischen dem beobachtenden Spieler und dem zeigenden Spieler.</German>
<Korean>관찰하는 플레이어와 가리키는 플레이어 사이의 거리에 따라 보이는 마커의 크기를 조정합니다.</Korean>
</Key> </Key>
<Key ID="STR_ACE_Finger_indicatorForSelf_name"> <Key ID="STR_ACE_Finger_indicatorForSelf_name">
<English>Show pointing indicator to self</English> <English>Show pointing indicator to self</English>

View File

@ -13,7 +13,7 @@
<Russian>Пламегаситель (6,5 мм)</Russian> <Russian>Пламегаситель (6,5 мм)</Russian>
<Spanish>Bocacha (6,5 mm)</Spanish> <Spanish>Bocacha (6,5 mm)</Spanish>
<Japanese>消炎器 (6.5 mm)</Japanese> <Japanese>消炎器 (6.5 mm)</Japanese>
<Korean>소염기 (6.5 mm)</Korean> <Korean>소염기 (6.5mm)</Korean>
<Chinesesimp>消焰器6.5 mm</Chinesesimp> <Chinesesimp>消焰器6.5 mm</Chinesesimp>
<Chinese>消光器 (6.5 mm)</Chinese> <Chinese>消光器 (6.5 mm)</Chinese>
<Turkish>Flash Suppressor (6.5 mm)</Turkish> <Turkish>Flash Suppressor (6.5 mm)</Turkish>
@ -30,7 +30,7 @@
<Russian>Пламегаситель (7,62 мм)</Russian> <Russian>Пламегаситель (7,62 мм)</Russian>
<Spanish>Bocacha (7,62 mm)</Spanish> <Spanish>Bocacha (7,62 mm)</Spanish>
<Japanese>消炎器 (7.62 mm)</Japanese> <Japanese>消炎器 (7.62 mm)</Japanese>
<Korean>소염기 (7.62 mm)</Korean> <Korean>소염기 (7.62mm)</Korean>
<Chinesesimp>消焰器7.62 mm</Chinesesimp> <Chinesesimp>消焰器7.62 mm</Chinesesimp>
<Chinese>消光器 (7.62 毫米)</Chinese> <Chinese>消光器 (7.62 毫米)</Chinese>
<Turkish>Flash Suppressor (7.62 mm)</Turkish> <Turkish>Flash Suppressor (7.62 mm)</Turkish>
@ -47,7 +47,7 @@
<Russian>Пламегаситель (5,56 мм)</Russian> <Russian>Пламегаситель (5,56 мм)</Russian>
<Spanish>Bocacha (5,56 mm)</Spanish> <Spanish>Bocacha (5,56 mm)</Spanish>
<Japanese>消炎器 (5.56 mm)</Japanese> <Japanese>消炎器 (5.56 mm)</Japanese>
<Korean>소염기 (5.56 mm)</Korean> <Korean>소염기 (5.56mm)</Korean>
<Chinesesimp>消焰器5.56 mm</Chinesesimp> <Chinesesimp>消焰器5.56 mm</Chinesesimp>
<Chinese>消光器 (5.56 mm)</Chinese> <Chinese>消光器 (5.56 mm)</Chinese>
<Turkish>Flash Suppressor (5.56 mm)</Turkish> <Turkish>Flash Suppressor (5.56 mm)</Turkish>

View File

@ -61,7 +61,7 @@
<Russian>Симуляция обломков</Russian> <Russian>Симуляция обломков</Russian>
<Italian>Simulazione Spalling</Italian> <Italian>Simulazione Spalling</Italian>
<Japanese>剥離シミュレーション</Japanese> <Japanese>剥離シミュレーション</Japanese>
<Korean>조각 시뮬레이션</Korean> <Korean>탄환파편 시뮬레이션</Korean>
<Chinesesimp>模拟剥落</Chinesesimp> <Chinesesimp>模拟剥落</Chinesesimp>
<Chinese>模擬剝落</Chinese> <Chinese>模擬剝落</Chinese>
</Key> </Key>
@ -77,7 +77,7 @@
<Russian>Включить симуляцию обломков ACE</Russian> <Russian>Включить симуляцию обломков ACE</Russian>
<Italian>Abilita la Simulazione Spalling di ACE</Italian> <Italian>Abilita la Simulazione Spalling di ACE</Italian>
<Japanese>ACE 剥離シミュレーションを有効化</Japanese> <Japanese>ACE 剥離シミュレーションを有効化</Japanese>
<Korean>ACE 조각 시뮬레이션을 적용합니다.</Korean> <Korean>ACE 탄환파편 시뮬레이션을 적용합니다.</Korean>
<Chinesesimp>启用 ACE 模拟剥落</Chinesesimp> <Chinesesimp>启用 ACE 模拟剥落</Chinesesimp>
<Chinese>啟用ACE模擬剝落</Chinese> <Chinese>啟用ACE模擬剝落</Chinese>
</Key> </Key>
@ -139,7 +139,7 @@
<Russian>Эта настройка контролирует максимальное количество снарядов, которок отслеживает система осколков и обломков в каждый момент времени. Снаряды, выстреленные сверх этого числа, отслеживаться не будут. Уменьшите это значение, если вы не хотите падения FPS при большом количестве снарядов в одной перестрелке (&gt; 200 одновременно летящих снарядов)</Russian> <Russian>Эта настройка контролирует максимальное количество снарядов, которок отслеживает система осколков и обломков в каждый момент времени. Снаряды, выстреленные сверх этого числа, отслеживаться не будут. Уменьшите это значение, если вы не хотите падения FPS при большом количестве снарядов в одной перестрелке (&gt; 200 одновременно летящих снарядов)</Russian>
<Italian>Questo parametro controlla il numero massimo di proiettili che la frammentazione e il sistema di spalling tracciano in ogni momento. Se più proiettili sono sparati, non verranno tracciati. Abbassa questo parametro se non vuoi cali di FPS in scenari con molti proiettili (&gt;200 proiettili in aria contemporaneamente)</Italian> <Italian>Questo parametro controlla il numero massimo di proiettili che la frammentazione e il sistema di spalling tracciano in ogni momento. Se più proiettili sono sparati, non verranno tracciati. Abbassa questo parametro se non vuoi cali di FPS in scenari con molti proiettili (&gt;200 proiettili in aria contemporaneamente)</Italian>
<Japanese>時間が許すかぎり、破片と剥離システムの最大数を設定できます。設定数以上の弾丸が発射された場合、それは対象になりません。もし多い弾数による FPS の低下を望まない場合は、低い数へ設定にします。( &amp;gt;一度に空中内で200発)</Japanese> <Japanese>時間が許すかぎり、破片と剥離システムの最大数を設定できます。設定数以上の弾丸が発射された場合、それは対象になりません。もし多い弾数による FPS の低下を望まない場合は、低い数へ設定にします。( &amp;gt;一度に空中内で200発)</Japanese>
<Korean>이 설정은 조각 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하) </Korean> <Korean>이 설정은 탄환파편 및 파편 시스템으로 인해 생긴 발사체의 수를 결정합니다. 만약 더 많은 발사체가 나올 경우 정해진 수 이외에는 추적하지 않습니다. 이 설정을 낮춤으로써 파편이 많은 시나리오를 실행할때 더욱 원활히 진행할 수 있습니다 (한 번에 200개 이하)</Korean>
<Chinesesimp>设定在指定时间内,系统最大可追踪的破片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( &gt;一次200颗粒子</Chinesesimp> <Chinesesimp>设定在指定时间内,系统最大可追踪的破片粒子数量。如有更多的碎片在这之后产生,这些粒子将不会被追踪。如果你想要维持好的帧数,此设定勿调的过高。( &gt;一次200颗粒子</Chinesesimp>
<Chinese>設定在指定時間內,系統最大可追蹤的碎片/剝落粒子數量。如有更多的碎片在這之後產生,這些粒子將不會被追蹤。如果你想要維持好的幀數,此設定勿調的過高。( &gt;一次200顆粒子)</Chinese> <Chinese>設定在指定時間內,系統最大可追蹤的碎片/剝落粒子數量。如有更多的碎片在這之後產生,這些粒子將不會被追蹤。如果你想要維持好的幀數,此設定勿調的過高。( &gt;一次200顆粒子)</Chinese>
</Key> </Key>
@ -187,7 +187,7 @@
<Russian>(Только для одиночной игры) Отслеживаение/отладка осколков</Russian> <Russian>(Только для одиночной игры) Отслеживаение/отладка осколков</Russian>
<Italian>(Solo SP) Debug Tracciamento Frag/Spall</Italian> <Italian>(Solo SP) Debug Tracciamento Frag/Spall</Italian>
<Japanese>(SP のみ) 破片/剥離のデバッグ用表示</Japanese> <Japanese>(SP のみ) 破片/剥離のデバッグ用表示</Japanese>
<Korean>(싱글플레이 전용) 조각/파편 디버그 추적화</Korean> <Korean>(싱글플레이 전용) 탄환파편/파편 디버그 추적화</Korean>
<Chinesesimp>(仅单人)追踪显示破片粒子</Chinesesimp> <Chinesesimp>(仅单人)追踪显示破片粒子</Chinesesimp>
<Chinese>(僅在單人模式) 碎片/剝落除錯追蹤</Chinese> <Chinese>(僅在單人模式) 碎片/剝落除錯追蹤</Chinese>
</Key> </Key>
@ -205,7 +205,7 @@
<Japanese>(SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の弾頭が見えるようになります。</Japanese> <Japanese>(SP のみ) ミッションとエディタの再起動が必要です。有効化すると、シングルプレイでのみ破片と剥離の弾頭が見えるようになります。</Japanese>
<Chinesesimp>(仅单人)激活后,只有在单人模式下才可观察到破片粒子的移动轨迹。</Chinesesimp> <Chinesesimp>(仅单人)激活后,只有在单人模式下才可观察到破片粒子的移动轨迹。</Chinesesimp>
<Chinese>(僅在單人模式) 讓你在單人模式下可觀察到碎片/剝落粒子的移動軌跡</Chinese> <Chinese>(僅在單人模式) 讓你在單人模式下可觀察到碎片/剝落粒子的移動軌跡</Chinese>
<Korean>(SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 조각화 및 스 폴링 라운드의 시각적 추적을 가능하게합니다.</Korean> <Korean>(SP 전용) 임무 / 편집자가 다시 시작해야합니다. SP 게임 모드에서만 파편화 및 탄환파편의 시각적 추적을 가능하게 합니다.</Korean>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -168,7 +168,7 @@
<Turkish>CTS 7290 9- Flaş Bombası</Turkish> <Turkish>CTS 7290 9- Flaş Bombası</Turkish>
<Russian>CTS 7290-9 Светошумовая граната</Russian> <Russian>CTS 7290-9 Светошумовая граната</Russian>
<Spanish>Granada aturdidora CTS 7290 9-explosiones</Spanish> <Spanish>Granada aturdidora CTS 7290 9-explosiones</Spanish>
<Korean>CTS 7290 9- 섬광 수류탄</Korean> <Korean>CTS 7290 9-bang 섬광 수류탄</Korean>
</Key> </Key>
<Key ID="STR_ACE_Grenades_CTS9_NameShort"> <Key ID="STR_ACE_Grenades_CTS9_NameShort">
<English>CTS 7290-9</English> <English>CTS 7290-9</English>

View File

@ -125,7 +125,7 @@
<English>Log transfer statistics and Headless Client (dis)connections to RPT. (Default: No)</English> <English>Log transfer statistics and Headless Client (dis)connections to RPT. (Default: No)</English>
<German>Zeichnet Transferstatistiken, Verbindungen und Verbindungsabbrüche in einer RPT-Datei auf. (Standard: Nein)</German> <German>Zeichnet Transferstatistiken, Verbindungen und Verbindungsabbrüche in einer RPT-Datei auf. (Standard: Nein)</German>
<Polish>Zapisz statystyki transferu i status połączenia Headless Clienta do RPT. (Domyślnie: Tak)</Polish> <Polish>Zapisz statystyki transferu i status połączenia Headless Clienta do RPT. (Domyślnie: Tak)</Polish>
<Korean>전송 통계 및 헤드리스 클라이언트 연결(해제) 로그 RPT. (기본값: No)</Korean> <Korean>전송 통계 및 헤드리스 클라이언트 연결(해제)를 RPT파일에 로그함. (기본값: No)</Korean>
<Japanese>統計とヘッドレス クライアントの接続有無を PRT へ記録します。(標準: 無効)</Japanese> <Japanese>統計とヘッドレス クライアントの接続有無を PRT へ記録します。(標準: 無効)</Japanese>
<French>Archive les statistiques de transfert et de (dé)connections du Headless Client dans le RPT. (Défaut: Non)</French> <French>Archive les statistiques de transfert et de (dé)connections du Headless Client dans le RPT. (Défaut: Non)</French>
<Chinesesimp>记录 Headless 客户端间的转换数量与连线/断线等记录到 RPT 报告档中。(预设:关闭)</Chinesesimp> <Chinesesimp>记录 Headless 客户端间的转换数量与连线/断线等记录到 RPT 报告档中。(预设:关闭)</Chinesesimp>

View File

@ -331,7 +331,7 @@
<French>Volume audio perçu par les joueurs portant des bouchons anti bruit.</French> <French>Volume audio perçu par les joueurs portant des bouchons anti bruit.</French>
<Czech>Hlasitost při používání špuntů do uší.</Czech> <Czech>Hlasitost při používání špuntů do uší.</Czech>
<Spanish>Volumen cuando se utilizan protectores auditivos.</Spanish> <Spanish>Volumen cuando se utilizan protectores auditivos.</Spanish>
<Korean>귀마개 사용시 볼륨입니다.</Korean> <Korean>귀마개 사용 볼륨입니다.</Korean>
</Key> </Key>
<Key ID="STR_ACE_Hearing_unconsciousnessVolume_DisplayName"> <Key ID="STR_ACE_Hearing_unconsciousnessVolume_DisplayName">
<English>Unconscious Volume</English> <English>Unconscious Volume</English>

View File

@ -48,7 +48,7 @@
<Polish>Rakieta naprowadzana laserowo z głowicą odłamkową</Polish> <Polish>Rakieta naprowadzana laserowo z głowicą odłamkową</Polish>
<German>Halbaktive Laser-Zielsuchrakete mit metallverstärktem Antipersonen-Gefechtskopf</German> <German>Halbaktive Laser-Zielsuchrakete mit metallverstärktem Antipersonen-Gefechtskopf</German>
<Chinesesimp>金属增强人员杀伤弹头半主动激光制导导弹</Chinesesimp> <Chinesesimp>金属增强人员杀伤弹头半主动激光制导导弹</Chinesesimp>
<Korean>반능동 레이저 유도 미사일로 대인 금속 강화 탄두가 탑재되었습니다.</Korean> <Korean>반능동 레이저 유도 미사일로 대인 금속 강화 탄두가 탑재하고 있습니다.</Korean>
</Key> </Key>
</Package> </Package>
</Project> </Project>

View File

@ -7,7 +7,7 @@
<Chinese>觸發倒下前最低需受到多少傷害</Chinese> <Chinese>觸發倒下前最低需受到多少傷害</Chinese>
<Chinesesimp>触发倒下前最低需受到多少伤害</Chinesesimp> <Chinesesimp>触发倒下前最低需受到多少伤害</Chinesesimp>
<Japanese>崩れ落ちるまでの最低損傷値</Japanese> <Japanese>崩れ落ちるまでの最低損傷値</Japanese>
<Korean>방아쇠를 당기는 최소한의 피해</Korean> <Korean>넘어질 때 발생하는 최소 피해량</Korean>
<German>Mindestschaden, um Sturz auszulösen</German> <German>Mindestschaden, um Sturz auszulösen</German>
<Polish>Minimalne obrażenie, żeby aktywować spadanie</Polish> <Polish>Minimalne obrażenie, żeby aktywować spadanie</Polish>
<Russian>Минимальный урон для активации падения</Russian> <Russian>Минимальный урон для активации падения</Russian>

View File

@ -302,7 +302,7 @@
<Hungarian>Hozzáférést biztosít a szöveg árnyékának kezeléséhez. A körvonal nem veszi figyelembe az egyedi árnyékszíneket.</Hungarian> <Hungarian>Hozzáférést biztosít a szöveg árnyékának kezeléséhez. A körvonal nem veszi figyelembe az egyedi árnyékszíneket.</Hungarian>
<Italian>Permette di controllare l'ombra del testo. L'impostazione "Contorno" ignora il colore dell'ombra.</Italian> <Italian>Permette di controllare l'ombra del testo. L'impostazione "Contorno" ignora il colore dell'ombra.</Italian>
<Japanese>文字への影を設定します。縁取りは設定された影の色を無視します。</Japanese> <Japanese>文字への影を設定します。縁取りは設定された影の色を無視します。</Japanese>
<Korean>문자의 그림자를 조절하는것을 가능케합니다. 외각선은 임의의 그림자색을 무시합니다.</Korean> <Korean>문자의 그림자를 조절하는 것을 가능케 합니다. 외곽선은 임의의 그림자색을 무시합니다.</Korean>
<Chinesesimp>允许控制文字阴影。轮廓部分则会忽略自定义的阴影颜色。</Chinesesimp> <Chinesesimp>允许控制文字阴影。轮廓部分则会忽略自定义的阴影颜色。</Chinesesimp>
<Chinese>允許控制文字陰影。輪廓部分則會忽略自定義的陰影顏色</Chinese> <Chinese>允許控制文字陰影。輪廓部分則會忽略自定義的陰影顏色</Chinese>
<Turkish>Metin gölgesinin kontrolüne izin verir. Dış çizgi, özel gölge renklerini yok sayar.</Turkish> <Turkish>Metin gölgesinin kontrolüne izin verir. Dış çizgi, özel gölge renklerini yok sayar.</Turkish>
@ -319,7 +319,7 @@
<Hungarian>Körvonal</Hungarian> <Hungarian>Körvonal</Hungarian>
<Italian>Contorno</Italian> <Italian>Contorno</Italian>
<Japanese>縁取り</Japanese> <Japanese>縁取り</Japanese>
<Korean></Korean> <Korean></Korean>
<Chinesesimp>只显示轮廓</Chinesesimp> <Chinesesimp>只显示轮廓</Chinesesimp>
<Chinese>只顯示輪廓</Chinese> <Chinese>只顯示輪廓</Chinese>
<Turkish>Dış Çizgi</Turkish> <Turkish>Dış Çizgi</Turkish>

View File

@ -47,7 +47,7 @@ if ((_house animationPhase (_animations select 0) <= 0) && {_house getVariable [
// Add handle on carrier // Add handle on carrier
if (typeOf _house == "Land_Carrier_01_island_01_F") then { if (typeOf _house == "Land_Carrier_01_island_01_F") then {
private _handle = format ["door_handle_%1_rot_1", (_animations select 0) select [5, 1]]; private _handle = format ["door_handle_%1_rotate_1", (_animations select 0) select [5, 1]];
TRACE_1("carrier handle",_handle); TRACE_1("carrier handle",_handle);
_animations pushBack _handle; _animations pushBack _handle;
}; };

View File

@ -80,7 +80,7 @@
<Italian>Braccio sinistro</Italian> <Italian>Braccio sinistro</Italian>
<Portuguese>Braço Esquerdo</Portuguese> <Portuguese>Braço Esquerdo</Portuguese>
<Japanese>左腕</Japanese> <Japanese>左腕</Japanese>
<Korean></Korean> <Korean>왼팔</Korean>
<Chinesesimp>左手</Chinesesimp> <Chinesesimp>左手</Chinesesimp>
<Chinese>左手</Chinese> <Chinese>左手</Chinese>
<Turkish>Sol Kol</Turkish> <Turkish>Sol Kol</Turkish>
@ -97,7 +97,7 @@
<Italian>Braccio destro</Italian> <Italian>Braccio destro</Italian>
<Portuguese>Braço Direito</Portuguese> <Portuguese>Braço Direito</Portuguese>
<Japanese>右腕</Japanese> <Japanese>右腕</Japanese>
<Korean>오른</Korean> <Korean>오른팔</Korean>
<Chinesesimp>右手</Chinesesimp> <Chinesesimp>右手</Chinesesimp>
<Chinese>右手</Chinese> <Chinese>右手</Chinese>
<Turkish>Sağ Kol</Turkish> <Turkish>Sağ Kol</Turkish>
@ -114,7 +114,7 @@
<Italian>Gamba sinistra</Italian> <Italian>Gamba sinistra</Italian>
<Portuguese>Perna Esquerda</Portuguese> <Portuguese>Perna Esquerda</Portuguese>
<Japanese>左足</Japanese> <Japanese>左足</Japanese>
<Korean>다리</Korean> <Korean>왼다리</Korean>
<Chinesesimp>左脚</Chinesesimp> <Chinesesimp>左脚</Chinesesimp>
<Chinese>左腳</Chinese> <Chinese>左腳</Chinese>
<Turkish>Sol Bacak</Turkish> <Turkish>Sol Bacak</Turkish>
@ -131,7 +131,7 @@
<Italian>Gamba destra</Italian> <Italian>Gamba destra</Italian>
<Portuguese>Perna Direita</Portuguese> <Portuguese>Perna Direita</Portuguese>
<Japanese>右足</Japanese> <Japanese>右足</Japanese>
<Korean>오른다리</Korean> <Korean>오른다리</Korean>
<Chinesesimp>右脚</Chinesesimp> <Chinesesimp>右脚</Chinesesimp>
<Chinese>右腳</Chinese> <Chinese>右腳</Chinese>
<Turkish>Sağ Bacak</Turkish> <Turkish>Sağ Bacak</Turkish>
@ -687,7 +687,7 @@
<French>Assigner à bleu</French> <French>Assigner à bleu</French>
<Italian>Assegna al team blu</Italian> <Italian>Assegna al team blu</Italian>
<Japanese>ブルーにする</Japanese> <Japanese>ブルーにする</Japanese>
<Korean>파랑 등록</Korean> <Korean>파랑 등록</Korean>
<Chinesesimp>指派为蓝组</Chinesesimp> <Chinesesimp>指派为蓝组</Chinesesimp>
<Chinese>指派為藍組</Chinese> <Chinese>指派為藍組</Chinese>
<Turkish>Maviye Ata</Turkish> <Turkish>Maviye Ata</Turkish>
@ -1070,7 +1070,7 @@
<Italian>I giocatori dovrebbero ricevere delle valutazioni negative ? Quando è abilitato i giocatori ricevono esclusivamente valutazioni positive che prevengono il fuoco delle AI alleate quando distruggono equipaggiamenti o uccidono membri della squadra.</Italian> <Italian>I giocatori dovrebbero ricevere delle valutazioni negative ? Quando è abilitato i giocatori ricevono esclusivamente valutazioni positive che prevengono il fuoco delle AI alleate quando distruggono equipaggiamenti o uccidono membri della squadra.</Italian>
<Chinese>玩家是否會收到負面評價? 當本功能開啟時玩家只會接收到正面評價所以當玩家做出擊殺友軍AI、毀壞友軍裝備或殺害小隊夥伴都不會收到負面評價</Chinese> <Chinese>玩家是否會收到負面評價? 當本功能開啟時玩家只會接收到正面評價所以當玩家做出擊殺友軍AI、毀壞友軍裝備或殺害小隊夥伴都不會收到負面評價</Chinese>
<Chinesesimp>玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军 AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。</Chinesesimp> <Chinesesimp>玩家是否会收到负面评价? 当本功能开启时玩家只会接收到正面评价,所以当玩家做出击杀友军 AI、毁坏友军装备或杀害小队伙伴都不会收到负面评价。</Chinesesimp>
<Korean>플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 높은 레이팅을 가질때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다.</Korean> <Korean>플레이어의 부정행위 가중치를 계산합니까? 활성화된 플레이어는 낮은 부정행위 가중치를 가질 때, 아군의 장비나 병력을 사격해도 아군 AI의 사격을 받지 않습니다.</Korean>
<Polish>Czy powinni gracze otrzymywać negatywną ocenę? Kiedy aktywowani gracze otrzymuję wyłącznie pozytywną ocenę, która zapobiega ognia przyjaznego SI podczas niszczenia przyjaznego wyposażenia lub zabijaniu członków drużyny.</Polish> <Polish>Czy powinni gracze otrzymywać negatywną ocenę? Kiedy aktywowani gracze otrzymuję wyłącznie pozytywną ocenę, która zapobiega ognia przyjaznego SI podczas niszczenia przyjaznego wyposażenia lub zabijaniu członków drużyny.</Polish>
<Russian>Должны ли игроки получать отрицательный рейтинг? Когда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды.</Russian> <Russian>Должны ли игроки получать отрицательный рейтинг? Когда включено, игроки получают только положительный рейтинг, что предотвращает дружественный огонь от ИИ при уничтожении дружественного оборудования или убийстве членов команды.</Russian>
<Portuguese>Jogadores devem receber uma avaliação negativa? Quando ativado, os jogadores estão recebendo avaliações positivas, prevenindo que IA amigável atire quando destruir algum equipamento aliado ou matar membros de equipe.</Portuguese> <Portuguese>Jogadores devem receber uma avaliação negativa? Quando ativado, os jogadores estão recebendo avaliações positivas, prevenindo que IA amigável atire quando destruir algum equipamento aliado ou matar membros de equipe.</Portuguese>

View File

@ -30,7 +30,7 @@
<Italian>Normalmente il menù inventario è scalato in base alle dimensioni dell'interfaccia. Questa opzione permette di ingrandirlo ulteriormente ma senza aumentare la dimensione del testo.</Italian> <Italian>Normalmente il menù inventario è scalato in base alle dimensioni dell'interfaccia. Questa opzione permette di ingrandirlo ulteriormente ma senza aumentare la dimensione del testo.</Italian>
<Portuguese>Normalmente o tamanho da tela do inventário é ditada pelo tamanho da UI. Isso permite aumentar o tamanho da tela de inventário, mas não aumenta o tamanho da fonte, permitindo que mais linhas sejam visualizadas.</Portuguese> <Portuguese>Normalmente o tamanho da tela do inventário é ditada pelo tamanho da UI. Isso permite aumentar o tamanho da tela de inventário, mas não aumenta o tamanho da fonte, permitindo que mais linhas sejam visualizadas.</Portuguese>
<Japanese>通常、インベントリは UI の大きさにより調整して表示されます。これはインベントリ UI を大きくできますが、文字は大きくできません。</Japanese> <Japanese>通常、インベントリは UI の大きさにより調整して表示されます。これはインベントリ UI を大きくできますが、文字は大きくできません。</Japanese>
<Korean>보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케하면서 글씨는 그대로 냅두게 해줍니다.</Korean> <Korean>보통 소지품 화면은 사용자 인터페이스 크기에 비례합니다. 이 항목은 소지품의 사용자 인터페이스를 확대를 가능케 하면서 글씨는 그대로 놔두게 해줍니다.</Korean>
<Chinesesimp>一般来说,物品清单尺寸是由使用者界面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数!</Chinesesimp> <Chinesesimp>一般来说,物品清单尺寸是由使用者界面来决定的。此选项能让你的物品显示清单更大但不会增加字体大小,此举可增加更多能被显示的描述行数!</Chinesesimp>
<Chinese>一般來說,物品清單尺寸是由使用者介面來決定的。此選項能讓你的物品顯示清單更大但不會增加字體大小,此舉可增加更多能被顯示的描述行數!</Chinese> <Chinese>一般來說,物品清單尺寸是由使用者介面來決定的。此選項能讓你的物品顯示清單更大但不會增加字體大小,此舉可增加更多能被顯示的描述行數!</Chinese>
<Turkish>Normalde envanter görüntüleme, kullanıcı arayüzü boyutuna göre ölçeklenir. Bu, Envanter kullanıcı arayüzü boyutunu büyütmeye izin verir, ancak daha fazla satır görüntülenmesine izin vermek için yazı tipi boyutunu büyütmez.</Turkish> <Turkish>Normalde envanter görüntüleme, kullanıcı arayüzü boyutuna göre ölçeklenir. Bu, Envanter kullanıcı arayüzü boyutunu büyütmeye izin verir, ancak daha fazla satır görüntülenmesine izin vermek için yazı tipi boyutunu büyütmez.</Turkish>

View File

@ -1,5 +1,6 @@
PREP(addLaserTarget); PREP(addLaserTarget);
PREP(addMapHandler);
PREP(dev_drawVisibleLaserTargets); PREP(dev_drawVisibleLaserTargets);
PREP(findLaserSource); PREP(findLaserSource);
PREP(handleLaserTargetCreation); PREP(handleLaserTargetCreation);

View File

@ -6,6 +6,13 @@ if (hasInterface) then {
GVAR(pfID) = -1; GVAR(pfID) = -1;
["CBA_settingsInitialized", { ["CBA_settingsInitialized", {
// Handle Map Drawing
GVAR(mapLaserSource) = objNull;
["ACE_controlledUAV", LINKFUNC(addMapHandler)] call CBA_fnc_addEventHandler;
["turret", LINKFUNC(addMapHandler), false] call CBA_fnc_addPlayerEventHandler;
["unit", LINKFUNC(addMapHandler), true] call CBA_fnc_addPlayerEventHandler;
// Laser code display
["turret", LINKFUNC(showVehicleHud), false] call CBA_fnc_addPlayerEventHandler; ["turret", LINKFUNC(showVehicleHud), false] call CBA_fnc_addPlayerEventHandler;
["vehicle", LINKFUNC(showVehicleHud), true] call CBA_fnc_addPlayerEventHandler; // only one of these needs the retro flag ["vehicle", LINKFUNC(showVehicleHud), true] call CBA_fnc_addPlayerEventHandler; // only one of these needs the retro flag

View File

@ -0,0 +1,70 @@
#include "script_component.hpp"
/*
* Author: PabstMirror
* Add laser drawing to map
*
* Arguments:
* None
*
* Return Value:
* None
*
* Example:
* [] call ace_laser_fnc_addMapHandler
*
* Public: No
*/
TRACE_3("addMapHandler",ace_player,typeOf vehicle ace_player,ACE_controlledUAV);
GVAR(mapLaserSource) = call {
if (GVAR(showLaserOnMap) == 0) exitWith {
TRACE_1("setting - disabled",GVAR(showLaserOnMap));
objNull
};
if (alive (ACE_controlledUAV # 0)) exitWith {
TRACE_1("using UAV",objNull);
ACE_controlledUAV # 0;
};
if (GVAR(showLaserOnMap) == 1) exitWith {
TRACE_1("setting - no UAV",GVAR(showLaserOnMap));
objNull
};
private _player = ace_player;
private _vehicle = vehicle _player;
if ((_player != _vehicle) && {_player in [gunner _vehicle, commander _vehicle]}) exitWith {
TRACE_1("using player's vehicle",_vehicle);
_vehicle
};
if (GVAR(showLaserOnMap) == 2) exitWith {
TRACE_1("setting - no UAV or vehicle",GVAR(showLaserOnMap));
objNull
};
TRACE_1("using player",_player);
_player
};
if (!alive GVAR(mapLaserSource)) exitWith {};
[{!isNull findDisplay 12}, // for some reason the display is null for the frame when starting to control drone
{
private _map = ((findDisplay 12) displayCtrl 51);
private _ehID = _map getVariable [QGVAR(ehID), -1];
if (_ehID > -1) exitWith {};
_ehID = _map ctrlAddEventHandler ["Draw", {
if (!alive GVAR(mapLaserSource)) exitWith {};
private _laserTarget = laserTarget GVAR(mapLaserSource);
if (!alive _laserTarget) exitWith {};
params ["_map"];
_map drawLine [getPos _laserTarget, getPos GVAR(mapLaserSource), [1,0,0,0.333]];
_map drawIcon [
"\A3\ui_f\data\igui\rscingameui\rscoptics\laser_designator_iconLaserOn.paa",
[1,0,1,1],
(getPos _laserTarget),
16, 16,
((getDir _laserTarget) + 90)
];
}];
TRACE_2("added map drawEH",_map,_ehID);
_map setVariable [QGVAR(ehID), _ehID];
}, []] call CBA_fnc_waitUntilAndExecute;

View File

@ -1,4 +1,4 @@
private _category = [LELSTRING(common,categoryUncategorized), localize "str_a3_itemtype_laser"]; private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(laser)];
[ [
QGVAR(dispersionCount), "SLIDER", QGVAR(dispersionCount), "SLIDER",
@ -7,3 +7,15 @@ private _category = [LELSTRING(common,categoryUncategorized), localize "str_a3_i
[0, 5, 2, -1], [0, 5, 2, -1],
1 1
] call CBA_fnc_addSetting; ] call CBA_fnc_addSetting;
[
QGVAR(showLaserOnMap), "LIST",
[LSTRING(showLaserOnMap), LSTRING(showLaserOnMap_tooltip)],
_category,
[
[0, 1, 2, 3],
[LELSTRING(Common,Disabled), "STR_A3_CfgEditorSubcategories_EdSubcat_Drones0", "str_dn_vehicles", LELSTRING(common,Always)],
1
],
true
] call CBA_fnc_addSetting;

View File

@ -1,6 +1,23 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<Project name="ACE"> <Project name="ACE">
<Package name="Laser"> <Package name="Laser">
<Key ID="STR_ACE_Laser_laser">
<English>Laser</English>
<German>Laser</German>
<Polish>Laser</Polish>
<French>Laser</French>
<Russian>Лазер</Russian>
<Portuguese>Laser</Portuguese>
<Hungarian>Lézer</Hungarian>
<Spanish>Láser</Spanish>
<Czech>Laser</Czech>
<Italian>Laser</Italian>
<Japanese>レーザー</Japanese>
<Korean>레이저</Korean>
<Chinesesimp>激光</Chinesesimp>
<Chinese>雷射</Chinese>
<Turkish>Lazer</Turkish>
</Key>
<Key ID="STR_ACE_Laser_dispersionCount_displayName"> <Key ID="STR_ACE_Laser_dispersionCount_displayName">
<English>Laser Dispersion Simulation Count</English> <English>Laser Dispersion Simulation Count</English>
<Japanese>レーザーの分散シミュレート数</Japanese> <Japanese>レーザーの分散シミュレート数</Japanese>
@ -68,5 +85,11 @@
<Chinese>雷射 - 循環切換雷射碼 下</Chinese> <Chinese>雷射 - 循環切換雷射碼 下</Chinese>
<Turkish>Lazer - Çevrim Kodu aşağı</Turkish> <Turkish>Lazer - Çevrim Kodu aşağı</Turkish>
</Key> </Key>
<Key ID="STR_ACE_Laser_showLaserOnMap">
<English>Draw Laser on Map</English>
</Key>
<Key ID="STR_ACE_Laser_showLaserOnMap_tooltip">
<English>Active laser designator's position will be drawn on the map</English>
</Key>
</Package> </Package>
</Project> </Project>

View File

@ -97,7 +97,7 @@
<Hungarian>Lézer</Hungarian> <Hungarian>Lézer</Hungarian>
<Czech>Laser</Czech> <Czech>Laser</Czech>
<Portuguese>Laser</Portuguese> <Portuguese>Laser</Portuguese>
<Japanese>レーザ</Japanese> <Japanese>レーザ</Japanese>
<Korean>레이저</Korean> <Korean>레이저</Korean>
<Chinesesimp>激光</Chinesesimp> <Chinesesimp>激光</Chinesesimp>
<Chinese>雷射</Chinese> <Chinese>雷射</Chinese>
@ -132,7 +132,7 @@
<Czech>Přepnout Laser / Infračervený Laser</Czech> <Czech>Přepnout Laser / Infračervený Laser</Czech>
<Portuguese>Alternar entre Laser / Laser IV</Portuguese> <Portuguese>Alternar entre Laser / Laser IV</Portuguese>
<Japanese>レーザ/赤外線レーザを切り替える</Japanese> <Japanese>レーザ/赤外線レーザを切り替える</Japanese>
<Korean>가시 / 적외선 레이저 전환</Korean> <Korean>가시광/적외선 레이저 전환</Korean>
<Chinesesimp>切换激光/红外线激光</Chinesesimp> <Chinesesimp>切换激光/红外线激光</Chinesesimp>
<Chinese>切換雷射/紅外線雷射</Chinese> <Chinese>切換雷射/紅外線雷射</Chinese>
<Turkish>Değiştir Lazer/IR Lazer</Turkish> <Turkish>Değiştir Lazer/IR Lazer</Turkish>

View File

@ -9,7 +9,7 @@
<German>Ein verdrehtes Geflecht aus Fasern. Wird normalerweise zum Abseilen oder Abschleppen verwendet.</German> <German>Ein verdrehtes Geflecht aus Fasern. Wird normalerweise zum Abseilen oder Abschleppen verwendet.</German>
<Polish>Lina skręcona z włókien. Zwykle używana do zjazdów lub holowania.</Polish> <Polish>Lina skręcona z włókien. Zwykle używana do zjazdów lub holowania.</Polish>
<Chinesesimp>编织绳。通常用于索降和牵引拖曳。</Chinesesimp> <Chinesesimp>编织绳。通常用于索降和牵引拖曳。</Chinesesimp>
<Korean>꼬아진 섬유질입니다. 주로 레펠이나 견인시 사용됩니다.</Korean> <Korean>꼬아진 섬유입니다. 주로 레펠이나 견인에 사용됩니다.</Korean>
</Key> </Key>
<Key ID="STR_ACE_Logistics_Rope_Rope_3_Display"> <Key ID="STR_ACE_Logistics_Rope_Rope_3_Display">
<English>Rope 3.2 meters</English> <English>Rope 3.2 meters</English>

View File

@ -24,7 +24,7 @@
<Chinese>每發所需時間</Chinese> <Chinese>每發所需時間</Chinese>
<Chinesesimp>每发所需时间</Chinesesimp> <Chinesesimp>每发所需时间</Chinesesimp>
<Japanese>弾頭毎の所有時間</Japanese> <Japanese>弾頭毎の所有時間</Japanese>
<Korean>탄당 시간</Korean> <Korean>당 시간</Korean>
<Polish>Czas na nabój</Polish> <Polish>Czas na nabój</Polish>
<Russian>Время на патрон</Russian> <Russian>Время на патрон</Russian>
<Portuguese>Tempo por projétil</Portuguese> <Portuguese>Tempo por projétil</Portuguese>
@ -56,7 +56,7 @@
<Chinese>每彈鍊所需時間</Chinese> <Chinese>每彈鍊所需時間</Chinese>
<Chinesesimp>每弹炼所需时间</Chinesesimp> <Chinesesimp>每弹炼所需时间</Chinesesimp>
<Japanese>ベルトリンク毎の所有時間</Japanese> <Japanese>ベルトリンク毎の所有時間</Japanese>
<Korean>띠 당 시간</Korean> <Korean>탄띠 당 시간</Korean>
<Polish>Czas na taśmę</Polish> <Polish>Czas na taśmę</Polish>
<Russian>Время на звено ленты</Russian> <Russian>Время на звено ленты</Russian>
<Portuguese>Tempo por carregador de cinto</Portuguese> <Portuguese>Tempo por carregador de cinto</Portuguese>
@ -161,7 +161,7 @@
<Italian>%1 Pieno(i) e %2 Parziale(i)</Italian> <Italian>%1 Pieno(i) e %2 Parziale(i)</Italian>
<Portuguese>%1 Total e %2 Parcial </Portuguese> <Portuguese>%1 Total e %2 Parcial </Portuguese>
<Japanese>%1 個の満杯と %2 個の弾薬入り弾倉</Japanese> <Japanese>%1 個の満杯と %2 個の弾薬入り弾倉</Japanese>
<Korean>%1 꽉찼고 %2 부분참</Korean> <Korean>%1 꽉 찼고 %2 부분적으로 </Korean>
<Chinesesimp>%1个满的与%2个部分的</Chinesesimp> <Chinesesimp>%1个满的与%2个部分的</Chinesesimp>
<Chinese>%1個滿的與%2個部分的</Chinese> <Chinese>%1個滿的與%2個部分的</Chinese>
<Turkish>%1 Dolu ve %2 Partial</Turkish> <Turkish>%1 Dolu ve %2 Partial</Turkish>

View File

@ -11,7 +11,7 @@
// MINIMAL required version for the Mod. Components can specify others.. // MINIMAL required version for the Mod. Components can specify others..
#define REQUIRED_VERSION 2.06 #define REQUIRED_VERSION 2.06
#define REQUIRED_CBA_VERSION {3,15,6} #define REQUIRED_CBA_VERSION {3,15,7}
#ifdef COMPONENT_BEAUTIFIED #ifdef COMPONENT_BEAUTIFIED
#define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED) #define COMPONENT_NAME QUOTE(ACE3 - COMPONENT_BEAUTIFIED)

View File

@ -1,4 +1,4 @@
#define MAJOR 3 #define MAJOR 3
#define MINOR 14 #define MINOR 15
#define PATCHLVL 1 #define PATCHLVL 0
#define BUILD 65 #define BUILD 67

View File

@ -14,7 +14,7 @@
<Japanese>ACE ロジスティクス</Japanese> <Japanese>ACE ロジスティクス</Japanese>
<Chinesesimp>ACE 后勤</Chinesesimp> <Chinesesimp>ACE 后勤</Chinesesimp>
<Chinese>ACE 後勤</Chinese> <Chinese>ACE 後勤</Chinese>
<Korean>ACE 군수</Korean> <Korean>ACE 병참</Korean>
<Turkish>ACE Lojistik</Turkish> <Turkish>ACE Lojistik</Turkish>
</Key> </Key>
<Key ID="STR_ACE_Main_URL"> <Key ID="STR_ACE_Main_URL">

View File

@ -61,7 +61,7 @@
<Italian>Luce della torcia in mappa</Italian> <Italian>Luce della torcia in mappa</Italian>
<French>Lueur lampe carte</French> <French>Lueur lampe carte</French>
<Japanese>地図をライトで照らす</Japanese> <Japanese>地図をライトで照らす</Japanese>
<Korean>지도 조명이 빛이 납니까</Korean> <Korean>지도 조명 발광</Korean>
<Chinesesimp>增加地图亮度</Chinesesimp> <Chinesesimp>增加地图亮度</Chinesesimp>
<Chinese>增加地圖亮度</Chinese> <Chinese>增加地圖亮度</Chinese>
</Key> </Key>
@ -76,7 +76,7 @@
<Czech>Přidat externí záři hráči který používá baterku v mapě?</Czech> <Czech>Přidat externí záři hráči který používá baterku v mapě?</Czech>
<Italian>Aggiungi luce esterna a giocatori che usano la torcia in mappa?</Italian> <Italian>Aggiungi luce esterna a giocatori che usano la torcia in mappa?</Italian>
<Japanese>プレイヤーが地図をフラッシュライトで照らせられるように設定します。</Japanese> <Japanese>プレイヤーが地図をフラッシュライトで照らせられるように設定します。</Japanese>
<Korean>지도에 불빛을 비치는 플레이어를 조금 더 밝게 합니까?</Korean> <Korean>지도에 조명을 사용하는 플레이어에 외부 불빛을 추가합니까?</Korean>
<Chinesesimp>当玩家打开手电筒时,增加地图亮度。</Chinesesimp> <Chinesesimp>当玩家打开手电筒时,增加地图亮度。</Chinesesimp>
<Chinese>當玩家擁有手電筒時,增加地圖亮度?</Chinese> <Chinese>當玩家擁有手電筒時,增加地圖亮度?</Chinese>
</Key> </Key>
@ -109,7 +109,7 @@
<Russian>Заставлять карту трястись при ходьбе?</Russian> <Russian>Заставлять карту трястись при ходьбе?</Russian>
<Italian>Far scuotere la mappa mentre cammini?</Italian> <Italian>Far scuotere la mappa mentre cammini?</Italian>
<Japanese>歩いているときは地図を揺らすかかどうかを設定できます。</Japanese> <Japanese>歩いているときは地図を揺らすかかどうかを設定できます。</Japanese>
<Korean>걸을때 지도보면 흔들리게 합니까?</Korean> <Korean>걸을 때 지도보면 흔들리게 합니까?</Korean>
<Chinesesimp>走路时打开地图会产生晃动。</Chinesesimp> <Chinesesimp>走路时打开地图会产生晃动。</Chinesesimp>
<Chinese>走路時讓地圖有震動的感覺?</Chinese> <Chinese>走路時讓地圖有震動的感覺?</Chinese>
</Key> </Key>
@ -157,7 +157,7 @@
<Russian>Показывать координаты курсора</Russian> <Russian>Показывать координаты курсора</Russian>
<Italian>Mostra coordinate sul cursore</Italian> <Italian>Mostra coordinate sul cursore</Italian>
<Japanese>カーソル先で座標を表示</Japanese> <Japanese>カーソル先で座標を表示</Japanese>
<Korean>커서에 좌표를 보이게 합니까</Korean> <Korean>커서에 좌표를 보이</Korean>
<Chinesesimp>显示光标的座标</Chinesesimp> <Chinesesimp>显示光标的座标</Chinesesimp>
<Chinese>顯示游標的座標</Chinese> <Chinese>顯示游標的座標</Chinese>
</Key> </Key>
@ -285,7 +285,7 @@
<Russian>Скрыть группы ботов</Russian> <Russian>Скрыть группы ботов</Russian>
<Italian>Nascondere gruppi IA</Italian> <Italian>Nascondere gruppi IA</Italian>
<Japanese>AI グループを非表示</Japanese> <Japanese>AI グループを非表示</Japanese>
<Korean>인공지능 그룹을 숨깁니까</Korean> <Korean>인공지능 그룹 숨기기</Korean>
<Chinesesimp>隐藏 AI 小队</Chinesesimp> <Chinesesimp>隐藏 AI 小队</Chinesesimp>
<Chinese>隱藏AI小隊</Chinese> <Chinese>隱藏AI小隊</Chinese>
</Key> </Key>
@ -317,7 +317,7 @@
<Russian>Показать имена игроков</Russian> <Russian>Показать имена игроков</Russian>
<Italian>Mostra i nomi dei giocatori</Italian> <Italian>Mostra i nomi dei giocatori</Italian>
<Japanese>プレイヤー名を表示</Japanese> <Japanese>プレイヤー名を表示</Japanese>
<Korean>플레이어 이름 표시합니까</Korean> <Korean>플레이어 이름 표시</Korean>
<Chinesesimp>显示玩家名称</Chinesesimp> <Chinesesimp>显示玩家名称</Chinesesimp>
<Chinese>顯示玩家名稱</Chinese> <Chinese>顯示玩家名稱</Chinese>
</Key> </Key>
@ -380,7 +380,7 @@
<Spanish>NVG</Spanish> <Spanish>NVG</Spanish>
<Italian>NVG</Italian> <Italian>NVG</Italian>
<Japanese>夜間暗視装置</Japanese> <Japanese>夜間暗視装置</Japanese>
<Korean>야투경</Korean> <Korean></Korean>
<Chinesesimp>夜视仪</Chinesesimp> <Chinesesimp>夜视仪</Chinesesimp>
<Chinese>夜視鏡</Chinese> <Chinese>夜視鏡</Chinese>
<Turkish>NVG</Turkish> <Turkish>NVG</Turkish>

View File

@ -168,7 +168,7 @@
<Spanish>Color por defecto para líderes cuando no está configurado [Módulo: dejar en blanco para no forzar]</Spanish> <Spanish>Color por defecto para líderes cuando no está configurado [Módulo: dejar en blanco para no forzar]</Spanish>
<French>Définit la couleur par défaut pour les chefs de groupe quand il n'y a pas de réglage de groupe. [Module : laisser vide pour ne pas forcer chez les clients.]</French> <French>Définit la couleur par défaut pour les chefs de groupe quand il n'y a pas de réglage de groupe. [Module : laisser vide pour ne pas forcer chez les clients.]</French>
<Japanese>グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません]</Japanese> <Japanese>グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません]</Japanese>
<Korean>그룹 설정이 없는 경우 리더의 예비 색상 값입니다. [모듈: 클라이언트에서 강체치 않기 위해 공백으로 비워둘것]</Korean> <Korean>그룹 설정이 없는 경우 리더의 예비 색상 값입니다. [모듈: 클라이언트에서 강체하지 않기 위해 공백으로 비워둘 것]</Korean>
<Chinesesimp>当没有设定小队颜色时,此功能会定义队长的指示颜色。[模块:此栏留空来保持预设颜色]</Chinesesimp> <Chinesesimp>当没有设定小队颜色时,此功能会定义队长的指示颜色。[模块:此栏留空来保持预设颜色]</Chinesesimp>
<Chinese>當沒有設定小隊顏色時,此功能會定義隊長的指示器顏色。[模塊: 此欄留空來保持預設顏色]</Chinese> <Chinese>當沒有設定小隊顏色時,此功能會定義隊長的指示器顏色。[模塊: 此欄留空來保持預設顏色]</Chinese>
<Czech>Záložní barva pro velitele skupin pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů]</Czech> <Czech>Záložní barva pro velitele skupin pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů]</Czech>
@ -199,7 +199,7 @@
<Spanish>Color por defecto cuando no está configurado [Módulo: dejar en blanco para no forzar]</Spanish> <Spanish>Color por defecto cuando no está configurado [Módulo: dejar en blanco para no forzar]</Spanish>
<French>Définit la couleur par défaut quand il n'y a pas de réglage pour le groupe. [Module : laisser vide pour ne pas forcer chez les clients.]</French> <French>Définit la couleur par défaut quand il n'y a pas de réglage pour le groupe. [Module : laisser vide pour ne pas forcer chez les clients.]</French>
<Japanese>グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません]</Japanese> <Japanese>グループ設定が存在しない場合に、グループ リーダーへ設定される色の値を設定します。[モジュール:空の場合はクライアントへ強制しません]</Japanese>
<Korean>그룹 설정이 없을 경우의 예비 색상입니다. [모듈: 클라이언트에서 강체치 않기 위해 공백으로 비워둘것]</Korean> <Korean>그룹 설정이 없을 경우의 예비 색상입니다. [모듈: 클라이언트에서 강체하지 않기 위해 공백으로 비워둘 것]</Korean>
<Chinesesimp>当没有设定小队颜色时,此功能会定义玩家的指示颜色。[模块:此栏留空来保持预设颜色]</Chinesesimp> <Chinesesimp>当没有设定小队颜色时,此功能会定义玩家的指示颜色。[模块:此栏留空来保持预设颜色]</Chinesesimp>
<Chinese>當沒有設定小隊顏色時,此功能會定義玩家的指示器顏色。[模塊: 此欄留空來保持預設顏色]</Chinese> <Chinese>當沒有設定小隊顏色時,此功能會定義玩家的指示器顏色。[模塊: 此欄留空來保持預設顏色]</Chinese>
<Czech>Záložní barva pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů]</Czech> <Czech>Záložní barva pokud není žádné skupinové nastavení [Modul: ponechat prázdné abyste nepřepsali nastavení klientů]</Czech>
@ -296,7 +296,7 @@
<Polish>Maksymalny zasięg kamery</Polish> <Polish>Maksymalny zasięg kamery</Polish>
<German>Maximale Kamerareichweite</German> <German>Maximale Kamerareichweite</German>
<Chinesesimp>摄像机最大范围</Chinesesimp> <Chinesesimp>摄像机最大范围</Chinesesimp>
<Korean>킴[리 처;데 갈;</Korean> <Korean>카메라와 지도 신호의 최대 거리</Korean>
</Key> </Key>
<Key ID="STR_ACE_Map_Gestures_maxRangeCamera_description"> <Key ID="STR_ACE_Map_Gestures_maxRangeCamera_description">
<English>Max range between a Camera and players to show the map gesture indicator</English> <English>Max range between a Camera and players to show the map gesture indicator</English>

View File

@ -52,7 +52,7 @@ class CfgVehicles {
}; };
class ACE_MapToolsAlignCompass { class ACE_MapToolsAlignCompass {
displayName = CSTRING(MapToolsAlignCompass); displayName = CSTRING(MapToolsAlignCompass);
condition = QUOTE((GVAR(mapTool_Shown) != 0) && {'ItemCompass' in assigneditems ACE_player}); condition = QUOTE(GVAR(mapTool_Shown) != 0 && {getUnitLoadout ACE_player param [ARR_2(9, [])] param [ARR_2(3, '')] != ''});
statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player;); statement = QUOTE(GVAR(mapTool_angle) = getDir ACE_player;);
exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"}; exceptions[] = {"isNotDragging", "notOnMap", "isNotInside", "isNotSitting"};
showDisabled = 1; showDisabled = 1;

View File

@ -17,7 +17,7 @@
visibleMap && visibleMap &&
{alive ACE_player} && {alive ACE_player} &&
{getText (configFile >> "CfgWeapons" >> (assignedItems ACE_player param [0, ""]) >> "simulation") == "ItemMap"} &&
{"ACE_MapTools" in (ACE_player call EFUNC(common,uniqueItems))} && {"ACE_MapTools" in (ACE_player call EFUNC(common,uniqueItems))} &&
{!GVAR(mapTool_isDragging)} && {!GVAR(mapTool_isDragging)} &&
{!GVAR(mapTool_isRotating)} {!GVAR(mapTool_isRotating)} &&
{getUnitLoadout ACE_player param [9, []] param [0, ""] != ""}

View File

@ -0,0 +1 @@
z\ace\addons\marker_flags

View File

@ -0,0 +1,17 @@
class Extended_PreStart_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preStart));
};
};
class Extended_PreInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_preInit));
};
};
class Extended_PostInit_EventHandlers {
class ADDON {
init = QUOTE(call COMPILE_SCRIPT(XEH_postInit));
};
};

View File

@ -0,0 +1,51 @@
class CfgVehicles {
class Man;
class CAManBase: Man {
class ACE_SelfActions {
class ACE_Equipment {
class ADDON {
displayName = CSTRING(ActionPlace);
condition = QUOTE(_player call FUNC(canPlace));
insertChildren = QUOTE(_this call FUNC(addActions));
};
};
};
};
class FlagMarker_01_F;
class GVAR(white): FlagMarker_01_F {
scope = 2;
scopeCurator = 2;
author = ECSTRING(common,ACETeam);
displayName = CSTRING(white);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,1,1,1,co)"};
};
class GVAR(black): GVAR(white) {
displayName = CSTRING(black);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0,0,0,1,co)"};
};
class GVAR(red): GVAR(white) {
displayName = CSTRING(red);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,0,0,1,co)"};
};
class GVAR(green): GVAR(white) {
displayName = CSTRING(green);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0,1,0,1,co)"};
};
class GVAR(blue): GVAR(white) {
displayName = CSTRING(blue);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0,0,1,1,co)"};
};
class GVAR(yellow): GVAR(white) {
displayName = CSTRING(yellow);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,1,0,1,co)"};
};
class GVAR(orange): GVAR(white) {
displayName = CSTRING(orange);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(1,0.5,0,1,co)"};
};
class GVAR(purple): GVAR(white) {
displayName = CSTRING(purple);
hiddenSelectionsTextures[] = {"#(argb,8,8,3)color(0.5,0,0.5,1,co)"};
};
};

View File

@ -0,0 +1,55 @@
class CfgWeapons {
class ACE_ItemCore;
class CBA_MiscItem_ItemInfo;
class GVAR(white): ACE_ItemCore {
GVAR(vehicle) = GVAR(white);
author = ECSTRING(common,ACETeam);
scope = 2;
displayName = CSTRING(white);
model = QPATHTOF(data\ace_markerpole.p3d);
picture = QPATHTOF(ui\white_ca.paa);
icon = "iconObject_1x10";
mapSize = 0.2;
class ItemInfo: CBA_MiscItem_ItemInfo {
mass = 1;
};
};
class GVAR(black): GVAR(white) {
GVAR(vehicle) = GVAR(black);
displayName = CSTRING(black);
picture = QPATHTOF(ui\black_ca.paa);
};
class GVAR(red): GVAR(white) {
GVAR(vehicle) = GVAR(red);
displayName = CSTRING(red);
picture = QPATHTOF(ui\red_ca.paa);
};
class GVAR(green): GVAR(white) {
GVAR(vehicle) = GVAR(green);
displayName = CSTRING(green);
picture = QPATHTOF(ui\green_ca.paa);
};
class GVAR(blue): GVAR(white) {
GVAR(vehicle) = GVAR(blue);
displayName = CSTRING(blue);
picture = QPATHTOF(ui\blue_ca.paa);
};
class GVAR(yellow): GVAR(white) {
GVAR(vehicle) = GVAR(yellow);
displayName = CSTRING(yellow);
picture = QPATHTOF(ui\yellow_ca.paa);
};
class GVAR(orange): GVAR(white) {
GVAR(vehicle) = GVAR(orange);
displayName = CSTRING(orange);
picture = QPATHTOF(ui\orange_ca.paa);
};
class GVAR(purple): GVAR(white) {
GVAR(vehicle) = GVAR(purple);
displayName = CSTRING(purple);
picture = QPATHTOF(ui\purple_ca.paa);
};
};

View File

@ -0,0 +1,5 @@
PREP(addActions);
PREP(canPlace);
PREP(getFlags);
PREP(pickUpFlag);
PREP(placeFlag);

View File

@ -0,0 +1,22 @@
#include "script_component.hpp"
if (!hasInterface) exitWith {};
private _weapons = (call (uiNamespace getVariable [QGVAR(flagItems), {[]}])) apply {configFile >> "CfgWeapons" >> _x};
{
private _name = configName _x;
private _vehicle = getText (_x >> QGVAR(vehicle));
GVAR(flagCache) set [_name, _vehicle];
private _action = [
QGVAR(pickup),
LLSTRING(ActionPickUp),
"",
{call FUNC(pickUpFlag)},
{[_player, _target, []] call EFUNC(common,canInteractWith)},
{},
[_name]
] call EFUNC(interact_menu,createAction);
[_vehicle, 0, ["ACE_MainActions"], _action] call EFUNC(interact_menu,addActionToClass);
} forEach _weapons;

View File

@ -0,0 +1,13 @@
#include "script_component.hpp"
ADDON = false;
PREP_RECOMPILE_START;
#include "XEH_PREP.hpp"
PREP_RECOMPILE_END;
#include "initSettings.sqf"
GVAR(flagCache) = createHashMap;
ADDON = true;

View File

@ -0,0 +1,6 @@
#include "script_component.hpp"
#include "XEH_PREP.hpp"
private _weapons = (configProperties [configfile >> "CfgWeapons", QUOTE(isClass _x && (isText (_x >> QQGVAR(vehicle)))), true]) apply {configName _x};
uiNamespace setVariable [QGVAR(flagItems), compileFinal str _weapons];

View File

@ -0,0 +1,37 @@
#include "script_component.hpp"
class CfgPatches {
class ADDON {
name = COMPONENT_NAME;
units[] = {
QGVAR(white),
QGVAR(black),
QGVAR(red),
QGVAR(green),
QGVAR(blue),
QGVAR(yellow),
QGVAR(orange),
QGVAR(purple)
};
weapons[] = {
QGVAR(white),
QGVAR(black),
QGVAR(red),
QGVAR(green),
QGVAR(blue),
QGVAR(yellow),
QGVAR(orange),
QGVAR(purple)
};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"ace_interact_menu"};
author = ECSTRING(common,ACETeam);
authors[] = {"Brett Mayson"};
url = ECSTRING(main,URL);
VERSION_CONFIG;
};
};
#include "CfgEventHandlers.hpp"
#include "CfgVehicles.hpp"
#include "CfgWeapons.hpp"

View File

@ -0,0 +1,79 @@
ambient[]={1,1,1,1};
diffuse[]={1,1,1,1};
forcedDiffuse[]={0,0,0,0};
emmisive[]={0,0,0,1};
specular[]={0.01,0.01,0.01,1}; //amount of glossiness - the higher the number, the higher the glossiness
specularPower=500; //area of glossiness - the higher the number, the smaller the area
PixelShaderID="Super";
VertexShaderID="Super";
class Stage1 {
texture="#(rgb,1,1,1)color(0.5,0.5,1,1)";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage2 {
texture="#(argb,8,8,3)color(0.5,0.5,0.5,1,dt)";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage3 {
texture="#(argb,8,8,3)color(0,0,0,0,mc)";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage4 {
texture="#(argb,8,8,3)color(1,1,1,1,as)";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,1};
pos[]={0,0,1};
};
};
class Stage5 {
texture="#(rgb,1,1,1)color(0.2,0.2,1,1)";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,0};
pos[]={0,0,0};
};
};
class Stage6 {
texture="#(ai,64,64,1)fresnel(4.7,1.2)";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,1};
pos[]={0,0,0};
};
};
class Stage7 {
texture="a3\data_f\env_land_ca.paa";
uvSource="tex";
class uvTransform {
aside[]={1,0,0};
up[]={0,1,0};
dir[]={0,0,1};
pos[]={0,0,0};
};
};

Binary file not shown.

View File

@ -0,0 +1,39 @@
#include "script_component.hpp"
/*
* Author: Brett Mayson
* Adds the child actions for placing flags.
*
* Arguments:
* 0: Player <OBJECT>
*
* Return Value:
* Actions <ARRAY>
*
* Example:
* [player] call ace_marker_flags_fnc_addActions
*
* Public: No
*/
params ["_unit"];
private _actions = [];
{
private _config = configFile >> "CfgWeapons" >> _x;
_actions pushBack [
[
_x,
getText (_config >> "displayName"),
getText (_config >> "picture"),
{[_this select 0, _this select 2] call FUNC(placeFlag)},
{true},
{},
_x
] call EFUNC(interact_menu,createAction),
[],
_unit
];
} forEach ([_unit] call FUNC(getFlags));
_actions

View File

@ -0,0 +1,20 @@
#include "script_component.hpp"
/*
* Authors: Brett Mayson
* Checks if a flag can be placed by a unit.
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return Value:
* Can place <BOOL>
*
* Example:
* player call ace_marker_flags_fnc_canPlace
*
* Public: No
*/
params ["_unit"];
GVAR(placeAnywhere) || {_unit call EFUNC(common,canDig)}

View File

@ -0,0 +1,20 @@
#include "script_component.hpp"
/*
* Authors: Brett Mayson
* Get the placeable flags in the unit's inventory.
*
* Arguments:
* 0: Unit <OBJECT>
*
* Return Value:
* flags <ARRAY>
*
* Example:
* [_unit] call ace_marker_flags_fnc_getFlags
*
* Public: No
*/
params ["_unit"];
(_unit call EFUNC(common,uniqueItems)) arrayIntersect keys GVAR(flagCache)

View File

@ -0,0 +1,28 @@
#include "script_component.hpp"
/*
* Author: Brett Mayson
* Places a flag in front of the unit.
*
* Arguments:
* 0: Flag <OBJECT>
* 1: Unit <OBJECT>
* 2: Action Args <ARRAY>
*
* Return Value:
* Nothing
*
* Example:
* [_flag,player,"x"] call ace_marker_flags_fnc_pickupFlag
*
* Public: No
*/
params [["_flag", objNull, [objNull]], ["_unit", objNull, [objNull]], ["_args", [""], [[]]]];
private _itemName = _args # 0;
TRACE_3("pickupFlag",_unit,_flag,_itemName);
if (isNull _flag) exitWith {};
[_unit, "PutDown"] call EFUNC(common,doGesture);
deleteVehicle _flag;
[_unit, _itemName] call EFUNC(common,addToInventory);

View File

@ -0,0 +1,27 @@
#include "script_component.hpp"
/*
* Author: Brett Mayson
* Places a flag in front of the unit.
*
* Arguments:
* 0: Unit <OBJECT>
* 1: Flag <STRING>
*
* Return Value:
* Flag <OBJECT>
*
* Example:
* [player, "ace_marker_flags_white"] call ace_marker_flags_fnc_placeFlag
*
* Public: No
*/
params [["_unit", objNull, [objNull]], ["_flag", QGVAR(white), [""]]];
_unit removeItem _flag;
_flag = GVAR(flagCache) get _flag; // convert to vehicle type
private _pos = _unit modelToWorld [0, 1, 0];
private _flag = _flag createVehicle _pos;
_flag setPos _pos;
[QGVAR(placed), [_unit, _flag]] call CBA_fnc_localEvent;
[_unit, "PutDown"] call EFUNC(common,doGesture);

View File

@ -0,0 +1 @@
#include "\z\ace\addons\marker_flags\script_component.hpp"

View File

@ -0,0 +1,9 @@
private _category = [LELSTRING(common,categoryUncategorized), LLSTRING(DisplayName_Settings)];
[
QGVAR(placeAnywhere), "CHECKBOX",
[LSTRING(PlaceAnywhere_DisplayName), LSTRING(PlaceAnywhere_Description)],
_category,
false, // default value
true // isGlobal
] call CBA_fnc_addSetting;

View File

@ -0,0 +1,17 @@
#define COMPONENT marker_flags
#define COMPONENT_BEAUTIFIED Marker Flags
#include "\z\ace\addons\main\script_mod.hpp"
// #define DEBUG_MODE_FULL
// #define DISABLE_COMPILE_CACHE
// #define ENABLE_PERFORMANCE_COUNTERS
#ifdef DEBUG_ENABLED_MARKER_FLAGS
#define DEBUG_MODE_FULL
#endif
#ifdef DEBUG_ENABLED_MARKER_FLAGS
#define DEBUG_SETTINGS DEBUG_ENABLED_MARKER_FLAGS
#endif
#include "\z\ace\addons\main\script_macros.hpp"

Some files were not shown because too many files have changed in this diff Show More