mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Merge remote-tracking branch 'refs/remotes/acemod/master' into rearm
Conflicts: addons/missileguidance/CfgAmmo.hpp
This commit is contained in:
commit
f02c57b599
29
.travis.yml
29
.travis.yml
@ -1,15 +1,30 @@
|
||||
branches:
|
||||
only:
|
||||
- master
|
||||
- master
|
||||
language: python
|
||||
python:
|
||||
- "3.4"
|
||||
- '3.4'
|
||||
before_script:
|
||||
- pip install pygithub
|
||||
- pip install pygithub3
|
||||
- if [ -n "${GH_TOKEN}" ] && [ "${TRAVIS_BRANCH}" == "master" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then
|
||||
pip install pygithub;
|
||||
pip install pygithub3;
|
||||
fi
|
||||
script:
|
||||
- python3 tools/deploy.py
|
||||
- python3 tools/sqf_validator.py
|
||||
- python3 tools/sqf_validator.py
|
||||
- if [ -n "${GH_TOKEN}" ] && [ "${TRAVIS_BRANCH}" == "master" ] && [ "${TRAVIS_PULL_REQUEST}" == "false" ]; then
|
||||
python3 tools/deploy.py;
|
||||
fi
|
||||
env:
|
||||
global:
|
||||
- secure: "KcJQbknBOdC5lA4nFGKPXVRVIGLDXDRzC8XkHuXJCE9pIR/wbxbkvx8fHKcC6SC9eHgzneC3+o4m4+CjIbVvIwDgslRbJ8Y59i90ncONmdoRx1HUYHwuYWVZm9HJFjCsIbrEqhSyyKS+PB3WZVOLbErtNHsgS8f43PTh5Ujg7Vg="
|
||||
- secure: KcJQbknBOdC5lA4nFGKPXVRVIGLDXDRzC8XkHuXJCE9pIR/wbxbkvx8fHKcC6SC9eHgzneC3+o4m4+CjIbVvIwDgslRbJ8Y59i90ncONmdoRx1HUYHwuYWVZm9HJFjCsIbrEqhSyyKS+PB3WZVOLbErtNHsgS8f43PTh5Ujg7Vg=
|
||||
notifications:
|
||||
slack:
|
||||
secure: aWYF/YX7vxEdXJ5w1jhYJQ2TtTP2NRdnXzJDMYXTv2dlXYhO9qp2qjxDGW3dezuPY7B1mPBgebfSKRx3Robkt1rAfEwPWivOiEztL30rwzOy+5Q1wpORv1JkvTC/q2wqQzxQCU/FPVjD2GkF1wtq1Rnx3ESWD8gbvzYoMNdIw1g=
|
||||
on_success: change
|
||||
on_failure: always
|
||||
on_start: never
|
||||
rooms:
|
||||
secure: MvxmqL1NGwiGTVv6uIVTM7jeNLQH95KYtTgSWlXaSw4jdjnf4cmrb/ofHQ3FHhhNVdhRN6W8n0cJfTC3DBZ90bionVh+528qw2mDnDbKljVdIwmoFSexBcH7H1uTLF3gsEz0tbrHtLcnAyTMxdjsdIXDLZ5hwxABNmW5/03jOgs=
|
||||
email:
|
||||
on_success: never
|
||||
on_failure: change
|
||||
|
@ -53,6 +53,7 @@ Dharma Bellamkonda <dharma.bellamkonda@gmail.com>
|
||||
Dimaslg <dimaslg@telecable.es>
|
||||
Drill <drill87@gmail.com>
|
||||
Dudakov <dudakov.s@gmail.com>
|
||||
Dslyecxi <dslyecxi@gmail.com>
|
||||
eRazeri
|
||||
evromalarkey <evromalarkey@gmail.com>
|
||||
F3 Project <alanr@ferstaberinde.com>
|
||||
|
64
CONTRIBUTING.md
Normal file
64
CONTRIBUTING.md
Normal file
@ -0,0 +1,64 @@
|
||||
# Reporting an issue
|
||||
|
||||
## Before reporting
|
||||
|
||||
If you have found an issue with ACE3 please make sure that ACE3 is really the cause of the problem. To do this try to reproduce the issue with using only `@CBA_A3` and `@ace` on a newly created mission.
|
||||
|
||||
Indicate if the issue appears on stable or development version. In case it is the development version, please also include the commit SHA-1 hash.
|
||||
|
||||
<div class="panel callout">
|
||||
<h5>Please note:</h5>
|
||||
<p>It's not a valid to simply remove <code>@ace</code> from the mod list to confirm that ACE3 is the culprit.</p>
|
||||
<p>If the error happens when using a <b>third-party mod</b> contact the author of the appropriate mod and report the issue there.</p>
|
||||
</div>
|
||||
|
||||
## Reporting the issue
|
||||
|
||||
Head over to the <a href="{{ site.githubUrl }}/issues" target="_blank">ACE3 GitHub issue tracker</a> and press the <a href="{{ site.githubUrl }}/issues/new" target="_blank">"New issue"</a> button in the top right corner. Add a descriptive title and copy the following issue template in to the text area:
|
||||
|
||||
```
|
||||
ACE3 Version: 3.x.x
|
||||
(indicate if stable or dev, if dev indicate the commit the version is based on)
|
||||
|
||||
**Mods:**
|
||||
* `@CBA_A3`
|
||||
* `@ace`
|
||||
|
||||
**Placed ACE3 Modules:**
|
||||
* *Add the list of modules you have placed on the map. Use 'None' if the error occurs without using any modules.*
|
||||
* You can also press the `Debug to` button in the ACE3 option menu (escape -> ACE3 options -> Debug to) and add a link (pastebin.com) to the results.
|
||||
|
||||
**Description:**
|
||||
* Add a detailed description of the error. This makes it easier for us to fix the issue.*
|
||||
|
||||
**Steps to reproduce:**
|
||||
* *Add the steps needed to reproduce the issue.*
|
||||
|
||||
**Where did the issue occur?**
|
||||
* A possible answer might be "Multiplayer", "Editor" or "Singleplayer"*
|
||||
|
||||
**RPT log file:**
|
||||
* Add a link (pastebin.com) to the client or server RPT file.*
|
||||
```
|
||||
|
||||
A video of the issue might be helpful in resolving it faster.
|
||||
|
||||
|
||||
Github uses <a href="http://daringfireball.net/projects/markdown/syntax" target="_blank">"Markdown"</a> to style the output. If you want to know more about it (e.g. how to <a href="https://help.github.com/articles/markdown-basics/#styling-text" target="_blank">turn text bold</a>, how to denote <a href="https://help.github.com/articles/markdown-basics/#inline-formats" target="_blank">code blocks</a> or <a href="https://help.github.com/articles/markdown-basics/#multiple-lines" target="_blank">inline code</a>) have a look at the <a href="https://help.github.com/articles/github-flavored-markdown/" target="_blank">GitHub markdown documentation</a>.
|
||||
|
||||
# Feature Requests
|
||||
|
||||
## Background
|
||||
ACE2, AGM and CSE had a lot of features implemented or planned. All of them are or have been evaluated for inclusion in ACE3 itself, and we'd like to port the majority of them eventually. However, due to time constraints, we have managed to finish only a fraction of the job so far.
|
||||
|
||||
Please refrain from making requests for any planned or existing features from either ACE2, AGM or CSE. Most of them are already being or have been considered for porting or a rewrite.
|
||||
|
||||
## Requesting a feature
|
||||
In order to avoid duplicates and keep the issue tracker organized, we have created a common issue for <a href="{{ site.githubUrl }}/issues/414/" target="_blank">ACE 3 Feature requests</a>. Any and all relevant requests should be submitted there, where they will also get discussed and evaluated. Before adding a new one, make sure to check the previous entries from the thread and do a quick search for similar suggestions; please don't reiterate requests for features that had already been accepted for inclusion, or those which were disregarded earlier.
|
||||
|
||||
Following their approval, feature requests may be moved by moderators to a separate issue for further discussion.
|
||||
|
||||
# Regarding Pull Requests (PRs)
|
||||
- You want to help but don't know where to start ? Check the wiki entry for [setting up the development environment](http://ace3mod.com/wiki/development/setting-up-the-development-environment.html)
|
||||
- [Make sure to respect the file structure](http://ace3mod.com/wiki/development/modularity-and-pbo-structure.html)
|
||||
- [Make sure to respect the coding guidelines](http://ace3mod.com/wiki/development/coding-guidelines.html)
|
16
README.md
16
README.md
@ -6,19 +6,22 @@
|
||||
<img src="https://img.shields.io/badge/Version-3.3.2-blue.svg" alt="ACE3 Version">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/releases/download/v3.3.2/ace3_3.3.2.zip">
|
||||
<img src="http://img.shields.io/badge/Download-62.0_MB-green.svg" alt="ACE3 Download">
|
||||
<img src="https://img.shields.io/badge/Download-65.7_MB-green.svg" alt="ACE3 Download">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/issues">
|
||||
<img src="http://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Issues" alt="ACE3 Issues">
|
||||
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Issues" alt="ACE3 Issues">
|
||||
</a>
|
||||
<a href="https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/?p=2859670">
|
||||
<img src="https://img.shields.io/badge/BIF-Thread-lightgrey.svg" alt="BIF Thread">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
|
||||
<img src="http://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License">
|
||||
<img src="https://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License">
|
||||
</a>
|
||||
<a href="http://slackin.koffeinflummi.de">
|
||||
<img src="http://slackin.koffeinflummi.de/badge.svg" alt="ACE3 Slack">
|
||||
<a href="http://slackin.ace3mod.com/">
|
||||
<img src="http://slackin.ace3mod.com/badge.svg" alt="ACE3 Slack">
|
||||
</a>
|
||||
<a href="https://travis-ci.org/acemod/ACE3">
|
||||
<img src="https://img.shields.io/travis/acemod/ACE3.svg" alt="ACE3 Build Status">
|
||||
</a>
|
||||
</p>
|
||||
<p align="center"><sup><strong>Requires the latest version of <a href="https://github.com/CBATeam/CBA_A3/releases">CBA A3</a>. Visit us on <a href="https://www.facebook.com/ACE3Mod">Facebook</a> | <a href="https://www.youtube.com/c/ACE3Mod">YouTube</a> | <a href="https://twitter.com/ACE3Mod">Twitter</a> | <a href="http://www.reddit.com/r/arma/search?q=ACE&restrict_sr=on&sort=new&t=all">Reddit</a></strong></sup></p>
|
||||
@ -66,7 +69,8 @@ The mod is **built modularly**, so almost any included PBO can be easily removed
|
||||
|
||||
### Guides & how-tos
|
||||
If you installed ACE3 but have trouble understanding how it all works, or where to start, read this first:
|
||||
- [Getting started](http://ace3mod.com/wiki/user/getting-started.html)
|
||||
- [Installation guide](http://ace3mod.com/wiki/user/installation-guide.html)
|
||||
- [Information center](http://ace3mod.com/wiki/user/information-center.html)
|
||||
|
||||
#### Contributing
|
||||
You can help out with the ongoing development by looking for potential bugs in our code base, or by contributing new features. To contribute something to ACE3, simply fork this repository and submit your pull requests for review by other collaborators. Remember to add yourself to the author array of any PBO you will be editing and the [`AUTHORS.txt`](https://github.com/acemod/ACE3/blob/master/AUTHORS.txt) file; including a valid email address.
|
||||
|
@ -218,6 +218,18 @@ class CfgVehicles {
|
||||
GVAR(size) = 2; // 1 = small, 2 = large
|
||||
GVAR(canLoad) = 1;
|
||||
};
|
||||
//"Supply Box" - Small Pallets
|
||||
class B_supplyCrate_F: ReammoBox_F {
|
||||
GVAR(size) = 6;
|
||||
};
|
||||
class IG_supplyCrate_F: ReammoBox_F {
|
||||
GVAR(size) = 6;
|
||||
};
|
||||
class C_supplyCrate_F: ReammoBox_F {
|
||||
GVAR(size) = 6;
|
||||
};
|
||||
|
||||
|
||||
|
||||
class Scrapyard_base_F;
|
||||
class Land_PaperBox_closed_F: Scrapyard_base_F {
|
||||
@ -425,5 +437,5 @@ class CfgVehicles {
|
||||
selection = "";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -9,11 +9,11 @@
|
||||
|
||||
//Singe PFEH to handle execNextFrame, waitAndExec and waitUntilAndExec:
|
||||
[{
|
||||
private ["_entry", "_deleted"];
|
||||
BEGIN_COUNTER(waitAndExec);
|
||||
|
||||
//Handle the waitAndExec array:
|
||||
while {!(GVAR(waitAndExecArray) isEqualTo []) && {GVAR(waitAndExecArray) select 0 select 0 <= ACE_Time}} do {
|
||||
_entry = GVAR(waitAndExecArray) deleteAt 0;
|
||||
local _entry = GVAR(waitAndExecArray) deleteAt 0;
|
||||
(_entry select 2) call (_entry select 1);
|
||||
};
|
||||
|
||||
@ -29,7 +29,7 @@
|
||||
GVAR(nextFrameNo) = diag_frameno + 1;
|
||||
|
||||
//Handle the waitUntilAndExec array:
|
||||
_deleted = 0;
|
||||
local _deleted = 0;
|
||||
{
|
||||
// if condition is satisifed call statement
|
||||
if ((_x select 2) call (_x select 0)) then {
|
||||
@ -39,6 +39,8 @@
|
||||
(_x select 2) call (_x select 1);
|
||||
};
|
||||
} forEach GVAR(waitUntilAndExecArray);
|
||||
|
||||
END_COUNTER(waitAndExec);
|
||||
}, 0, []] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
|
||||
|
@ -133,6 +133,7 @@ PREP(numberToDigitsString);
|
||||
PREP(numberToString);
|
||||
PREP(onAnswerRequest);
|
||||
PREP(owned);
|
||||
PREP(parseList);
|
||||
PREP(player);
|
||||
PREP(playerSide);
|
||||
PREP(positionToASL);
|
||||
|
@ -4,50 +4,41 @@
|
||||
* Used by moduleAssign* within various parts of the ACE3 project.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: list <STRING>
|
||||
* 1: variableName <STRING>
|
||||
* 2: value <ANY>
|
||||
* 0: List <STRING>
|
||||
* 1: Variable Name <STRING>
|
||||
* 2: Value <ANY>
|
||||
* 3: Global <BOOL>
|
||||
* 4: Vehicle <BOOL> (default: false)
|
||||
*
|
||||
* Return Value:
|
||||
* None <NIL>
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* ["text", "variable", value, true] call ace_common_fnc_assignObjectsInList
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_list", "_variable", "_setting", "_global"];
|
||||
params ["_list", "_variable", "_setting", "_global", ["_vehicle", false]];
|
||||
|
||||
if (typeName _list == "STRING") then {
|
||||
private ["_splittedList", "_nilCheckPassedList"];
|
||||
|
||||
_splittedList = [_list, ","] call BIS_fnc_splitString;
|
||||
_nilCheckPassedList = "";
|
||||
|
||||
{
|
||||
_x = [_x] call FUNC(stringRemoveWhiteSpace);
|
||||
if !(isNil _x) then {
|
||||
if (_nilCheckPassedList == "") then {
|
||||
_nilCheckPassedList = _x;
|
||||
} else {
|
||||
_nilCheckPassedList = _nilCheckPassedList + ","+ _x;
|
||||
};
|
||||
};
|
||||
false
|
||||
} count _splittedList;
|
||||
|
||||
_list = [] call compile format["[%1]",_nilCheckPassedList];
|
||||
_list = [_list, true, true] call FUNC(parseList);
|
||||
TRACE_1("Parsed",_list)
|
||||
};
|
||||
|
||||
{
|
||||
if (!isNil "_x") then {
|
||||
if (typeName _x == typeName objNull) then {
|
||||
if (local _x) then {
|
||||
_x setvariable [_variable, _setting, _global];
|
||||
if (_vehicle) then {
|
||||
(vehicle _x) setVariable [_variable, _setting, _global];
|
||||
TRACE_6("Set variable vehicle",_x,vehicle _x,typeOf (vehicle _x),_variable,_setting,_global);
|
||||
} else {
|
||||
_x setVariable [_variable, _setting, _global];
|
||||
TRACE_5("Set variable",_x,typeOf _x,_variable,_setting,_global);
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
false
|
||||
} count _list;
|
||||
|
||||
true
|
||||
|
@ -1,22 +1,24 @@
|
||||
/*
|
||||
* Author: ?
|
||||
* ?
|
||||
* Dumps an array to the RPT, showing the depth of each element.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Array to be dumped <ARRAY>
|
||||
* 1: Depth <NUMBER>
|
||||
* 1: Depth <NUMBER><OPTIONAL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [[0, [1,2], [[3]]]] call ace_common_fnc_dumpArray
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_var", "_depth"];
|
||||
params ["_var", ["_depth", 0, [0]]];
|
||||
|
||||
private "_pad";
|
||||
_pad = "";
|
||||
local _pad = "";
|
||||
|
||||
for "_i" from 0 to _depth do {
|
||||
_pad = _pad + toString [9];
|
||||
@ -38,5 +40,5 @@ if (IS_ARRAY(_var)) then {
|
||||
diag_log text format ["%1],", _pad];
|
||||
};
|
||||
} else {
|
||||
diag_log text format ["%1%2", _pad, [_var] call FUNC(formatVar)];
|
||||
diag_log text format ["%1%2", _pad, _var];
|
||||
};
|
||||
|
@ -20,11 +20,10 @@
|
||||
GVAR(remoteFnc) = _this;
|
||||
|
||||
params ["_arguments", "_function", "_unit", "_name"];
|
||||
TRACE_4("params", _arguments, _function, _unit, _name);
|
||||
|
||||
_function = call compile _function;
|
||||
|
||||
//["Remote", [_arguments, _this select 1, _name], {format ["%1 call %2 id: %3", _this select 0, _this select 1, _this select 2]}, false] call FUNC(log);
|
||||
|
||||
// execute function on every currently connected machine
|
||||
[[_arguments, _unit], _this select 1, 2] call FUNC(execRemoteFnc);
|
||||
|
||||
|
@ -23,11 +23,10 @@
|
||||
GVAR(remoteFnc) = _this;
|
||||
|
||||
params ["_arguments", "_function", ["_unit", 2]];
|
||||
TRACE_3("params", _arguments, _function, _unit);
|
||||
|
||||
_function = call compile _function;
|
||||
|
||||
//["Remote", [_arguments, _this select 1, _unit], {format ["%1 call %2 to: %3", _this select 0, _this select 1, _this select 2]}, false] call FUNC(log);
|
||||
|
||||
if (typeName _unit == "SCALAR") exitWith {
|
||||
switch (_unit) do {
|
||||
case 0 : {
|
||||
|
@ -8,29 +8,23 @@
|
||||
* Return Value:
|
||||
* Turret Index <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* [ace_player] call ace_common_fnc_getTurretIndex
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_unit"];
|
||||
|
||||
private ["_vehicle", "_turrets", "_units", "_index"];
|
||||
|
||||
_vehicle = vehicle _unit;
|
||||
|
||||
local _vehicle = vehicle _unit;
|
||||
if (_unit == _vehicle) exitWith {[]};
|
||||
|
||||
_turrets = allTurrets [_vehicle, true];
|
||||
|
||||
_units = [];
|
||||
scopeName "main";
|
||||
|
||||
{
|
||||
_units pushBack (_vehicle turretUnit _x);
|
||||
false
|
||||
} count _turrets;
|
||||
if (_unit == (_vehicle turretUnit _x)) then {_x breakOut "main"};
|
||||
nil
|
||||
} count allTurrets [_vehicle, true];
|
||||
|
||||
_index = _units find _unit;
|
||||
|
||||
if (_index == -1) exitWith {[]};
|
||||
|
||||
_turrets select _index;
|
||||
[]
|
||||
|
@ -21,7 +21,7 @@ private ["_vehicle", "_loadcar", "_loadair", "_loadtank", "_loadboat"];
|
||||
|
||||
_vehicle = objNull;
|
||||
|
||||
if (!([_caller] call FUNC(canInteract)) || {_caller == _unit}) exitwith {_vehicle};
|
||||
if (!([_caller, _unit, ["isNotDragging", "isNotCarrying"]] call FUNC(canInteractWith)) || {_caller == _unit}) exitwith {_vehicle};
|
||||
|
||||
_loadcar = nearestObject [_unit, "Car"];
|
||||
|
||||
|
59
addons/common/functions/fnc_parseList.sqf
Normal file
59
addons/common/functions/fnc_parseList.sqf
Normal file
@ -0,0 +1,59 @@
|
||||
/*
|
||||
* Author: Glowbal, Jonpas
|
||||
* Makes a list from a string using comma as a delimiter, optionally trim or remove whitespace and check each for object existence.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: List <STRING>
|
||||
* 1: Remove or Trim Whitespace <BOOL> (default: false (trim))
|
||||
* 2: Check Nil <BOOL> (default: false)
|
||||
*
|
||||
* Return Value:
|
||||
* Parsed List <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* ["text", true, false] call ace_common_fnc_parseList
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_list", ["_removeWhitespace", false], ["_checkNil", false]];
|
||||
|
||||
private ["_whitespaceList", "_nilCheckedList"];
|
||||
|
||||
// Split using comma delimiter
|
||||
_list = _list splitString ",";
|
||||
TRACE_1("Splitted List",_list);
|
||||
|
||||
|
||||
// Remove or Trim Whitespace
|
||||
_whitespaceList = [];
|
||||
{
|
||||
if (_removeWhitespace) then {
|
||||
_whitespaceList pushBack ([_x] call FUNC(stringRemoveWhiteSpace));
|
||||
} else {
|
||||
_whitespaceList pushBack ([_x] call CBA_fnc_trim);
|
||||
};
|
||||
nil
|
||||
} count _list;
|
||||
|
||||
_list = _whitespaceList;
|
||||
TRACE_1("Whitespace List",_list);
|
||||
|
||||
|
||||
// Check for object existence
|
||||
if (_checkNil) then {
|
||||
_nilCheckedList = [];
|
||||
{
|
||||
if !(isNil _x) then {
|
||||
_nilCheckedList pushBack (missionNamespace getVariable _x);
|
||||
};
|
||||
nil
|
||||
} count _list;
|
||||
|
||||
_list = _nilCheckedList;
|
||||
};
|
||||
|
||||
TRACE_1("Final List",_list);
|
||||
|
||||
_list
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Author: Glowbal
|
||||
* Sends a display information hint to a receiver
|
||||
*
|
||||
* Arguments:
|
||||
* 0: receiver <OBJECT>
|
||||
* 1: title <STRING>
|
||||
* 2: content <ARRAY>
|
||||
* 3: type (optional) <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params [["_reciever", objNull], ["_title", ""], ["_content", ""], ["_type", 0], ["_parameters", []]];
|
||||
|
||||
if (isPlayer _reciever) then {
|
||||
if (!local _reciever) then {
|
||||
[_this, QFUNC(sendDisplayInformationTo), _reciever, false] call FUNC(execRemoteFnc);
|
||||
} else {
|
||||
if (isLocalized _title) then {
|
||||
_title = localize _title;
|
||||
};
|
||||
|
||||
private "_localizationArray";
|
||||
_localizationArray = [_title];
|
||||
|
||||
{
|
||||
_localizationArray pushback _x;
|
||||
false
|
||||
} count _parameters;
|
||||
|
||||
_title = format _localizationArray;
|
||||
|
||||
{
|
||||
if (isLocalized _x) then {
|
||||
_localizationArray = [localize _x];
|
||||
|
||||
{
|
||||
_localizationArray pushBack _x;
|
||||
false
|
||||
} count _parameters;
|
||||
|
||||
_content set [_forEachIndex, format _localizationArray];
|
||||
};
|
||||
} forEach _content;
|
||||
|
||||
[_title, _content, _type] call FUNC(displayInformation);
|
||||
};
|
||||
};
|
@ -1,53 +0,0 @@
|
||||
/*
|
||||
* Author: Glowbal
|
||||
* Displays a message on locality of receiver
|
||||
*
|
||||
* Arguments:
|
||||
* 0: receiver <OBJECT>
|
||||
* 1: title <STRING>
|
||||
* 2: content <ARRAY>
|
||||
* 3: type (optional) <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Public: Yes
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params [["_reciever", objNull], ["_title", ""], ["_content", ""], ["_type", 0], ["_parameters", []]];
|
||||
|
||||
if (isPlayer _reciever) then {
|
||||
if (!local _reciever) then {
|
||||
[_this, QFUNC(sendDisplayMessageTo), _reciever, false] call FUNC(execRemoteFnc);
|
||||
} else {
|
||||
if (isLocalized _title) then {
|
||||
_title = localize _title;
|
||||
};
|
||||
|
||||
if (isLocalized _content) then {
|
||||
_content = localize _content;
|
||||
};
|
||||
|
||||
private "_localizationArray";
|
||||
_localizationArray = [_title];
|
||||
|
||||
{
|
||||
_localizationArray pushBack _x;
|
||||
false
|
||||
} count _parameters;
|
||||
|
||||
_title = format _localizationArray;
|
||||
|
||||
_localizationArray = [_content];
|
||||
|
||||
{
|
||||
_localizationArray pushBack _x;
|
||||
false
|
||||
} count _parameters;
|
||||
|
||||
_content = format _localizationArray;
|
||||
|
||||
[_title, _content, _type] call FUNC(displayMessage);
|
||||
};
|
||||
};
|
@ -1,26 +1,26 @@
|
||||
/*
|
||||
* Author: ?
|
||||
* ?
|
||||
* Author: jaynus
|
||||
* PFEH to set all Ace Time Variables
|
||||
*
|
||||
* Arguments:
|
||||
* ?
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* ?
|
||||
* None
|
||||
*
|
||||
* Public: ?
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_lastTickTime", "_lastGameTime", "_delta"];
|
||||
BEGIN_COUNTER(timePFH);
|
||||
|
||||
_lastTickTime = ACE_diagTime;
|
||||
_lastGameTime = ACE_gameTime;
|
||||
local _lastTickTime = ACE_diagTime;
|
||||
local _lastGameTime = ACE_gameTime;
|
||||
|
||||
ACE_gameTime = time;
|
||||
ACE_diagTime = diag_tickTime;
|
||||
|
||||
_delta = ACE_diagTime - _lastTickTime;
|
||||
local _delta = ACE_diagTime - _lastTickTime;
|
||||
|
||||
if (ACE_gameTime <= _lastGameTime) then {
|
||||
TRACE_1("paused",_delta);
|
||||
@ -36,3 +36,5 @@ if (ACE_gameTime <= _lastGameTime) then {
|
||||
ACE_virtualTime = ACE_virtualTime + (_delta * accTime);
|
||||
ACE_time = ACE_virtualTime;
|
||||
};
|
||||
|
||||
END_COUNTER(timePFH);
|
||||
|
@ -1,4 +1,3 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
PARAMS_1(_wire);
|
||||
_wire addEventHandler ["HandleDamage", {_this call FUNC(handleDamage)}];
|
||||
params ["_wire"];
|
||||
_wire addEventHandler ["HandleDamage", FUNC(handleDamage)];
|
||||
|
@ -8,10 +8,9 @@
|
||||
* 1: unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
@ -22,7 +21,7 @@ private ["_wireNoGeo", "_dir", "_pos", "_wireNoGeoPos"];
|
||||
_wireNoGeo = "ACE_ConcertinaWireNoGeo" createVehicle [0,0,0];
|
||||
{
|
||||
_wireNoGeo animate [_x, 1];
|
||||
} foreach WIRE_FAST;
|
||||
} count WIRE_FAST;
|
||||
|
||||
GVAR(placer) = _unit;
|
||||
_dir = getDir _unit;
|
||||
@ -37,8 +36,9 @@ deleteVehicle _wirecoil;
|
||||
_unit setVariable [QGVAR(wireDeployed), false];
|
||||
|
||||
GVAR(deployPFH) = [{
|
||||
EXPLODE_3_PVT(_this select 0,_wireNoGeo,_wireNoGeoPos,_unit);
|
||||
|
||||
params ["_args", "_idPFH"];
|
||||
_args params ["_wireNoGeo", "_wireNoGeoPos", "_unit"];
|
||||
|
||||
private ["_range", "_posStart", "_posEnd", "_dirVect", "_dir", "_anim", "_wire"];
|
||||
_posStart = (_wireNoGeo modelToWorldVisual (_wireNoGeo selectionPosition "start")) call EFUNC(common,positionToASL);
|
||||
_posEnd = (getPosASL _unit) vectorAdd (vectorDir _unit);
|
||||
@ -46,37 +46,38 @@ GVAR(deployPFH) = [{
|
||||
_dir = _dirVect call CBA_fnc_vectDir;
|
||||
_range = vectorMagnitude _dirVect;
|
||||
_anim = 0 max (1 - (_range / 12));
|
||||
|
||||
|
||||
if (!(alive _unit) || _range >= 12 || (_unit getVariable [QGVAR(wireDeployed), false])) exitWith {
|
||||
_wire = "ACE_ConcertinaWire" createvehicle [0, 0, 0];
|
||||
{
|
||||
_wire animate [_x, _anim];
|
||||
} foreach WIRE_FAST;
|
||||
|
||||
} count WIRE_FAST;
|
||||
|
||||
[{
|
||||
EXPLODE_5_PVT(_this select 0,_wireNoGeo,_wire,_anim,_dir,_wireNoGeoPos);
|
||||
params ["_args", "_idPFH"];
|
||||
_args params ["_wireNoGeo", "_wire", "_anim", "_dir", "_wireNoGeoPos"];
|
||||
if (_wire animationPhase "wire_2" == _anim) then {
|
||||
deleteVehicle _wireNoGeo;
|
||||
_wire setDir _dir;
|
||||
_wire setPosASL _wireNoGeoPos;
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
[_idPFH] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
}, 0, [_wireNoGeo, _wire, _anim, _dir, _wireNoGeoPos]] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
|
||||
[_unit, "DefaultAction", _unit getVariable [QGVAR(Deploy), -1]] call EFUNC(Common,removeActionEventHandler);
|
||||
call EFUNC(interaction,hideMouseHint);
|
||||
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
|
||||
[_idPFH] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
|
||||
_wireNoGeo setDir _dir;
|
||||
{
|
||||
_wireNoGeo animate [_x, _anim];
|
||||
} foreach WIRE_FAST;
|
||||
} count WIRE_FAST;
|
||||
}, 0, [_wireNoGeo, _wireNoGeoPos, _unit]] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
[localize "STR_ACE_ROLLWIRE", "", ""] call EFUNC(interaction,showMouseHint);
|
||||
|
||||
|
||||
GVAR(placer) setVariable [QGVAR(Deploy),
|
||||
[GVAR(placer), "DefaultAction",
|
||||
{GVAR(deployPFH) != -1},
|
||||
|
@ -8,10 +8,9 @@
|
||||
* 1: unit <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
@ -21,8 +20,7 @@ if (uiNamespace getVariable [QEGVAR(interact_menu,cursorMenuOpened),false]) exit
|
||||
_this call FUNC(dismount);
|
||||
}, _this] call EFUNC(common,execNextFrame);
|
||||
};
|
||||
|
||||
PARAMS_2(_wire,_unit);
|
||||
params ["_wire", "_unit"];
|
||||
|
||||
private ["_config", "_delay"];
|
||||
_config = (configFile >> "CfgVehicles" >> typeOf _unit);
|
||||
|
@ -7,10 +7,9 @@
|
||||
* 0: wire <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
@ -18,25 +17,26 @@ PARAMS_1(_wire);
|
||||
|
||||
{
|
||||
_wire animate [_x, 1];
|
||||
} foreach WIRE_FAST;
|
||||
} count WIRE_FAST;
|
||||
|
||||
[{
|
||||
EXPLODE_1_PVT(_this select 0,_wire);
|
||||
|
||||
params ["_args", "_idPFH"];
|
||||
_args params ["_wire"];
|
||||
|
||||
if (_wire animationPhase "wire_2" == 1) then {
|
||||
private ["_dir", "_pos", "_wirecoil"];
|
||||
|
||||
|
||||
_dir = getDir _wire;
|
||||
_pos = getPosASL _wire;
|
||||
|
||||
|
||||
_wirecoil = "ACE_ConcertinaWireCoil" createvehicle [0, 0, 0];
|
||||
|
||||
deleteVehicle _wire;
|
||||
|
||||
|
||||
_wirecoil setDir _dir;
|
||||
_wirecoil setPosASL _pos;
|
||||
_wirecoil setVelocity [0, 0, 0];
|
||||
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
|
||||
[_idPFH] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
}, 0, [_wire]] call CBA_fnc_addPerFrameHandler;
|
||||
|
@ -11,15 +11,12 @@
|
||||
* 4: projectile <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
PARAMS_5(_wire,_selectionName,_damage,_source,_projectile);
|
||||
|
||||
params ["_wire", "", "_damage", "_source", ""];
|
||||
if (_damage < 0.5) exitWith { 0 };
|
||||
|
||||
if (!(isNull _source)) then {
|
||||
|
@ -8,14 +8,12 @@
|
||||
* 1: killer (vehicle) <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
PARAMS_2(_wire,_killer);
|
||||
params ["_wire", "_killer"];
|
||||
|
||||
private ["_distance", "_vehicle"];
|
||||
|
||||
|
@ -7,14 +7,12 @@
|
||||
* 1: vehicle <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Return value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
PARAMS_2(_wire,_vehicle);
|
||||
params ["_wire", "_vehicle"];
|
||||
|
||||
private ["_type", "_mode", "_anim", "_parts", "_selectionPart", "_selection", "_pos_w", "_dir_w"];
|
||||
|
||||
@ -43,8 +41,8 @@ _dir_w = getDir _wire;
|
||||
|
||||
if (_mode == 0) then {
|
||||
private ["_x", "_y", "_found", "_wireCheckPosAr", "_no"];
|
||||
_x = _pos_w select 0;
|
||||
_y = _pos_w select 1;
|
||||
_pos_w params ["_x","_y"];
|
||||
|
||||
// Check if two Single coils are placed next to each other (i.e playes have built a big wire obstacle)
|
||||
_wireCheckPosAr = [
|
||||
[_x + (sin (_dir_w+90) * 1.5),_y + (cos (_dir_w+90) * 1.5)],
|
||||
|
@ -22,12 +22,7 @@ class Extended_Init_EventHandlers {
|
||||
init = QUOTE(_this call DFUNC(initObject));
|
||||
};
|
||||
};
|
||||
class ReammoBox_F {
|
||||
class ADDON {
|
||||
init = QUOTE(_this call DFUNC(initObject));
|
||||
};
|
||||
};
|
||||
class ACE_RepairItem_Base {
|
||||
class ThingX {
|
||||
class ADDON {
|
||||
init = QUOTE(_this call DFUNC(initObject));
|
||||
};
|
||||
|
@ -15,5 +15,6 @@ PREP(restoreUserData);
|
||||
PREP(storeUserData);
|
||||
PREP(updateDisplay);
|
||||
PREP(updateImpellerState);
|
||||
|
||||
PREP(updateMemory);
|
||||
PREP(dayOfWeek);
|
||||
ADDON = true;
|
||||
|
@ -3,10 +3,10 @@
|
||||
* Handles the Kestrel 4500 dialog button actions
|
||||
*
|
||||
* Arguments:
|
||||
* buttonID <integer>
|
||||
* button ID <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* 2 call ace_kestrel4500_fnc_buttonPressed
|
||||
|
@ -3,13 +3,13 @@
|
||||
* Tests if the Kestrel 4500 can be shown
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* canShow (bool)
|
||||
* canShow <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [mode] call ace_kestrel4500_fnc_canShow
|
||||
* call ace_kestrel4500_fnc_canShow
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
@ -3,18 +3,19 @@
|
||||
* Gathers the weather data for the Kestrel 4500
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_collectData
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_altitude", "_airDensity", "_densityAltitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_fnc_updateMemory", "_windSpeed", "_crosswind", "_headwind"];
|
||||
private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_altitude", "_airDensity", "_densityAltitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_windSpeed", "_crosswind", "_headwind"];
|
||||
_playerDir = getDir ACE_player;
|
||||
_playerAltitude = (getPosASL ACE_player) select 2;
|
||||
_temperature = _playerAltitude call EFUNC(weather,calculateTemperatureAtHeight);
|
||||
@ -35,25 +36,19 @@ if (isNil QGVAR(MIN) || isNil QGVAR(MAX)) then {
|
||||
|
||||
{
|
||||
GVAR(ENTRIES) set [_x, (GVAR(ENTRIES) select _x) + 1];
|
||||
} forEach [1, 5, 6, 7, 8, 9, 10, 11, 12, 13];
|
||||
} count [1, 5, 6, 7, 8, 9, 10, 11, 12, 13];
|
||||
|
||||
_fnc_updateMemory = {
|
||||
PARAMS_2(_slot,_value);
|
||||
GVAR(MIN) set [_slot, (GVAR(MIN) select _slot) min _value];
|
||||
GVAR(MAX) set [_slot, _value max (GVAR(MAX) select _slot)];
|
||||
GVAR(TOTAL) set [_slot, (GVAR(TOTAL) select _slot) + _value];
|
||||
};
|
||||
|
||||
[0, _playerDir] call _fnc_updateMemory;
|
||||
[0, _playerDir] call FUNC(updateMemory);
|
||||
|
||||
if (GVAR(MinAvgMaxMode) == 1) then {
|
||||
{
|
||||
GVAR(ENTRIES) set [_x, (GVAR(ENTRIES) select _x) + 1];
|
||||
} forEach [2, 3, 4];
|
||||
} count [2, 3, 4];
|
||||
|
||||
// Wind SPD
|
||||
_windSpeed = call FUNC(measureWindSpeed);
|
||||
[2, _windSpeed] call _fnc_updateMemory;
|
||||
[2, _windSpeed] call FUNC(updateMemory);
|
||||
|
||||
// CROSSWIND
|
||||
_crosswind = 0;
|
||||
@ -62,7 +57,7 @@ if (GVAR(MinAvgMaxMode) == 1) then {
|
||||
} else {
|
||||
_crosswind = abs(sin(GVAR(RefHeading)) * _windSpeed);
|
||||
};
|
||||
[3, _crosswind] call _fnc_updateMemory;
|
||||
[3, _crosswind] call FUNC(updateMemory);
|
||||
|
||||
// HEADWIND
|
||||
_headwind = 0;
|
||||
@ -80,12 +75,4 @@ if (GVAR(MinAvgMaxMode) == 1) then {
|
||||
GVAR(TOTAL) set [4, (GVAR(TOTAL) select 4) + _headwind];
|
||||
};
|
||||
|
||||
[5, _temperature] call _fnc_updateMemory;
|
||||
[6, _chill] call _fnc_updateMemory;
|
||||
[7, _humidity] call _fnc_updateMemory;
|
||||
[8, _heatIndex] call _fnc_updateMemory;
|
||||
[9, _dewPoint] call _fnc_updateMemory;
|
||||
[10, _wetBulb] call _fnc_updateMemory;
|
||||
[11, _barometricPressure] call _fnc_updateMemory;
|
||||
[12, _altitude] call _fnc_updateMemory;
|
||||
[13, _densityAltitude] call _fnc_updateMemory;
|
||||
{ _x call FUNC(updateMemory); true } count [[5, _temperature],[6, _chill],[7, _humidity],[8, _heatIndex],[9, _dewPoint],[10, _wetBulb],[11, _barometricPressure],[12, _altitude],[13, _densityAltitude]];
|
||||
|
@ -3,12 +3,13 @@
|
||||
* Opens the Kestrel 4500 dialog
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_createKestrelDialog
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
@ -29,7 +30,7 @@ createDialog 'Kestrel4500_Display';
|
||||
GVAR(Kestrel4500) = false;
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
|
||||
[] call FUNC(updateDisplay);
|
||||
}, 1, _this select 0] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
|
26
addons/kestrel4500/functions/fnc_dayOfWeek.sqf
Normal file
26
addons/kestrel4500/functions/fnc_dayOfWeek.sqf
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
* Calculate Current Day in the Week
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Year <NUMBER>
|
||||
* 1: Month <NUMBER>
|
||||
* 2: Day <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* Day of The Week <NUMBER>
|
||||
*
|
||||
* Example:
|
||||
* [1995, 10, 21] call ace_kestrel4500_fnc_buttonPressed
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
private "_table";
|
||||
params ["_year", "_month", "_day"];
|
||||
|
||||
_table = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4];
|
||||
if (_month < 3) then {
|
||||
_year = _year - 1;
|
||||
};
|
||||
(_year + floor(_year/4) - floor(_year/100) + floor(_year/400) + (_table select (_month - 1)) + _day) % 7
|
@ -3,12 +3,13 @@
|
||||
* Shows the Kestrel 4500 as rsc title
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_displayKestrel
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
@ -50,49 +51,66 @@ if (GVAR(Kestrel4500) && dialog) then {
|
||||
|
||||
GVAR(Overlay) = true;
|
||||
|
||||
[{
|
||||
[{
|
||||
// abort condition
|
||||
if (!GVAR(Overlay) || {!(("ACE_Kestrel4500" in (uniformItems ACE_player)) || ("ACE_Kestrel4500" in (vestItems ACE_player)))}) exitWith {
|
||||
GVAR(Overlay) = false;
|
||||
3 cutText ["", "PLAIN"];
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
|
||||
if (ACE_diagTime > GVAR(updateTimer)) then {
|
||||
GVAR(updateTimer) = ACE_diagTime + 1;
|
||||
|
||||
|
||||
private ["_outputData"];
|
||||
_outputData = [] call FUNC(generateOutputData);
|
||||
|
||||
|
||||
3 cutRsc ["RscKestrel4500", "PLAIN", 1, false];
|
||||
|
||||
__ctrlTop ctrlSetText (_outputData select 0);
|
||||
__ctrlCenterBig ctrlSetText (_outputData select 1);
|
||||
|
||||
__ctrlTop ctrlSetText (_outputData select 0);
|
||||
__ctrlCenterBig ctrlSetText (_outputData select 1);
|
||||
__ctrlCenter ctrlSetText (_outputData select 2);
|
||||
|
||||
__ctrlCenterLine1Left ctrlSetText (_outputData select 3);
|
||||
__ctrlCenterLine2Left ctrlSetText (_outputData select 4);
|
||||
__ctrlCenterLine3Left ctrlSetText (_outputData select 5);
|
||||
_outputData params [
|
||||
"_ctrlTop",
|
||||
"_ctrlCenterBig",
|
||||
"_ctrlCenter",
|
||||
"_ctrlCenterLine1Left",
|
||||
"_ctrlCenterLine2Left",
|
||||
"_ctrlCenterLine3Left",
|
||||
"_ctrlCenterLine1Right",
|
||||
"_ctrlCenterLine2Right",
|
||||
"_ctrlCenterLine3Right",
|
||||
"_ctrlInfoLine1",
|
||||
"_ctrlInfoLine2",
|
||||
"_ctrlBottomBig",
|
||||
"_ctrlCenterLine1",
|
||||
"_ctrlCenterLine2",
|
||||
"_ctrlCenterLine3",
|
||||
"_ctrlCenterLine4",
|
||||
"_ctrlCenterLine5",
|
||||
"_ctrlCenterLine6"
|
||||
];
|
||||
|
||||
__ctrlCenterLine1Right ctrlSetText (_outputData select 6);
|
||||
__ctrlCenterLine2Right ctrlSetText (_outputData select 7);
|
||||
__ctrlCenterLine3Right ctrlSetText (_outputData select 8);
|
||||
__ctrlTop ctrlSetText _ctrlTop;
|
||||
__ctrlCenterBig ctrlSetText _ctrlCenterBig;
|
||||
__ctrlCenter ctrlSetText _ctrlCenter;
|
||||
|
||||
__ctrlCenterLine1Left ctrlSetText _ctrlCenterLine1Left;
|
||||
__ctrlCenterLine2Left ctrlSetText _ctrlCenterLine2Left;
|
||||
__ctrlCenterLine3Left ctrlSetText _ctrlCenterLine3Left;
|
||||
|
||||
__ctrlCenterLine1Right ctrlSetText _ctrlCenterLine1Right;
|
||||
__ctrlCenterLine2Right ctrlSetText _ctrlCenterLine2Right;
|
||||
__ctrlCenterLine3Right ctrlSetText _ctrlCenterLine3Right;
|
||||
|
||||
__ctrlInfoLine1 ctrlSetText _ctrlInfoLine1;
|
||||
__ctrlInfoLine2 ctrlSetText _ctrlInfoLine2;
|
||||
|
||||
__ctrlBottomBig ctrlSetText _ctrlBottomBig;
|
||||
|
||||
__ctrlCenterLine1 ctrlSetText _ctrlCenterLine1;
|
||||
__ctrlCenterLine2 ctrlSetText _ctrlCenterLine2;
|
||||
__ctrlCenterLine3 ctrlSetText _ctrlCenterLine3;
|
||||
__ctrlCenterLine4 ctrlSetText _ctrlCenterLine4;
|
||||
__ctrlCenterLine5 ctrlSetText _ctrlCenterLine5;
|
||||
__ctrlCenterLine6 ctrlSetText _ctrlCenterLine6;
|
||||
|
||||
__ctrlInfoLine1 ctrlSetText (_outputData select 9);
|
||||
__ctrlInfoLine2 ctrlSetText (_outputData select 10);
|
||||
|
||||
__ctrlBottomBig ctrlSetText (_outputData select 11);
|
||||
|
||||
__ctrlCenterLine1 ctrlSetText (_outputData select 12);
|
||||
__ctrlCenterLine2 ctrlSetText (_outputData select 13);
|
||||
__ctrlCenterLine3 ctrlSetText (_outputData select 14);
|
||||
__ctrlCenterLine4 ctrlSetText (_outputData select 15);
|
||||
__ctrlCenterLine5 ctrlSetText (_outputData select 16);
|
||||
__ctrlCenterLine6 ctrlSetText (_outputData select 17);
|
||||
|
||||
if (GVAR(referenceHeadingMenu) == 1) then {
|
||||
if (GVAR(referenceHeadingAutoSet)) then {
|
||||
__ctrlCenterLine3 ctrlSetTextColor [0, 0, 0, 0.6];
|
||||
@ -106,10 +124,10 @@ GVAR(Overlay) = true;
|
||||
__ctrlCenterLine4 ctrlSetTextColor [0, 0, 0, 1.0];
|
||||
};
|
||||
};
|
||||
|
||||
|
||||
call FUNC(updateImpellerState);
|
||||
__ctrlKestrel4500 ctrlSetText format [QUOTE(PATHTOF(UI\Kestrel4500_%1.paa)), floor(GVAR(ImpellerState) % 7)];
|
||||
|
||||
|
||||
}, 0.01, []] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
true
|
||||
|
@ -3,12 +3,29 @@
|
||||
* Generates the Kestrel 4500 output text.
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* [top <STRING>, centerBig <STRING>, CenterLine1Left <STRING>, CenterLine2Left <STRING>, CenterLine3Left <STRING>, CenterLine1Right <STRING>, CenterLine2Right <STRING>, CenterLine3Right <STRING>, InfoLine1 <STRING>, InfoLine2 <STRING>]
|
||||
* 0: top <STRING>
|
||||
* 1: centerBig <STRING>
|
||||
* 2: CenterLine1Left <STRING>
|
||||
* 3: CenterLine2Left <STRING>
|
||||
* 4: CenterLine3Left <STRING>
|
||||
* 5: CenterLine1Right <STRING>
|
||||
* 6: CenterLine2Right <STRING>
|
||||
* 7: CenterLine3Right <STRING>
|
||||
* 8: InfoLine1 <STRING>
|
||||
* 9: InfoLine2 <STRING>
|
||||
* 10: Bottom Big <STRING>
|
||||
* 11: Center Line 1 <STRING>
|
||||
* 11: Center Line 2 <STRING>
|
||||
* 12: Center Line 3 <STRING>
|
||||
* 13: Center Line 4 <STRING>
|
||||
* 14: Center Line 5 <STRING>
|
||||
* 15: Center Line 6 <STRING>
|
||||
*
|
||||
* Example:
|
||||
* _var = call ace_kestrel4500_fnc_generateOutputData
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
@ -16,7 +33,7 @@
|
||||
|
||||
if (ACE_diagTime - GVAR(headingSetDisplayTimer) < 0.8) exitWith {["", "", " Heading Set", "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]};
|
||||
|
||||
private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_airDensity", "_densityAltitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_fnc_dayOfWeek", "_dayString", "_monthString", "_windSpeed", "_windDir", "_textTop", "_textCenterBig", "_textCenter", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_textBottomBig", "_textCenterLine1", "_textCenterLine2", "_textCenterLine3", "_textCenterLine4", "_textCenterLine5", "_textCenterLine6"];
|
||||
private ["_playerDir", "_playerAltitude", "_temperature", "_humidity", "_barometricPressure", "_airDensity", "_densityAltitude", "_chill", "_heatIndex", "_dewPoint", "_wetBulb", "_dayString", "_monthString", "_windSpeed", "_windDir", "_textTop", "_textCenterBig", "_textCenter", "_textCenterLine1Left", "_textCenterLine2Left", "_textCenterLine3Left", "_textCenterLine1Right", "_textCenterLine2Right", "_textCenterLine3Right", "_textInfoLine1", "_textInfoLine2", "_textBottomBig", "_textCenterLine1", "_textCenterLine2", "_textCenterLine3", "_textCenterLine4", "_textCenterLine5", "_textCenterLine6"];
|
||||
|
||||
[] call FUNC(collectData);
|
||||
|
||||
@ -59,19 +76,6 @@ _heatIndex = [_temperature, _humidity] call EFUNC(weather,calculateHeatIndex);
|
||||
_dewPoint = [_temperature, _humidity] call EFUNC(weather,calculateDewPoint);
|
||||
_wetBulb = [_temperature, _barometricPressure, _humidity] call EFUNC(weather,calculateWetBulb);
|
||||
|
||||
_fnc_dayOfWeek = {
|
||||
private ["_year", "_month", "_day", "_table"];
|
||||
_year = _this select 0;
|
||||
_month = _this select 1;
|
||||
_day = _this select 2;
|
||||
|
||||
_table = [0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4];
|
||||
if (_month < 3) then {
|
||||
_year = _year - 1;
|
||||
};
|
||||
(_year + floor(_year/4) - floor(_year/100) + floor(_year/400) + (_table select (_month - 1)) + _day) % 7
|
||||
};
|
||||
|
||||
GVAR(Direction) = 4 * floor(_playerDir / 90);
|
||||
if (_playerDir % 90 > 10) then { GVAR(Direction) = GVAR(Direction) + 1};
|
||||
if (_playerDir % 90 > 35) then { GVAR(Direction) = GVAR(Direction) + 1};
|
||||
@ -82,8 +86,8 @@ GVAR(Direction) = GVAR(Direction) % 16;
|
||||
if (GVAR(referenceHeadingMenu) == 0) then {
|
||||
switch (GVAR(Menu)) do {
|
||||
case 0: { // Date
|
||||
EXPLODE_3_PVT(date,_year,_month,_day);
|
||||
_dayString = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] select (date call _fnc_dayOfWeek);
|
||||
date params ["_year", "_month", "_day"];
|
||||
_dayString = ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] select (date call FUNC(dayOfWeek));
|
||||
_monthString = localize (["str_january","str_february","str_march","str_april","str_may","str_june","str_july","str_august","str_september","str_october","str_november","str_december"] select (_month - 1));
|
||||
_textTop = _dayString;
|
||||
_textCenter = format["%1 %2 %3", _day, _monthString, _year];
|
||||
|
@ -3,12 +3,13 @@
|
||||
* Measures the wind speed, stores the information in GVAR(MeasuredWindSpeed) and updates GVAR(ImpellerState)
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* wind speed <NUMBER>
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_canShow
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
@ -1,3 +1,18 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
* Called if Kestrel Dialog is closed
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_onCloseDialog
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
uiNamespace setVariable ['Kestrel4500_Display', nil];
|
||||
|
@ -1,3 +1,18 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
* Called if Kestrel Display is closed
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_onCloseDisplay
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
uiNamespace setVariable ['RscKestrel4500', nil];
|
||||
|
@ -6,7 +6,7 @@
|
||||
* Nothing
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_restore_user_data
|
||||
|
@ -3,10 +3,10 @@
|
||||
* Saves user data into profileNamespace
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_store_user_data
|
||||
|
@ -3,10 +3,10 @@
|
||||
* Updates the Kestrel 4500 dialog text boxes.
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
@ -22,29 +22,9 @@ private ["_outputData"];
|
||||
|
||||
_outputData = [] call FUNC(generateOutputData);
|
||||
|
||||
ctrlSetText [74100, _outputData select 0];
|
||||
ctrlSetText [74200, _outputData select 1];
|
||||
ctrlSetText [74201, _outputData select 2];
|
||||
|
||||
ctrlSetText [74300, _outputData select 3];
|
||||
ctrlSetText [74301, _outputData select 4];
|
||||
ctrlSetText [74302, _outputData select 5];
|
||||
|
||||
ctrlSetText [74303, _outputData select 6];
|
||||
ctrlSetText [74304, _outputData select 7];
|
||||
ctrlSetText [74305, _outputData select 8];
|
||||
|
||||
ctrlSetText [74400, _outputData select 9];
|
||||
ctrlSetText [74401, _outputData select 10];
|
||||
|
||||
ctrlSetText [74500, _outputData select 11];
|
||||
|
||||
ctrlSetText [74600, _outputData select 12];
|
||||
ctrlSetText [74601, _outputData select 13];
|
||||
ctrlSetText [74602, _outputData select 14];
|
||||
ctrlSetText [74603, _outputData select 15];
|
||||
ctrlSetText [74604, _outputData select 16];
|
||||
ctrlSetText [74605, _outputData select 17];
|
||||
{
|
||||
ctrlSetText [_x , _outputData select _foreachindex];
|
||||
} forEach [74100, 74200, 74201, 74300, 74301, 74302, 74303, 74304, 74305, 74400, 74401, 74500, 74600, 74601, 74602, 74603, 74604, 74605];
|
||||
|
||||
if (GVAR(referenceHeadingMenu) == 1) then {
|
||||
if (GVAR(referenceHeadingAutoSet)) then {
|
||||
|
@ -3,10 +3,10 @@
|
||||
* Updates the Kestrel 4500 Impeller state
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
*
|
||||
|
21
addons/kestrel4500/functions/fnc_updateMemory.sqf
Normal file
21
addons/kestrel4500/functions/fnc_updateMemory.sqf
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Author: Ruthberg
|
||||
* Update Memory of Kestrel
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Slot <NUMBER>
|
||||
* 1: Value <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [1, "test"] call ace_kestrel4500_fnc_updateMemory
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
params ["_slot", "_value"];
|
||||
GVAR(MIN) set [_slot, (GVAR(MIN) select _slot) min _value];
|
||||
GVAR(MAX) set [_slot, _value max (GVAR(MAX) select _slot)];
|
||||
GVAR(TOTAL) set [_slot, (GVAR(TOTAL) select _slot) + _value];
|
@ -1 +1 @@
|
||||
#include "\z\ace\addons\kestrel4500\script_component.hpp"
|
||||
#include "\z\ace\addons\kestrel4500\script_component.hpp"
|
||||
|
@ -2,7 +2,7 @@ class CfgWeapons {
|
||||
// Disable locking unless newb mode
|
||||
class LauncherCore;
|
||||
class RocketPods: LauncherCore {
|
||||
canLock = 1;
|
||||
// canLock = 1;
|
||||
};
|
||||
|
||||
class missiles_DAGR: RocketPods {
|
||||
|
@ -2,33 +2,55 @@ class ACE_Settings {
|
||||
class GVAR(BFT_Interval) {
|
||||
value = 1.0;
|
||||
typeName = "SCALAR";
|
||||
displayName = CSTRING(BFT_Interval_DisplayName);
|
||||
description = CSTRING(BFT_Interval_Description);
|
||||
};
|
||||
class GVAR(BFT_Enabled) {
|
||||
value = 0;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(BFT_Enabled_DisplayName);
|
||||
description = CSTRING(BFT_Enabled_Description);
|
||||
};
|
||||
class GVAR(BFT_HideAiGroups) {
|
||||
value = 0;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(BFT_HideAiGroups_DisplayName);
|
||||
description = CSTRING(BFT_HideAiGroups_Description);
|
||||
};
|
||||
class GVAR(mapIllumination) {
|
||||
value = 1;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(MapIllumination_DisplayName);
|
||||
description = CSTRING(MapIllumination_Description);
|
||||
};
|
||||
class GVAR(mapGlow) {
|
||||
value = 1;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(MapGlow_DisplayName);
|
||||
description = CSTRING(MapGlow_Description);
|
||||
};
|
||||
class GVAR(mapShake) {
|
||||
value = 1;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(MapShake_DisplayName);
|
||||
description = CSTRING(MapShake_Description);
|
||||
};
|
||||
class GVAR(mapLimitZoom) {
|
||||
value = 0;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(MapLimitZoom_DisplayName);
|
||||
description = CSTRING(MapLimitZoom_Description);
|
||||
};
|
||||
class GVAR(mapShowCursorCoordinates) {
|
||||
value = 0;
|
||||
typeName = "BOOL";
|
||||
displayName = CSTRING(MapShowCursorCoordinates_DisplayName);
|
||||
description = CSTRING(MapShowCursorCoordinates_Description);
|
||||
};
|
||||
class GVAR(DefaultChannel) {
|
||||
value = -1;
|
||||
typeName = "SCALAR";
|
||||
displayName = CSTRING(DefaultChannel_DisplayName);
|
||||
description = CSTRING(DefaultChannel_Description);
|
||||
};
|
||||
};
|
||||
|
@ -55,6 +55,20 @@ class CfgVehicles {
|
||||
typeName = "BOOL";
|
||||
defaultValue = 0;
|
||||
};
|
||||
class DefaultChannel {
|
||||
displayName = CSTRING(DefaultChannel_DisplayName);
|
||||
description = CSTRING(DefaultChannel_Description);
|
||||
typeName = "NUMBER";
|
||||
class values {
|
||||
class disable {name = ECSTRING(common,Disabled); value = -1; default = 1;};
|
||||
class global {name = "$STR_channel_global"; value = 0;};
|
||||
class side {name = "$STR_channel_side"; value = 1;};
|
||||
class command {name = "$STR_channel_command"; value = 2;};
|
||||
class group {name = "$STR_channel_group"; value = 3;};
|
||||
class vehicle {name = "$STR_channel_vehicle"; value = 4;};
|
||||
class direct {name = "$STR_channel_direct"; value = 5;};
|
||||
};
|
||||
};
|
||||
};
|
||||
class ModuleDescription {
|
||||
description = CSTRING(Module_Description);
|
||||
|
@ -56,6 +56,21 @@ call FUNC(determineZoom);
|
||||
}, 0] call CBA_fnc_addPerFrameHandler;
|
||||
|
||||
["SettingsInitialized", {
|
||||
if (isMultiplayer && {GVAR(DefaultChannel) != -1}) then {
|
||||
//Set the chat channel once the map has finished loading
|
||||
[{
|
||||
if ((isNull findDisplay 37) && {isNull findDisplay 52} && {isNull findDisplay 53} && {isNull findDisplay 12}) exitWith {};
|
||||
[_this select 1] call CBA_fnc_removePerFrameHandler;
|
||||
|
||||
setCurrentChannel GVAR(DefaultChannel);
|
||||
if (currentChannel == GVAR(DefaultChannel)) then {
|
||||
// ACE_LOGINFO_1("Channel Set - %1", currentChannel);
|
||||
} else {
|
||||
ACE_LOGERROR_2("Failed To Set Channel %1 (is %2)", GVAR(DefaultChannel), currentChannel);
|
||||
};
|
||||
}, 0, []] call CBA_fnc_addPerFrameHandler;
|
||||
};
|
||||
|
||||
// Start Blue Force Tracking if Enabled
|
||||
if (GVAR(BFT_Enabled)) then {
|
||||
GVAR(BFT_markers) = [];
|
||||
|
@ -13,7 +13,7 @@
|
||||
|
||||
if !(isServer) exitWith {};
|
||||
|
||||
params ["_logic", "_units", "_activated"];
|
||||
params ["_logic", "", "_activated"];
|
||||
|
||||
if !(_activated) exitWith {};
|
||||
|
||||
@ -22,5 +22,6 @@ if !(_activated) exitWith {};
|
||||
[_logic, QGVAR(mapShake), "MapShake" ] call EFUNC(common,readSettingFromModule);
|
||||
[_logic, QGVAR(mapLimitZoom), "MapLimitZoom" ] call EFUNC(common,readSettingFromModule);
|
||||
[_logic, QGVAR(mapShowCursorCoordinates), "MapShowCursorCoordinates"] call EFUNC(common,readSettingFromModule);
|
||||
[_logic, QGVAR(DefaultChannel), "DefaultChannel" ] call EFUNC(common,readSettingFromModule);
|
||||
|
||||
ACE_LOGINFO("Map Module Initialized.");
|
||||
|
@ -22,7 +22,7 @@ _hmd = hmd ACE_player;
|
||||
_flashlight = GVAR(flashlightInUse);
|
||||
|
||||
//map width (on screen) in pixels
|
||||
_screenSize = 640 * safeZoneW;
|
||||
_screenSize = 640 * safeZoneWAbs;
|
||||
|
||||
//resolution params (every frame in case resolution change)
|
||||
getResolution params ["_resX", "_resY", "_viewPortX", "_viewPortY", "", "_uiScale"];
|
||||
@ -58,7 +58,7 @@ if (_flashlight == "") then {
|
||||
if !(_colour in ["white", "red", "green", "blue", "yellow"]) then {_colour = "white"};
|
||||
_size = getNumber (configFile >> "CfgWeapons" >> _flashlight >> "ItemInfo" >> "FlashLight" >> "ACE_Flashlight_Size");
|
||||
_flashTex = format[QUOTE(PATHTOF_SYS(ace,flashlights,UI\Flashlight_Beam_%1_ca.paa)), _colour];
|
||||
_beamSize = _screenSize / _size;
|
||||
_beamSize = (safeZoneW/safeZoneWAbs) * _screenSize / _size;
|
||||
|
||||
//after 5x zoom, it's simulated to be fixed (it actually gets bigger relative to zoom)
|
||||
if (_mapScale < 0.2) then {_beamSize = _beamSize / (_mapScale * (1 / 0.2))};
|
||||
|
@ -256,5 +256,13 @@
|
||||
<Czech>Snížit jas</Czech>
|
||||
<Spanish>Reducir brillo</Spanish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Map_DefaultChannel_DisplayName">
|
||||
<English>Set Channel At Start</English>
|
||||
<Polish>Ust. domyślny kanał</Polish>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Map_DefaultChannel_Description">
|
||||
<English>Change the starting marker channel at mission start</English>
|
||||
<Polish>Ustaw domyślny kanał dla markerów przy starcie misji</Polish>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
1
addons/map_gestures/$PBOPREFIX$
Normal file
1
addons/map_gestures/$PBOPREFIX$
Normal file
@ -0,0 +1 @@
|
||||
z\ace\addons\map_gestures
|
61
addons/map_gestures/ACE_Settings.hpp
Normal file
61
addons/map_gestures/ACE_Settings.hpp
Normal file
@ -0,0 +1,61 @@
|
||||
class ACE_Settings {
|
||||
class GVAR(enabled) {
|
||||
displayName = CSTRING(enabled_displayName);
|
||||
description = CSTRING(enabled_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
typeName = "BOOL";
|
||||
value = 1;
|
||||
};
|
||||
class GVAR(maxRange) {
|
||||
displayName = CSTRING(maxRange_displayName);
|
||||
description = CSTRING(maxRange_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
typeName = "SCALAR";
|
||||
value = 7;
|
||||
};
|
||||
class GVAR(interval) {
|
||||
displayName = CSTRING(interval_displayName);
|
||||
description = CSTRING(interval_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
typeName = "SCALAR";
|
||||
value = 0.03;
|
||||
};
|
||||
class GVAR(nameTextColor) {
|
||||
displayName = CSTRING(nameTextColor_displayName);
|
||||
description = CSTRING(nameTextColor_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
isClientSettable = 1;
|
||||
typeName = "COLOR";
|
||||
value[] = {0.2, 0.2, 0.2, 0.3};
|
||||
};
|
||||
class GVAR(defaultLeadColor) {
|
||||
displayName = CSTRING(defaultLeadColor_displayName);
|
||||
description = CSTRING(defaultLeadColor_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
isClientSettable = 1;
|
||||
typeName = "COLOR";
|
||||
value[] = {1, 0.88, 0, 0.95};
|
||||
};
|
||||
class GVAR(defaultColor) {
|
||||
displayName = CSTRING(defaultColor_displayName);
|
||||
description = CSTRING(defaultColor_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
isClientSettable = 1;
|
||||
typeName = "COLOR";
|
||||
value[] = {1, 0.88, 0, 0.7};
|
||||
};
|
||||
class GVAR(GroupColorConfigurations) {
|
||||
displayName = CSTRING(GroupColorConfigurations_displayName);
|
||||
description = CSTRING(GroupColorConfigurations_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
typeName = "ARRAY";
|
||||
value[] = {};
|
||||
};
|
||||
class GVAR(GroupColorConfigurationMapping) {
|
||||
displayName = CSTRING(GroupColorConfigurationMapping_displayName);
|
||||
description = CSTRING(GroupColorConfigurationMapping_description);
|
||||
category = CSTRING(mapGestures_category);
|
||||
typeName = "ARRAY";
|
||||
value[] = {{}, {}};
|
||||
};
|
||||
};
|
12
addons/map_gestures/CfgEventHandlers.hpp
Normal file
12
addons/map_gestures/CfgEventHandlers.hpp
Normal file
@ -0,0 +1,12 @@
|
||||
class Extended_PreInit_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_FILE(XEH_preInit));
|
||||
};
|
||||
};
|
||||
|
||||
class Extended_PostInit_EventHandlers {
|
||||
class ADDON {
|
||||
init = QUOTE(call COMPILE_FILE(XEH_postInit));
|
||||
serverInit = QUOTE(call COMPILE_FILE(XEH_serverPostInit));
|
||||
};
|
||||
};
|
66
addons/map_gestures/CfgVehicles.hpp
Normal file
66
addons/map_gestures/CfgVehicles.hpp
Normal file
@ -0,0 +1,66 @@
|
||||
class CfgVehicles {
|
||||
class ACE_Module;
|
||||
class GVAR(moduleSettings): ACE_Module {
|
||||
scope = 2;
|
||||
category = "ACE";
|
||||
displayName = CSTRING(moduleSettings_displayName);
|
||||
function = QFUNC(moduleSettings);
|
||||
isGlobal = 0;
|
||||
author = ECSTRING(common,ACETeam);
|
||||
icon = PATHTOF(ui\icon_module_map_gestures_ca.paa);
|
||||
class Arguments {
|
||||
class enabled {
|
||||
displayName = CSTRING(enabled_DisplayName);
|
||||
typeName = "BOOL";
|
||||
defaultValue = 1;
|
||||
};
|
||||
class maxRange {
|
||||
displayName = CSTRING(maxRange_displayName);
|
||||
description = CSTRING(maxRange_description);
|
||||
typeName = "NUMBER";
|
||||
defaultValue = 4;
|
||||
};
|
||||
class interval {
|
||||
displayName = CSTRING(interval_displayName);
|
||||
description = CSTRING(interval_description);
|
||||
typeName = "NUMBER";
|
||||
defaultValue = 0.03;
|
||||
};
|
||||
class defaultLeadColor {
|
||||
displayName = CSTRING(defaultLeadColor_displayName);
|
||||
description = CSTRING(defaultLeadColor_description);
|
||||
typeName = "STRING";
|
||||
defaultValue = "0,0,0,0";
|
||||
};
|
||||
class defaultColor {
|
||||
displayName = CSTRING(defaultColor_displayName);
|
||||
description = CSTRING(defaultColor_description);
|
||||
typeName = "STRING";
|
||||
defaultValue = "0,0,0,0";
|
||||
};
|
||||
};
|
||||
};
|
||||
class GVAR(moduleGroupSettings): ACE_Module {
|
||||
scope = 2;
|
||||
category = "ACE";
|
||||
displayName = CSTRING(moduleGroupSettings_displayName);
|
||||
function = QFUNC(moduleGroupSettings);
|
||||
isGlobal = 0;
|
||||
author = ECSTRING(common,ACETeam);
|
||||
icon = PATHTOF(ui\icon_module_map_gestures_ca.paa);
|
||||
class Arguments {
|
||||
class leadColor {
|
||||
displayName = CSTRING(leadColor_displayName);
|
||||
description = CSTRING(leadColor_description);
|
||||
typeName = "STRING";
|
||||
defaultValue = "0,0,0,0";
|
||||
};
|
||||
class color {
|
||||
displayName = CSTRING(color_displayName);
|
||||
description = CSTRING(color_description);
|
||||
typeName = "STRING";
|
||||
defaultValue = "0,0,0,0";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
16
addons/map_gestures/XEH_postInit.sqf
Normal file
16
addons/map_gestures/XEH_postInit.sqf
Normal file
@ -0,0 +1,16 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
["SettingsInitialized", {
|
||||
[{
|
||||
if (isNull (findDisplay 12)) exitWith {};
|
||||
|
||||
params ["", "_pfhId"];
|
||||
|
||||
call FUNC(receiverInit);
|
||||
call FUNC(transmitterInit);
|
||||
|
||||
[_pfhId] call CBA_fnc_removePerFrameHandler;
|
||||
}, 1, []] call CBA_fnc_addPerFrameHandler;
|
||||
}] call EFUNC(common,addEventHandler);
|
17
addons/map_gestures/XEH_preInit.sqf
Normal file
17
addons/map_gestures/XEH_preInit.sqf
Normal file
@ -0,0 +1,17 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP(assignClientIDOnServer);
|
||||
PREP(drawMapGestures);
|
||||
PREP(endTransmit);
|
||||
PREP(getProximityPlayers);
|
||||
PREP(initTransmit);
|
||||
PREP(isValidColorArray);
|
||||
PREP(moduleGroupSettings);
|
||||
PREP(moduleSettings);
|
||||
PREP(receiverInit);
|
||||
PREP(transmit);
|
||||
PREP(transmitterInit);
|
||||
|
||||
ADDON = true;
|
3
addons/map_gestures/XEH_serverPostInit.sqf
Normal file
3
addons/map_gestures/XEH_serverPostInit.sqf
Normal file
@ -0,0 +1,3 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
[EVENT_PLAYER_HAS_NO_OWNER_ID, FUNC(assignClientIDOnServer)] call EFUNC(common,addEventHandler);
|
17
addons/map_gestures/config.cpp
Normal file
17
addons/map_gestures/config.cpp
Normal file
@ -0,0 +1,17 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
class CfgPatches {
|
||||
class ADDON {
|
||||
units[] = {};
|
||||
weapons[] = {};
|
||||
requiredVersion = REQUIRED_VERSION;
|
||||
requiredAddons[] = {"ace_common"};
|
||||
author[] = {"Dslyecxi", "MikeMatrix"};
|
||||
authorUrl = "https://github.com/MikeMatrix";
|
||||
VERSION_CONFIG;
|
||||
};
|
||||
};
|
||||
|
||||
#include "ACE_Settings.hpp"
|
||||
#include "CfgEventHandlers.hpp"
|
||||
#include "CfgVehicles.hpp"
|
24
addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf
Normal file
24
addons/map_gestures/functions/fnc_assignClientIDOnServer.sqf
Normal file
@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Assign readable client ID to unit on the server.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit name <STRING>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* ["MikeMatrix"] call ace_map_gestures_fnc_assignClientIDOnServer
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_unitName"];
|
||||
|
||||
{
|
||||
if (name _x == _unitName) exitWith {
|
||||
_x setVariable [QGVAR(owner_id), owner _x, true];
|
||||
};
|
||||
} count playableUnits;
|
61
addons/map_gestures/functions/fnc_drawMapGestures.sqf
Normal file
61
addons/map_gestures/functions/fnc_drawMapGestures.sqf
Normal file
@ -0,0 +1,61 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Receives and draws map gestures from nearby players.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Map Handle <CONTROL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [findDisplay 12 displayCtrl 51] call ace_map_gesutres_fnc_drawMapGestures
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
#define ICON_RENDER_SIZE 55
|
||||
#define ICON_TEXT_ALIGN "left"
|
||||
#define ICON_ANGLE 0
|
||||
#define ICON_SHADOW 1
|
||||
#define TEXT_FONT "PuristaBold"
|
||||
#define TEXT_ICON_RENDER_SIZE 20
|
||||
#define TEXT_SIZE 0.030
|
||||
#define TEXT_SHADOW 0
|
||||
|
||||
if (!GVAR(enabled) || !visibleMap) exitWith {};
|
||||
|
||||
private["_color", "_drawPosVariableName", "_group", "_grpName", "_pos", "_unitUID"];
|
||||
|
||||
params ["_mapHandle"];
|
||||
|
||||
// Iterate over all nearby players and render their pointer if player is transmitting.
|
||||
{
|
||||
// Data variable name for unit
|
||||
_unitUID = getPlayerUID _x;
|
||||
_drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil};
|
||||
|
||||
if (!isNil "_drawPosVariableName") then {
|
||||
if (isNil {missionNamespace getVariable _drawPosVariableName}) then {missionNamespace setVariable [_drawPosVariableName, [1, 1, 1]];};
|
||||
_pos = missionNamespace getVariable _drawPosVariableName;
|
||||
|
||||
// Only render if the unit is alive and transmitting
|
||||
if (alive _x && {_x getVariable QGVAR(Transmit)}) then {
|
||||
_group = group _x;
|
||||
_grpName = groupID _group;
|
||||
|
||||
// If color settings for the group exist, then use those, otherwise fall back to the default colors
|
||||
_color = if (HASH_HASKEY(GVAR(GroupColorConfigurationMapping),_grpName)) then {
|
||||
(GVAR(GroupColorConfigurations) select (HASH_GET(GVAR(GroupColorConfigurationMapping),_grpName))) select (_x != leader _group)
|
||||
} else {
|
||||
if (_x == leader _group) then {GVAR(defaultLeadColor)} else {GVAR(defaultColor)};
|
||||
};
|
||||
|
||||
// Render icon and player name
|
||||
_mapHandle drawIcon ["\a3\ui_f\data\gui\cfg\Hints\icon_text\group_1_ca.paa", _color, _pos, ICON_RENDER_SIZE, ICON_RENDER_SIZE, ICON_ANGLE, "", ICON_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN];
|
||||
_mapHandle drawIcon ["#(argb,8,8,3)color(0,0,0,0)", GVAR(nameTextColor), _pos, TEXT_ICON_RENDER_SIZE, TEXT_ICON_RENDER_SIZE, ICON_ANGLE, name _x, TEXT_SHADOW, TEXT_SIZE, TEXT_FONT, ICON_TEXT_ALIGN];
|
||||
};
|
||||
};
|
||||
nil
|
||||
} count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers));
|
21
addons/map_gestures/functions/fnc_endTransmit.sqf
Normal file
21
addons/map_gestures/functions/fnc_endTransmit.sqf
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Ensure that all variables used to indicate transmission are disabled.
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_map_gestures_fnc_endTransmit
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
if (!GVAR(enabled)) exitWith {};
|
||||
|
||||
ACE_player setVariable [QGVAR(Transmit), false, true];
|
||||
GVAR(EnableTransmit) = false;
|
26
addons/map_gestures/functions/fnc_getProximityPlayers.sqf
Normal file
26
addons/map_gestures/functions/fnc_getProximityPlayers.sqf
Normal file
@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Returns all players in a given range and in the units vehicle.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Unit <OBJECT>
|
||||
* 1: Range <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* All units in proximity <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* ["example value"] call ace_module_fnc_functionName
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private "_proximityPlayers";
|
||||
|
||||
params ["_unit", "_range"];
|
||||
|
||||
_proximityPlayers = (getPos _unit) nearEntities [["CAMAnBase"], _range];
|
||||
_proximityPlayers deleteAt (_proximityPlayers find _unit);
|
||||
_proximityPlayers append (crew vehicle _unit);
|
||||
_proximityPlayers
|
21
addons/map_gestures/functions/fnc_initTransmit.sqf
Normal file
21
addons/map_gestures/functions/fnc_initTransmit.sqf
Normal file
@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Initializes transmitting map gestures.
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_map_gestures_fnc_initTransmit
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
if (!GVAR(enabled)) exitWith {};
|
||||
|
||||
GVAR(EnableTransmit) = true;
|
||||
[FUNC(transmit), GVAR(interval), []] call CBA_fnc_addPerFrameHandler;
|
30
addons/map_gestures/functions/fnc_isValidColorArray.sqf
Normal file
30
addons/map_gestures/functions/fnc_isValidColorArray.sqf
Normal file
@ -0,0 +1,30 @@
|
||||
/*
|
||||
* Author: MikeMatrix
|
||||
* Validate if an array is in the propper color format.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Color Array <ARRAY>
|
||||
*
|
||||
* Return Value:
|
||||
* Is valid Color Array <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [[1, 0.2, 1, 0.5]] call ace_map_gestures_fnc_isValidColorArray
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
scopeName "main";
|
||||
|
||||
params ["_colorArray"];
|
||||
|
||||
if (isNil "_colorArray") exitWith {false};
|
||||
if ((typeName _colorArray) != "ARRAY") exitWith {false};
|
||||
if (count _colorArray != 4) exitWith {false};
|
||||
|
||||
{
|
||||
if ((typeName _x) != "SCALAR" || _x < 0 || _x > 1) exitWith {false breakOut "main"};
|
||||
} count _colorArray;
|
||||
|
||||
true
|
45
addons/map_gestures/functions/fnc_moduleGroupSettings.sqf
Normal file
45
addons/map_gestures/functions/fnc_moduleGroupSettings.sqf
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Initializes Settings for the groups modules and transcodes settings to a useable format.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Logic <LOGIC>
|
||||
* 1: Units <ARRAY>
|
||||
* 2: Activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [module, [player], true] call ace_map_gestures_fnc_moduleGroupSettings
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_color", "_configurationGroupMappings", "_configurationIndex", "_configurations", "_leadColor"];
|
||||
|
||||
params ["_logic", "_units", "_activated"];
|
||||
|
||||
if (!_activated || !isServer) exitWith {};
|
||||
|
||||
// Transcode string setting into usable array. Example: "1,1,1,1" -> [1, 1, 1, 1]
|
||||
_leadColor = call compile ("[" + (_logic getVariable ["leadColor", ""]) + "]");
|
||||
if (!([_leadColor] call FUNC(isValidColorArray))) exitWith {ERROR("leadColor is not a valid color array.")};
|
||||
_color = call compile ("[" + (_logic getVariable ["color", ""]) + "]");
|
||||
if (!([_color] call FUNC(isValidColorArray))) exitWith {ERROR("color is not a valid color array.")};
|
||||
|
||||
// If we already have color configurations from another source, use those, otherwise use default.
|
||||
_configurations = if (isNil QGVAR(GroupColorConfigurations)) then { [] } else { +GVAR(GroupColorConfigurations) };
|
||||
_configurationGroupMappings = if(isNil QGVAR(GroupColorConfigurationMapping)) then { HASH_CREATE } else { +GVAR(GroupColorConfigurationMapping) };
|
||||
|
||||
// Save custom color configuration and keep the index of the entry.
|
||||
_configurationIndex = _configurations pushBack [_leadColor, _color];
|
||||
|
||||
// Add all synchronized groups and reference custom configuration for them
|
||||
{
|
||||
HASH_SET(_configurationGroupMappings,groupID (group _x),_configurationIndex);
|
||||
} count _units;
|
||||
|
||||
[QGVAR(GroupColorConfigurations), _configurations, false, true] call EFUNC(common,setSetting);
|
||||
[QGVAR(GroupColorConfigurationMapping), _configurationGroupMappings, false, true] call EFUNC(common,setSetting);
|
37
addons/map_gestures/functions/fnc_moduleSettings.sqf
Normal file
37
addons/map_gestures/functions/fnc_moduleSettings.sqf
Normal file
@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Initializes Settings for the module and transcodes settings to a useable format.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Logic <LOGIC>
|
||||
* 1: Units <ARRAY>
|
||||
* 2: Activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [module, [player], true] call ace_map_gestures_fnc_moduleGroupSettings
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_defaultColor", "_defaultLeadColor"];
|
||||
|
||||
params ["_logic", "", "_activated"];
|
||||
|
||||
if (!_activated || !isServer) exitWith {};
|
||||
|
||||
[_logic, QGVAR(enabled), "enabled"] call EFUNC(common,readSettingFromModule);
|
||||
[_logic, QGVAR(maxRange), "maxRange"] call EFUNC(common,readSettingFromModule);
|
||||
[_logic, QGVAR(interval), "interval"] call EFUNC(common,readSettingFromModule);
|
||||
|
||||
_defaultLeadColor = call compile ("[" + (_logic getVariable ["defaultLeadColor", ""]) + "]");
|
||||
if (!([_defaultLeadColor] call FUNC(isValidColorArray))) exitWith {ERROR("defaultLeadColor is not a valid color array.")};
|
||||
|
||||
_defaultColor = call compile ("[" + (_logic getVariable ["defaultColor", ""]) + "]");
|
||||
if (!([_defaultColor] call FUNC(isValidColorArray))) exitWith {ERROR("defaultColor is not a valid color array.")};
|
||||
|
||||
[QGVAR(defaultLeadColor), _defaultLeadColor, false, true] call EFUNC(common,setSetting);
|
||||
[QGVAR(defaultColor), _defaultColor, false, true] call EFUNC(common,setSetting);
|
25
addons/map_gestures/functions/fnc_receiverInit.sqf
Normal file
25
addons/map_gestures/functions/fnc_receiverInit.sqf
Normal file
@ -0,0 +1,25 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Initializes the receiver and hooks it to the Draw event of the map.
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_map_gestures_fnc_receiverInit
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
ACE_player setVariable [QGVAR(Transmit), false, true];
|
||||
GVAR(EnableTransmit) = false;
|
||||
|
||||
if (!isNil QGVAR(DrawMapHandlerID)) then {
|
||||
(findDisplay 12 displayCtrl 51) ctrlRemoveEventHandler ["Draw", GVAR(DrawMapHandlerID)];
|
||||
GVAR(DrawMapHandlerID) = nil;
|
||||
};
|
||||
GVAR(DrawMapHandlerID) = findDisplay 12 displayCtrl 51 ctrlAddEventHandler ["Draw", FUNC(drawMapGestures)];
|
45
addons/map_gestures/functions/fnc_transmit.sqf
Normal file
45
addons/map_gestures/functions/fnc_transmit.sqf
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Transmit PFH
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Arguments <ARRAY>
|
||||
* 1: PFH ID <NUMBER>
|
||||
*
|
||||
* Return Value:
|
||||
* Return description <TYPE>
|
||||
*
|
||||
* Example:
|
||||
* [[], 2] call ace_map_gestures_fnc_transmit
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_ownerID", "_unitUID", "_drawPosVariableName", "_playerOwnerID"];
|
||||
|
||||
params ["", "_pfhId"];
|
||||
|
||||
if (!visibleMap) then {
|
||||
call FUNC(endTransmit);
|
||||
};
|
||||
|
||||
if (!GVAR(EnableTransmit) || !visibleMap) exitWith {
|
||||
[_pfhId] call CBA_fnc_removePerFrameHandler;
|
||||
};
|
||||
|
||||
{
|
||||
_ownerID = _x getVariable QGVAR(owner_id);
|
||||
if (isNil "_ownerID") then {
|
||||
[EVENT_PLAYER_HAS_NO_OWNER_ID, [name _x]] call EFUNC(common,serverEvent);
|
||||
} else {
|
||||
_playerOwnerID = ACE_player getVariable QGVAR(owner_id);
|
||||
if (!isNil "_playerOwnerID" && _ownerID != _playerOwnerID) then {
|
||||
_unitUID = getPlayerUID ACE_Player;
|
||||
_drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil};
|
||||
if (!isNil "_drawPosVariableName") then {
|
||||
_ownerID publicVariableClient _drawPosVariableName;
|
||||
};
|
||||
};
|
||||
};
|
||||
} count ([ACE_player, GVAR(maxRange)] call FUNC(getProximityPlayers));
|
70
addons/map_gestures/functions/fnc_transmitterInit.sqf
Normal file
70
addons/map_gestures/functions/fnc_transmitterInit.sqf
Normal file
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Author: Dslyecxi, MikeMatrix
|
||||
* Initializes the transmitting event handlers.
|
||||
*
|
||||
* Arguments:
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [] call ace_map_gestures_fnc_transmitterInit
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_mapCtrl", "_unitUID", "_drawPosVariableName"];
|
||||
|
||||
disableSerialization;
|
||||
|
||||
_mapCtrl = findDisplay 12 displayCtrl 51;
|
||||
|
||||
// MouseMoving EH.
|
||||
if (!isNil QGVAR(MouseMoveHandlerID)) then {
|
||||
_mapCtrl ctrlRemoveEventHandler ["MouseMoving", GVAR(MouseMoveHandlerID)];
|
||||
GVAR(MouseMoveHandlerID) = nil;
|
||||
};
|
||||
GVAR(MouseMoveHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseMoving", {
|
||||
// Don't transmit any data if we're using the map tools
|
||||
if (!GVAR(EnableTransmit) || EGVAR(maptools,drawing_isDrawing) || EGVAR(maptools,mapTool_isDragging) || EGVAR(maptools,mapTool_isRotating)) exitWith {};
|
||||
|
||||
params ["_control", "_posX", "_posY"];
|
||||
|
||||
if (!(ACE_player getVariable QGVAR(Transmit))) then {
|
||||
ACE_player setVariable [QGVAR(Transmit), true, true];
|
||||
};
|
||||
|
||||
_unitUID = getPlayerUID ACE_player;
|
||||
_drawPosVariableName = if (!isNil "_unitUID" && _unitUID != "") then {format [QGVAR(%1_DrawPos), _unitUID]} else {nil};
|
||||
if (!isNil "_drawPosVariableName") then {
|
||||
missionNamespace setVariable [_drawPosVariableName, _control ctrlMapScreenToWorld [_posX, _posY]];
|
||||
};
|
||||
}];
|
||||
|
||||
// MouseDown EH
|
||||
if (!isNil QGVAR(MouseDownHandlerID)) then {
|
||||
_mapCtrl ctrlRemoveEventHandler ["MouseButtonDown",GVAR(MouseDownHandlerID)];
|
||||
GVAR(MouseDownHandlerID) = nil;
|
||||
};
|
||||
GVAR(MouseDownHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseButtonDown", {
|
||||
if (!GVAR(enabled)) exitWith {};
|
||||
|
||||
params ["", "_button"];
|
||||
|
||||
if (_button == 0) then {call FUNC(initTransmit);};
|
||||
}];
|
||||
|
||||
// MouseUp EH
|
||||
if (!isNil QGVAR(MouseUpHandlerID)) then {
|
||||
_mapCtrl ctrlRemoveEventHandler ["MouseButtonUp", GVAR(MouseUpHandlerID)];
|
||||
GVAR(MouseUpHandlerID) = nil;
|
||||
};
|
||||
GVAR(MouseUpHandlerID) = _mapCtrl ctrlAddEventHandler ["MouseButtonUp", {
|
||||
if (!GVAR(enabled)) exitWith {};
|
||||
|
||||
params ["", "_button"];
|
||||
|
||||
if (_button == 0) then {call FUNC(endTransmit);};
|
||||
}];
|
1
addons/map_gestures/functions/script_component.hpp
Normal file
1
addons/map_gestures/functions/script_component.hpp
Normal file
@ -0,0 +1 @@
|
||||
#include "\z\ace\addons\map_gestures\script_component.hpp"
|
14
addons/map_gestures/script_component.hpp
Normal file
14
addons/map_gestures/script_component.hpp
Normal file
@ -0,0 +1,14 @@
|
||||
#define COMPONENT map_gestures
|
||||
#include "\z\ace\addons\main\script_mod.hpp"
|
||||
|
||||
#ifdef DEBUG_ENABLED_MAP_GESTURES
|
||||
#define DEBUG_MODE_FULL
|
||||
#endif
|
||||
|
||||
#ifdef DEBUG_SETTINGS_MAP_GESTURES
|
||||
#define DEBUG_SETTINGS DEBUG_SETTINGS_MAP_GESTURES
|
||||
#endif
|
||||
|
||||
#include "\z\ace\addons\main\script_macros.hpp"
|
||||
|
||||
#define EVENT_PLAYER_HAS_NO_OWNER_ID "PlayerNameHasNoOwnerID"
|
98
addons/map_gestures/stringtable.xml
Normal file
98
addons/map_gestures/stringtable.xml
Normal file
@ -0,0 +1,98 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project name="ACE">
|
||||
<Package name="map_gestures">
|
||||
<Key ID="STR_ACE_map_gestures_moduleSettings_displayName">
|
||||
<English>Map Gestures</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_enabled_displayName">
|
||||
<English>Enabled</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_maxRange_displayName">
|
||||
<English>Map Gesture Max Range</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_maxRange_description">
|
||||
<English>Max range between players to show the map gesture indicator [default: 7 meters]</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultLeadAlpha_displayName">
|
||||
<English>Lead Default Alpha</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultLeadAlpha_description">
|
||||
<English>Fallback Alpha value for group leaders.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultAlpha_displayName">
|
||||
<English>Default Alpha</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultAlpha_descriptions">
|
||||
<English>Fallback Alpha value.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultLeadColor_displayName">
|
||||
<English>Lead Default Color</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultLeadColor_description">
|
||||
<English>Fallback Color value for group leaders.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultColor_displayName">
|
||||
<English>Default Color</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_defaultColor_description">
|
||||
<English>Fallback Color value.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_leadAlpha_displayName">
|
||||
<English>Lead Alpha</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_leadAlpha_description">
|
||||
<English>Alpha value for group leaders of groups synced with this module.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_alpha_displayName">
|
||||
<English>Alpha</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_alpha_description">
|
||||
<English>Alpha value for group members of groups synced with this module.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_leadColor_displayName">
|
||||
<English>Lead Color</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_leadColor_description">
|
||||
<English>Color value for group leaders of groups synced with this module.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_color_displayName">
|
||||
<English>Color</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_color_description">
|
||||
<English>Color value for group members of groups synced with this module.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_moduleGroupSettings_displayName">
|
||||
<English>Map Gestures - Group Settings</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_interval_displayName">
|
||||
<English>Update Interval</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_interval_description">
|
||||
<English>Time between data updates.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_GroupColorConfigurations_displayName">
|
||||
<English>Group color configurations</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_GroupColorConfigurations_description">
|
||||
<English>Group color configuration containing arrays of color pairs ([leadColor, color]).</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_GroupColorConfigurationMapping_description">
|
||||
<English>Hash of Group ID mapped to the Group color configuration index.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_GroupColorConfigurationMapping_displayName">
|
||||
<English>GroupID Color configuration mapping</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_enabled_description">
|
||||
<English>Enables the Map Gestures.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_nameTextColor_displayName">
|
||||
<English>Name Text Color</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_nameTextColor_description">
|
||||
<English>Color of the name tag text besides the map gestures mark.</English>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_map_gestures_mapGestures_category">
|
||||
<English>Map Gestures</English>
|
||||
</Key>
|
||||
</Package>
|
||||
</Project>
|
BIN
addons/map_gestures/ui/icon_module_map_gestures_ca.paa
Normal file
BIN
addons/map_gestures/ui/icon_module_map_gestures_ca.paa
Normal file
Binary file not shown.
@ -1,61 +1,26 @@
|
||||
/*
|
||||
* Author: Glowbal
|
||||
* Assign a medical role to a unit
|
||||
* Assign a medical role to a unit.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The module logic <LOGIC>
|
||||
* 1: units <ARRAY>
|
||||
* 2: activated <BOOL>
|
||||
* 0: The module logic <OBJECT>
|
||||
* 1: Synchronized units <ARRAY>
|
||||
* 2: Activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList"];
|
||||
params [["_logic", objNull, [objNull]]];
|
||||
params ["_logic"];
|
||||
|
||||
if (!isNull _logic) then {
|
||||
_list = _logic getvariable ["EnableList",""];
|
||||
private ["_list", "_setting"];
|
||||
_list = _logic getVariable ["EnableList", ""];
|
||||
_setting = _logic getVariable ["role", 0];
|
||||
|
||||
_splittedList = [_list, ","] call BIS_fnc_splitString;
|
||||
_nilCheckPassedList = "";
|
||||
{
|
||||
_x = [_x] call EFUNC(common,stringRemoveWhiteSpace);
|
||||
if !(isnil _x) then {
|
||||
if (_nilCheckPassedList == "") then {
|
||||
_nilCheckPassedList = _x;
|
||||
} else {
|
||||
_nilCheckPassedList = _nilCheckPassedList + ","+ _x;
|
||||
};
|
||||
};
|
||||
} foreach _splittedList;
|
||||
|
||||
_list = "[" + _nilCheckPassedList + "]";
|
||||
_parsedList = [] call compile _list;
|
||||
_setting = _logic getvariable ["role",0];
|
||||
_objects = synchronizedObjects _logic;
|
||||
if (!(_objects isEqualTo []) && _parsedList isEqualTo []) then {
|
||||
{
|
||||
if (!isnil "_x") then {
|
||||
if (typeName _x == typeName objNull) then {
|
||||
if (local _x) then {
|
||||
_x setvariable [QGVAR(medicClass), _setting, true];
|
||||
};
|
||||
};
|
||||
};
|
||||
} foreach _objects;
|
||||
};
|
||||
{
|
||||
if (!isnil "_x") then {
|
||||
if (typeName _x == typeName objNull) then {
|
||||
if (local _x) then {
|
||||
_x setvariable [QGVAR(medicClass), _setting, true];
|
||||
};
|
||||
};
|
||||
};
|
||||
} foreach _parsedList;
|
||||
};
|
||||
[_list, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
[synchronizedObjects _logic, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
};
|
||||
|
@ -1,11 +1,11 @@
|
||||
/*
|
||||
* Author: Glowbal
|
||||
* Assign vehicle as a medical vehicle
|
||||
* Assign vehicle as a medical vehicle.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: The module logic <LOGIC>
|
||||
* 1: units <ARRAY>
|
||||
* 2: activated <BOOL>
|
||||
* 0: The module logic <OBJECT>
|
||||
* 1: Synchronized units <ARRAY>
|
||||
* 2: Activated <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
@ -14,50 +14,13 @@
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_setting", "_objects", "_list", "_splittedList", "_nilCheckPassedList", "_parsedList", "_xVehicle"];
|
||||
params [["_logic", objNull, [objNull]]];
|
||||
params ["_logic"];
|
||||
|
||||
if (!isNull _logic) then {
|
||||
_list = _logic getvariable ["EnableList",""];
|
||||
private ["_list", "_setting"];
|
||||
_list = _logic getVariable ["EnableList", ""];
|
||||
_setting = _logic getVariable ["enabled", 0];
|
||||
|
||||
_splittedList = [_list, ","] call BIS_fnc_splitString;
|
||||
_nilCheckPassedList = "";
|
||||
{
|
||||
_x = [_x] call EFUNC(common,stringRemoveWhiteSpace);
|
||||
if !(isnil _x) then {
|
||||
if (_nilCheckPassedList == "") then {
|
||||
_nilCheckPassedList = _x;
|
||||
} else {
|
||||
_nilCheckPassedList = _nilCheckPassedList + ","+ _x;
|
||||
};
|
||||
};
|
||||
} foreach _splittedList;
|
||||
|
||||
_list = "[" + _nilCheckPassedList + "]";
|
||||
_parsedList = [] call compile _list;
|
||||
_setting = _logic getvariable ["enabled", 0];
|
||||
_objects = synchronizedObjects _logic;
|
||||
if (!(_objects isEqualTo []) && _parsedList isEqualTo []) then {
|
||||
{
|
||||
if (!isnil "_x") then {
|
||||
if (typeName _x == typeName objNull) then {
|
||||
if (local _x) then {
|
||||
_xVehicle = vehicle _x;
|
||||
TRACE_3("setting medical vehicle", _x, _xVehicle, (typeOf _xVehicle));
|
||||
_xVehicle setvariable [QGVAR(medicClass), _setting, true];
|
||||
};
|
||||
};
|
||||
};
|
||||
} foreach _objects;
|
||||
};
|
||||
{
|
||||
if (!isnil "_x") then {
|
||||
if (typeName _x == typeName objNull) then {
|
||||
if (local _x) then {
|
||||
TRACE_2("setting medical vehicle", _x, (typeOf _x));
|
||||
_x setvariable [QGVAR(medicClass), _setting, true];
|
||||
};
|
||||
};
|
||||
};
|
||||
} foreach _parsedList;
|
||||
[_list, QGVAR(medicClass), _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
[synchronizedObjects _logic, QGVAR(medicClass), _setting, true, true] call EFUNC(common,assignObjectsInList);
|
||||
};
|
||||
|
@ -3276,7 +3276,7 @@
|
||||
<Hungarian>Elsősegélycsomag helyek</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_useLocation_PAK_Description">
|
||||
<English>Where can the Personal Aid Kit be used?</English>
|
||||
<English>Where can the PAK be used?</English>
|
||||
<Russian>Где может использоваться аптечка?</Russian>
|
||||
<Polish>Gdzie można korzystać z apteczek osobistych?</Polish>
|
||||
<Spanish>¿Dónde se puede utilizar el equipo de primeros auxilios?</Spanish>
|
||||
@ -3297,7 +3297,7 @@
|
||||
<Russian>Условие использования аптечки</Russian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_useCondition_PAK_Description">
|
||||
<English>When can the Personal Aid Kit be used?</English>
|
||||
<English>When can the PAK be used?</English>
|
||||
<Czech>Kde může být použita osobní lékárnička?</Czech>
|
||||
<Spanish>¿Cuando se puede utilizar el Equipo de primeros auxilios?</Spanish>
|
||||
<French>Quand peut être utilisé le Kit de Premier Secours</French>
|
||||
@ -3351,7 +3351,7 @@
|
||||
<Hungarian>Járművek & létesítmény</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_medicSetting_SurgicalKit_DisplayName">
|
||||
<English>Allow Surgical kit (Adv)</English>
|
||||
<English>Allow Surgical Kit (Adv)</English>
|
||||
<Russian>Хирургический набор может использоваться (усл.)</Russian>
|
||||
<Polish>Ust. zestawu chirurg.</Polish>
|
||||
<Spanish>Permitir equipo quirúrgico (Avanzado)</Spanish>
|
||||
@ -3362,7 +3362,7 @@
|
||||
<Hungarian>Sebészkészlet (Fejlett) engedélyezése</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_medicSetting_SurgicalKit_Description">
|
||||
<English>Who can use the surgical kit?</English>
|
||||
<English>Who can use the Surgical Kit?</English>
|
||||
<Russian>Кто может использовать хирургический набор?</Russian>
|
||||
<Polish>Kto może skorzystać z zestawu chirurgicznego w celu zszycia ran?</Polish>
|
||||
<Spanish>¿Quién puede utilizar el equipo quirúrgico?</Spanish>
|
||||
@ -3373,7 +3373,7 @@
|
||||
<Hungarian>Ki használhatja a sebészkészletet?</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_consumeItem_SurgicalKit_DisplayName">
|
||||
<English>Remove Surgical kit (Adv)</English>
|
||||
<English>Remove Surgical Kit (Adv)</English>
|
||||
<Russian>Удалять хирургический набор (усл.)</Russian>
|
||||
<Polish>Usuń zest. chir. po użyciu</Polish>
|
||||
<Spanish>Eliminar equipo quirúrgico (Avanzado)</Spanish>
|
||||
@ -3395,7 +3395,7 @@
|
||||
<Hungarian>Eltávolítódjon a sebészkészlet használatkor?</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_useLocation_SurgicalKit_DisplayName">
|
||||
<English>Locations Surgical kit (Adv)</English>
|
||||
<English>Locations Surgical Kit (Adv)</English>
|
||||
<Russian>Место использования хирургического набора (усл.)</Russian>
|
||||
<Polish>Ogr. zestawu chirurg.</Polish>
|
||||
<Spanish>Ubicaciones del equipo quirúrgico (Avanzado)</Spanish>
|
||||
@ -3406,7 +3406,7 @@
|
||||
<Hungarian>Sebészkészlet (Fejlett) helyei</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_useLocation_SurgicalKit_Description">
|
||||
<English>Where can the Surgical kit be used?</English>
|
||||
<English>Where can the Surgical Kit be used?</English>
|
||||
<Russian>Где может использоваться хирургический набор?</Russian>
|
||||
<Polish>Gdzie można korzystać z zestawu chirurgicznego?</Polish>
|
||||
<Spanish>Dónde se puede utilizar el equipo quirúrgico</Spanish>
|
||||
@ -3417,7 +3417,7 @@
|
||||
<Hungarian>Hol lehet a sebészkészletet használni?</Hungarian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_useCondition_SurgicalKit_DisplayName">
|
||||
<English>Condition Surgical kit (Adv)</English>
|
||||
<English>Condition Surgical Kit (Adv)</English>
|
||||
<Czech>Podmínka chirurgické soupravy (Pokr.)</Czech>
|
||||
<Spanish>Condición de equipo quirúrgico (Av)</Spanish>
|
||||
<French>Conditions d'utilisation du kit de chirurgie</French>
|
||||
@ -3427,7 +3427,7 @@
|
||||
<Russian>Условие использования хирургического набора (усл.)</Russian>
|
||||
</Key>
|
||||
<Key ID="STR_ACE_Medical_AdvancedMedicalSettings_useCondition_SurgicalKit_Description">
|
||||
<English>When can the Surgical kit be used?</English>
|
||||
<English>When can the Surgical Kit be used?</English>
|
||||
<Czech>Kde může být použita chirurgická souprava?</Czech>
|
||||
<Spanish>¿Cuando se puede utilizar el equipo quirúrgico?</Spanish>
|
||||
<French>Quand peut être utilisé les kit de chirurgie</French>
|
||||
|
@ -5,8 +5,8 @@ enum {
|
||||
|
||||
class CfgAmmo {
|
||||
class MissileBase;
|
||||
|
||||
class M_PG_AT : MissileBase {
|
||||
|
||||
class M_PG_AT: MissileBase {
|
||||
model = "\A3\Weapons_F\Ammo\Rocket_01_fly_F";
|
||||
proxyShape = "\A3\Weapons_F\Ammo\Rocket_01_F";
|
||||
|
||||
@ -67,18 +67,19 @@ class CfgAmmo {
|
||||
attackProfiles[] = { "LIN", "DIR", "MID", "HI" };
|
||||
};
|
||||
};
|
||||
|
||||
class ACE_Hydra70_DAGR : M_PG_AT {
|
||||
|
||||
class ACE_Hydra70_DAGR: M_PG_AT {
|
||||
displayName = CSTRING(Hydra70_DAGR);
|
||||
displayNameShort = CSTRING(Hydra70_DAGR_Short);
|
||||
|
||||
description = CSTRING(Hydra70_DAGR_Desc);
|
||||
descriptionShort = CSTRING(Hydra70_DAGR_Desc);
|
||||
|
||||
EGVAR(rearm,caliber) = 70;
|
||||
|
||||
//Explicity add guidance config
|
||||
class ADDON: ADDON {};
|
||||
};
|
||||
|
||||
class ACE_Hellfire_AGM114K : ACE_Hydra70_DAGR {
|
||||
|
||||
class ACE_Hellfire_AGM114K: ACE_Hydra70_DAGR {
|
||||
displayName = CSTRING(Hellfire_AGM114K);
|
||||
displayNameShort = CSTRING(Hellfire_AGM114K_Short);
|
||||
|
||||
@ -93,10 +94,13 @@ class CfgAmmo {
|
||||
indirectHit = 71;
|
||||
indirectHitRange = 4.5;
|
||||
effectsMissile = "missile2";
|
||||
|
||||
//Explicity add guidance config
|
||||
class ADDON: ADDON {};
|
||||
};
|
||||
|
||||
// Titan
|
||||
class M_Titan_AT : MissileBase {};
|
||||
class M_Titan_AT: MissileBase {};
|
||||
|
||||
class ACE_Javelin_FGM148: M_Titan_AT {
|
||||
irLock = 0;
|
||||
@ -147,8 +151,8 @@ class CfgAmmo {
|
||||
//Take config changes from (M_Titan_AT_static: M_Titan_AT)
|
||||
initTime = 0.25; //"How long (in seconds) the projectile waits before starting it's engine.", - but doesn't seem to do anything
|
||||
effectsMissileInit = "RocketBackEffectsStaticRPG";
|
||||
class ADDON: ADDON {
|
||||
enabled = 1;
|
||||
};
|
||||
|
||||
//Explicity add guidance config
|
||||
class ADDON: ADDON {};
|
||||
};
|
||||
};
|
||||
|
@ -4,7 +4,7 @@ class CfgWeapons {
|
||||
class LauncherCore;
|
||||
|
||||
class RocketPods: LauncherCore {
|
||||
canLock = 1;
|
||||
// canLock = 1;
|
||||
};
|
||||
class missiles_DAGR : RocketPods {
|
||||
canLock = 1;
|
||||
|
@ -17,7 +17,7 @@ TRACE_1("", _launchParams);
|
||||
// TODO:: Make sure the missile maintains LOS
|
||||
_foundTargetPos = [0,0,0];
|
||||
if(!isNil "_target") then {
|
||||
_foundTargetPos = getPosASL _target;
|
||||
_foundTargetPos = aimPos _target ;
|
||||
//_foundTargetPos = (_target modelToWorldVisual (getCenterOfMass _target));
|
||||
};
|
||||
|
||||
@ -48,4 +48,4 @@ if(!_angleOkay || !_losOkay) then {
|
||||
};
|
||||
|
||||
|
||||
_foundTargetPos;
|
||||
_foundTargetPos;
|
||||
|
@ -11,51 +11,35 @@
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* function = "ace_repair_fnc_moduleAssignRepairVehicle"
|
||||
* function = "ace_repair_fnc_moduleAddSpareParts"
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#define DEBUG_MODE_FULL
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_logic"];
|
||||
|
||||
if (!isNull _logic) then {
|
||||
private ["_list", "_part", "_amount", "_nilCheckPassedList"];
|
||||
// Module settings
|
||||
private ["_list", "_part", "_amount"];
|
||||
_list = _logic getVariable ["List", ""];
|
||||
_part = _logic getVariable ["Part", 0];
|
||||
_amount = _logic getVariable ["Amount", 1];
|
||||
|
||||
// Parse list
|
||||
_nilCheckPassedList = "";
|
||||
{
|
||||
_x = [_x] call EFUNC(common,stringRemoveWhiteSpace);
|
||||
if !(isnil _x) then {
|
||||
if (_nilCheckPassedList == "") then {
|
||||
_nilCheckPassedList = _x;
|
||||
} else {
|
||||
_nilCheckPassedList = _nilCheckPassedList + "," + _x;
|
||||
};
|
||||
};
|
||||
} forEach ([_list, ","] call BIS_fnc_splitString);
|
||||
_list = "[" + _nilCheckPassedList + "]";
|
||||
_list = [] call compile _list;
|
||||
_list = [_list, true, true] call EFUNC(common,parseList);
|
||||
|
||||
// Add synchronized objects to list
|
||||
{
|
||||
_list pushBack _x;
|
||||
} forEach (synchronizedObjects _logic);
|
||||
nil
|
||||
} count (synchronizedObjects _logic);
|
||||
|
||||
if (_list isEqualTo []) exitWith {};
|
||||
|
||||
TRACE_3("module info parsed",_list,_part,_amount);
|
||||
TRACE_3("Module info parsed",_list,_part,_amount);
|
||||
|
||||
// Add spare parts
|
||||
{
|
||||
if (!isNil "_x" && {typeName _x == typeName objNull}) then {
|
||||
[_x, _amount, _part, true] call FUNC(addSpareParts);
|
||||
};
|
||||
} forEach _list;
|
||||
[_x, _amount, _part, true] call FUNC(addSpareParts);
|
||||
} count _list;
|
||||
};
|
||||
|
||||
true
|
||||
|
@ -21,11 +21,9 @@ params ["_logic"];
|
||||
|
||||
if (!isNull _logic) then {
|
||||
private ["_list", "_setting"];
|
||||
_list = _logic getVariable ["EnableList",""];
|
||||
_setting = _logic getVariable ["role",0];
|
||||
_list = _logic getVariable ["EnableList", ""];
|
||||
_setting = _logic getVariable ["role", 0];
|
||||
|
||||
[_list, "ACE_IsEngineer", _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
[synchronizedObjects _logic, "ACE_IsEngineer", _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
};
|
||||
|
||||
true
|
||||
};
|
||||
|
@ -21,11 +21,9 @@ params ["_logic"];
|
||||
|
||||
if (!isNull _logic) then {
|
||||
private ["_list", "_setting"];
|
||||
_list = _logic getVariable ["EnableList",""];
|
||||
_setting = _logic getVariable ["role",0];
|
||||
_list = _logic getVariable ["EnableList", ""];
|
||||
_setting = _logic getVariable ["role", 0];
|
||||
|
||||
[_list, "ACE_isRepairFacility", _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
[synchronizedObjects _logic, "ACE_isRepairFacility", _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
};
|
||||
|
||||
true
|
||||
|
@ -21,11 +21,9 @@ params ["_logic"];
|
||||
|
||||
if (!isNull _logic) then {
|
||||
private ["_list", "_setting"];
|
||||
_list = _logic getVariable ["EnableList",""];
|
||||
_setting = _logic getVariable ["role",0];
|
||||
_list = _logic getVariable ["EnableList", ""];
|
||||
_setting = _logic getVariable ["role", 0];
|
||||
|
||||
[_list, "ACE_isRepairVehicle", _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
[synchronizedObjects _logic, "ACE_isRepairVehicle", _setting, true] call EFUNC(common,assignObjectsInList);
|
||||
};
|
||||
|
||||
true
|
||||
};
|
||||
|
@ -17,3 +17,12 @@ class Extended_Killed_EventHandlers {
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
// Need initPost or there are problems with setVariable
|
||||
class Extended_InitPost_EventHandlers {
|
||||
class ThingX {
|
||||
class ADDON {
|
||||
init = QUOTE(_this call DFUNC(addSitActions))
|
||||
};
|
||||
};
|
||||
};
|
||||
|
@ -34,79 +34,67 @@ class CfgVehicles {
|
||||
};
|
||||
};
|
||||
|
||||
#define MACRO_SEAT_ACTION \
|
||||
class ACE_Actions { \
|
||||
class ACE_MainActions { \
|
||||
displayName = ECSTRING(interaction,MainAction); \
|
||||
selection = ""; \
|
||||
distance = 1.5; \
|
||||
condition = "true"; \
|
||||
class GVAR(Sit) { \
|
||||
displayName = CSTRING(Sit); \
|
||||
condition = QUOTE(_this call FUNC(canSit)); \
|
||||
statement = QUOTE(_this call FUNC(sit)); \
|
||||
showDisabled = 0; \
|
||||
priority = 0; \
|
||||
icon = PATHTOF(UI\sit_ca.paa); \
|
||||
}; \
|
||||
}; \
|
||||
};
|
||||
|
||||
class ThingX;
|
||||
// Folding Chair
|
||||
class Land_CampingChair_V1_F: ThingX {
|
||||
XEH_ENABLED;
|
||||
MACRO_SEAT_ACTION
|
||||
GVAR(canSit) = 1;
|
||||
GVAR(sitDirection) = 180;
|
||||
GVAR(sitPosition[]) = {0, -0.1, -0.45};
|
||||
GVAR(sitRotation) = 10;
|
||||
EGVAR(dragging,canCarry) = 1;
|
||||
EGVAR(dragging,carryPosition[]) = {0, 0.75, 0.5};
|
||||
EGVAR(dragging,carryDirection) = 180;
|
||||
};
|
||||
// Camping Chair
|
||||
class Land_CampingChair_V2_F: ThingX {
|
||||
XEH_ENABLED;
|
||||
MACRO_SEAT_ACTION
|
||||
GVAR(canSit) = 1;
|
||||
GVAR(sitDirection) = 180;
|
||||
GVAR(sitPosition[]) = {0, -0.1, -0.45};
|
||||
GVAR(sitRotation) = 45;
|
||||
EGVAR(dragging,canCarry) = 1;
|
||||
EGVAR(dragging,carryPosition[]) = {0, 0.75, 0.5};
|
||||
EGVAR(dragging,carryDirection) = 180;
|
||||
};
|
||||
|
||||
class Furniture_base_F;
|
||||
// Chair (Plastic)
|
||||
class Land_ChairPlastic_F: Furniture_base_F {
|
||||
XEH_ENABLED;
|
||||
MACRO_SEAT_ACTION
|
||||
GVAR(canSit) = 1;
|
||||
GVAR(sitDirection) = 90;
|
||||
GVAR(sitPosition[]) = {0, 0, -0.5};
|
||||
GVAR(sitRotation) = 5;
|
||||
EGVAR(dragging,canCarry) = 1;
|
||||
EGVAR(dragging,carryPosition[]) = {0, 0.75, 0.5};
|
||||
EGVAR(dragging,carryDirection) = 270;
|
||||
};
|
||||
// Chair (Wooden)
|
||||
class Land_ChairWood_F: Furniture_base_F {
|
||||
XEH_ENABLED;
|
||||
MACRO_SEAT_ACTION
|
||||
GVAR(canSit) = 1;
|
||||
GVAR(sitDirection) = 180;
|
||||
GVAR(sitPosition[]) = {0, -0.05, 0};
|
||||
GVAR(sitRotation) = 75;
|
||||
EGVAR(dragging,canCarry) = 1;
|
||||
EGVAR(dragging,carryPosition[]) = {0, 0.75, 0.5};
|
||||
EGVAR(dragging,carryDirection) = 180;
|
||||
};
|
||||
// Office Chair
|
||||
class Land_OfficeChair_01_F: Furniture_base_F {
|
||||
XEH_ENABLED;
|
||||
MACRO_SEAT_ACTION
|
||||
GVAR(canSit) = 1;
|
||||
GVAR(sitDirection) = 180;
|
||||
GVAR(sitPosition[]) = {0, 0, -0.6};
|
||||
GVAR(sitRotation) = 15;
|
||||
EGVAR(dragging,canCarry) = 1;
|
||||
EGVAR(dragging,carryPosition[]) = {0, 0.75, 0.5};
|
||||
EGVAR(dragging,carryDirection) = 180;
|
||||
};
|
||||
// Rattan Chair
|
||||
class Land_RattanChair_01_F: Furniture_base_F {
|
||||
XEH_ENABLED;
|
||||
MACRO_SEAT_ACTION
|
||||
GVAR(canSit) = 1;
|
||||
GVAR(sitDirection) = 180;
|
||||
GVAR(sitPosition[]) = {0, -0.1, -1}; // Z must be -1 due to chair's geometry (magic floating seat point)
|
||||
GVAR(sitRotation) = 2;
|
||||
EGVAR(dragging,canCarry) = 1;
|
||||
EGVAR(dragging,carryPosition[]) = {0, 0.75, 0.5};
|
||||
EGVAR(dragging,carryDirection) = 180;
|
||||
};
|
||||
};
|
||||
|
@ -4,7 +4,7 @@
|
||||
if (!hasInterface) exitWith {};
|
||||
|
||||
// Add interaction menu exception
|
||||
["isNotSitting", {!((_this select 0) getVariable [QGVAR(isSitting), false])}] call EFUNC(common,addCanInteractWithCondition);
|
||||
["isNotSitting", {isNil {(_this select 0) getVariable QGVAR(isSitting)}}] call EFUNC(common,addCanInteractWithCondition);
|
||||
|
||||
// Handle interruptions
|
||||
["medical_onUnconscious", {_this call DFUNC(handleInterrupt)}] call EFUNC(common,addEventhandler);
|
||||
|
@ -2,6 +2,7 @@
|
||||
|
||||
ADDON = false;
|
||||
|
||||
PREP(addSitActions);
|
||||
PREP(canSit);
|
||||
PREP(canStand);
|
||||
PREP(getRandomAnimation);
|
||||
@ -10,4 +11,6 @@ PREP(moduleInit);
|
||||
PREP(sit);
|
||||
PREP(stand);
|
||||
|
||||
GVAR(initializedClasses) = [];
|
||||
|
||||
ADDON = true;
|
||||
|
42
addons/sitting/functions/fnc_addSitActions.sqf
Normal file
42
addons/sitting/functions/fnc_addSitActions.sqf
Normal file
@ -0,0 +1,42 @@
|
||||
/*
|
||||
* Author: Jonpas
|
||||
* Adds sit actions.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Seat <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* None
|
||||
*
|
||||
* Example:
|
||||
* [seat] call ace_sitting_fnc_addSitActions
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_seat"];
|
||||
private ["_type", "_sitAction"];
|
||||
|
||||
_type = typeOf _seat;
|
||||
|
||||
// Exit if the object is not specified as a seat
|
||||
if (getNumber (configFile >> "CfgVehicles" >> _type >> QGVAR(canSit)) != 1) exitWith {};
|
||||
|
||||
// Exit if class already initialized
|
||||
if (_type in GVAR(initializedClasses)) exitWith {};
|
||||
|
||||
GVAR(initializedClasses) pushBack _type;
|
||||
|
||||
_sitAction = [
|
||||
QGVAR(Sit),
|
||||
localize LSTRING(Sit),
|
||||
QUOTE(PATHTOF(UI\sit_ca.paa)),
|
||||
{_this call FUNC(sit)},
|
||||
{_this call FUNC(canSit)},
|
||||
{},
|
||||
[],
|
||||
[0, 0, 0],
|
||||
1.5
|
||||
] call EFUNC(interact_menu,createAction);
|
||||
[_type, 0, ["ACE_MainActions"], _sitAction] call EFUNC(interact_menu,addActionToClass);
|
@ -4,22 +4,20 @@
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Seat <OBJECT>
|
||||
* 1: Player <OBJECT>
|
||||
*
|
||||
* Return Value:
|
||||
* Can Sit Down <BOOL>
|
||||
*
|
||||
* Example:
|
||||
* [seat, player] call ace_sitting_fnc_canSit
|
||||
* [seat] call ace_sitting_fnc_canSit
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_seat", "_player"];
|
||||
params ["_seat"];
|
||||
|
||||
// Sitting enabled, is seat object, not occupied and standing up (or not on a big slope)
|
||||
GVAR(enable) &&
|
||||
{getNumber (configFile >> "CfgVehicles" >> typeOf _seat >> QGVAR(canSit)) == 1} &&
|
||||
{isNil {_seat getVariable QGVAR(seatOccupied)}} &&
|
||||
{round (vectorUp _seat select 0) == 0 && {round (vectorUp _seat select 1) == 0} && {round (vectorUp _seat select 2) == 1}}
|
||||
|
@ -18,4 +18,4 @@
|
||||
params ["_player"];
|
||||
|
||||
// Sitting
|
||||
(_player getVariable [QGVAR(isSitting), false])
|
||||
!isNil {_player getVariable QGVAR(isSitting)}
|
||||
|
@ -17,6 +17,6 @@
|
||||
|
||||
params ["_player"];
|
||||
|
||||
if (_player getVariable [QGVAR(isSitting), false]) then {
|
||||
if (!isNil {_player getVariable QGVAR(isSitting)}) then {
|
||||
_player call FUNC(stand);
|
||||
};
|
||||
|
@ -16,23 +16,14 @@
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_actionID", "_configFile", "_sitDirection", "_sitPosition", "_sitRotation", "_seatPosOrig"];
|
||||
private ["_actionID", "_configFile", "_sitDirection", "_sitPosition", "_seatPosOrig"];
|
||||
|
||||
params ["_seat", "_player"];
|
||||
|
||||
// Set global variable for standing up
|
||||
GVAR(seat) = _seat;
|
||||
|
||||
// Overwrite weird position, because Arma decides to set it differently based on current animation/stance...
|
||||
_player switchMove "amovpknlmstpsraswrfldnon";
|
||||
|
||||
// Add scroll-wheel action to release object
|
||||
_actionID = _player getVariable [QGVAR(StandUpActionID), -1];
|
||||
|
||||
if (_actionID != -1) then {
|
||||
_player removeAction _actionID;
|
||||
};
|
||||
|
||||
_actionID = _player addAction [
|
||||
format ["<t color='#FFFF00'>%1</t>", localize LSTRING(Stand)],
|
||||
QUOTE((_this select 0) call FUNC(stand)),
|
||||
@ -44,13 +35,10 @@ _actionID = _player addAction [
|
||||
QUOTE(_this call FUNC(canStand))
|
||||
];
|
||||
|
||||
_player setVariable [QGVAR(StandUpActionID), _actionID];
|
||||
|
||||
// Read config
|
||||
_configFile = configFile >> "CfgVehicles" >> typeOf _seat;
|
||||
_sitDirection = (getDir _seat) + getNumber (_configFile >> QGVAR(sitDirection));
|
||||
_sitPosition = getArray (_configFile >> QGVAR(sitPosition));
|
||||
_sitRotation = if (isNumber (_configFile >> QGVAR(sitRotation))) then {getNumber (_configFile >> QGVAR(sitRotation))} else {45}; // Apply default if config entry not present
|
||||
|
||||
// Get random animation and perform it (before moving player to ensure correct placement)
|
||||
[_player, call FUNC(getRandomAnimation), 2] call EFUNC(common,doAnimation); // Correctly places when using non-transitional animations
|
||||
@ -58,11 +46,11 @@ _sitRotation = if (isNumber (_configFile >> QGVAR(sitRotation))) then {getNumber
|
||||
|
||||
// Set direction and position
|
||||
_player setDir _sitDirection;
|
||||
// No need for ATL/ASL as modelToWorld returns in format position
|
||||
_player setPos (_seat modelToWorld _sitPosition);
|
||||
//modelToWorld returns AGL
|
||||
_player setPosASL (AGLtoASL (_seat modelToWorld _sitPosition));
|
||||
|
||||
// Set variables
|
||||
_player setVariable [QGVAR(isSitting), true];
|
||||
// Set variables, save seat object on player
|
||||
_player setVariable [QGVAR(isSitting), [_seat, _actionID]];
|
||||
_seat setVariable [QGVAR(seatOccupied), true, true]; // To prevent multiple people sitting on one seat
|
||||
|
||||
|
||||
@ -73,7 +61,7 @@ _seatPosOrig = getPosASL _seat;
|
||||
_args params ["_player", "_seat", "_seatPosOrig"];
|
||||
|
||||
// Remove PFH if not sitting any more
|
||||
if !(_player getVariable [QGVAR(isSitting), false]) exitWith {
|
||||
if (isNil {_player getVariable QGVAR(isSitting)}) exitWith {
|
||||
[_pfhId] call CBA_fnc_removePerFrameHandler;
|
||||
TRACE_1("Remove PFH",_player getVariable [ARR_2(QGVAR(isSitting), false)]);
|
||||
};
|
||||
|
@ -16,12 +16,14 @@
|
||||
#include "script_component.hpp"
|
||||
|
||||
params ["_player"];
|
||||
private ["_animation"];
|
||||
|
||||
// remove scroll wheel action
|
||||
_player removeAction (_player getVariable [QGVAR(StandUpActionID), -1]);
|
||||
(_player getVariable QGVAR(isSitting)) params ["_seat", "_actionID"];
|
||||
|
||||
// Remove scroll-wheel action
|
||||
_player removeAction _actionID;
|
||||
|
||||
// Restore animation
|
||||
private "_animation";
|
||||
_animation = switch (currentWeapon _player) do {
|
||||
case "": {"amovpercmstpsnonwnondnon"};
|
||||
case (primaryWeapon _player): {"amovpercmstpslowwrfldnon"};
|
||||
@ -33,5 +35,5 @@ _animation = switch (currentWeapon _player) do {
|
||||
|
||||
// Set variables to nil
|
||||
_player setVariable [QGVAR(isSitting), nil];
|
||||
GVAR(seat) setVariable [QGVAR(seatOccupied), nil, true];
|
||||
GVAR(seat) = nil;
|
||||
if (isNull _seat) exitWith {};
|
||||
_seat setVariable [QGVAR(seatOccupied), nil, true];
|
||||
|
@ -5,7 +5,6 @@ ADDON = false;
|
||||
PREP(addSlideActions);
|
||||
PREP(autoTransition);
|
||||
PREP(createSlideshow);
|
||||
PREP(makeList);
|
||||
PREP(moduleInit);
|
||||
|
||||
GVAR(slideshows) = 0;
|
||||
|
@ -1,56 +0,0 @@
|
||||
/*
|
||||
* Author: Jonpas
|
||||
* Makes a list from a string using comma as a delimiter, optionally remove whitespace and check each for object existence.
|
||||
*
|
||||
* Arguments:
|
||||
* 0: Text <STRING>
|
||||
* 1: Trim Whitespace <BOOL>
|
||||
* 2: Check Nil <BOOL>
|
||||
*
|
||||
* Return Value:
|
||||
* Parsed List <ARRAY>
|
||||
*
|
||||
* Example:
|
||||
* ["text", true, false] call ace_slideshow_fnc_makeList
|
||||
*
|
||||
* Public: No
|
||||
*/
|
||||
#include "script_component.hpp"
|
||||
|
||||
private ["_splittedList", "_listTrimmedWhitespace", "_nilCheckPassedList"];
|
||||
params ["_list", "_trimWhitespace", "_checkNil"];
|
||||
|
||||
// Split using comma delimiter
|
||||
_splittedList = [_list, ","] call BIS_fnc_splitString;
|
||||
|
||||
// Remove whitespace
|
||||
_listTrimmedWhitespace = [];
|
||||
if (_trimWhitespace) then {
|
||||
{
|
||||
_listTrimmedWhitespace pushBack ([_x] call CBA_fnc_trim);
|
||||
nil
|
||||
} count _splittedList;
|
||||
_list = _listTrimmedWhitespace;
|
||||
};
|
||||
|
||||
// Check for object existence
|
||||
_nilCheckPassedList = "";
|
||||
if (_checkNil) then {
|
||||
{
|
||||
if !(isNil _x) then {
|
||||
if (_nilCheckPassedList == "") then {
|
||||
_nilCheckPassedList = _x;
|
||||
} else {
|
||||
_nilCheckPassedList = _nilCheckPassedList + "," + _x;
|
||||
};
|
||||
};
|
||||
} count _list;
|
||||
|
||||
// Add Array characters and parse into array
|
||||
_list = "[" + _nilCheckPassedList + "]";
|
||||
_list = [] call compile _list;
|
||||
};
|
||||
|
||||
TRACE_4("Lists",_splittedList,_listTrimmedWhitespace,_nilCheckPassedList,_list);
|
||||
|
||||
_list // return
|
@ -24,10 +24,10 @@ if !(_activated) exitWith {};
|
||||
if (isNull _logic) exitWith {};
|
||||
|
||||
// Extract variables from logic
|
||||
_objects = [_logic getVariable ["Objects", ""], true, true] call FUNC(makeList);
|
||||
_controllers = [_logic getVariable ["Controllers", ""], true, true] call FUNC(makeList);
|
||||
_images = [_logic getVariable ["Images", ""], true, false] call FUNC(makeList);
|
||||
_names = [_logic getVariable ["Names", ""], true, false] call FUNC(makeList);
|
||||
_objects = [_logic getVariable ["Objects", ""], true, true] call EFUNC(common,parseList);
|
||||
_controllers = [_logic getVariable ["Controllers", ""], true, true] call EFUNC(common,parseList);
|
||||
_images = [_logic getVariable ["Images", ""], false, false] call EFUNC(common,parseList);
|
||||
_names = [_logic getVariable ["Names", ""], false, false] call EFUNC(common,parseList);
|
||||
_duration = _logic getVariable ["Duration", 0];
|
||||
|
||||
// Objects synced to the module
|
||||
|
@ -3,22 +3,25 @@
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/acemod/ACE3/releases">
|
||||
<img src="https://img.shields.io/badge/Version-3.2.1-blue.svg" alt="ACE3 Version">
|
||||
<img src="https://img.shields.io/badge/Version-3.3.2-blue.svg" alt="ACE3 Version">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/releases/download/v3.2.1/ace3_3.2.1.zip">
|
||||
<img src="http://img.shields.io/badge/Download-56.5_MB-green.svg" alt="ACE3 Download">
|
||||
<a href="https://github.com/acemod/ACE3/releases/download/v3.3.2/ace3_3.3.2.zip">
|
||||
<img src="https://img.shields.io/badge/Download-65.7_MB-green.svg" alt="ACE3 Download">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/issues">
|
||||
<img src="http://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Issues" alt="ACE3 Issues">
|
||||
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Issues" alt="ACE3 Issues">
|
||||
</a>
|
||||
<a href="https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/?p=2859670">
|
||||
<img src="https://img.shields.io/badge/BIF-Thread-lightgrey.svg" alt="BIF Thread">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
|
||||
<img src="http://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License">
|
||||
<img src="https://img.shields.io/badge/License-GPLv2-red.svg" alt="ACE3 License">
|
||||
</a>
|
||||
<a href="http://slackin.koffeinflummi.de">
|
||||
<img src="http://slackin.koffeinflummi.de/badge.svg" alt="ACE3 Slack">
|
||||
<a href="http://slackin.ace3mod.com/">
|
||||
<img src="http://slackin.ace3mod.com/badge.svg" alt="ACE3 Slack">
|
||||
</a>
|
||||
<a href="https://travis-ci.org/acemod/ACE3">
|
||||
<img src="https://img.shields.io/travis/acemod/ACE3.svg" alt="ACE3 Build Status">
|
||||
</a>
|
||||
</p>
|
||||
<p align="center"><sup><strong>Benötigt die aktuellste Version von <a href="https://github.com/CBATeam/CBA_A3/releases">CBA A3</a>. Besucht uns auf <a href="https://www.facebook.com/ACE3Mod">Facebook</a> | <a href="https://www.youtube.com/c/ACE3Mod">YouTube</a> | <a href="https://twitter.com/ACE3Mod">Twitter</a> | <a href="http://www.reddit.com/r/arma/search?q=ACE&restrict_sr=on&sort=new&t=all">Reddit</a></strong></sup></p>
|
||||
|
@ -3,22 +3,25 @@
|
||||
</p>
|
||||
<p align="center">
|
||||
<a href="https://github.com/acemod/ACE3/releases">
|
||||
<img src="https://img.shields.io/badge/Wersja-3.2.1-blue.svg" alt="ACE3 Wersja">
|
||||
<img src="https://img.shields.io/badge/Wersja-3.3.2-blue.svg" alt="ACE3 Wersja">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/releases/download/v3.2.1/ace3_3.2.1.zip">
|
||||
<img src="http://img.shields.io/badge/Pobierz-56.5_MB-green.svg" alt="ACE3 Pobierz">
|
||||
<a href="https://github.com/acemod/ACE3/releases/download/v3.3.2/ace3_3.3.2.zip">
|
||||
<img src="https://img.shields.io/badge/Pobierz-65.7_MB-green.svg" alt="ACE3 Pobierz">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/issues">
|
||||
<img src="http://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Zagadnienia" alt="ACE3 Zagadnienia">
|
||||
<img src="https://img.shields.io/github/issues-raw/acemod/ACE3.svg?label=Zagadnienia" alt="ACE3 Zagadnienia">
|
||||
</a>
|
||||
<a href="https://forums.bistudio.com/topic/181341-ace3-a-collaborative-merger-between-agm-cse-and-ace/?p=2859670">
|
||||
<img src="https://img.shields.io/badge/Temat-BIF-lightgrey.svg" alt="Temat BIF">
|
||||
</a>
|
||||
<a href="https://github.com/acemod/ACE3/blob/master/LICENSE">
|
||||
<img src="http://img.shields.io/badge/Licencja-GPLv2-red.svg" alt="ACE3 Licencja">
|
||||
<img src="https://img.shields.io/badge/Licencja-GPLv2-red.svg" alt="ACE3 Licencja">
|
||||
</a>
|
||||
<a href="http://slackin.koffeinflummi.de">
|
||||
<img src="http://slackin.koffeinflummi.de/badge.svg" alt="ACE3 Slack">
|
||||
<a href="http://slackin.ace3mod.com/">
|
||||
<img src="http://slackin.ace3mod.com/badge.svg" alt="ACE3 Slack">
|
||||
</a>
|
||||
<a href="https://travis-ci.org/acemod/ACE3">
|
||||
<img src="https://img.shields.io/travis/acemod/ACE3.svg" alt="ACE3 Build Status">
|
||||
</a>
|
||||
</p>
|
||||
<p align="center"><sup><strong>Wymaga najnowszej wersji <a href="https://github.com/CBATeam/CBA_A3/releases">CBA A3</a>. Odwiedź nas na <a href="https://www.facebook.com/ACE3Mod">Facebook</a> | <a href="https://www.youtube.com/c/ACE3Mod">YouTube</a> | <a href="https://twitter.com/ACE3Mod">Twitter</a> | <a href="http://www.reddit.com/r/arma/search?q=ACE&restrict_sr=on&sort=new&t=all">Reddit</a></strong></sup></p>
|
||||
|
@ -16,8 +16,7 @@ from pygithub3 import Github
|
||||
|
||||
|
||||
TRANSLATIONISSUE = 367
|
||||
TRANSLATIONBODY = """**How to translate ACE3:**
|
||||
http://ace3mod.com/wiki/development/how-to-translate-ace3.html
|
||||
TRANSLATIONBODY = """**[ACE3 Translation Guide](http://ace3mod.com/wiki/development/how-to-translate-ace3.html)**
|
||||
|
||||
{}
|
||||
"""
|
||||
|
@ -1,3 +1,4 @@
|
||||
#!/usr/bin/env python3
|
||||
|
||||
import fnmatch
|
||||
import os
|
||||
@ -6,6 +7,16 @@ import ntpath
|
||||
import sys
|
||||
import argparse
|
||||
|
||||
def validKeyWordAfterCode(content, index):
|
||||
keyWords = ["for", "do", "count", "each", "forEach", "else", "and", "not", "isEqualTo", "in", "call", "spawn", "execVM", "catch"];
|
||||
for word in keyWords:
|
||||
try:
|
||||
subWord = content.index(word, index, index+len(word))
|
||||
return True;
|
||||
except:
|
||||
pass
|
||||
return False
|
||||
|
||||
def check_sqf_syntax(filepath):
|
||||
bad_count_file = 0
|
||||
def pushClosing(t):
|
||||
@ -15,63 +26,98 @@ def check_sqf_syntax(filepath):
|
||||
def popClosing():
|
||||
closing << closingStack.pop()
|
||||
|
||||
with open(filepath, 'r') as file:
|
||||
with open(filepath, 'r', encoding='utf-8', errors='ignore') as file:
|
||||
content = file.read()
|
||||
|
||||
# Store all brackets we find in this file, so we can validate everything on the end
|
||||
brackets_list = []
|
||||
|
||||
# To check if we are in a comment block
|
||||
isInCommentBlock = False
|
||||
checkIfInComment = False
|
||||
# Used in case we are in a line comment (//)
|
||||
ignoreTillEndOfLine = False
|
||||
# Used in case we are in a comment block (/* */). This is true if we detect a * inside a comment block.
|
||||
# If the next character is a /, it means we end our comment block.
|
||||
checkIfNextIsClosingBlock = False
|
||||
isInString = False
|
||||
|
||||
# We ignore everything inside a string
|
||||
isInString = False
|
||||
# Used to store the starting type of a string, so we can match that to the end of a string
|
||||
inStringType = '';
|
||||
|
||||
lastIsCurlyBrace = False
|
||||
checkForSemiColumn = False
|
||||
|
||||
# Extra information so we know what line we find errors at
|
||||
lineNumber = 0
|
||||
|
||||
indexOfCharacter = 0
|
||||
# Parse all characters in the content of this file to search for potential errors
|
||||
for c in content:
|
||||
if c == '\n':
|
||||
if (lastIsCurlyBrace):
|
||||
lastIsCurlyBrace = False
|
||||
checkForSemiColumn = True
|
||||
|
||||
if c == '\n': # Keeping track of our line numbers
|
||||
lineNumber += 1 # so we can print accurate line number information when we detect a possible error
|
||||
if (isInString):
|
||||
if (isInString): # while we are in a string, we can ignore everything else, except the end of the string
|
||||
if (c == inStringType):
|
||||
isInString = False
|
||||
elif (isInCommentBlock == False): # if we are not in a comment block, we will check if we are at the start of one or count the () {} and []
|
||||
if (checkIfInComment): # This means we have encountered a /, so we are now checking if this is an inline comment or a comment block
|
||||
# if we are not in a comment block, we will check if we are at the start of one or count the () {} and []
|
||||
elif (isInCommentBlock == False):
|
||||
|
||||
# This means we have encountered a /, so we are now checking if this is an inline comment or a comment block
|
||||
if (checkIfInComment):
|
||||
checkIfInComment = False
|
||||
if c == '*': # if the next character after / is a *, we are at the start of a comment block
|
||||
isInCommentBlock = True
|
||||
if (c == '/'): # Otherwise, will check if we are in an line comment
|
||||
elif (c == '/'): # Otherwise, will check if we are in an line comment
|
||||
ignoreTillEndOfLine = True # and an line comment is a / followed by another / (//) We won't care about anything that comes after it
|
||||
|
||||
if (isInCommentBlock == False):
|
||||
if (ignoreTillEndOfLine): # we are in a line comment, just continue going through the characters until we find an end of line
|
||||
if (c == '\n'):
|
||||
ignoreTillEndOfLine = False
|
||||
else:
|
||||
if (c == '"'):
|
||||
else: # validate brackets
|
||||
if (c == '"' or c == "'"):
|
||||
isInString = True
|
||||
inStringType = c
|
||||
elif (c == '#'):
|
||||
ignoreTillEndOfLine = True
|
||||
elif (c == '/'):
|
||||
checkIfInComment = True
|
||||
elif (c == '('):
|
||||
brackets_list.append('(')
|
||||
elif (c == ')'):
|
||||
if (brackets_list[-1] in ['{', '[']):
|
||||
print("Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
print("ERROR: Possible missing round bracket ')' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
bad_count_file += 1
|
||||
brackets_list.append(')')
|
||||
elif (c == '['):
|
||||
brackets_list.append('[')
|
||||
elif (c == ']'):
|
||||
if (brackets_list[-1] in ['{', '(']):
|
||||
print("Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
print("ERROR: Possible missing square bracket ']' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
bad_count_file += 1
|
||||
brackets_list.append(']')
|
||||
elif (c == '{'):
|
||||
brackets_list.append('{')
|
||||
elif (c == '}'):
|
||||
lastIsCurlyBrace = True
|
||||
if (brackets_list[-1] in ['(', '[']):
|
||||
print("Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
print("ERROR: Possible missing curly brace '}}' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
bad_count_file += 1
|
||||
brackets_list.append('}')
|
||||
else:
|
||||
|
||||
if (checkForSemiColumn):
|
||||
if (c not in [' ', '\t', '\n', '/']): # keep reading until no white space or comments
|
||||
checkForSemiColumn = False
|
||||
if (c not in [']', ')', '}', ';', ',', '&', '!', '|', '='] and not validKeyWordAfterCode(content, indexOfCharacter)): # , 'f', 'd', 'c', 'e', 'a', 'n', 'i']):
|
||||
print("ERROR: Possible missing semi-column ';' detected at {0} Line number: {1}".format(filepath,lineNumber))
|
||||
bad_count_file += 1
|
||||
|
||||
else: # Look for the end of our comment block
|
||||
if (c == '*'):
|
||||
checkIfNextIsClosingBlock = True;
|
||||
elif (checkIfNextIsClosingBlock):
|
||||
@ -79,39 +125,49 @@ def check_sqf_syntax(filepath):
|
||||
isInCommentBlock = False
|
||||
elif (c != '*'):
|
||||
checkIfNextIsClosingBlock = False
|
||||
indexOfCharacter += 1
|
||||
|
||||
if brackets_list.count('[') != brackets_list.count(']'):
|
||||
print("A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']')))
|
||||
print("ERROR: A possible missing square bracket [ or ] in file {0} [ = {1} ] = {2}".format(filepath,brackets_list.count('['),brackets_list.count(']')))
|
||||
bad_count_file += 1
|
||||
if brackets_list.count('(') != brackets_list.count(')'):
|
||||
print("A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')')))
|
||||
print("ERROR: A possible missing round bracket ( or ) in file {0} ( = {1} ) = {2}".format(filepath,brackets_list.count('('),brackets_list.count(')')))
|
||||
bad_count_file += 1
|
||||
if brackets_list.count('{') != brackets_list.count('}'):
|
||||
print("A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}')))
|
||||
print("ERROR: A possible missing curly brace {{ or }} in file {0} {{ = {1} }} = {2}".format(filepath,brackets_list.count('{'),brackets_list.count('}')))
|
||||
bad_count_file += 1
|
||||
return bad_count_file
|
||||
|
||||
def main():
|
||||
|
||||
print("#########################")
|
||||
print("# Validate SQF files missing brackets #")
|
||||
print("#########################")
|
||||
print("Validating SQF")
|
||||
|
||||
sqf_list = []
|
||||
bad_count = 0
|
||||
|
||||
parser = argparse.ArgumentParser()
|
||||
parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default=".")
|
||||
parser.add_argument('-m','--module', help='only search specified module addon folder', required=False, default="")
|
||||
args = parser.parse_args()
|
||||
|
||||
for root, dirnames, filenames in os.walk('../addons' + '/' + args.module):
|
||||
# Allow running from root directory as well as from inside the tools directory
|
||||
rootDir = "../addons"
|
||||
if (os.path.exists("addons")):
|
||||
rootDir = "addons"
|
||||
|
||||
for root, dirnames, filenames in os.walk(rootDir + '/' + args.module):
|
||||
for filename in fnmatch.filter(filenames, '*.sqf'):
|
||||
sqf_list.append(os.path.join(root, filename))
|
||||
|
||||
for filename in sqf_list:
|
||||
bad_count = bad_count + check_sqf_syntax(filename)
|
||||
|
||||
print("Bad Count {0}".format(bad_count))
|
||||
|
||||
print("------\nChecked {0} files\nErrors detected: {1}".format(len(sqf_list), bad_count))
|
||||
if (bad_count == 0):
|
||||
print("SQF validation PASSED")
|
||||
else:
|
||||
print("SQF validation FAILED")
|
||||
|
||||
return bad_count
|
||||
|
||||
if __name__ == "__main__":
|
||||
|
Loading…
Reference in New Issue
Block a user