From 96e073e66d95cdd3acdfb8e62230ca9b03189341 Mon Sep 17 00:00:00 2001 From: Drill Date: Sun, 7 Jun 2015 12:10:50 +0300 Subject: [PATCH] Initial commit for finger-pointing module --- AUTHORS.txt | 1 + addons/finger/$PBOPREFIX$ | 1 + addons/finger/ACE_Settings.hpp | 23 ++++++ addons/finger/code/addon.hpp | 26 +++++++ addons/finger/code/fn__OEF_renderer.sqf | 24 ++++++ addons/finger/code/fn__comm.sqf | 94 ++++++++++++++++++++++++ addons/finger/code/fn__fp_handler.sqf | 44 +++++++++++ addons/finger/code/fn__init.sqf | 18 +++++ addons/finger/code/fn__mainLoop.sqf | 90 +++++++++++++++++++++++ addons/finger/code/macros.hpp | 54 ++++++++++++++ addons/finger/code/main.hpp | 12 +++ addons/finger/code/settings.hpp | 23 ++++++ addons/finger/code/structures.hpp | 10 +++ addons/finger/config.cpp | 52 +++++++++++++ addons/finger/img/fp_icon.paa | Bin 0 -> 34013 bytes addons/finger/script_component.hpp | 12 +++ addons/finger/stringtable.xml | 34 +++++++++ 17 files changed, 518 insertions(+) create mode 100644 addons/finger/$PBOPREFIX$ create mode 100644 addons/finger/ACE_Settings.hpp create mode 100644 addons/finger/code/addon.hpp create mode 100644 addons/finger/code/fn__OEF_renderer.sqf create mode 100644 addons/finger/code/fn__comm.sqf create mode 100644 addons/finger/code/fn__fp_handler.sqf create mode 100644 addons/finger/code/fn__init.sqf create mode 100644 addons/finger/code/fn__mainLoop.sqf create mode 100644 addons/finger/code/macros.hpp create mode 100644 addons/finger/code/main.hpp create mode 100644 addons/finger/code/settings.hpp create mode 100644 addons/finger/code/structures.hpp create mode 100644 addons/finger/config.cpp create mode 100644 addons/finger/img/fp_icon.paa create mode 100644 addons/finger/script_component.hpp create mode 100644 addons/finger/stringtable.xml diff --git a/AUTHORS.txt b/AUTHORS.txt index c8145e3970..8b729a6f63 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -101,3 +101,4 @@ Valentin Torikian VyMajoris(W-Cephei) Winter zGuba +Drill diff --git a/addons/finger/$PBOPREFIX$ b/addons/finger/$PBOPREFIX$ new file mode 100644 index 0000000000..746f380ecc --- /dev/null +++ b/addons/finger/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\finger \ No newline at end of file diff --git a/addons/finger/ACE_Settings.hpp b/addons/finger/ACE_Settings.hpp new file mode 100644 index 0000000000..584d1d03de --- /dev/null +++ b/addons/finger/ACE_Settings.hpp @@ -0,0 +1,23 @@ +#include "code\addon.hpp" + +#define LOC(x) $__LOCALIZE_PREFIX__##x + + +class ACE_Settings { + class GVAR(FP_indicator_for_self) { + displayName = LOC(indicator_for_self); + description = LOC(indicator_for_self__desc); + isClientSettable = 1; + typeName = "BOOL"; + value = 1; + }; + class GVAR(FP_indicator_color) + { + value[] = {0.83, 0.68, 0.21, 0.75}; + typeName = "COLOR"; + isClientSettable = 1; + displayName = LOC(color); + description = LOC(color__desc); + }; + +}; diff --git a/addons/finger/code/addon.hpp b/addons/finger/code/addon.hpp new file mode 100644 index 0000000000..aedbcad672 --- /dev/null +++ b/addons/finger/code/addon.hpp @@ -0,0 +1,26 @@ +#ifndef __ADDON_HPP_ +#define __ADDON_HPP_ + + +#define __ADDON_NAME__ ace_finger +#define __BASENAME__ __ADDON_NAME__##_var +#define __PREFIX__ "\z\ace\addons\finger" +#define __PREFIXC__ "\z\ace\addons\finger\code\" + +#define FUNC(x) __BASENAME__##_fnc_##x +#define CFUNC(x) __ADDON_NAME__##_fnc_##x + +#define GVAR(x) __BASENAME__##_##x + +#define __LOCALIZE_PREFIX__ STR_Addons_ACE__dfinger__ +#define LOCALIZE(x) (localize ('__LOCALIZE_PREFIX__##x')) + + + + +#define PV(x) private ['x']; x + + + + +#endif diff --git a/addons/finger/code/fn__OEF_renderer.sqf b/addons/finger/code/fn__OEF_renderer.sqf new file mode 100644 index 0000000000..586e852ef0 --- /dev/null +++ b/addons/finger/code/fn__OEF_renderer.sqf @@ -0,0 +1,24 @@ +#include "addon.hpp" +#include "main.hpp" + +#define BASE_SIZE 44 + + +PV(_pos) = [0,0,0]; +PV(_name) = ""; + + +PV(_fov_corr) = ((worldToScreen (positionCameraToWorld [1000, 0, 10000])) select 0) - 0.5; +PV(_sz) = BASE_SIZE * _fov_corr; + +{ + _pos = _x select 0; + _name = _x select 1; + + drawIcon3D [FP_ICON, [ + GVAR(FP_indicator_color) select 0, + GVAR(FP_indicator_color) select 1, + GVAR(FP_indicator_color) select 2, + (GVAR(FP_indicator_color) select 3) max MIN_OPAQUE + ], _pos, _sz, _sz, 0, _name, 1, 0.03, "PuristaMedium"]; +} forEach MAP_VALUES(GVAR(cur_fps)); diff --git a/addons/finger/code/fn__comm.sqf b/addons/finger/code/fn__comm.sqf new file mode 100644 index 0000000000..fd1a088325 --- /dev/null +++ b/addons/finger/code/fn__comm.sqf @@ -0,0 +1,94 @@ +#include "addon.hpp" +#include "main.hpp" + +// finger-pointing array format: +// 1: source player +// 2: position of finger-pointing +// 3: players to broadcast the finger-pointing to + +// server-side event-handlers + +if (isServer) then +{ + // receives finger-pointing array and broadcasts it to provided players + + GVAR(fnc_pv_fpToServer) = + { + LOGV(_this); + + PV(_val) = _this select 1; + + PV(_sp) = _val select 0; + PV(_pfp) = _val select 1; + PV(_dps) = _val select 2; + + GVAR(pv_fpToClient) = [_sp, _pfp]; + PV(_owner) = 0; + { + _owner = owner _x; + + LOGV(_x); + LOGV(_owner); + + if (_owner > 0 && {isPlayer _x}) then + { + if (player == _x) then + { + [0, GVAR(pv_fpToClient)] call GVAR(fnc_pv_fpToClient); + } + else + { + _owner publicVariableClient 'GVAR(pv_fpToClient)'; + }; + }; + } forEach _dps; + + }; + + + + 'GVAR(pv_fpToServer)' addPublicVariableEventHandler GVAR(fnc_pv_fpToServer); + +}; + + +if (hasInterface) then +{ + // currently shown finger-pointings map + // key: source player + // value: [position, source player name, last update time] + // + + + GVAR(cur_fps) = CREATE_MAP(); + + GVAR(fp_handler_running) = false; + + + // receives pointing-object and starts drawing process in format + // 1: source player + // 2: position of finger-pointing + // + + GVAR(fnc_pv_fpToClient) = { + LOGV(_this); + + PV(_val) = _this select 1; + PV(_sp) = _val select 0; + PV(_pfp) = _val select 1; + + PV(_newval) = [_pfp, name _sp, diag_tickTime]; + MAP_SET(GVAR(cur_fps), _sp, _newval); + + if (!GVAR(fp_handler_running)) then + { + GVAR(fp_handler_running) = true; + + [] spawn CFUNC(_fp_handler); + }; + }; + + 'GVAR(pv_fpToClient)' addPublicVariableEventHandler GVAR(fnc_pv_fpToClient); + + +}; diff --git a/addons/finger/code/fn__fp_handler.sqf b/addons/finger/code/fn__fp_handler.sqf new file mode 100644 index 0000000000..52dedaf9be --- /dev/null +++ b/addons/finger/code/fn__fp_handler.sqf @@ -0,0 +1,44 @@ +#include "addon.hpp" +#include "main.hpp" + +['GVAR(_OEF_renderer)', "onEachFrame", CFUNC(_OEF_renderer)] + call BIS_fnc_addStackedEventHandler; + + +// deleting figner-pointings which last more than FP_TIMEOUT + +while {MAP_LEN(GVAR(cur_fps)) > 0} do +{ + if (!( + alive player && + {player == vehicle player || + (vehicle player) isKindOf "StaticWeapon"} + )) exitWith + { + GVAR(cur_fps) = CREATE_MAP(); + }; + + + _ct = diag_tickTime; + + _i = 0; + while {_i < MAP_LEN(GVAR(cur_fps))} do + { + _e = MAP_VALUES(GVAR(cur_fps)) select _i; + if (_ct > (_e select 2) + FP_TIMEOUT) then + { + MAP_IDEL(GVAR(cur_fps), _i); + } + else + { + _i = _i + 1; + }; + }; + + sleep 0.1; +}; + + +['GVAR(_OEF_renderer)', "onEachFrame"] call BIS_fnc_addStackedEventHandler; + +GVAR(fp_handler_running) = false; diff --git a/addons/finger/code/fn__init.sqf b/addons/finger/code/fn__init.sqf new file mode 100644 index 0000000000..266c4017fb --- /dev/null +++ b/addons/finger/code/fn__init.sqf @@ -0,0 +1,18 @@ +#include "addon.hpp" +#include "main.hpp" + +[] spawn +{ + [] call CFUNC(_comm); +}; + + +if (hasInterface) then +{ + [] spawn + { + [] call CFUNC(_mainLoop); + }; +}; + + diff --git a/addons/finger/code/fn__mainLoop.sqf b/addons/finger/code/fn__mainLoop.sqf new file mode 100644 index 0000000000..087d6b0f55 --- /dev/null +++ b/addons/finger/code/fn__mainLoop.sqf @@ -0,0 +1,90 @@ +#include "addon.hpp" +#include "main.hpp" + +LOG("Starting"); + +//while {isNull (findDisplay 46)} do {sleep 1;}; + + +GVAR(FP_keyComb) = [41, false, true, false]; // Ctrl + Tilda + +GVAR(lastFPTime) = -FP_ACTION_TIMEOUT; + + +["ACE3 Common", + "point_finger_at", + [LOCALIZE(keyComb), LOCALIZE(keyComb)], + { + + PV(_rv) = false; + if (alive player) then + { + if (!( + (player == vehicle player || + (vehicle player) isKindOf "StaticWeapon") && + cameraView in ["INTERNAL", "EXTERNAL"] + )) exitWith {}; + + _rv = true; + + if (diag_tickTime < GVAR(lastFPTime) + FP_ACTION_TIMEOUT) + exitWith {}; + + + PV(_pos_prec) = positionCameraToWorld [0, 0, FP_DISTANCE]; + PV(_pos) = positionCameraToWorld [ + random (2*FP_RANDOMIZATION_X) - FP_RANDOMIZATION_X, + random (2*FP_RANDOMIZATION_Y) - FP_RANDOMIZATION_Y, + FP_DISTANCE + ]; + + + PV(_dest_players) = []; + + PV(_pep) = eyePos player; + { + if (isPlayer _x && _x != player && alive _x && + {(_x == vehicle _x || (vehicle _x) isKindOf "StaticWeapon") && { + ((eyePos _x) vectorDistance _pep) < MAX_DIST_TO_OTHER_PLAYERS + }}) then + { + _dest_players pushBack _x; + }; + } forEach playableUnits; + + GVAR(pv_fpToServer) = [player, _pos, _dest_players]; + + LOGV(GVAR(pv_fpToServer)); + + if (isServer) then + { + [0, GVAR(pv_fpToServer)] call GVAR(fnc_pv_fpToServer); + } + else + { + publicVariableServer 'GVAR(pv_fpToServer)'; + }; + + + if (GVAR(FP_indicator_for_self)) then + { + [0, [player, _pos_prec]] call GVAR(fnc_pv_fpToClient); + }; + + player playActionNow "GestureGo"; + GVAR(lastFPTime) = diag_tickTime; + + _rv = true; + }; + + _rv; + }, + "", + [GVAR(FP_keyComb) select 0, + [GVAR(FP_keyComb) select 1, GVAR(FP_keyComb) select 2, GVAR(FP_keyComb) select 3]] +] call cba_fnc_addKeybind; + + + + +LOG("Done"); diff --git a/addons/finger/code/macros.hpp b/addons/finger/code/macros.hpp new file mode 100644 index 0000000000..13b3a30807 --- /dev/null +++ b/addons/finger/code/macros.hpp @@ -0,0 +1,54 @@ +#define XOR(x,y) (((x)||(y)) && !((x)&&(y))) +#define SQR(x) ((x)*(x)) + + +// debug + + +#ifdef DEBUG + #define LOG(msg) (diag_log text format["%1:%2> %3", __FILE__, __LINE__, (msg)]) + #define LOGV(msg) (diag_log text format["%1:%2> %3 = %4", __FILE__, __LINE__, (#msg), (msg)]) +#else + #define LOG(msg) + #define LOGV(msg) +#endif + + + + + +// map macros + +#define CREATE_MAP() [[],[]] + +#define MAP_KEYS(m) ((m) select 0) +#define MAP_VALUES(m) ((m) select 1) + +#define MAP_SET(m, k, v) if (true) then {_____map_t = MAP_KEYS(m) find (k);\ + if (_____map_t >= 0) exitWith {MAP_VALUES(m) set [_____map_t, (v)]};\ + _____map_t = count MAP_KEYS(m);\ + MAP_KEYS(m) set [_____map_t, (k)];\ + MAP_VALUES(m) set [_____map_t, (v)];\ +} + +#define MAP_GET(m, k) if (true) then {_____map_t = MAP_KEYS(m) find (k);\ + if (_____map_t >= 0) exitWith {MAP_VALUES(m) select _____map_t};\ + nil\ +} + +#define MAP_DEL(m, k) if (true) then {_____map_t = MAP_KEYS(m) find (k);\ + if (_____map_t >= 0) exitWith {\ + MAP_KEYS(m) deleteAt _____map_t;\ + MAP_VALUES(m) deleteAt _____map_t;\ + };\ +} + +#define MAP_LEN(m) (count MAP_KEYS(m)) + +#define MAP_IKEY(m, k) (MAP_KEYS(m) find (k)) +#define MAP_IGET(m, i) (MAP_VALUES(m) select (i)) +#define MAP_ISET(m, i, v) (MAP_VALUES(m) set [(i), (v)]) +#define MAP_IDEL(m, i) if (true) then {\ + MAP_KEYS(m) deleteAt (i);\ + MAP_VALUES(m) deleteAt (i);\ +} diff --git a/addons/finger/code/main.hpp b/addons/finger/code/main.hpp new file mode 100644 index 0000000000..7a58ba5a75 --- /dev/null +++ b/addons/finger/code/main.hpp @@ -0,0 +1,12 @@ +#ifndef __MAIN_HPP_ +#define __MAIN_HPP_ + +#include "addon.hpp" + +#include "settings.hpp" + +#include "structures.hpp" +#include "macros.hpp" + + +#endif diff --git a/addons/finger/code/settings.hpp b/addons/finger/code/settings.hpp new file mode 100644 index 0000000000..42d13ec809 --- /dev/null +++ b/addons/finger/code/settings.hpp @@ -0,0 +1,23 @@ +#ifndef __STRUCTURES_H__ +#define __STRUCTURES_H__ + +// #define DEBUG + + +#define FP_ICON "\z\ace\addons\finger\img\fp_icon.paa" + + +#define FP_TIMEOUT 2 +#define FP_ACTION_TIMEOUT 1 + +#define FP_DISTANCE 10000 +#define FP_RANDOMIZATION_X 350 +#define FP_RANDOMIZATION_Y 100 + +#define MAX_DIST_TO_OTHER_PLAYERS 4 + + +#define MIN_OPAQUE 0.1 + + +#endif diff --git a/addons/finger/code/structures.hpp b/addons/finger/code/structures.hpp new file mode 100644 index 0000000000..4922612347 --- /dev/null +++ b/addons/finger/code/structures.hpp @@ -0,0 +1,10 @@ +#ifndef __STRUCTURES_H__ +#define __STRUCTURES_H__ + + + + + + + +#endif diff --git a/addons/finger/config.cpp b/addons/finger/config.cpp new file mode 100644 index 0000000000..dd97a6294d --- /dev/null +++ b/addons/finger/config.cpp @@ -0,0 +1,52 @@ +#include "script_component.hpp" + +#define RECOMPILE 0 + +class CfgPatches +{ + class ace_finger + { + units[]={}; + weapons[]={}; + + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + + author[]= + { + "Drill" + }; + authorUrl = "https://github.com/TheDrill/"; + + addon_version=6; + + VERSION_CONFIG; + }; +}; + +class CfgFunctions +{ + class ace_finger + { + class Main + { + file="\z\ace\addons\finger\code"; + class _init + { + preInit=0; + postInit=1; + recompile=RECOMPILE; + }; + + class _mainLoop {recompile=RECOMPILE;}; + class _comm {recompile=RECOMPILE;}; + class _fp_handler {recompile=RECOMPILE;}; + class _OEF_renderer {recompile=RECOMPILE;}; + }; + }; +}; + + + +#include "ACE_Settings.hpp" + diff --git a/addons/finger/img/fp_icon.paa b/addons/finger/img/fp_icon.paa new file mode 100644 index 0000000000000000000000000000000000000000..9fccb144f18eff19eb3c282fc035d8a0895ef1c3 GIT binary patch literal 34013 zcmeHw3tUr2_W#^_a}yHsA`lHAl7vSR-l%|RAOWh9DiR)nr~x9VYae#e)+(Bi0BY-Q ztzbp8fLiUtKHU2FiR;e*LAz~fyQ{UOwPKa}Xsu6tpaOyWKR1YV``i7syKVow`~UZT z1U%ef=FB-~&di+oo(V}!nUa#5HYG2Gfe_lif4`5LHl}3IGzAY$Pf3|JnWi!LqUoH; zlQXsOe>;2?L?blkw+KCELugSILS-uua>Cb-d@2z3Srif>DT2QzF{E1;tXszzz=+M* zF>C-MZP@Az&H%=;VU&hFfO(W-Plqd-5!;3}MWTo##EVKo+HegvD3~AKicQB?MoOJFxTBNG*a`~Zf4I31}_SP&zW)IHG| zqEe_aMifW4s54jvzs1J#bj4xGC_!Ms6caI&=w-!Nie#h~MJ6Gy2nVvV`guh9AQtT@ zAgEwZc%@_&5Ob8tNJ%ujR^2&~g76u+H1@R>b7!gT= zONwNHHzpulOWG9}PcFE$uJZ|{8Zlx$+HD6T6QI%*VF4CG|7x0F`)~K33st!IL~cm? zwWgEG3EZb+O;$uK_>leKOoR*uL*%Oox*Jqe5_YF~3�aW5S5mNc7*INlh5mfxbzz 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 + + + + + + + + + + Show finger indicator to self + Отображать пальце-индикатор для показывающего игрока + + + Render the indicator for the pointing player. This option doesn't affect whether the other players would see the indicator + Отображать индикатор для показывающего игрока. Эта настройка не влияет на то, будутт ли другие игроки видеть индикатор + + + + Finger indicator + Пальце-индикатор + + + Color of the finger-pointing indicator circle + Цвет индикатора пальце-указания + + + + Action "point a finger at" + Действие "показать пальцем на" + + + +