2023-09-12 18:58:10 +00:00
|
|
|
#include "..\script_component.hpp"
|
2015-05-09 19:24:39 +00:00
|
|
|
/*
|
2015-05-09 19:30:49 +00:00
|
|
|
* Author: Bohemia Interactive
|
|
|
|
* Module function for initalizing zeus
|
|
|
|
* Edited to remove eagle and global ascension message
|
2015-05-18 19:43:02 +00:00
|
|
|
* Added "zeusUnitAssigned" event call
|
2015-05-09 19:30:49 +00:00
|
|
|
*
|
|
|
|
* Arguments:
|
2015-05-18 11:56:31 +00:00
|
|
|
* 0: The module logic <LOGIC>
|
|
|
|
* 1: units <ARRAY>
|
|
|
|
* 2: activated <BOOL>
|
2015-05-09 19:30:49 +00:00
|
|
|
*
|
|
|
|
* Return Value:
|
2016-11-15 12:07:48 +00:00
|
|
|
* None
|
2015-05-09 19:30:49 +00:00
|
|
|
*
|
2017-06-08 13:31:51 +00:00
|
|
|
* Example:
|
|
|
|
* [LOGIC, [bob, kevin], true] call ace_zeus_fnc_bi_moduleCurator
|
|
|
|
*
|
2015-05-09 19:30:49 +00:00
|
|
|
* Public: No
|
|
|
|
*/
|
2015-05-11 16:08:25 +00:00
|
|
|
|
2016-09-04 14:44:22 +00:00
|
|
|
params ["_logic", "_units", "_activated"];
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
if (_activated) then {
|
|
|
|
|
|
|
|
//--- Terminate when not created on the server
|
2016-05-15 11:48:32 +00:00
|
|
|
if (!isserver && local _logic && isnull (getassignedcuratorunit _logic)) exitwith {
|
2015-05-09 19:24:39 +00:00
|
|
|
[format ["%1 is trying to create curator logic ModuleCurator_F",profilename],"bis_fnc_error",false] call bis_fnc_mp;
|
|
|
|
deletevehicle _logic;
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Get curator owner
|
2016-05-15 11:48:32 +00:00
|
|
|
_ownerVar = _logic getvariable ["owner",""];
|
2015-05-09 19:24:39 +00:00
|
|
|
_ownerUID = parsenumber _ownerVar;
|
|
|
|
if (cheatsenabled) then {
|
|
|
|
_ownerVarArray = toarray _ownerVar;
|
|
|
|
_ownerVarArray resize 3;
|
|
|
|
if (tostring _ownerVarArray == "DEV") then {_ownerUID = 1;};
|
|
|
|
};
|
|
|
|
if (_ownerVar == "" && !ismultiplayer) then {
|
|
|
|
["Curator owner not defined, player used instead in singleplayer."] call bis_fnc_error;
|
|
|
|
_ownerVar = player call bis_fnc_objectvar;
|
|
|
|
};
|
|
|
|
if (_ownerUID > 0 && !ismultiplayer) then {
|
|
|
|
_ownerVar = player call bis_fnc_objectvar;
|
|
|
|
};
|
|
|
|
_isAdmin = _ownerVar == "#adminLogged" || _ownerVar == "#adminVoted";
|
|
|
|
|
|
|
|
//--- Wipe out the variable so clients can't access it
|
2016-05-15 11:48:32 +00:00
|
|
|
_logic setvariable ["owner",nil];
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Server
|
|
|
|
if (isserver) then {
|
|
|
|
|
|
|
|
//--- Prepare admin variable
|
|
|
|
_adminVar = "";
|
|
|
|
if (_isAdmin) then {
|
|
|
|
_letters = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"];
|
|
|
|
_adminVar = "admin_";
|
2015-11-29 15:48:23 +00:00
|
|
|
for "_i" from 0 to 9 do {_adminVar = _adminVar + selectRandom _letters};
|
2015-05-09 19:24:39 +00:00
|
|
|
_logic setvariable ["adminVar",_adminVar,true];
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Get allowed addons
|
2016-05-15 11:48:32 +00:00
|
|
|
_addonsType = _logic getvariable ["Addons",2];
|
2015-05-09 19:24:39 +00:00
|
|
|
_addons = [];
|
|
|
|
switch _addonsType do {
|
|
|
|
|
|
|
|
//--- All (including unofficial ones)
|
|
|
|
case 3: {
|
2016-05-15 11:48:32 +00:00
|
|
|
_cfgPatches = configfile >> "cfgpatches";
|
2015-05-09 19:24:39 +00:00
|
|
|
for "_i" from 0 to (count _cfgPatches - 1) do {
|
|
|
|
_class = _cfgPatches select _i;
|
|
|
|
if (isclass _class) then {_addons set [count _addons,configname _class];};
|
|
|
|
};
|
2023-10-03 11:08:04 +00:00
|
|
|
// Modified by ace_zeus - bis_fnc_activateaddons will error if time > 0 so only call if at start
|
|
|
|
if (time <= 0) then { _addons call bis_fnc_activateaddons; };
|
2015-05-09 19:24:39 +00:00
|
|
|
removeallcuratoraddons _logic;
|
|
|
|
_logic addcuratoraddons _addons;
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- All active
|
|
|
|
case 2: {};
|
|
|
|
|
|
|
|
//--- All mission
|
|
|
|
case 1: {
|
|
|
|
_addonsList = [];
|
|
|
|
{
|
2016-05-15 11:48:32 +00:00
|
|
|
_addonsList = _addonsList + (unitaddons typeof _x);
|
|
|
|
} foreach (entities "all");
|
2015-05-09 19:24:39 +00:00
|
|
|
removeallcuratoraddons _logic;
|
|
|
|
_logic addcuratoraddons _addonsList;
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- None
|
|
|
|
case 0: {
|
|
|
|
removeallcuratoraddons _logic;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Handle ownership
|
|
|
|
[_logic,_ownerVar,_ownerUID,_adminVar] spawn {
|
|
|
|
scriptname "BIS_fnc_moduleCurator: Owner";
|
2016-11-15 12:07:48 +00:00
|
|
|
|
2016-09-04 14:44:22 +00:00
|
|
|
params ["_logic", "_ownerVar", "_ownerUID", "_adminVar"];
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
if (_adminVar != "") then {_ownerVar = _adminVar;};
|
|
|
|
|
2016-05-15 11:48:32 +00:00
|
|
|
_forced = _logic getvariable ["forced",0] > 0;
|
|
|
|
_name = _logic getvariable ["name",""];
|
2015-05-09 19:24:39 +00:00
|
|
|
if (_name == "") then {_name = localize "STR_A3_curator";};
|
|
|
|
|
|
|
|
//--- Wait until mission starts
|
2016-03-02 10:01:39 +00:00
|
|
|
waitUntil {time > 0}; // NOTE: DO NOT CHANGE TO CBA_missionTime, IT BREAKS THE MODULE
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Refresh addon list, so it's broadcasted to clients
|
|
|
|
_addons = curatoraddons _logic;
|
|
|
|
removeAllCuratorAddons _logic;
|
|
|
|
_logic addcuratoraddons _addons;
|
|
|
|
|
|
|
|
while {true} do {
|
|
|
|
//--- Wait for player to become Zeus
|
|
|
|
switch true do {
|
|
|
|
case (_ownerUID > 0): {
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {
|
2015-05-09 19:24:39 +00:00
|
|
|
sleep 0.01;
|
2015-06-08 17:18:40 +00:00
|
|
|
{getplayeruid _x == _ownerVar} count playableunits > 0 || isnull _logic
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
default {
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {isplayer (missionnamespace getvariable [_ownerVar,objnull]) || isnull _logic};
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
2016-05-15 11:48:32 +00:00
|
|
|
if (isnull _logic) exitwith {};
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Assign
|
|
|
|
_player = objnull;
|
|
|
|
switch true do {
|
|
|
|
case (_ownerUID > 0): {
|
|
|
|
{
|
2016-05-15 11:48:32 +00:00
|
|
|
if (getplayeruid _x == _ownerVar) exitwith {_player = _x;};
|
|
|
|
} foreach playableunits;
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
default {
|
2016-05-15 11:48:32 +00:00
|
|
|
_player = missionnamespace getvariable [_ownerVar,objnull];
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {unassigncurator _logic; isnull (getassignedcuratorunit _logic) || isnull _logic};
|
|
|
|
waituntil {_player assignCurator _logic; getassignedcuratorunit _logic == _player || isnull _logic};
|
|
|
|
if (isnull _logic) exitwith {};
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Add radio channels
|
|
|
|
{
|
|
|
|
_x radiochanneladd [_player];
|
2016-05-15 11:48:32 +00:00
|
|
|
} foreach (_logic getvariable ["channels",[]]);
|
2015-05-09 19:24:39 +00:00
|
|
|
|
2016-05-15 11:48:32 +00:00
|
|
|
// Added by ace_zeus to delay ascension message code
|
|
|
|
private _msgCode = {
|
|
|
|
params ["_logic","_player"];
|
2015-05-15 20:09:55 +00:00
|
|
|
|
2015-06-08 17:18:40 +00:00
|
|
|
//--- Sent notification to all assigned players
|
2015-11-30 16:27:09 +00:00
|
|
|
if ((_logic getVariable ["showNotification",true]) && GVAR(zeusAscension)) then {
|
2015-05-15 20:09:55 +00:00
|
|
|
{
|
|
|
|
if (isplayer _x) then {
|
|
|
|
[["CuratorAssign",[_name,name _player]],"bis_fnc_showNotification",_x] call bis_fnc_mp;
|
|
|
|
};
|
2015-11-30 16:23:48 +00:00
|
|
|
} forEach (curatoreditableobjects _logic);
|
2015-05-15 20:09:55 +00:00
|
|
|
};
|
2016-05-15 11:48:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Added by ace_zeus to hide ascension messages
|
|
|
|
if !(EGVAR(common,settingsInitFinished)) then {
|
|
|
|
EGVAR(common,runAtSettingsInitialized) pushBack [_msgCode, [_logic,_player]];
|
|
|
|
} else {
|
|
|
|
[_logic,_player] call _msgCode;
|
|
|
|
};
|
2015-05-15 19:47:54 +00:00
|
|
|
|
2015-05-09 19:24:39 +00:00
|
|
|
[_logic,"curatorUnitAssigned",[_logic,_player]] call bis_fnc_callscriptedeventhandler;
|
|
|
|
|
2015-06-08 17:18:40 +00:00
|
|
|
// Added by ace_zeus
|
2016-05-25 00:19:50 +00:00
|
|
|
[QGVAR(zeusUnitAssigned), [_logic,_player]] call CBA_fnc_globalEvent;
|
2015-05-18 19:43:02 +00:00
|
|
|
|
2015-05-09 19:24:39 +00:00
|
|
|
//--- Wait for player to stop being Zeus
|
|
|
|
switch true do {
|
|
|
|
case (_ownerUID > 0): {
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {
|
2015-05-09 19:24:39 +00:00
|
|
|
sleep 0.01;
|
2015-06-08 17:18:40 +00:00
|
|
|
{getplayeruid _x == _ownerVar} count playableunits == 0 || isnull _logic
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
default {
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {_player != missionnamespace getvariable [_ownerVar,objnull] || isnull _logic};
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
2016-05-15 11:48:32 +00:00
|
|
|
if (isnull _logic) exitwith {};
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Add radio channels
|
|
|
|
{
|
|
|
|
_x radiochannelremove [_player];
|
2016-05-15 11:48:32 +00:00
|
|
|
} foreach (_logic getvariable ["channels",[]]);
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Unassign
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {unassigncurator _logic; isnull (getassignedcuratorunit _logic) || isnull _logic};
|
|
|
|
if (isnull _logic) exitwith {};
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
|
2015-06-08 17:18:40 +00:00
|
|
|
// Added by ace_zeus to delay bird code
|
2016-05-15 11:48:32 +00:00
|
|
|
private _birdCode = {
|
|
|
|
params ["_logic"];
|
2015-05-15 20:09:55 +00:00
|
|
|
|
|
|
|
if (GVAR(zeusBird)) then {
|
|
|
|
//--- Create bird
|
2015-11-30 16:27:09 +00:00
|
|
|
_birdType = _logic getVariable ["birdType","eagle_f"];
|
2015-05-15 20:09:55 +00:00
|
|
|
if (_birdType != "") then {
|
|
|
|
_bird = createvehicle [_birdType,[100,100,100],[],0,"none"];
|
2015-11-30 16:27:09 +00:00
|
|
|
_logic setVariable ["bird",_bird,true];
|
2015-05-15 20:09:55 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//--- Locality changed
|
|
|
|
_logic addeventhandler [
|
|
|
|
"local",
|
|
|
|
{
|
|
|
|
_logic = _this select 0;
|
2015-11-30 16:27:09 +00:00
|
|
|
_bird = _logic getVariable ["bird",objnull];
|
2015-05-15 20:09:55 +00:00
|
|
|
_bird setowner owner _logic;
|
|
|
|
}
|
|
|
|
];
|
|
|
|
};
|
2016-05-15 11:48:32 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
// Added by ace_zeus to hide camera bird
|
|
|
|
if !(EGVAR(common,settingsInitFinished)) then {
|
|
|
|
EGVAR(common,runAtSettingsInitialized) pushBack [_birdCode, [_logic]];
|
|
|
|
} else {
|
|
|
|
[_logic] call _birdCode;
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Activated all future addons
|
|
|
|
_addons = [];
|
|
|
|
{
|
|
|
|
if (typeof _x == "ModuleCuratorAddAddons_F") then {
|
|
|
|
_paramAddons = call compile ("[" + (_x getvariable ["addons",""]) + "]");
|
|
|
|
{
|
|
|
|
if !(_x in _addons) then {_addons set [count _addons,_x];};
|
|
|
|
{
|
|
|
|
if !(_x in _addons) then {_addons set [count _addons,_x];};
|
|
|
|
} foreach (unitaddons _x);
|
|
|
|
} foreach _paramAddons;
|
|
|
|
};
|
|
|
|
} foreach (synchronizedobjects _logic);
|
2023-10-03 11:08:04 +00:00
|
|
|
// Modified by ace_zeus - bis_fnc_activateaddons will error if time > 0 so only call if at start
|
|
|
|
if (time <= 0) then { _addons call bis_fnc_activateaddons; };
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
|
|
|
|
//--- Player
|
|
|
|
if (hasinterface) then {
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {local player};
|
2015-05-09 19:24:39 +00:00
|
|
|
_serverCommand = if (_ownerVar == "#adminLogged") then {"#shutdown"} else {"#kick"};
|
|
|
|
|
|
|
|
//--- Black effect until the interface is open
|
2016-05-15 11:48:32 +00:00
|
|
|
_forced = _logic getvariable ["forced",0] > 0;
|
2015-05-09 19:24:39 +00:00
|
|
|
if (_forced) then {
|
|
|
|
_isCurator = switch true do {
|
|
|
|
case (_ownerUID > 0): {
|
|
|
|
getplayeruid player == _ownerVar
|
|
|
|
};
|
|
|
|
case (_isAdmin): {
|
|
|
|
isserver || servercommandavailable _serverCommand
|
|
|
|
};
|
|
|
|
default {
|
2016-05-15 11:48:32 +00:00
|
|
|
player == missionnamespace getvariable [_ownerVar,objnull]
|
2015-05-09 19:24:39 +00:00
|
|
|
};
|
|
|
|
};
|
|
|
|
if (_isCurator) then {
|
|
|
|
[true,true] spawn bis_fnc_forceCuratorInterface;
|
|
|
|
("RscDisplayCurator" call bis_fnc_rscLayer) cuttext ["","black in",1e10];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Check if player is server admin
|
|
|
|
if (_isAdmin) then {
|
2016-05-15 11:48:32 +00:00
|
|
|
_adminVar = _logic getvariable ["adminVar",""];
|
|
|
|
_logic setvariable ["adminVar",nil];
|
2015-05-09 19:24:39 +00:00
|
|
|
if (isserver) then {
|
|
|
|
//--- Host
|
2016-05-15 11:48:32 +00:00
|
|
|
missionnamespace setvariable [_adminVar,player];
|
2015-05-09 19:24:39 +00:00
|
|
|
} else {
|
|
|
|
//--- Client
|
|
|
|
[_logic,_adminVar,_serverCommand] spawn {
|
|
|
|
scriptname "BIS_fnc_moduleCurator: Admin check";
|
|
|
|
|
|
|
|
_logic = _this select 0;
|
|
|
|
_adminVar = _this select 1;
|
|
|
|
_serverCommand = _this select 2;
|
|
|
|
while {true} do {
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {sleep 0.1; servercommandavailable _serverCommand};
|
|
|
|
missionnamespace setvariable [_adminVar,player];
|
2015-05-09 19:24:39 +00:00
|
|
|
publicvariable _adminVar;
|
|
|
|
_respawn = player addeventhandler ["respawn",format ["%1 = _this select 0; publicvariable '%1';",_adminVar]];
|
|
|
|
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {sleep 0.1; !servercommandavailable _serverCommand};
|
|
|
|
missionnamespace setvariable [_adminVar,objnull];
|
2015-05-09 19:24:39 +00:00
|
|
|
publicvariable _adminVar;
|
|
|
|
player removeeventhandler ["respawn",_respawn];
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
[_logic] spawn {
|
|
|
|
_logic = _this select 0;
|
|
|
|
sleep 1;
|
2016-05-15 11:48:32 +00:00
|
|
|
waituntil {alive player};
|
2015-05-09 19:24:39 +00:00
|
|
|
|
|
|
|
//--- Show warning when Zeus key is not assigned
|
|
|
|
if (count (actionkeys "curatorInterface") == 0) then {
|
|
|
|
[
|
|
|
|
format [
|
|
|
|
localize "str_a3_cfgvehicles_modulecurator_f_keyNotAssigned",
|
|
|
|
(["IGUI","WARNING_RGB"] call bis_fnc_displaycolorget) call bis_fnc_colorRGBAtoHTML
|
|
|
|
]
|
|
|
|
] call bis_fnc_guiMessage;
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Show hint about pinging for players
|
|
|
|
if (
|
2016-05-15 11:48:32 +00:00
|
|
|
isnil {profilenamespace getvariable "bis_fnc_curatorPinged_done"}
|
2015-05-09 19:24:39 +00:00
|
|
|
&&
|
|
|
|
{isTutHintsEnabled}
|
|
|
|
&&
|
|
|
|
{isnull getassignedcuratorlogic player}
|
|
|
|
&&
|
|
|
|
{player in curatoreditableobjects _logic}
|
|
|
|
) then {
|
|
|
|
sleep 0.5;
|
|
|
|
[["Curator","Ping"]] call bis_fnc_advHint;
|
|
|
|
};
|
|
|
|
};
|
|
|
|
|
|
|
|
//--- Add local event handlers
|
|
|
|
_logic addeventhandler ["curatorFeedbackMessage",{_this call bis_fnc_showCuratorFeedbackMessage;}];
|
|
|
|
_logic addeventhandler ["curatorPinged",{_this call bis_fnc_curatorPinged;}];
|
|
|
|
_logic addeventhandler ["curatorObjectPlaced",{_this call bis_fnc_curatorObjectPlaced;}];
|
|
|
|
_logic addeventhandler ["curatorObjectEdited",{_this call bis_fnc_curatorObjectEdited;}];
|
|
|
|
_logic addeventhandler ["curatorWaypointPlaced",{_this call bis_fnc_curatorWaypointPlaced;}];
|
|
|
|
|
|
|
|
_logic addeventhandler ["curatorObjectDoubleClicked",{(_this select 1) call bis_fnc_showCuratorAttributes;}];
|
|
|
|
_logic addeventhandler ["curatorGroupDoubleClicked",{(_this select 1) call bis_fnc_showCuratorAttributes;}];
|
|
|
|
_logic addeventhandler ["curatorWaypointDoubleClicked",{(_this select 1) call bis_fnc_showCuratorAttributes;}];
|
|
|
|
_logic addeventhandler ["curatorMarkerDoubleClicked",{(_this select 1) call bis_fnc_showCuratorAttributes;}];
|
|
|
|
|
|
|
|
player call bis_fnc_curatorRespawn;
|
|
|
|
};
|
2015-05-11 17:06:01 +00:00
|
|
|
};
|