initial files
This commit is contained in:
103
kp_liberation.brf_sumava/scripts/client/actions/do_recycle.sqf
Normal file
103
kp_liberation.brf_sumava/scripts/client/actions/do_recycle.sqf
Normal file
@@ -0,0 +1,103 @@
|
||||
// TODO Split this in an added action to the vehicles and add the dorecycle == 1 part in a button action
|
||||
params ["_vehToRecycle"];
|
||||
|
||||
if (_vehToRecycle getVariable ["KP_liberation_preplaced", false]) exitWith {hint localize "STR_PREPLACED_ERROR";};
|
||||
|
||||
dorecycle = 0;
|
||||
|
||||
private _type = typeOf _vehToRecycle;
|
||||
private _cfg = configFile >> "cfgVehicles";
|
||||
private _suppMulti = 0.5;
|
||||
private _ammoMulti = 0.5;
|
||||
private _fuelMulti = 0.5;
|
||||
|
||||
if !(
|
||||
((toLower _type) in KPLIB_b_buildings_classes) ||
|
||||
((toLower _type) in KPLIB_storageBuildings) ||
|
||||
((toLower _type) in KPLIB_upgradeBuildings) ||
|
||||
(_type in KP_liberation_ace_crates) ||
|
||||
(_type == "B_Slingload_01_Repair_F") ||
|
||||
(_type == "B_Slingload_01_Fuel_F") ||
|
||||
(_type == "B_Slingload_01_Ammo_F")
|
||||
) then {
|
||||
private _currentAmmo = 0;
|
||||
private _allAmmo = 0;
|
||||
if (count (magazinesAmmo _vehToRecycle) > 0) then {
|
||||
{
|
||||
_currentAmmo = _currentAmmo + (_x select 1);
|
||||
_allAmmo = _allAmmo + (getNumber(configFile >> "CfgMagazines" >> (_x select 0) >> "count"));
|
||||
} forEach (magazinesAmmo _vehToRecycle);
|
||||
} else {
|
||||
_allAmmo = 1;
|
||||
};
|
||||
|
||||
_suppMulti = (((_vehToRecycle getHitPointDamage "HitEngine") - 1) * -1) * (((_vehToRecycle getHitPointDamage "HitHull") - 1) * -1);
|
||||
_ammoMulti = _currentAmmo/_allAmmo;
|
||||
_fuelMulti = fuel _vehToRecycle;
|
||||
|
||||
if (_type in boats_names) then {
|
||||
_suppMulti = (((_vehToRecycle getHitPointDamage "HitEngine") - 1) * -1);
|
||||
};
|
||||
};
|
||||
|
||||
private _price_s = 0;
|
||||
private _price_a = 0;
|
||||
private _price_f = 0;
|
||||
|
||||
if ((toLower _type) in KPLIB_o_allVeh_classes) then {
|
||||
if (_vehToRecycle isKindOf "Car") then {
|
||||
_price_s = round (60 * _suppMulti);
|
||||
_price_a = round (25 * _ammoMulti);
|
||||
_price_f = round (40 * _fuelMulti);
|
||||
};
|
||||
if (_vehToRecycle isKindOf "Tank") then {
|
||||
_price_s = round (150 * _suppMulti);
|
||||
_price_a = round (120 * _ammoMulti);
|
||||
_price_f = round (100 * _fuelMulti);
|
||||
};
|
||||
if (_vehToRecycle isKindOf "Air") then {
|
||||
_price_s = round (250 * _suppMulti);
|
||||
_price_a = round (200 * _ammoMulti);
|
||||
_price_f = round (150 * _fuelMulti);
|
||||
};
|
||||
} else {
|
||||
private _objectinfo = ((light_vehicles + heavy_vehicles + air_vehicles + static_vehicles + support_vehicles + buildings) select {_type == (_x select 0)}) select 0;
|
||||
_price_s = round ((_objectinfo select 1) * GRLIB_recycling_percentage * _suppMulti);
|
||||
_price_a = round ((_objectinfo select 2) * GRLIB_recycling_percentage * _ammoMulti);
|
||||
_price_f = round ((_objectinfo select 3) * GRLIB_recycling_percentage * _fuelMulti);
|
||||
};
|
||||
|
||||
createDialog "liberation_recycle";
|
||||
waitUntil {sleep 0.1; dialog};
|
||||
|
||||
ctrlSetText [134, format [localize "STR_RECYCLING_YIELD", getText (_cfg >> _type >> "displayName")]];
|
||||
ctrlSetText [131, format ["%1", _price_s]];
|
||||
ctrlSetText [132, format ["%1", _price_a]];
|
||||
ctrlSetText [133, format ["%1", _price_f]];
|
||||
|
||||
waitUntil {sleep 0.1; !dialog || !alive player || dorecycle != 0};
|
||||
|
||||
if (dialog) then {closeDialog 0};
|
||||
|
||||
if (dorecycle == 1 && !(isnull _vehToRecycle) && alive _vehToRecycle) then {
|
||||
if (!(KP_liberation_recycle_building_near) && ((_price_s + _price_a + _price_f) > 0)) exitWith {hint localize "STR_NORECBUILDING_ERROR";};
|
||||
|
||||
private _storage_areas = (([] call KPLIB_fnc_getNearestFob) nearobjects (GRLIB_fob_range * 1.2)) select {(_x getVariable ["KP_liberation_storage_type",-1]) == 0};
|
||||
private _crateSum = (ceil (_price_s / 100)) + (ceil (_price_a / 100)) + (ceil (_price_f / 100));
|
||||
private _spaceSum = 0;
|
||||
|
||||
{
|
||||
if (typeOf _x == KP_liberation_large_storage_building) then {
|
||||
_spaceSum = _spaceSum + (count KP_liberation_large_storage_positions) - (count (attachedObjects _x));
|
||||
};
|
||||
if (typeOf _x == KP_liberation_small_storage_building) then {
|
||||
_spaceSum = _spaceSum + (count KP_liberation_small_storage_positions) - (count (attachedObjects _x));
|
||||
};
|
||||
} forEach _storage_areas;
|
||||
|
||||
if (_spaceSum < _crateSum) then {
|
||||
hint localize "STR_CANCEL_ERROR";
|
||||
} else {
|
||||
[_vehToRecycle, _price_s, _price_a, _price_f, _storage_areas] remoteExec ["recycle_remote_call",2];
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,40 @@
|
||||
dorepackage = 0;
|
||||
|
||||
createDialog "liberation_repackage_fob";
|
||||
waitUntil {sleep 0.1; dialog};
|
||||
waitUntil {sleep 0.1; !dialog || !alive player || dorepackage != 0};
|
||||
|
||||
if (dorepackage > 0) then {
|
||||
closeDialog 0;
|
||||
waitUntil {sleep 0.1; !dialog};
|
||||
|
||||
private _fob = [] call KPLIB_fnc_getNearestFob;
|
||||
|
||||
if !(_fob isEqualTo []) then {
|
||||
GRLIB_all_fobs = GRLIB_all_fobs - [_fob];
|
||||
KP_liberation_clearances deleteAt (KP_liberation_clearances findIf {(_x select 0) isEqualTo _fob});
|
||||
publicVariable "GRLIB_all_fobs";
|
||||
publicVariable "KP_liberation_clearances";
|
||||
};
|
||||
|
||||
{deleteVehicle _x} forEach (((getPos player) nearobjects [FOB_typename, 250]) select {getObjectType _x >= 8});
|
||||
|
||||
sleep 0.5;
|
||||
|
||||
private _spawnpos = zeropos;
|
||||
while {_spawnpos distance2d zeropos < 1000} do {
|
||||
_spawnpos = (getPos player) findEmptyPosition [10, 250, 'B_Heli_Transport_01_F'];
|
||||
if (_spawnpos isEqualTo []) then {_spawnpos = zeropos;};
|
||||
};
|
||||
|
||||
if (dorepackage == 1) then {
|
||||
private _fobbox = FOB_box_typename createVehicle _spawnpos;
|
||||
[_fobbox] call KPLIB_fnc_addObjectInit;
|
||||
};
|
||||
|
||||
if (dorepackage == 2) then {
|
||||
private _fobTruck = FOB_truck_typename createVehicle _spawnpos;
|
||||
[_fobTruck] call KPLIB_fnc_addObjectInit;
|
||||
};
|
||||
hint localize "STR_FOB_REPACKAGE_HINT";
|
||||
};
|
||||
@@ -0,0 +1,6 @@
|
||||
params [ "_veh" ];
|
||||
|
||||
if ( !isNull _veh ) then {
|
||||
_veh setpos [(getpos _veh) select 0,(getpos _veh) select 1, 0.5];
|
||||
_veh setVectorUp surfaceNormal position _veh;
|
||||
};
|
||||
@@ -0,0 +1,53 @@
|
||||
// TODO Remove this loop by adding the actions to the units/intel objects on spawn
|
||||
waitUntil {!isNil "GRLIB_permissions"};
|
||||
waitUntil {!(GRLIB_permissions isEqualTo []) || !GRLIB_permissions_param};
|
||||
|
||||
private _near_people = [];
|
||||
private _near_intel = [];
|
||||
private _actionned_captive_units = [];
|
||||
private _actionned_intel_items = [];
|
||||
|
||||
while {true} do {
|
||||
if ([5] call KPLIB_fnc_hasPermission) then {
|
||||
_near_people = (getPosATL player) nearEntities [["Man"], 5];
|
||||
_near_intel = (getPosATL player) nearEntities [KPLIB_intelObjectClasses, 5];
|
||||
{
|
||||
if ((captive _x) && !(_x in _actionned_captive_units) && !((side group _x) == GRLIB_side_friendly) && !(_x getVariable ["ACE_isUnconscious", false])) then {
|
||||
_x addAction ["<t color='#FFFF00'>" + localize "STR_SECONDARY_CAPTURE" + "</t>",{[_this select 0] join (group player);},"",-850,true,true,"","(vehicle player == player) && (side group _target != GRLIB_side_friendly) && (captive _target)"];
|
||||
_actionned_captive_units pushback _x;
|
||||
};
|
||||
} forEach _near_people;
|
||||
|
||||
{
|
||||
if (!(alive _x) || ((player distance _x) > 5) || ((side group _x) == GRLIB_side_friendly)) then {
|
||||
removeAllActions _x;
|
||||
_actionned_captive_units = _actionned_captive_units - [_x];
|
||||
};
|
||||
} forEach _actionned_captive_units;
|
||||
|
||||
{
|
||||
if !(_x in _actionned_intel_items) then {
|
||||
_x addAction ["<t color='#FFFF00'>" + localize "STR_INTEL" + "</t>",{[_this select 0] remoteExecCall ["intel_remote_call", 2];},"",-849,true,true,"","(vehicle player == player)"];
|
||||
_actionned_intel_items pushback _x;
|
||||
};
|
||||
} forEach _near_intel;
|
||||
|
||||
{
|
||||
if ((player distance _x) > 5) then {
|
||||
removeAllActions _x;
|
||||
_actionned_intel_items = _actionned_intel_items - [_x];
|
||||
};
|
||||
} forEach _actionned_intel_items;
|
||||
} else {
|
||||
{
|
||||
removeAllActions _x;
|
||||
_actionned_captive_units = _actionned_captive_units - [_x];
|
||||
} forEach _actionned_captive_units;
|
||||
|
||||
{
|
||||
removeAllActions _x;
|
||||
_actionned_intel_items = _actionned_intel_items - [_x];
|
||||
} forEach _actionned_intel_items;
|
||||
};
|
||||
sleep 3;
|
||||
};
|
||||
138
kp_liberation.brf_sumava/scripts/client/actions/open_arsenal.sqf
Normal file
138
kp_liberation.brf_sumava/scripts/client/actions/open_arsenal.sqf
Normal file
@@ -0,0 +1,138 @@
|
||||
if (KPLIB_directArsenal) exitWith {
|
||||
if (KP_liberation_ace && KP_liberation_arsenal_type) then {
|
||||
[player, player, false] call ace_arsenal_fnc_openBox;
|
||||
} else {
|
||||
["Open", false] spawn BIS_fnc_arsenal;
|
||||
};
|
||||
};
|
||||
|
||||
load_loadout = 0;
|
||||
edit_loadout = 0;
|
||||
respawn_loadout = 0;
|
||||
load_from_player = -1;
|
||||
exit_on_load = 0;
|
||||
createDialog "liberation_arsenal";
|
||||
|
||||
private _backpack = backpack player;
|
||||
|
||||
private ["_loadouts_data"];
|
||||
// Get loadouts either from ACE or BI arsenals
|
||||
if (KP_liberation_ace && KP_liberation_arsenal_type) then {
|
||||
_loadouts_data = +(profileNamespace getVariable ["ace_arsenal_saved_loadouts", []]);
|
||||
} else {
|
||||
private _saved_loadouts = +(profileNamespace getVariable "bis_fnc_saveInventory_data");
|
||||
_loadouts_data = [];
|
||||
private _counter = 0;
|
||||
if (!isNil "_saved_loadouts") then {
|
||||
{
|
||||
if (_counter % 2 == 0) then {
|
||||
_loadouts_data pushback _x;
|
||||
};
|
||||
_counter = _counter + 1;
|
||||
} forEach _saved_loadouts;
|
||||
};
|
||||
};
|
||||
|
||||
waitUntil { dialog };
|
||||
|
||||
if ( count _loadouts_data > 0 ) then {
|
||||
|
||||
{ lbAdd [201, _x param [0]]} foreach _loadouts_data;
|
||||
|
||||
if ( lbSize 201 > 0 ) then {
|
||||
ctrlEnable [ 202, true ];
|
||||
lbSetCurSel [ 201, 0 ];
|
||||
} else {
|
||||
ctrlEnable [ 202, false ];
|
||||
};
|
||||
|
||||
} else {
|
||||
ctrlEnable [ 202, false ];
|
||||
};
|
||||
|
||||
private _loadplayers = [];
|
||||
{
|
||||
if ( !(name _x in [ "HC1", "HC2", "HC3" ]) ) then {
|
||||
_loadplayers pushback [ name _x, _x ];
|
||||
};
|
||||
} foreach ( allPlayers - [ player ] );
|
||||
|
||||
if ( count _loadplayers > 0 ) then {
|
||||
|
||||
{
|
||||
private _nextplayer = _x select 1;
|
||||
private _namestr = "";
|
||||
if(count (squadParams _nextplayer) != 0) then {
|
||||
_namestr = "[" + ((squadParams _nextplayer select 0) select 0) + "] ";
|
||||
};
|
||||
_namestr = _namestr + name _nextplayer;
|
||||
|
||||
lbAdd [ 203, _namestr ];
|
||||
lbSetCurSel [ 203, 0 ];
|
||||
} foreach _loadplayers;
|
||||
|
||||
} else {
|
||||
ctrlEnable [ 203, false ];
|
||||
ctrlEnable [ 204, false ];
|
||||
};
|
||||
|
||||
((findDisplay 5251) displayCtrl 201) ctrlAddEventHandler [ "mouseButtonDblClick" , { exit_on_load = 1; load_loadout = 1; } ];
|
||||
|
||||
while { dialog && (alive player) && edit_loadout == 0 } do {
|
||||
|
||||
if ( load_loadout > 0 ) then {
|
||||
private _loaded_loadout = _loadouts_data select (lbCurSel 201);
|
||||
if (KP_liberation_ace && KP_liberation_arsenal_type) then {
|
||||
player setUnitLoadout (_loaded_loadout select 1);
|
||||
} else {
|
||||
[player, [profileNamespace, _loaded_loadout]] call BIS_fnc_loadInventory;
|
||||
};
|
||||
|
||||
if (KP_liberation_arsenalUsePreset) then {
|
||||
if ([_backpack] call KPLIB_fnc_checkGear) then {
|
||||
hint format [ localize "STR_HINT_LOADOUT_LOADED", _loaded_loadout param [0]];
|
||||
};
|
||||
} else {
|
||||
hint format [ localize "STR_HINT_LOADOUT_LOADED", _loaded_loadout param [0]];
|
||||
};
|
||||
|
||||
if ( exit_on_load == 1 ) then {
|
||||
closeDialog 0;
|
||||
};
|
||||
load_loadout = 0;
|
||||
};
|
||||
|
||||
if ( respawn_loadout > 0 ) then {
|
||||
GRLIB_respawn_loadout = [ player, ["repetitive"] ] call KPLIB_fnc_getLoadout;
|
||||
hint localize "STR_MAKE_RESPAWN_LOADOUT_HINT";
|
||||
respawn_loadout = 0;
|
||||
};
|
||||
|
||||
if ( load_from_player >= 0 ) then {
|
||||
private _playerselected = ( _loadplayers select load_from_player ) select 1;
|
||||
if ( alive _playerselected ) then {
|
||||
[player, [_playerselected, ["repetitive"]] call KPLIB_fnc_getLoadout] call KPLIB_fnc_setLoadout;
|
||||
hint format [ localize "STR_LOAD_PLAYER_LOADOUT_HINT", name _playerselected ];
|
||||
};
|
||||
load_from_player = -1;
|
||||
};
|
||||
|
||||
sleep 0.1;
|
||||
};
|
||||
|
||||
if ( edit_loadout > 0 ) then {
|
||||
closeDialog 0;
|
||||
waitUntil { !dialog };
|
||||
if (KP_liberation_ace && KP_liberation_arsenal_type) then {
|
||||
[player, player, false] call ace_arsenal_fnc_openBox;
|
||||
} else {
|
||||
[ "Open", false ] spawn BIS_fnc_arsenal;
|
||||
};
|
||||
|
||||
if (KP_liberation_arsenalUsePreset) then {
|
||||
uiSleep 5;
|
||||
private _arsenalDisplay = ["RSCDisplayArsenal", "ace_arsenal_display"] select (KP_liberation_ace && KP_liberation_arsenal_type);
|
||||
waitUntil {sleep 1; isNull (uinamespace getvariable [_arsenalDisplay, displayNull])};
|
||||
[_backpack] call KPLIB_fnc_checkGear;
|
||||
};
|
||||
};
|
||||
@@ -0,0 +1,72 @@
|
||||
private _recycleable_vehicles = [];
|
||||
private _recycleable_classnames = [];
|
||||
veh_action_detect_distance = 20;
|
||||
veh_action_distance = 10;
|
||||
|
||||
{
|
||||
_recycleable_classnames append _x;
|
||||
} forEach [
|
||||
KPLIB_b_light_classes,
|
||||
KPLIB_b_heavy_classes,
|
||||
KPLIB_b_air_classes,
|
||||
KPLIB_b_static_classes,
|
||||
KPLIB_b_support_classes,
|
||||
KPLIB_o_allVeh_classes
|
||||
];
|
||||
|
||||
while {true} do {
|
||||
waitUntil {sleep 2; player getVariable ['KPLIB_fobDist', 99999] < GRLIB_fob_range};
|
||||
|
||||
if ([4] call KPLIB_fnc_hasPermission) then {
|
||||
private _detected_vehicles = (getPos player) nearObjects veh_action_detect_distance select {
|
||||
(((toLower (typeof _x)) in _recycleable_classnames && (({alive _x} count (crew _x)) == 0 || unitIsUAV _x) && (locked _x == 0 || locked _x == 1)) ||
|
||||
(toLower (typeOf _x)) in KPLIB_b_buildings_classes ||
|
||||
(((toLower (typeOf _x)) in KPLIB_storageBuildings) && ((_x getVariable ["KP_liberation_storage_type",-1]) == 0)) ||
|
||||
(toLower (typeOf _x)) in KPLIB_upgradeBuildings ||
|
||||
(typeOf _x) in KP_liberation_ace_crates) &&
|
||||
alive _x &&
|
||||
(
|
||||
// ignore null objects left by Advanced Towing
|
||||
// see https://github.com/sethduda/AdvancedTowing/pull/46
|
||||
(((attachedObjects _x) select {!isNull _X}) isEqualTo [])
|
||||
|| ((typeOf _x) == "rhsusf_mkvsoc")
|
||||
) &&
|
||||
_x distance2d startbase > 1000 &&
|
||||
(_x distance2d ([] call KPLIB_fnc_getNearestFob)) < GRLIB_fob_range &&
|
||||
(getObjectType _x) >= 8
|
||||
};
|
||||
|
||||
{
|
||||
private _next_vehicle = _x;
|
||||
private _next_vehicle_already_in_list = false;
|
||||
{
|
||||
if ((_x select 0) == _next_vehicle) exitWith {_next_vehicle_already_in_list = true;};
|
||||
} forEach _recycleable_vehicles;
|
||||
|
||||
if (!_next_vehicle_already_in_list) then {
|
||||
private _idact_next = _next_vehicle addAction ["<t color='#FFFF00'>" + localize "STR_RECYCLE" + "</t> <img size='2' image='res\ui_recycle.paa'/>", "scripts\client\actions\do_recycle.sqf", "", -900, true, true, "", "build_confirmed == 0 && ((_this distance2D _target) < veh_action_distance) && (vehicle player == player)"];
|
||||
_recycleable_vehicles pushback [_next_vehicle, _idact_next] ;
|
||||
};
|
||||
} forEach _detected_vehicles;
|
||||
|
||||
{
|
||||
private _next_vehicle = _x;
|
||||
private _next_vehicle_already_in_list = false;
|
||||
{
|
||||
if (_x == (_next_vehicle select 0)) exitWith {_next_vehicle_already_in_list = true;};
|
||||
} forEach _detected_vehicles;
|
||||
|
||||
if (!_next_vehicle_already_in_list) then {
|
||||
(_next_vehicle select 0) removeAction (_next_vehicle select 1);
|
||||
_recycleable_vehicles = _recycleable_vehicles - [_next_vehicle];
|
||||
};
|
||||
} forEach _recycleable_vehicles;
|
||||
} else {
|
||||
{
|
||||
(_x select 0) removeAction (_x select 1);
|
||||
_recycleable_vehicles = _recycleable_vehicles - [_x];
|
||||
} forEach _recycleable_vehicles;
|
||||
};
|
||||
|
||||
sleep 3;
|
||||
};
|
||||
@@ -0,0 +1,58 @@
|
||||
waitUntil {!isNil "GRLIB_permissions"};
|
||||
waitUntil {!(GRLIB_permissions isEqualTo []) || !GRLIB_permissions_param};
|
||||
|
||||
private [ "_unflippable_vehicles", "_detected_vehicles", "_next_vehicle", "_next_vehicle_already_in_list", "_idact_next" ];
|
||||
|
||||
_unflippable_vehicles = [];
|
||||
veh_action_distance = 10;
|
||||
|
||||
while { true } do {
|
||||
|
||||
if ([5] call KPLIB_fnc_hasPermission) then {
|
||||
|
||||
_detected_vehicles = ((getpos player) nearEntities [["Tank","APC","IFV","Car"], veh_action_distance]) select {
|
||||
(count crew _x) == 0 &&
|
||||
((locked _x == 0 || locked _x == 1)) &&
|
||||
(_x distance startbase > 1000)
|
||||
};
|
||||
|
||||
{
|
||||
_next_vehicle = _x;
|
||||
_next_vehicle_already_in_list = false;
|
||||
{
|
||||
if ( (_x select 0) == _next_vehicle ) then {
|
||||
_next_vehicle_already_in_list = true;
|
||||
};
|
||||
} foreach _unflippable_vehicles;
|
||||
|
||||
if ( !_next_vehicle_already_in_list ) then {
|
||||
_idact_next = _next_vehicle addAction [ "<t color='#FFFF00'>" + localize "STR_UNFLIP" + "</t> <img size='2' image='res\ui_flipveh.paa'/>", "scripts\client\actions\do_unflip.sqf", "", -950, true, true, "", "build_confirmed == 0 && (_this distance _target < veh_action_distance) && (vehicle player == player)"];
|
||||
_unflippable_vehicles pushback [ _next_vehicle, _idact_next ] ;
|
||||
};
|
||||
} foreach _detected_vehicles;
|
||||
|
||||
{
|
||||
_next_vehicle = _x;
|
||||
_next_vehicle_already_in_list = false;
|
||||
{
|
||||
if ( _x == (_next_vehicle select 0) ) then {
|
||||
_next_vehicle_already_in_list = true;
|
||||
};
|
||||
} foreach _detected_vehicles;
|
||||
|
||||
if ( !_next_vehicle_already_in_list ) then {
|
||||
(_next_vehicle select 0) removeAction (_next_vehicle select 1);
|
||||
_unflippable_vehicles = _unflippable_vehicles - [ _next_vehicle ];
|
||||
};
|
||||
|
||||
} foreach _unflippable_vehicles;
|
||||
|
||||
} else {
|
||||
{
|
||||
(_x select 0) removeAction (_x select 1);
|
||||
_unflippable_vehicles = _unflippable_vehicles - [ _x ];
|
||||
} foreach _unflippable_vehicles;
|
||||
};
|
||||
|
||||
sleep 3;
|
||||
};
|
||||
Reference in New Issue
Block a user