From fbf2c4c721cbcb2d637bf62017563ed6d04446d7 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 6 Nov 2023 22:01:05 +0100 Subject: [PATCH 1/2] Update Event.lua - Improved getCategory behaviour --- Moose Development/Moose/Core/Event.lua | 36 ++++++++++++++------------ 1 file changed, 19 insertions(+), 17 deletions(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index d057805f3..e767a36d1 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -1080,9 +1080,9 @@ function EVENT:onEvent( Event ) if Event.initiator then - Event.IniObjectCategory = Event.initiator:getCategory() + Event.IniObjectCategory = Object.getCategory(Event.initiator) --Event.initiator:getCategory() - if Event.IniObjectCategory == Object.Category.STATIC then + if Event.IniObjectCategory == Object.Category.STATIC then --- -- Static --- @@ -1118,10 +1118,9 @@ function EVENT:onEvent( Event ) local Unit=UNIT:FindByName(Event.IniDCSUnitName) if Unit then Event.IniObjectCategory = Object.Category.UNIT - end - end + end - if Event.IniObjectCategory == Object.Category.UNIT then + elseif Event.IniObjectCategory == Object.Category.UNIT then --- -- Unit --- @@ -1147,9 +1146,8 @@ function EVENT:onEvent( Event ) Event.IniCoalition = Event.IniDCSUnit:getCoalition() Event.IniTypeName = Event.IniDCSUnit:getTypeName() Event.IniCategory = Event.IniDCSUnit:getDesc().category - end - if Event.IniObjectCategory == Object.Category.CARGO then + elseif Event.IniObjectCategory == Object.Category.CARGO then --- -- Cargo --- @@ -1160,9 +1158,8 @@ function EVENT:onEvent( Event ) Event.IniCoalition = Event.IniDCSUnit:getCoalition() Event.IniCategory = Event.IniDCSUnit:getDesc().category Event.IniTypeName = Event.IniDCSUnit:getTypeName() - end - if Event.IniObjectCategory == Object.Category.SCENERY then + elseif Event.IniObjectCategory == Object.Category.SCENERY then --- -- Scenery --- @@ -1172,9 +1169,8 @@ function EVENT:onEvent( Event ) Event.IniUnit = SCENERY:Register( Event.IniDCSUnitName, Event.initiator ) Event.IniCategory = Event.IniDCSUnit:getDesc().category Event.IniTypeName = Event.initiator:isExist() and Event.IniDCSUnit:getTypeName() or "SCENERY" - end - if Event.IniObjectCategory == Object.Category.BASE then + elseif Event.IniObjectCategory == Object.Category.BASE then --- -- Base Object --- @@ -1201,9 +1197,12 @@ function EVENT:onEvent( Event ) --- -- Target category. - Event.TgtObjectCategory = Event.target:getCategory() + Event.TgtObjectCategory = Object.getCategory(Event.target) --Event.target:getCategory() if Event.TgtObjectCategory == Object.Category.UNIT then + --- + -- UNIT + --- Event.TgtDCSUnit = Event.target Event.TgtDCSGroup = Event.TgtDCSUnit:getGroup() Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() @@ -1219,10 +1218,11 @@ function EVENT:onEvent( Event ) Event.TgtCoalition = Event.TgtDCSUnit:getCoalition() Event.TgtCategory = Event.TgtDCSUnit:getDesc().category Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() - end - if Event.TgtObjectCategory == Object.Category.STATIC then - -- get base data + elseif Event.TgtObjectCategory == Object.Category.STATIC then + --- + -- STATIC + --- Event.TgtDCSUnit = Event.target if Event.target:isExist() and Event.id ~= 33 then -- leave out ejected seat object Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() @@ -1249,9 +1249,11 @@ function EVENT:onEvent( Event ) Event.TgtTypeName = "Static" end end - end - if Event.TgtObjectCategory == Object.Category.SCENERY then + elseif Event.TgtObjectCategory == Object.Category.SCENERY then + --- + -- SCENERY + --- Event.TgtDCSUnit = Event.target Event.TgtDCSUnitName = Event.TgtDCSUnit:getName() Event.TgtUnitName = Event.TgtDCSUnitName From 9fafdea0bb4187327398c87480fe695b2362ff09 Mon Sep 17 00:00:00 2001 From: Applevangelist Date: Wed, 8 Nov 2023 11:08:38 +0100 Subject: [PATCH 2/2] #EVENT #NET * On a MP server, added IniPlayerUCID and TgtPlayerUCID to the EventData structure (filled in applicable Events) --- Moose Development/Moose/Core/Event.lua | 21 +++++++++++- Moose Development/Moose/Wrapper/Airbase.lua | 2 +- Moose Development/Moose/Wrapper/Client.lua | 37 +++++++++++++++++++-- Moose Development/Moose/Wrapper/Net.lua | 30 +++++++++-------- 4 files changed, 71 insertions(+), 19 deletions(-) diff --git a/Moose Development/Moose/Core/Event.lua b/Moose Development/Moose/Core/Event.lua index e767a36d1..27c569c8c 100644 --- a/Moose Development/Moose/Core/Event.lua +++ b/Moose Development/Moose/Core/Event.lua @@ -173,7 +173,8 @@ -- @image Core_Event.JPG ---- @type EVENT +--- +-- @type EVENT -- @field #EVENT.Events Events -- @extends Core.Base#BASE @@ -282,6 +283,7 @@ EVENTS = { -- @field Wrapper.Group#GROUP IniGroup (UNIT) The initiating MOOSE wrapper @{Wrapper.Group#GROUP} of the initiator Group object. -- @field #string IniGroupName UNIT) The initiating GROUP name (same as IniDCSGroupName). -- @field #string IniPlayerName (UNIT) The name of the initiating player in case the Unit is a client or player slot. +-- @field #string IniPlayerUCID (UNIT) The UCID of the initiating player in case the Unit is a client or player slot and on a multi-player server. -- @field DCS#coalition.side IniCoalition (UNIT) The coalition of the initiator. -- @field DCS#Unit.Category IniCategory (UNIT) The category of the initiator. -- @field #string IniTypeName (UNIT) The type name of the initiator. @@ -297,6 +299,7 @@ EVENTS = { -- @field Wrapper.Group#GROUP TgtGroup (UNIT) The target MOOSE wrapper @{Wrapper.Group#GROUP} of the target Group object. -- @field #string TgtGroupName (UNIT) The target GROUP name (same as TgtDCSGroupName). -- @field #string TgtPlayerName (UNIT) The name of the target player in case the Unit is a client or player slot. +-- @field #string TgtPlayerUCID (UNIT) The UCID of the target player in case the Unit is a client or player slot and on a multi-player server. -- @field DCS#coalition.side TgtCoalition (UNIT) The coalition of the target. -- @field DCS#Unit.Category TgtCategory (UNIT) The category of the target. -- @field #string TgtTypeName (UNIT) The type name of the target. @@ -1143,6 +1146,14 @@ function EVENT:onEvent( Event ) end Event.IniPlayerName = Event.IniDCSUnit:getPlayerName() + if Event.IniPlayerName then + -- get UUCID + local PID = NET.GetPlayerIDByName(nil,Event.IniPlayerName) + if PID then + Event.IniPlayerUCID = net.get_player_info(tonumber(PID), 'ucid') + --env.info("Event.IniPlayerUCID="..tostring(Event.IniPlayerUCID),false) + end + end Event.IniCoalition = Event.IniDCSUnit:getCoalition() Event.IniTypeName = Event.IniDCSUnit:getTypeName() Event.IniCategory = Event.IniDCSUnit:getDesc().category @@ -1215,6 +1226,14 @@ function EVENT:onEvent( Event ) Event.TgtGroupName = Event.TgtDCSGroupName end Event.TgtPlayerName = Event.TgtDCSUnit:getPlayerName() + if Event.TgtPlayerName then + -- get UUCID + local PID = NET.GetPlayerIDByName(nil,Event.TgtPlayerName) + if PID then + Event.TgtPlayerUCID = net.get_player_info(tonumber(PID), 'ucid') + --env.info("Event.TgtPlayerUCID="..tostring(Event.TgtPlayerUCID),false) + end + end Event.TgtCoalition = Event.TgtDCSUnit:getCoalition() Event.TgtCategory = Event.TgtDCSUnit:getDesc().category Event.TgtTypeName = Event.TgtDCSUnit:getTypeName() diff --git a/Moose Development/Moose/Wrapper/Airbase.lua b/Moose Development/Moose/Wrapper/Airbase.lua index c8c55c81b..da1510608 100644 --- a/Moose Development/Moose/Wrapper/Airbase.lua +++ b/Moose Development/Moose/Wrapper/Airbase.lua @@ -1773,7 +1773,7 @@ function AIRBASE:_CheckParkingLists(TerminalID) end --- Helper function to check for the correct terminal type including "artificial" ones. --- @param #number Term_Type Termial type from getParking routine. +-- @param #number Term_Type Terminal type from getParking routine. -- @param #AIRBASE.TerminalType termtype Terminal type from AIRBASE.TerminalType enumerator. -- @return #boolean True if terminal types match. function AIRBASE._CheckTerminalType(Term_Type, termtype) diff --git a/Moose Development/Moose/Wrapper/Client.lua b/Moose Development/Moose/Wrapper/Client.lua index 01dce4828..f91b7a47c 100644 --- a/Moose Development/Moose/Wrapper/Client.lua +++ b/Moose Development/Moose/Wrapper/Client.lua @@ -323,7 +323,7 @@ function CLIENT:Alive( CallBackFunction, ... ) return self end ---- @param #CLIENT self +-- @param #CLIENT self function CLIENT:_AliveCheckScheduler( SchedulerName ) self:F3( { SchedulerName, self.ClientName, self.ClientAlive2, self.ClientBriefingShown, self.ClientCallBack } ) @@ -531,8 +531,6 @@ function CLIENT:ShowCargo() end - - --- The main message driver for the CLIENT. -- This function displays various messages to the Player logged into the CLIENT through the DCS World Messaging system. -- @param #CLIENT self @@ -578,3 +576,36 @@ function CLIENT:Message( Message, MessageDuration, MessageCategory, MessageInter end end end + +--- [Multi-Player Server] Get UCID from a CLIENT. +-- @param #CLIENT self +-- @return #string UCID +function CLIENT:GetUCID() + local PID = NET.GetPlayerIDByName(nil,self:GetPlayerName()) + return net.get_player_info(tonumber(PID), 'ucid') +end + +--- [Multi-Player Server] Return a table of attributes from CLIENT. If optional attribute is present, only that value is returned. +-- @param #CLIENT self +-- @param #string Attribute (Optional) The attribute to obtain. List see below. +-- @return #table PlayerInfo or nil if it cannot be found +-- @usage +-- Returned table holds these attributes: +-- +-- 'id' : player ID +-- 'name' : player name +-- 'side' : 0 - spectators, 1 - red, 2 - blue +-- 'slot' : slot ID of the player or +-- 'ping' : ping of the player in ms +-- 'ipaddr': IP address of the player, SERVER ONLY +-- 'ucid' : Unique Client Identifier, SERVER ONLY +-- +function CLIENT:GetPlayerInfo(Attribute) + local PID = NET.GetPlayerIDByName(nil,self:GetPlayerName()) + if PID then + return net.get_player_info(tonumber(PID), Attribute) + else + return nil + end +end + diff --git a/Moose Development/Moose/Wrapper/Net.lua b/Moose Development/Moose/Wrapper/Net.lua index f42c1c1ee..761b6829b 100644 --- a/Moose Development/Moose/Wrapper/Net.lua +++ b/Moose Development/Moose/Wrapper/Net.lua @@ -5,7 +5,7 @@ -- === -- -- ### Author: **Applevangelist** --- # Last Update June 2023 +-- # Last Update Oct 2023 -- -- === -- @@ -35,6 +35,7 @@ do -- @field #number id -- @field #number side -- @field #number slot +-- @field #numner timestamp --- Encapsules multiplayer environment scripting functions from [net](https://wiki.hoggitworld.com/view/DCS_singleton_net) -- with some added FSM functions and options to block/unblock players in MP environments. @@ -42,7 +43,7 @@ do -- @field #NET NET = { ClassName = "NET", - Version = "0.1.2", + Version = "0.1.3", BlockTime = 600, BlockedPilots = {}, BlockedUCIDs = {}, @@ -205,7 +206,7 @@ function NET:_EventHandler(EventData) -- Joining if data.id == EVENTS.PlayerEnterUnit or data.id == EVENTS.PlayerEnterAircraft then - self:T(self.lid.."Pilot Joining: "..name.." | UCID: "..ucid) + self:T(self.lid.."Pilot Joining: "..name.." | UCID: "..ucid.." | Event ID: "..data.id) -- Check for blockages local blocked = self:IsAnyBlocked(ucid,name,PlayerID,PlayerSide,PlayerSlot) @@ -213,15 +214,18 @@ function NET:_EventHandler(EventData) -- block pilot local outcome = net.force_player_slot(tonumber(PlayerID), 0, '' ) else - self.KnownPilots[name] = { - name = name, - ucid = ucid, - id = PlayerID, - side = PlayerSide, - slot = PlayerSlot, - } local client = CLIENT:FindByPlayerName(name) or data.IniUnit - self:__PlayerJoined(1,client,name) + if not self.KnownPilots[name] or (self.KnownPilots[name] and TNow-self.KnownPilots[name].timestamp > 3) then + self:__PlayerJoined(1,client,name) + self.KnownPilots[name] = { + name = name, + ucid = ucid, + id = PlayerID, + side = PlayerSide, + slot = PlayerSlot, + timestamp = TNow, + } + end return self end end @@ -466,11 +470,9 @@ end -- @return #number PlayerID or nil function NET:GetPlayerIDByName(Name) if not Name then return nil end - local playerList = self:GetPlayerList() - self:T({playerList}) + local playerList = net.get_player_list() for i=1,#playerList do local playerName = net.get_name(i) - self:T({playerName}) if playerName == Name then return playerList[i] end