mirror of
https://github.com/acemod/ACE3.git
synced 2024-08-30 18:23:18 +00:00
Added network event handlers, ref ticket #12.
This commit is contained in:
parent
e071b2f684
commit
f90b23b4f6
@ -19,6 +19,10 @@ if (_currentVersion != _previousVersion) then {
|
|||||||
|
|
||||||
0 spawn COMPILE_FILE(scripts\Version\checkVersionNumber);
|
0 spawn COMPILE_FILE(scripts\Version\checkVersionNumber);
|
||||||
|
|
||||||
|
//add network event handlers
|
||||||
|
"ACEg" addPublicVariableEventHandler { _this call FUNC(_handletNetEvent); };
|
||||||
|
"ACEc" addPublicVariableEventHandler { _this call FUNC(_handletNetEvent); };
|
||||||
|
|
||||||
// everything that only player controlled machines need, goes below this
|
// everything that only player controlled machines need, goes below this
|
||||||
if (!hasInterface) exitWith {};
|
if (!hasInterface) exitWith {};
|
||||||
|
|
||||||
@ -67,3 +71,5 @@ enableCamShake true;
|
|||||||
[_this select 1] call FUNC(setName)
|
[_this select 1] call FUNC(setName)
|
||||||
};
|
};
|
||||||
}] call FUNC(addCustomEventhandler);
|
}] call FUNC(addCustomEventhandler);
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,6 +137,16 @@ PREP(showUser);
|
|||||||
PREP(addCuratorUnloadEventhandler);
|
PREP(addCuratorUnloadEventhandler);
|
||||||
PREP(fixCrateContent);
|
PREP(fixCrateContent);
|
||||||
|
|
||||||
|
//ACE events global variables
|
||||||
|
GVAR(netEvents) = [[],[]];
|
||||||
|
|
||||||
|
PREP(globalEvent);
|
||||||
|
PREP(_handleNetEvent);
|
||||||
|
PREP(addNetEventHandler);
|
||||||
|
PREP(targetEvent);
|
||||||
|
PREP(serverEvent);
|
||||||
|
|
||||||
|
|
||||||
// Loop to update the ACE_player variable
|
// Loop to update the ACE_player variable
|
||||||
ACE_player = player;
|
ACE_player = player;
|
||||||
if (hasInterface) then {
|
if (hasInterface) then {
|
||||||
|
59
addons/common/functions/fnc__handleNetEvent.sqf
Normal file
59
addons/common/functions/fnc__handleNetEvent.sqf
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
//fnc__handleNetEvent.sqf
|
||||||
|
// internal handler for net events
|
||||||
|
#include "script_component.hpp"
|
||||||
|
|
||||||
|
private ["_eventType", "_event", "_eventName", "_eventArgs", "_eventNames", "_eventIndex", "_eventTargets", "_sentEvents", "_owner", "_serverFlagged"];
|
||||||
|
|
||||||
|
_eventType = _this select 0;
|
||||||
|
_event = _this select 1;
|
||||||
|
|
||||||
|
|
||||||
|
if(_eventType == "ACEg") then {
|
||||||
|
_eventName = _event select 0;
|
||||||
|
_eventArgs = _event select 1;
|
||||||
|
|
||||||
|
_eventNames = GVAR(netEvents) select 0;
|
||||||
|
_eventIndex = _eventNames find _eventName;
|
||||||
|
if(_eventIndex != -1) then {
|
||||||
|
_events = (GVAR(netEvents) select 1) select _eventIndex;
|
||||||
|
{
|
||||||
|
if(!isNil "_x") then {
|
||||||
|
_eventArgs call CALLSTACK_NAMED(_x, format[ARR_3("Net Event %1 ID: %2",_eventName,_forEachIndex)]);
|
||||||
|
};
|
||||||
|
} forEach _events;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
if(_eventType == "ACEc") then {
|
||||||
|
if(isServer) then {
|
||||||
|
_eventName = _event select 0;
|
||||||
|
_eventTargets = _event select 1;
|
||||||
|
_eventArgs = _event select 2;
|
||||||
|
|
||||||
|
_sentEvents = [];
|
||||||
|
if(!IS_ARRAY(_eventTargets)) then {
|
||||||
|
_eventTargets = [_eventTargets];
|
||||||
|
};
|
||||||
|
_serverFlagged = false;
|
||||||
|
{
|
||||||
|
_owner = _x;
|
||||||
|
if(IS_OBJECT(_x)) then {
|
||||||
|
_owner = owner _x;
|
||||||
|
};
|
||||||
|
if(!(_owner in _sentEvents)) then {
|
||||||
|
PUSH(_sentEvents, _owner);
|
||||||
|
ACEg = [_eventName, _eventArgs];
|
||||||
|
if(isDedicated || {_x != ACE_player}) then {
|
||||||
|
if(isDedicated && {local _x} && {!_serverFlagged}) then {
|
||||||
|
_serverFlagged = true;
|
||||||
|
["ACEg", ACEg] call FUNC(_handleNetEvent);
|
||||||
|
} else {
|
||||||
|
_owner publicVariableClient "ACEg";
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
["ACEg", ACEg] call FUNC(_handleNetEvent);
|
||||||
|
};
|
||||||
|
};
|
||||||
|
} forEach _eventTargets;
|
||||||
|
};
|
||||||
|
};
|
32
addons/common/functions/fnc_addNetEventHandler.sqf
Normal file
32
addons/common/functions/fnc_addNetEventHandler.sqf
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/*
|
||||||
|
* Author: Nou
|
||||||
|
*
|
||||||
|
* Add a network event handler.
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* 0: Event name (string)
|
||||||
|
* 1: Event code (code)
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Event handler ID number (for use with fnc_removeNetEventHandler)
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
private ["_eventName", "_eventCode", "_eventNames", "_eventFunctions", "_eventNameCount", "_eventIndex", "_eventFunctionCount"];
|
||||||
|
_eventName = _this select 0;
|
||||||
|
_eventCode = _this select 1;
|
||||||
|
|
||||||
|
_eventNames = GVAR(netEvents) select 0;
|
||||||
|
_eventFunctions = [];
|
||||||
|
_eventIndex = _eventNames find _eventName;
|
||||||
|
if(_eventIndex != -1) then {
|
||||||
|
_eventFunctions = (GVAR(netEvents) select 1) select _eventIndex;
|
||||||
|
} else {
|
||||||
|
_eventNameCount = count _eventNames;
|
||||||
|
_eventNames set[_eventNameCount, _eventName];
|
||||||
|
(GVAR(netEvents) select 1) set[_eventNameCount, _eventFunctions];
|
||||||
|
};
|
||||||
|
|
||||||
|
_eventFunctionCount = count _eventFunctions;
|
||||||
|
_eventFunctions set[_eventFunctionCount, _eventCode];
|
||||||
|
|
||||||
|
_eventFunctionCount;
|
22
addons/common/functions/fnc_globalEvent.sqf
Normal file
22
addons/common/functions/fnc_globalEvent.sqf
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
* Author: Nou
|
||||||
|
*
|
||||||
|
* Execute a global event on all clients, including self.
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* 0: Event name (string)
|
||||||
|
* 1: Event args (any)
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
private ["_eventName", "_eventArgs"];
|
||||||
|
|
||||||
|
_eventName = _this select 0;
|
||||||
|
_eventArgs = _this select 1;
|
||||||
|
|
||||||
|
|
||||||
|
ACEg = [_eventName, _eventArgs];
|
||||||
|
publicVariable "ACEg";
|
||||||
|
["ACEg", ACEg] call FUNC(_handleNetEvent);
|
25
addons/common/functions/fnc_serverEvent.sqf
Normal file
25
addons/common/functions/fnc_serverEvent.sqf
Normal file
@ -0,0 +1,25 @@
|
|||||||
|
/*
|
||||||
|
* Author: Nou
|
||||||
|
*
|
||||||
|
* Execute a event only on the server.
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* 0: Event name (string)
|
||||||
|
* 1: Event args (any)
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
private ["_eventName", "_eventArgs"];
|
||||||
|
|
||||||
|
_eventName = _this select 0;
|
||||||
|
_eventArgs = _this select 1;
|
||||||
|
|
||||||
|
|
||||||
|
ACEg = [_eventName, _eventArgs];
|
||||||
|
if(!isServer) then {
|
||||||
|
publicVariableServer "ACEg";
|
||||||
|
} else {
|
||||||
|
["ACEg", ACEg] call FUNC(_handleNetEvent);
|
||||||
|
};
|
29
addons/common/functions/fnc_targetEvent.sqf
Normal file
29
addons/common/functions/fnc_targetEvent.sqf
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
/*
|
||||||
|
* Author: Nou
|
||||||
|
*
|
||||||
|
* Execute a event only on specific clients.
|
||||||
|
*
|
||||||
|
* Argument:
|
||||||
|
* 0: Event name (string)
|
||||||
|
* 1: Event targets (object or array of objects)
|
||||||
|
* 2: Event args (any)
|
||||||
|
*
|
||||||
|
* Note: If local executor is in list of targets, event will execute with
|
||||||
|
* network delay, and not immediatly.
|
||||||
|
*
|
||||||
|
* Return value:
|
||||||
|
* Nothing
|
||||||
|
*/
|
||||||
|
#include "script_component.hpp"
|
||||||
|
private ["_eventName", "_eventArgs", "_eventTargets"];
|
||||||
|
|
||||||
|
_eventName = _this select 0;
|
||||||
|
_eventTargets = _this select 1;
|
||||||
|
_eventArgs = _this select 2;
|
||||||
|
|
||||||
|
ACEc = [_eventName, _eventTargets, _eventArgs];
|
||||||
|
if(!isServer) then {
|
||||||
|
publicVariableServer "ACEc";
|
||||||
|
} else {
|
||||||
|
["ACEc", ACEc] call FUNC(_handleNetEvent);
|
||||||
|
};
|
Loading…
Reference in New Issue
Block a user