diff --git a/Moose/Base.lua b/Moose/Base.lua index c11c786a1..59edff66e 100644 --- a/Moose/Base.lua +++ b/Moose/Base.lua @@ -104,6 +104,7 @@ trace.f( self.ClassName ) return self end + BaseEventCodes = { "S_EVENT_SHOT", "S_EVENT_HIT", @@ -129,7 +130,35 @@ BaseEventCodes = { "S_EVENT_SHOOTING_START", "S_EVENT_SHOOTING_END", "S_EVENT_MAX", - } +} + +--onEvent( {[1]="S_EVENT_BIRTH",[2]={["subPlace"]=5,["time"]=0,["initiator"]={["id_"]=16884480,},["place"]={["id_"]=5000040,},["id"]=15,["IniUnitName"]="US F-15C@RAMP-Air Support Mountains#001-01",},} +-- Event = { +-- id = enum world.event, +-- time = Time, +-- initiator = Unit, +-- target = Unit, +-- place = Unit, +-- subPlace = enum world.BirthPlace, +-- weapon = Weapon +-- } + + +function BASE:CreateEventBirth( EventTime, Initiator, IniUnitName, place, subplace ) +trace.f( self.ClassName, { EventTime, Initiator, IniUnitName, place, subplace } ) + + local Event = { + id = world.event.S_EVENT_BIRTH, + time = EventTime, + initiator = Initiator, + IniUnitName = IniUnitName, + place = place, + subplace = subplace + } + + world.onEvent( Event ) +end + function BASE:onEvent(event) --trace.f(self.ClassName, event ) diff --git a/Moose/Client.lua b/Moose/Client.lua index e4bd7933c..c9a7dcfb4 100644 --- a/Moose/Client.lua +++ b/Moose/Client.lua @@ -68,8 +68,9 @@ end -- This function is modified to deal with a couple of bugs in DCS 1.5.3 -- @treturn Group function CLIENT:ClientGroup() ---trace.f(self.ClassName) --- local ClientData = Group.getByName( self.ClientName ) +trace.f(self.ClassName) + +-- local ClientData = Group.getByName( self.ClientName ) -- if ClientData and ClientData:isExist() then -- trace.i( self.ClassName, self.ClientName .. " : group found!" ) -- return ClientData @@ -77,35 +78,84 @@ function CLIENT:ClientGroup() -- return nil -- end - local ClientGroup = Group.getByName( self.ClientName ) - - if ClientGroup then - - local ClientUnits = ClientGroup:getUnits() - - if ClientGroup:isExist() then - trace.i( self.ClassName, self.ClientName .. " : group found!" ) - return ClientGroup - else - -- Now we need to resolve the bugs in DCS 1.5 ... - local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } - for CoalitionId, CoalitionData in pairs( CoalitionsData ) do - trace.i( self.ClassName, CoalitionData ) - for UnitId, UnitData in pairs( CoalitionData ) do - trace.i( self.ClassName, UnitData ) - if UnitData and UnitData:isExist() then - if UnitData:getID() == ClientUnits[1]:getID() then - trace.i( self.ClassName, self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) - return self.ClientGroup + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + trace.i( self.ClassName, CoalitionData ) + for UnitId, UnitData in pairs( CoalitionData ) do + trace.i( self.ClassName, UnitData ) + if UnitData and UnitData:isExist() then + + local ClientGroup = Group.getByName( self.ClientName ) + if ClientGroup then + trace.i( self.ClassName, "ClientGroup = " .. self.ClientName ) + if ClientGroup:isExist() and ClientGroup:getID() == UnitData:getGroup():getID() then + trace.i( self.ClassName, "Normal logic" ) + trace.i( self.ClassName, self.ClientName .. " : group found!" ) + return ClientGroup + else + -- Now we need to resolve the bugs in DCS 1.5 ... + -- Consult the database for the units of the Client Group. (ClientGroup:getUnits() returns nil) + trace.i( self.ClassName, "Bug 1.5 logic" ) + local ClientUnits = _Database.Groups[self.ClientName].Units + trace.i( self.ClassName, { ClientUnits[1].name, env.getValueDictByKey(ClientUnits[1].name) } ) + for ClientUnitID, ClientUnitData in pairs( ClientUnits ) do + trace.i( self.ClassName, { tonumber(UnitData:getID()), ClientUnitData.unitId } ) + if tonumber(UnitData:getID()) == ClientUnitData.unitId then + local ClientGroupTemplate = _Database.Groups[self.ClientName].Template + self.ClientGroupID = ClientGroupTemplate.groupId + self.ClientGroupUnit = UnitData + trace.i( self.ClassName, self.ClientName .. " : group found in bug 1.5 resolvement logic!" ) + return ClientGroup + end end end +-- else +-- error( "Client " .. self.ClientName .. " not found!" ) end end end end + + self.ClientGroupID = nil + self.ClientGroupUnit = nil + return nil end + +function CLIENT:GetClientGroupID() +trace.f(self.ClassName) + + ClientGroup = self:ClientGroup() + + if ClientGroup then + if ClientGroup:isExist() then + return ClientGroup:getID() + else + return self.ClientGroupID + end + end + + return nil +end + +function CLIENT:GetClientGroupUnit() +trace.f(self.ClassName) + + ClientGroup = self:ClientGroup() + + if ClientGroup then + if ClientGroup:isExist() then + return ClientGroup:getUnits()[1] + else + return self.ClientGroupUnit + end + end + + return nil +end + + --- Returns the Unit of the @{CLIENT}. -- @treturn Unit function CLIENT:ClientUnit() @@ -260,10 +310,10 @@ function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, M trace.f( self.ClassName, { Message, MessageDuration, MessageId, MessageCategory, MessageInterval } ) if not self.MenuMessages then - if self:ClientGroup() and self:ClientGroup():getID() then - self.MenuMessages = MENU_SUB_GROUP:New( self:ClientGroup():getID(), 'Messages' ) - self.MenuRouteMessageOn = MENU_COMMAND_GROUP:New( self:ClientGroup():getID(), 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) - self.MenuRouteMessageOff = MENU_COMMAND_GROUP:New( self:ClientGroup():getID(),'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) + if self:GetClientGroupID() then + self.MenuMessages = MENU_SUB_GROUP:New( self:GetClientGroupID(), 'Messages' ) + self.MenuRouteMessageOn = MENU_COMMAND_GROUP:New( self:GetClientGroupID(), 'Messages On', self.MenuMessages, CLIENT.SwitchMessages, { self, true } ) + self.MenuRouteMessageOff = MENU_COMMAND_GROUP:New( self:GetClientGroupID(),'Messages Off', self.MenuMessages, CLIENT.SwitchMessages, { self, false } ) end end @@ -283,7 +333,7 @@ trace.f( self.ClassName, { Message, MessageDuration, MessageId, MessageCategory, end MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) else - if self:ClientGroup() and self:ClientGroup():getUnits() and self:ClientGroup():getUnits()[1] and not self:ClientGroup():getUnits()[1]:inAir() then + if self:GetClientGroupUnit() and not self:GetClientGroupUnit():inAir() then if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() diff --git a/Moose/ClientBug.lua b/Moose/ClientBug.lua new file mode 100644 index 000000000..12fc34df5 --- /dev/null +++ b/Moose/ClientBug.lua @@ -0,0 +1,50 @@ +--- Bug Client Activation Multiplayer Classes +-- @classmod CLIENTBUG + +Include.File( "Routines" ) +Include.File( "Base" ) + + +CLIENTBUG = { + ClassName = "CLIENTBUG", +} + +function CLIENTBUG:New( ) +trace.f( self.ClassName ) + + -- Arrange meta tables + local self = BASE:Inherit( self, BASE:New() ) + + self.ActiveClients = {} + + self.ClientBugWorkaround = routines.scheduleFunction( self._ClientBugWorkaround, { self }, timer.getTime() + 1, 0.1 ) + + return self +end + +function CLIENTBUG:_ClientBugWorkaround() + + -- Get the units of the players + local CoalitionsData = { AlivePlayersRed = coalition.getPlayers( coalition.side.RED ), AlivePlayersBlue = coalition.getPlayers( coalition.side.BLUE ) } + + for CoalitionId, CoalitionData in pairs( CoalitionsData ) do + trace.i( self.ClassName, CoalitionData ) + + for UnitId, UnitData in pairs( CoalitionData ) do + trace.i( self.ClassName, UnitData ) + + if UnitData and UnitData:isExist() then + + local UnitSkill = _Database.Units[UnitData:getName()].Template.skill + trace.i( self.ClassName, "UnitSkill = " .. UnitSkill ) + + if UnitSkill == "Client" then + + -- Generate birth event + self:CreateEventBirth( 0, UnitData, UnitData:getName(), 0, 0 ) + end + end + end + end + +end diff --git a/Moose/Database.lua b/Moose/Database.lua index 99ceb9f36..4ec727564 100644 --- a/Moose/Database.lua +++ b/Moose/Database.lua @@ -176,6 +176,8 @@ function DATABASE:_RegisterGroup( GroupTemplate ) self.Groups[GroupTemplateName].Template = GroupTemplate self.Groups[GroupTemplateName].groupId = GroupTemplate.groupId self.Groups[GroupTemplateName].UnitCount = #GroupTemplate.units + self.Groups[GroupTemplateName].Units = GroupTemplate.units + trace.i( self.ClassName, { "Group", self.Groups[GroupTemplateName].GroupName, self.Groups[GroupTemplateName].UnitCount } ) for unit_num, UnitTemplate in pairs(GroupTemplate.units) do diff --git a/Moose/Message.lua b/Moose/Message.lua index 44c128c69..6ca4b906a 100644 --- a/Moose/Message.lua +++ b/Moose/Message.lua @@ -74,11 +74,11 @@ end function MESSAGE:ToClient( Client ) trace.f(self.ClassName ) - if Client and Client:ClientGroup() then + if Client and Client:GetClientGroupID() then - local ClientGroup = Client:ClientGroup() + local ClientGroupID = Client:GetClientGroupID() trace.i( self.ClassName, self.MessageCategory .. '\n' .. self.MessageText:gsub("\n$",""):gsub("\n$","") .. " / " .. self.MessageDuration ) - trigger.action.outTextForGroup( ClientGroup:getID(), self.MessageCategory .. '\n' .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) + trigger.action.outTextForGroup( ClientGroupID, self.MessageCategory .. '\n' .. self.MessageText:gsub("\n$",""):gsub("\n$",""), self.MessageDuration ) end return self diff --git a/Moose/Mission.lua b/Moose/Mission.lua index fcb0d8683..2ff9c8485 100644 --- a/Moose/Mission.lua +++ b/Moose/Mission.lua @@ -425,7 +425,7 @@ trace.scheduled("MISSIONSCHEDULER","Scheduler") trace.i( "MISSIONSCHEDULER", "Client: " .. Client.ClientName ) - if Client:ClientGroup() and Client:ClientGroup():getUnits() and Client:ClientGroup():getUnits()[1] and Client:ClientGroup():getUnits()[1]:getLife() > 0.0 then + if Client:ClientGroup() then -- There is at least one Client that is alive... So the Mission status is set to Ongoing. ClientsAlive = true diff --git a/Moose/Moose.lua b/Moose/Moose.lua index 5dc2b17e8..4c27ec554 100644 --- a/Moose/Moose.lua +++ b/Moose/Moose.lua @@ -21,8 +21,10 @@ Include.Files = {} Include.File = function( IncludeFile ) if not Include.Files[ IncludeFile ] then Include.Files[IncludeFile] = IncludeFile + env.info( "Include:" .. IncludeFile .. " from " .. Include.ProgramPath ) local f = assert( base.loadfile( Include.ProgramPath .. IncludeFile .. ".lua" ) ) if f == nil then + env.info( "Include:" .. IncludeFile .. " from " .. Include.MissionPath ) local f = assert( base.loadfile( Include.MissionPath .. IncludeFile .. ".lua" ) ) if f == nil then error ("Could not load MOOSE file " .. IncludeFile .. ".lua" )