mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Code cleanup of Kestrel 4500 module.
This commit is contained in:
parent
7c60375105
commit
183aac1911
@ -17,3 +17,21 @@ PREP(updateDisplay);
|
||||
PREP(updateImpellerState);
|
||||
|
||||
ADDON = true;
|
||||
|
||||
FUNC(updateMemory) = {
|
||||
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];
|
||||
};
|
||||
|
||||
FUNC(dayOfWeek) = {
|
||||
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,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,7 +3,7 @@
|
||||
* Opens the Kestrel 4500 dialog
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
@ -29,7 +29,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;
|
||||
|
||||
|
@ -3,12 +3,13 @@
|
||||
* Shows the Kestrel 4500 as rsc title
|
||||
*
|
||||
* Arguments:
|
||||
* Nothing
|
||||
* None
|
||||
*
|
||||
* Return Value:
|
||||
* Nothing
|
||||
*
|
||||
* Example:
|
||||
* call ace_kestrel4500_fnc_displayKestrell
|
||||
*
|
||||
* 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_kestrell4500_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 Kestrell 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 Kestrell 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:
|
||||
*
|
||||
|
Loading…
Reference in New Issue
Block a user