Skip to content

Commit

Permalink
Merge branch 'master' into release-candidate-3-7-0
Browse files Browse the repository at this point in the history
  • Loading branch information
jonpas committed Apr 30, 2018
2 parents b00efae + 920dc5f commit 6ceef12
Show file tree
Hide file tree
Showing 14 changed files with 311 additions and 6 deletions.
10 changes: 9 additions & 1 deletion addons/common/fnc_deleteEntity.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,15 @@ switch (typeName _entity) do {
case "GROUP" : {
(units _entity) call CBA_fnc_deleteEntity;
{deleteWaypoint _x} forEach (wayPoints _entity);
deleteGroup _entity;
if (local _entity) then {
deleteGroup _entity;
} else {
if (isServer) then {
_entity remoteExecCall ["CBA_fnc_deleteEntity", groupOwner _entity];
} else {
_entity remoteExecCall ["CBA_fnc_deleteEntity", 2];
};
};
};
case "LOCATION" : {
deleteLocation _entity;
Expand Down
10 changes: 6 additions & 4 deletions addons/common/fnc_waitUntilAndExecute.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,15 @@ Function: CBA_fnc_waitUntilAndExecute
Description:
Executes a code once in unscheduled environment after a condition is true.
It's also possible to add a timeout, in which case a different code is executed.
It's also possible to add a timeout >= 0, in which case a different code is executed.
Then it will be waited until _timeout time has elapsed or _condition evaluates to true.
Parameters:
_condition - The function to evaluate as condition. <CODE>
_statement - The function to run once the condition is true. <CODE>
_args - Parameters passed to the functions (statement and condition) executing. (optional) <ANY>
_timeout - Timeout for the condition in seconds. (optional) <NUMBER>
_timeout - If >= 0, timeout for the condition in seconds. If < 0, no timeout.
Exactly 0 means timeout immediately on the next iteration.(optional, default -1) <NUMBER>
_timeoutCode - Will execute instead of _statement if the condition times out. (optional) <CODE>
Passed Arguments:
Expand Down Expand Up @@ -37,11 +39,11 @@ params [
["_condition", {}, [{}]],
["_statement", {}, [{}]],
["_args", []],
["_timeout", 0, [0]],
["_timeout", -1, [0]],
["_timeoutCode", {}, [{}]]
];

if (_timeout == 0) then {
if (_timeout < 0) then {
GVAR(waitUntilAndExecArray) pushBack [_condition, _statement, _args];
} else {
GVAR(waitUntilAndExecArray) pushBack [{
Expand Down
1 change: 1 addition & 0 deletions addons/ui/CfgFunctions.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class CfgFunctions {
file = QUOTE(PATHTOF(flexiMenu\fnc_openMenuByDef.sqf));
};
PATHTO_FNC(addPauseMenuOption);
PATHTO_FNC(progressBar);
};
};
};
30 changes: 30 additions & 0 deletions addons/ui/CfgUIGrids.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
class CfgUIGrids {
class IGUI {
class Presets {
class Arma3 {
class Variables {
GVAR(grid)[] = {
{
1 * GUI_GRID_CENTER_W + GUI_GRID_CENTER_X,
0 * GUI_GRID_CENTER_H + GUI_GRID_CENTER_Y,
38 * GUI_GRID_CENTER_W,
1 * GUI_GRID_CENTER_H
},
0.5 * GUI_GRID_CENTER_W,
0.5 * GUI_GRID_CENTER_H
};
};
};
};

class Variables {
class GVAR(grid) {
displayName = CSTRING(ProgressBarPositionName);
description = CSTRING(ProgressBarPositionDescription);
preview = "#(argb,8,8,3)color(0,0,0,1)";
saveToProfile[] = {0,1,2,3};
canResize = 1;
};
};
};
};
57 changes: 57 additions & 0 deletions addons/ui/RscTitles.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
class RscText;
class RscProgress;
class RscMapControl;

class RscTitles {
class GVAR(ProgressBar) {
onLoad = uiNamespace setVariable ['GVAR(ProgressBar)', _this select 0];
idd = -1;
duration = 1e+11;
fadeIn = 0;
fadeOut = 0;

controls[] = {"Background", "TitleBackground", "ProgressBar", "TitleText", "Script"};

class Background: RscText {
colorBackground[] = {0,0,0,0};
x = "safezoneXAbs";
y = "safezoneY";
w = "safezoneWAbs";
h = "safezoneH";
};

class TitleBackground: RscText {
idc = IDC_PROGRESSBAR_BACKGROUND;
style = ST_CENTER;
sizeEx = 1 * GUI_GRID_CENTER_H;
colorBackground[] = {0,0,0,0.5};
x = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),X)', 0];
y = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),Y)', 0];
w = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),W)', 0];
h = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),H)', 0];
};

class TitleText: TitleBackground {
idc = IDC_PROGRESSBAR_TITLE;
colorBackground[] = {0,0,0,0};
colorText[] = {1,1,1,1};
};

class ProgressBar: RscProgress {
idc = IDC_PROGRESSBAR_BAR;
colorFrame[] = {0,0,0,0.5};
colorBar[] = GUI_BCG_COLOR;
texture = "#(argb,8,8,3)color(1,1,1,0.7)";
x = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),X)', 0];
y = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),Y)', 0];
w = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),W)', 0];
h = profileNamespace getVariable ['TRIPLES(IGUI,GVAR(grid),H)', 0];
};

class Script: RscMapControl {
idc = IDC_PROGRESSBAR_SCRIPT;
w = 0;
h = 0;
};
};
};
7 changes: 7 additions & 0 deletions addons/ui/XEH_preClientInit.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,10 @@
LOG(MSG_INIT);

call COMPILE_FILE(flexiMenu\init);

// recreate after loading a savegame
addMissionEventHandler ["Loaded", {
if (!isNil QGVAR(ProgressBarParams)) then {
QGVAR(ProgressBar) cutRsc [QGVAR(ProgressBar), "PLAIN"];
};
}];
4 changes: 3 additions & 1 deletion addons/ui/config.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,11 @@ class CfgPatches {
#include "CfgEventHandlers.hpp"
#include "CfgFunctions.hpp"

#include "RscTitles.hpp"
#include "CfgUIGrids.hpp"

//-----------------------------------------------------------------------------
// TODO: Delete these rsc/_flexiMenu_RscShortcutButton classes soon and transfer properties to menu classes, if any.
class RscText;
class RscShortcutButton;
class _flexiMenu_RscShortcutButton: RscShortcutButton {
class HitZone {
Expand Down
149 changes: 149 additions & 0 deletions addons/ui/fnc_progressBar.sqf
Original file line number Diff line number Diff line change
@@ -0,0 +1,149 @@
/* ----------------------------------------------------------------------------
Function: CBA_fnc_progressBar
Description:
Opens a progress bar. Closes the currently active progress bar.
Parameters:
_title - Title of the progress bar <STRING>
_totalTime - Time for the progress bar to complete <NUMBER>
_condition - Execute every frame. If reports false, close the progress bar <CODE>
_onSuccess - Script to execute if the progress bar completed <CODE>
_onFailure - Script to execute if the progress bar was aborted prematurely
(optional, default: {}) <CODE>
_arguments - Arguments passed to the scripts (optional, default: []) <ANY>
_blockMouse - Block mouse input (optional, default: true) <BOOLEAN>
_blockKeys - Block keyboard input
requires _blockMouse to be set to true (optional, default: true) <BOOLEAN>
_allowClose - Allow ESC key to abort the progress bar
requires _blockMouse to be set to true (optional, default: true) <BOOLEAN>
Arguments:
_this:
#0 - same as _arguments <ANY>
#1 - true: success, false: failure <BOOLEAN>
#2 - elapsed time, not more than _totalTime <NUMBER>
#3 - total time, same as _totalTime <NUMBER>
Returns:
Nothing
Examples:
(begin example)
["progress bar", 5, {true}, {hint "done"}, {hint "aborted"}] call CBA_fnc_progressBar;
(end)
Author:
commy2
---------------------------------------------------------------------------- */
#include "script_component.hpp"

// no progress bar without interface
if (!hasInterface) exitWith {};

// execute in unscheduled environment
if (canSuspend) exitWith {
[CBA_fnc_progressBar, _this] call CBA_fnc_directCall;
};

// arguments
params [
["_title", "", [""]],
["_totalTime", 0, [0]],
["_condition", {}, [{true}]],
["_onSuccess", {}, [{}]],
["_onFailure", {}, [{}]],
["_arguments", []],
["_blockMouse", true, [false]],
["_blockKeys", true, [false]],
["_allowClose", true, [false]]
];

if (isLocalized _title) then {
_title = localize _title;
};

// show progress bar and set title
QGVAR(ProgressBar) cutRsc [QGVAR(ProgressBar), "PLAIN"];
private _display = uiNamespace getVariable QGVAR(ProgressBar);

private _ctrlTitle = _display displayCtrl IDC_PROGRESSBAR_TITLE;
_ctrlTitle ctrlSetText _title;

// run failure code on previous progress bar
if (!isNil QGVAR(ProgressBarParams)) then {
GVAR(ProgressBarParams) params ["_arguments", "", "", "_onFailure", "_startTime", "_totalTime"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;

[_onFailure, [_arguments, false, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;
};

GVAR(ProgressBarParams) = [_arguments, _condition, _onSuccess, _onFailure, CBA_missionTime, _totalTime, _blockMouse, _blockKeys, _allowClose];

// update bar, check condition, execute success or failure scripts
private _ctrlScript = _display displayCtrl IDC_PROGRESSBAR_SCRIPT;
_ctrlScript ctrlAddEventHandler ["Draw", {
params ["_ctrlScript"];
private _display = ctrlParent _ctrlScript;

GVAR(ProgressBarParams) params ["_arguments", "_condition", "_onSuccess", "_onFailure", "_startTime", "_totalTime"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;

private _continue = [[_arguments, true, _elapsedTime, _totalTime], _condition] call {
private ["_ctrlScript", "_display", "_arguments", "_condition", "_onSuccess", "_onFailure", "_startTime", "_totalTime", "_elapsedTime"];
_this#0 call _this#1;
};

private _blockInputDisplay = uiNamespace getVariable [QGVAR(BlockInputDisplay), displayNull];

if (!_continue) exitWith {
GVAR(ProgressBarParams) = nil;
{QGVAR(ProgressBar) cutText ["", "PLAIN"]} call CBA_fnc_execNextFrame; // game would crash if display is killed from Draw event
_blockInputDisplay closeDisplay 0;
[_onFailure, [_arguments, false, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;
};

if (_elapsedTime >= _totalTime) exitWith {
GVAR(ProgressBarParams) = nil;
{QGVAR(ProgressBar) cutText ["", "PLAIN"]} call CBA_fnc_execNextFrame; // game would crash if display is killed from Draw event
_blockInputDisplay closeDisplay 0;
[_onSuccess, [_arguments, true, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;
};

private _ctrlBar = _display displayCtrl IDC_PROGRESSBAR_BAR;
_ctrlBar progressSetPosition (_elapsedTime / _totalTime);
}];

// block input while the bar is shown
private _blockInputDisplay = uiNamespace getVariable [QGVAR(BlockInputDisplay), displayNull];
_blockInputDisplay closeDisplay 0;

if (_blockMouse) then {
private _mission = uiNamespace getVariable "RscDisplayMission";
_blockInputDisplay = _mission createDisplay "RscDisplayEmpty";
uiNamespace setVariable [QGVAR(BlockInputDisplay), _blockInputDisplay];

_blockInputDisplay displayAddEventHandler ["KeyDown", {
params ["_blockInputDisplay", "_key", "_shift", "_control", "_alt"];

GVAR(ProgressBarParams) params ["_arguments", "", "", "_onFailure", "_startTime", "_totalTime", "_blockMouse", "_blockKeys", "_allowClose"];
private _elapsedTime = (CBA_missionTime - _startTime) min _totalTime;

if (_key isEqualTo DIK_ESCAPE) then {
if (_allowClose) then {
GVAR(ProgressBarParams) = nil;
QGVAR(ProgressBar) cutText ["", "PLAIN"];
_blockInputDisplay closeDisplay 0;
[_onFailure, [_arguments, false, _elapsedTime, _totalTime]] call CBA_fnc_execNextFrame;

_blockKeys = false;
} else {
_blockKeys = true;
};
};

_blockKeys
}];
};

nil
7 changes: 7 additions & 0 deletions addons/ui/script_component.hpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
#define COMPONENT ui
#include "\x\cba\addons\main\script_mod.hpp"

//#define DEBUG_MODE_FULL
//#define DISABLE_COMPILE_CACHE
//#define DEBUG_ENABLED_UI

#ifdef DEBUG_ENABLED_UI
Expand All @@ -14,9 +16,14 @@
#include "\x\cba\addons\main\script_macros.hpp"

#include "\a3\ui_f\hpp\defineCommonGrids.inc"
#include "\a3\ui_f\hpp\defineCommonColors.inc"
#include "\a3\ui_f\hpp\defineDIKCodes.inc"
#include "\a3\ui_f\hpp\defineResincl.inc"

#define IDC_PROGRESSBAR_TITLE 10
#define IDC_PROGRESSBAR_BAR 11
#define IDC_PROGRESSBAR_SCRIPT 12

#define IDC_ADDON_CONTROLS 127303
#define IDC_ADDON_OPTIONS 127307

Expand Down
8 changes: 8 additions & 0 deletions addons/ui/stringtable.xml
Original file line number Diff line number Diff line change
Expand Up @@ -9,5 +9,13 @@
<Portuguese>Extensões de Base Comunitária - Interface ao Usuário</Portuguese>
<Russian>Community Base Addons - Пользовательский Интерфейс</Russian>
</Key>
<Key ID="STR_CBA_Ui_ProgressBarPositionName">
<English>Progress Bar</English>
<German>Fortschrittsanzeige</German>
</Key>
<Key ID="STR_CBA_Ui_ProgressBarPositionDescription">
<English>Position of the progress bar.</English>
<German>Position der Fortschrittsanzeige.</German>
</Key>
</Package>
</Project>
3 changes: 3 additions & 0 deletions addons/versioning/XEH_postInitServer.sqf
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@ FUNC(paranoid) = {

QGVAR(versions_serv) addPublicVariableEventHandler { (_this select 1) call FUNC(paranoid) };

// Skip missing mod check if it is disabled.
if (getNumber (configFile >> "CBA_disableMissingModCheck") == 1) exitWith {};

// Missing Modfolder check
FUNC(handleMismatch) = {
params ["_machine","_mod"];
Expand Down
1 change: 1 addition & 0 deletions optionals/disable_missing_mod_check/$PBOPREFIX$
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
x\cba\addons\disable_missing_mod_check
17 changes: 17 additions & 0 deletions optionals/disable_missing_mod_check/config.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
#include "script_component.hpp"

class CfgPatches {
class ADDON {
author = "$STR_CBA_Author";
name = ECSTRING(Optional,Component);
url = "$STR_CBA_URL";
units[] = {};
weapons[] = {};
requiredVersion = REQUIRED_VERSION;
requiredAddons[] = {"CBA_extended_eventhandlers", "CBA_versioning"};
version = VERSION;
authors[] = {"Dedmen"};
};
};

CBA_disableMissingModCheck = 1;
Loading

0 comments on commit 6ceef12

Please sign in to comment.