added movable markers option (#5397)

* added movable markers option

* added restrictions

* added local events

* formatting + small fixes

* Events for start and end modified + small adjusts

* minor fixes

* lazy eval

* Alt as modifier key

* Update XEH_postInit.sqf

* Skip UI EH on headless
This commit is contained in:
Christian Klemm 2017-09-07 19:26:32 +02:00 committed by jonpas
parent 1a590ea399
commit 22b4788891
13 changed files with 304 additions and 0 deletions

View File

@ -0,0 +1,17 @@
class ACE_Settings {
class GVAR(movableMarkersEnabled) {
category = CSTRING(Module_DisplayName);
value = 0;
typeName = "BOOL";
displayName = CSTRING(MovableMarkers_DisplayName);
description = CSTRING(MovableMarkers_Description);
};
class GVAR(moveRestriction) {
category = CSTRING(Module_DisplayName);
value = 0;
typeName = "SCALAR";
displayName = CSTRING(MoveRestriction_DisplayName);
description = CSTRING(MoveRestriction_Description);
values[] = {CSTRING(MoveRestriction_All), CSTRING(MoveRestriction_Admins), CSTRING(MoveRestriction_GroupLeaders), CSTRING(MoveRestriction_GroupLeadersAndAdmins)};
};
};

View File

@ -0,0 +1,48 @@
class CfgVehicles {
class ACE_Module;
class ACE_ModuleMarkers: ACE_Module {
author = ECSTRING(common,ACETeam);
category = "ACE";
displayName = CSTRING(Module_DisplayName);
function = QFUNC(initModule);
scope = 2;
isGlobal = 1;
isSingular = 1;
icon = QPATHTOF(UI\Icon_Module_Markers_ca.paa);
class Arguments {
class MovableMarkersEnabled {
displayName = CSTRING(MovableMarkers_DisplayName);
description = CSTRING(MovableMarkers_Description);
typeName = "BOOL";
defaultValue = 0;
};
class MoveRestriction {
displayName = CSTRING(MoveRestriction_DisplayName);
description = CSTRING(MoveRestriction_Description);
typeName = "NUMBER";
class values {
class all {
name = CSTRING(MoveRestriction_All);
value = MOVE_RESTRICTION_ALL;
default = MOVE_RESTRICTION_ALL;
};
class admins {
name = CSTRING(MoveRestriction_Admins);
value = MOVE_RESTRICTION_ADMINS;
};
class groupLeaders {
name = CSTRING(MoveRestriction_GroupLeaders);
value = MOVE_RESTRICTION_GROUP_LEADERS;
};
class groupLeadersAndAdmins {
name = CSTRING(MoveRestriction_GroupLeadersAndAdmins);
value = MOVE_RESTRICTION_GROUP_LEADERS_ADMINS;
};
};
};
};
class ModuleDescription {
description = CSTRING(Module_Description);
};
};
};

Binary file not shown.

View File

@ -11,3 +11,8 @@ PREP(placeMarker);
PREP(sendMarkersJIP); PREP(sendMarkersJIP);
PREP(setMarkerJIP); PREP(setMarkerJIP);
PREP(setMarkerNetwork); PREP(setMarkerNetwork);
PREP(movePFH);
PREP(onMouseButtonDownMap);
PREP(onMouseButtonUpMap);
PREP(initModule);
PREP(canMoveMarker);

View File

@ -18,3 +18,28 @@ GVAR(currentMarkerPosition) = [];
GVAR(currentMarkerAngle) = 0; GVAR(currentMarkerAngle) = 0;
GVAR(currentMarkerColorConfigName) = ""; GVAR(currentMarkerColorConfigName) = "";
GVAR(currentMarkerConfigName) = ""; GVAR(currentMarkerConfigName) = "";
// set marker pos local on every computer (prevent markers visible for everyone)
[QGVAR(applyMarkerPosLocal), {
params["_marker", "_pos"];
_marker setMarkerPosLocal _pos;
if (isServer) then {
private _index = (GETGVAR(allMapMarkers,[])) find _marker; // case-sensitive, but should be fine
if (_index < 0) exitWith {ERROR_1("Could not find data for %1", _marker);};
private _data = GVAR(allMapMarkersProperties) select _index;
_data set [2, _pos];
};
}] call CBA_fnc_addEventHandler;
["ace_settingsInitialized", {
if (GVAR(movableMarkersEnabled)) then {
if (!hasInterface) exitWith {};
[{
!isNull (findDisplay 12)
}, {
(findDisplay 12 displayCtrl 51) ctrlAddEventHandler ["MouseButtonDown", FUNC(onMouseButtonDownMap)];
(findDisplay 12 displayCtrl 51) ctrlAddEventHandler ["MouseButtonUp", FUNC(onMouseButtonUpMap)];
}] call CBA_fnc_waitUntilAndExecute;
};
}] call CBA_fnc_addEventHandler;

View File

@ -15,4 +15,7 @@ class CfgPatches {
}; };
#include "CfgEventHandlers.hpp" #include "CfgEventHandlers.hpp"
#include "ACE_Settings.hpp"
#include "CfgVehicles.hpp"
#include "InsertMarker.hpp" #include "InsertMarker.hpp"

View File

@ -0,0 +1,28 @@
/*
* Author: chris579
* Checks whether the player can move markers.
*
* Arguments:
* None
*
* Return Value:
* Whether the player can move markers <BOOL>
*
* Example:
* [] call ace_markers_fnc_canMoveMarker
*
* Public: No
*/
#include "script_component.hpp"
switch (GVAR(moveRestriction)) do {
case MOVE_RESTRICTION_ALL: { true };
case MOVE_RESTRICTION_ADMINS: { IS_ADMIN };
case MOVE_RESTRICTION_GROUP_LEADERS: {
leader group ACE_player == ACE_player
};
case MOVE_RESTRICTION_GROUP_LEADERS_ADMINS: {
(leader group ACE_player == ACE_player) || IS_ADMIN
};
default { true };
};

View File

@ -0,0 +1,21 @@
/*
* Author: chris579
* Initializes the Markers Module.
*
* Arguments:
* 0: Logic <Object>
*
* Return Value:
* None
*
* Example:
* [LOGIC] call ACE_markers_fnc_initModule
*
* Public: No
*/
#include "script_component.hpp"
params ["_logic"];
[_logic, QGVAR(movableMarkersEnabled), "MovableMarkersEnabled"] call EFUNC(common,readSettingFromModule);
[_logic, QGVAR(moveRestriction), "MoveRestriction"] call EFUNC(common,readSettingFromModule);

View File

@ -0,0 +1,38 @@
/*
* Author: chris579
* When the marker is being moved.
*
* Arguments:
* 0: Marker data <ARRAY>
* 1: PFH ID <NUMBER>
*
* Return Value:
* None
*
* Example:
* [[MARKER], 5] call ace_markers_fnc_movePFH
*
* Public: No
*/
#include "script_component.hpp"
params ["_args", "_idPFH"];
_args params ["_marker"];
if (isNull (findDisplay 12 displayCtrl 51) || {!(player getVariable [QGVAR(moveInProgress), false])}) exitWith {
[_idPFH] call CBA_fnc_removePerFrameHandler;
private _origin = ACE_player getVariable [QGVAR(movedMarkerOrigin), getMarkerPos _marker];
if !([QGVAR(markerMoveEnded), [ACE_player, _marker, _origin, getMarkerPos _marker]] call CBA_fnc_localEvent) exitWith {
_marker setMarkerPosLocal _origin;
};
[QGVAR(applyMarkerPosLocal), [_marker, getMarkerPos _marker]] call CBA_fnc_globalEvent;
_marker setMarkerAlphaLocal (ACE_player getVariable [QGVAR(movedMarkerAlpha), 1]);
EGVAR(map_gestures,enabled) = ACE_player getVariable [QGVAR(mapGesturesSetting), false];
(findDisplay 12 displayCtrl 51) ctrlMapCursor ["Track", "Track"];
};
_marker setMarkerPosLocal ((findDisplay 12 displayCtrl 51) posScreenToWorld getMousePosition);

View File

@ -0,0 +1,53 @@
/*
* Author: chris579
* Triggered when a mouse button is pressed on the map.
*
* Arguments:
* 0: Map Control the EVH was assigned to <CONTROL>
* 1: Button code <NUMBER>
* 2: Position of x <NUMBER>
* 3: Position of y <NUMBER>
* 4: State of Shift <BOOL>
* 5: State of Ctrl <BOOL>
* 6: State of Alt <BOOL>
*
* Return Value:
* None
*
* Example:
* [CONTROL, 2, 0, 0, true, false, false] call ace_markers_fnc_onMouseButtonDownMap
*
* Public: No
*/
#include "script_component.hpp"
params ["_mapCtrl", "_button", "_x", "_y", "_shift", "_ctrl", "_alt"];
if (_button != 0) exitWith {};
private _mouseOver = ctrlMapMouseOver _mapCtrl;
if (count _mouseOver == 2) then {
if ((_mouseOver select 0) == "marker") then {
private _markerName = _mouseOver select 1;
if (_markerName find "_USER_DEFINED" != -1) then {
if (!_ctrl && !_shift && _alt && ([] call FUNC(canMoveMarker))) then {
// move marker
_mapCtrl ctrlMapCursor ["Track", "Move"];
if !([QGVAR(markerMoveStarted), [ACE_player, _markerName, getMarkerPos _markerName]] call CBA_fnc_localEvent) exitWith {};
ACE_player setVariable [QGVAR(movedMarkerOrigin), getMarkerPos _markerName];
ACE_player setVariable [QGVAR(movedMarkerAlpha), markerAlpha _markerName];
ACE_player setVariable [QGVAR(moveInProgress), true];
ACE_player setVariable [QGVAR(mapGesturesSetting), EGVAR(map_gestures,enabled)];
EGVAR(map_gestures,enabled) = false;
_markerName setMarkerAlphaLocal 0.5;
[FUNC(movePFH), 0, [_markerName]] call CBA_fnc_addPerFrameHandler;
};
};
};
};

View File

@ -0,0 +1,21 @@
/*
* Author: chris579
* Triggered when a mouse button is released on the map.
*
* Arguments:
* 0: Map Control the evh was assigned to <CONTROL>
* 1: Button code <NUMBER>
*
* Return Value:
* None
*
* Example:
* [CONTROL, 2] call ace_markers_fnc_onMouseButtonUpMap
*
* Public: No
*/
#include "script_component.hpp"
params ["_mapCtrl", "_button"];
player setVariable [QGVAR(moveInProgress), false];

View File

@ -24,3 +24,8 @@
localize "str_channel_vehicle", \ localize "str_channel_vehicle", \
localize "str_channel_direct" \ localize "str_channel_direct" \
] ]
#define MOVE_RESTRICTION_ALL 0
#define MOVE_RESTRICTION_ADMINS 1
#define MOVE_RESTRICTION_GROUP_LEADERS 2
#define MOVE_RESTRICTION_GROUP_LEADERS_ADMINS 3

View File

@ -17,5 +17,45 @@
<Chinesesimp>方位: %1°</Chinesesimp> <Chinesesimp>方位: %1°</Chinesesimp>
<Chinese>方位: %1°</Chinese> <Chinese>方位: %1°</Chinese>
</Key> </Key>
<Key ID="STR_ACE_Markers_Module_DisplayName">
<English>Markers</English>
<German>Markierungen</German>
</Key>
<Key ID="STR_ACE_Markers_Module_Description">
<English>This module allows you to customize markers placement.</English>
<German>Dieses Modul ermöglicht die Steuerung der Platzierung von Markierungen.</German>
</Key>
<Key ID="STR_ACE_Markers_MovableMarkers_DisplayName">
<English>Movable markers</English>
<German>Bewegbare Markierungen</German>
</Key>
<Key ID="STR_ACE_Markers_MovableMarkers_Description">
<English>Should map markers placed by players be movable?</English>
<German>Sollen Markierungen, die von Spielern platziert wurden, verschiebbar sein?</German>
</Key>
<Key ID="STR_ACE_Markers_MoveRestriction_DisplayName">
<English>Move restriction</English>
<German>Verschiebungsrestriktion</German>
</Key>
<Key ID="STR_ACE_Markers_MoveRestriction_Description">
<English>Apply move restrictions so that not every player is able to move markers.</English>
<German>Restriktionen, damit nicht jeder Spieler Marker verschieben kann</German>
</Key>
<Key ID="STR_ACE_Markers_MoveRestriction_All">
<English>All players</English>
<German>Alle Spieler</German>
</Key>
<Key ID="STR_ACE_Markers_MoveRestriction_Admins">
<English>Admins</English>
<German>Admins</German>
</Key>
<Key ID="STR_ACE_Markers_MoveRestriction_GroupLeaders">
<English>Group leaders</English>
<German>Gruppenführer</German>
</Key>
<Key ID="STR_ACE_Markers_MoveRestriction_GroupLeadersAndAdmins">
<English>Group leaders and Admins</English>
<German>Gruppenführer und Admins</German>
</Key>
</Package> </Package>
</Project> </Project>