diff --git a/Moose Development/Moose/Airbase.lua b/Moose Development/Moose/Airbase.lua index 970e8ddfa..ec1e47e21 100644 --- a/Moose Development/Moose/Airbase.lua +++ b/Moose Development/Moose/Airbase.lua @@ -41,9 +41,9 @@ -- @module Airbase -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The AIRBASE class -- @type AIRBASE diff --git a/Moose Development/Moose/Base.lua b/Moose Development/Moose/Base.lua index 47045deed..1d91baca7 100644 --- a/Moose Development/Moose/Base.lua +++ b/Moose Development/Moose/Base.lua @@ -53,7 +53,7 @@ -- @module Base -- @author FlightControl -Include.File( "Routines" ) + local _TraceOn = true local _TraceLevel = 1 diff --git a/Moose Development/Moose/Cargo.lua b/Moose Development/Moose/Cargo.lua index ea54dde1b..33c4461e1 100644 --- a/Moose Development/Moose/Cargo.lua +++ b/Moose Development/Moose/Cargo.lua @@ -1,10 +1,10 @@ --- CARGO Classes -- @module CARGO -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) + + + + --- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". diff --git a/Moose Development/Moose/CleanUp.lua b/Moose Development/Moose/CleanUp.lua index 936318ef1..71554252b 100644 --- a/Moose Development/Moose/CleanUp.lua +++ b/Moose Development/Moose/CleanUp.lua @@ -2,11 +2,11 @@ -- @module CleanUp -- @author Flightcontrol -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) + + + + + --- The CLEANUP class. -- @type CLEANUP @@ -58,7 +58,6 @@ function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) self:F( { GroupObject, CleanUpGroupName } ) if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() trigger.action.deactivateGroup(GroupObject) self:T( { "GroupObject Destroyed", GroupObject } ) end @@ -72,7 +71,6 @@ function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) self:F( { CleanUpUnit, CleanUpUnitName } ) if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() local CleanUpGroup = Unit.getGroup(CleanUpUnit) -- TODO Client bug in 1.5.3 if CleanUpGroup and CleanUpGroup:isExist() then @@ -142,7 +140,6 @@ function CLEANUP:_EventCrash( Event ) self:F( { Event } ) --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() -- self:T("before getGroup") -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired -- self:T("after getGroup") @@ -277,7 +274,6 @@ function CLEANUP:_CleanUpScheduler() --self:T( CleanUpUnitVec2 ) local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then if CleanUpSurfaceType == land.SurfaceType.RUNWAY then @@ -309,7 +305,6 @@ function CLEANUP:_CleanUpScheduler() else UnitData.CleanUpTime = timer.getTime() UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() end end diff --git a/Moose Development/Moose/Client.lua b/Moose Development/Moose/Client.lua index 4326d11cf..690d4ef8e 100644 --- a/Moose Development/Moose/Client.lua +++ b/Moose Development/Moose/Client.lua @@ -37,10 +37,10 @@ -- @module Client -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) + + + + --- The CLIENT class @@ -462,16 +462,16 @@ function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, M else self.Messages[MessageId].MessageInterval = MessageInterval end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) else if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() end else if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() end end diff --git a/Moose Development/Moose/Database.lua b/Moose Development/Moose/Database.lua index 95a89355a..38d6891b4 100644 --- a/Moose Development/Moose/Database.lua +++ b/Moose Development/Moose/Database.lua @@ -32,15 +32,15 @@ -- @module Database -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Static" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) -Include.File( "Scheduler" ) + + + + + + + + + --- DATABASE class diff --git a/Moose Development/Moose/DeployTask.lua b/Moose Development/Moose/DeployTask.lua index 4bd0cf65c..5a346b3f9 100644 --- a/Moose Development/Moose/DeployTask.lua +++ b/Moose Development/Moose/DeployTask.lua @@ -1,7 +1,7 @@ --- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. -- @module DEPLOYTASK -Include.File( "Task" ) + --- A DeployTask -- @type DEPLOYTASK diff --git a/Moose Development/Moose/DestroyBaseTask.lua b/Moose Development/Moose/DestroyBaseTask.lua index 3cef73cd5..b057605ba 100644 --- a/Moose Development/Moose/DestroyBaseTask.lua +++ b/Moose Development/Moose/DestroyBaseTask.lua @@ -4,7 +4,7 @@ -- @see DESTROYUNITTYPESTASK -- @see DESTROY_RADARS_TASK -Include.File("Task") + --- The DESTROYBASETASK class -- @type DESTROYBASETASK diff --git a/Moose Development/Moose/DestroyGroupsTask.lua b/Moose Development/Moose/DestroyGroupsTask.lua index 38cd98fb6..d98d9e710 100644 --- a/Moose Development/Moose/DestroyGroupsTask.lua +++ b/Moose Development/Moose/DestroyGroupsTask.lua @@ -1,7 +1,7 @@ --- DESTROYGROUPSTASK -- @module DESTROYGROUPSTASK -Include.File("DestroyBaseTask") + --- The DESTROYGROUPSTASK class -- @type diff --git a/Moose Development/Moose/DestroyRadarsTask.lua b/Moose Development/Moose/DestroyRadarsTask.lua index 347ad4181..3b1ac5167 100644 --- a/Moose Development/Moose/DestroyRadarsTask.lua +++ b/Moose Development/Moose/DestroyRadarsTask.lua @@ -1,7 +1,7 @@ --- Task class to destroy radar installations. -- @module DESTROYRADARSTASK -Include.File("DestroyBaseTask") + --- The DESTROYRADARS class -- @type diff --git a/Moose Development/Moose/DestroyUnitTypesTask.lua b/Moose Development/Moose/DestroyUnitTypesTask.lua index a4001ccd4..c8683fc6c 100644 --- a/Moose Development/Moose/DestroyUnitTypesTask.lua +++ b/Moose Development/Moose/DestroyUnitTypesTask.lua @@ -1,7 +1,7 @@ --- Set TASK to destroy certain unit types. -- @module DESTROYUNITTYPESTASK -Include.File("DestroyBaseTask") + --- The DESTROYUNITTYPESTASK class -- @type diff --git a/Moose Development/Moose/Escort.lua b/Moose Development/Moose/Escort.lua index 6fc0d5a49..355a576fb 100644 --- a/Moose Development/Moose/Escort.lua +++ b/Moose Development/Moose/Escort.lua @@ -102,11 +102,11 @@ -- @module Escort -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) + + + + + --- -- @type ESCORT diff --git a/Moose Development/Moose/Event.lua b/Moose Development/Moose/Event.lua index 75cfca6ff..e58e8a2ec 100644 --- a/Moose Development/Moose/Event.lua +++ b/Moose Development/Moose/Event.lua @@ -2,9 +2,6 @@ -- @module Event -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) - --- The EVENT structure -- @type EVENT -- @field #EVENT.Events Events diff --git a/Moose Development/Moose/GoHomeTask.lua b/Moose Development/Moose/GoHomeTask.lua index 4f302f5a1..35461ea34 100644 --- a/Moose Development/Moose/GoHomeTask.lua +++ b/Moose Development/Moose/GoHomeTask.lua @@ -1,8 +1,6 @@ --- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. -- @module GOHOMETASK -Include.File("Task") - --- The GOHOMETASK class -- @type GOHOMETASK = { diff --git a/Moose Development/Moose/Group.lua b/Moose Development/Moose/Group.lua index a63d742a5..4778c31c5 100644 --- a/Moose Development/Moose/Group.lua +++ b/Moose Development/Moose/Group.lua @@ -146,11 +146,6 @@ -- @module Group -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - --- The GROUP class -- @type GROUP -- @extends Base#BASE @@ -2672,7 +2667,7 @@ function GROUP:Message( Message, Duration ) local DCSGroup = self:GetDCSGroup() if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) end return nil diff --git a/Moose Development/Moose/Menu.lua b/Moose Development/Moose/Menu.lua index e5bdfa778..cdad61304 100644 --- a/Moose Development/Moose/Menu.lua +++ b/Moose Development/Moose/Menu.lua @@ -1,9 +1,6 @@ --- Encapsulation of DCS World Menu system in a set of MENU classes. -- @module Menu -Include.File( "Routines" ) -Include.File( "Base" ) - --- The MENU class -- @type MENU -- @extends Base#BASE diff --git a/Moose Development/Moose/Message.lua b/Moose Development/Moose/Message.lua index 423d23e2c..b55a48c6f 100644 --- a/Moose Development/Moose/Message.lua +++ b/Moose Development/Moose/Message.lua @@ -1,17 +1,30 @@ ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. +--- This module contains the MESSAGE class. +-- +-- 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- ================================================= +-- Message System to display Messages to Clients, Coalitions or All. -- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- Messages can contain a category which is indicating the category of the message. +-- +-- 1.1) MESSAGE construction methods +-- --------------------------------- +-- Messages are created with @{Message#MESSAGE.New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- 1.2) Send messages with MESSAGE To methods +-- ------------------------------------------ +-- Messages are sent to: +-- +-- * Clients with @{Message#MESSAGE.ToClient}. +-- * Coalitions with @{Message#MESSAGE.ToCoalition}. +-- * All Players with @{Message#MESSAGE.ToAll}. +-- -- @module Message - -Include.File( "Base" ) +-- @author FlightControl --- The MESSAGE class -- @type MESSAGE +-- @extends Base#BASE MESSAGE = { ClassName = "MESSAGE", MessageCategory = 0, @@ -22,9 +35,8 @@ MESSAGE = { --- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. -- @param self -- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. -- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". -- @return #MESSAGE -- @usage -- -- Create a series of new Messages. @@ -32,15 +44,15 @@ MESSAGE = { -- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". -- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". -- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + self:F( { MessageText, MessageDuration, MessageCategory } ) - -- When no messagecategory is given, we don't show it as a title... + -- When no MessageCategory is given, we don't show it as a title... if MessageCategory and MessageCategory ~= "" then self.MessageCategory = MessageCategory .. ": " else @@ -48,7 +60,6 @@ function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) end self.MessageDuration = MessageDuration - self.MessageID = MessageID self.MessageTime = timer.getTime() self.MessageText = MessageText @@ -174,77 +185,77 @@ end ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - +----- The MESSAGEQUEUE class +---- @type MESSAGEQUEUE +--MESSAGEQUEUE = { +-- ClientGroups = {}, +-- CoalitionSides = {} +--} +-- +--function MESSAGEQUEUE:New( RefreshInterval ) +-- local self = BASE:Inherit( self, BASE:New() ) +-- self:F( { RefreshInterval } ) +-- +-- self.RefreshInterval = RefreshInterval +-- +-- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) +-- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) +-- +-- return self +--end +-- +----- This function is called automatically by the MESSAGEQUEUE scheduler. +--function MESSAGEQUEUE:_DisplayMessages() +-- +-- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- if MessageData.MessageSent == false then +-- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageSent = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- +-- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. +-- -- Because the Client messages will overwrite the Coalition messages (for that Client). +-- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do +-- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do +-- if MessageData.MessageGroup == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageGroup = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- +-- -- Now check if the Client also has messages that belong to the Coalition of the Client... +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- local CoalitionGroup = Group.getByName( ClientGroupName ) +-- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then +-- if MessageData.MessageCoalition == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageCoalition = true +-- end +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- end +-- +-- return true +--end +-- +----- The _MessageQueue object is created when the MESSAGE class module is loaded. +----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) +-- diff --git a/Moose Development/Moose/MissileTrainer.lua b/Moose Development/Moose/MissileTrainer.lua index d7773c502..57520d508 100644 --- a/Moose Development/Moose/MissileTrainer.lua +++ b/Moose Development/Moose/MissileTrainer.lua @@ -70,9 +70,6 @@ -- @author FlightControl -Include.File( "Client" ) -Include.File( "Scheduler" ) - --- The MISSILETRAINER class -- @type MISSILETRAINER -- @extends Base#BASE @@ -217,9 +214,9 @@ function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) self.MessagesOnOff = MessagesOnOff if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() end return self @@ -234,9 +231,9 @@ function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) self.TrackingToAll = TrackingToAll if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() end return self @@ -251,9 +248,9 @@ function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) self.TrackingOnOff = TrackingOnOff if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() end return self @@ -272,7 +269,7 @@ function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) self.TrackingFrequency = 0.5 end if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() end return self @@ -287,9 +284,9 @@ function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) self.AlertsToAll = AlertsToAll if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() end return self @@ -304,9 +301,9 @@ function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) self.AlertsHitsOnOff = AlertsHitsOnOff if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() end return self @@ -321,9 +318,9 @@ function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) self.AlertsLaunchesOnOff = AlertsLaunchesOnOff if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() end return self @@ -338,9 +335,9 @@ function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) self.DetailsRangeOnOff = DetailsRangeOnOff if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() end return self @@ -355,9 +352,9 @@ function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) self.DetailsBearingOnOff = DetailsBearingOnOff if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() end return self @@ -372,9 +369,9 @@ function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) self.MenusOnOff = MenusOnOff if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() end return self @@ -425,7 +422,7 @@ function MISSILETRAINER._MenuMessages( MenuParameters ) if MenuParameters.Distance ~= nil then self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() end end @@ -461,7 +458,7 @@ function MISSILETRAINER:_EventShot( Event ) string.format( "%s launched a %s", TrainerSourceUnit:GetTypeName(), TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) if self.AlertsToAll then Message:ToAll() @@ -576,7 +573,7 @@ function MISSILETRAINER:_TrackMissiles() TrainerWeapon:getTypeName(), TrainerSourceUnit:GetTypeName(), TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) + ), 15, "Hit Alert" ) if self.AlertsToAll == true then Message:ToAll() @@ -597,7 +594,7 @@ function MISSILETRAINER:_TrackMissiles() string.format( "%s launched by %s self destructed!", TrainerWeaponTypeName, TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) + ), 5, "Tracking" ) if self.AlertsToAll == true then Message:ToAll() @@ -671,7 +668,7 @@ function MISSILETRAINER:_TrackMissiles() -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) end end end diff --git a/Moose Development/Moose/Mission.lua b/Moose Development/Moose/Mission.lua index 764f26425..e67271d5c 100644 --- a/Moose Development/Moose/Mission.lua +++ b/Moose Development/Moose/Mission.lua @@ -2,11 +2,6 @@ -- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. -- @module Mission -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - --- The MISSION class -- @type MISSION -- @extends Base#BASE @@ -191,7 +186,7 @@ function MISSION:ReportToAll() for TaskID, TaskData in pairs( Tasks ) do TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() end @@ -650,7 +645,7 @@ function MISSIONSCHEDULER:TimeShow() self.TimeIntervalCount = self.TimeIntervalCount + 1 if self.TimeIntervalCount >= self.TimeTriggerShow then local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() self.TimeIntervalCount = 0 end end diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index 123f51481..5221d8f73 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -2,8 +2,73 @@ Include.File( "Routines" ) Include.File( "Base" ) -Include.File( "Database" ) +Include.File( "Scheduler" ) Include.File( "Event" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Zone" ) +Include.File( "Client" ) +Include.File( "Static" ) +Include.File( "Database" ) +Include.File( "Set" ) +Include.File( "Point" ) +Include.File( "Moose" ) +Include.File( "Scoring" ) +Include.File( "Cargo" ) +Include.File( "Message" ) +Include.File( "Stage" ) +Include.File( "Task" ) +Include.File( "GoHomeTask" ) +Include.File( "DestroyBaseTask" ) +Include.File( "DestroyGroupsTask" ) +Include.File( "DestroyRadarsTask" ) +Include.File( "DestroyUnitTypesTask" ) +Include.File( "PickupTask" ) +Include.File( "DeployTask" ) +Include.File( "NoTask" ) +Include.File( "RouteTask" ) +Include.File( "Mission" ) +Include.File( "CleanUp" ) +Include.File( "Spawn" ) +Include.File( "Movement" ) +Include.File( "Sead" ) +Include.File( "Escort" ) +Include.File( "MissileTrainer" ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- The order of the declarations is important here. Don't touch it. diff --git a/Moose Development/Moose/Movement.lua b/Moose Development/Moose/Movement.lua index 2b7bb7bee..9ea15f0ae 100644 --- a/Moose Development/Moose/Movement.lua +++ b/Moose Development/Moose/Movement.lua @@ -5,8 +5,6 @@ -- on defined intervals (currently every minute). -- @module MOVEMENT -Include.File( "Routines" ) - --- the MOVEMENT class -- @type MOVEMENT = { diff --git a/Moose Development/Moose/NoTask.lua b/Moose Development/Moose/NoTask.lua index 016ba955e..f3fa13554 100644 --- a/Moose Development/Moose/NoTask.lua +++ b/Moose Development/Moose/NoTask.lua @@ -1,8 +1,6 @@ --- A NOTASK is a dummy activity... But it will show a Mission Briefing... -- @module NOTASK -Include.File("Task") - --- The NOTASK class -- @type NOTASK = { diff --git a/Moose Development/Moose/PickupTask.lua b/Moose Development/Moose/PickupTask.lua index 7cbec30a6..84593c751 100644 --- a/Moose Development/Moose/PickupTask.lua +++ b/Moose Development/Moose/PickupTask.lua @@ -2,9 +2,6 @@ -- @module PICKUPTASK -- @parent TASK -Include.File("Task") -Include.File("Cargo") - --- The PICKUPTASK class -- @type PICKUPTASK = { diff --git a/Moose Development/Moose/Point.lua b/Moose Development/Moose/Point.lua index e0dfa6cdb..f45175397 100644 --- a/Moose Development/Moose/Point.lua +++ b/Moose Development/Moose/Point.lua @@ -25,10 +25,6 @@ -- @module Point -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Point" ) - --- The POINT_VEC3 class -- @type POINT_VEC3 -- @extends Base#BASE diff --git a/Moose Development/Moose/Routines.lua b/Moose Development/Moose/Routines.lua index 58abae93f..5235f218b 100644 --- a/Moose Development/Moose/Routines.lua +++ b/Moose Development/Moose/Routines.lua @@ -2,10 +2,6 @@ -- @module routines -- @author Flightcontrol ---Include.File( "Trace" ) ---Include.File( "Message" ) - - env.setErrorMessageBoxEnabled(false) --- Extract of MIST functions. @@ -2310,19 +2306,19 @@ end function MessageToAll( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) + MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) end function MessageToRed( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) end function MessageToBlue( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) end function getCarrierHeight( CarrierGroup ) diff --git a/Moose Development/Moose/Scheduler.lua b/Moose Development/Moose/Scheduler.lua index 259933c68..ad45956f6 100644 --- a/Moose Development/Moose/Scheduler.lua +++ b/Moose Development/Moose/Scheduler.lua @@ -20,10 +20,6 @@ -- @module Scheduler -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) - - --- The SCHEDULER class -- @type SCHEDULER -- @extends Base#BASE diff --git a/Moose Development/Moose/Scoring.lua b/Moose Development/Moose/Scoring.lua index 5d2a9dc15..f853a4bb4 100644 --- a/Moose Development/Moose/Scoring.lua +++ b/Moose Development/Moose/Scoring.lua @@ -7,13 +7,6 @@ -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - --- The Scoring class -- @type SCORING -- @field Players A collection of the current players that have joined the game. @@ -176,7 +169,7 @@ function SCORING:_EventOnDeadOrCrash( Event ) MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + 5 ):ToAll() self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) else PlayerData.Score = PlayerData.Score + 10 @@ -185,7 +178,7 @@ function SCORING:_EventOnDeadOrCrash( Event ) MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + 5 ):ToAll() self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) end end @@ -236,9 +229,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName + 2 ):ToAll() self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) @@ -252,9 +243,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) if self.Players[PlayerName].Penalty > 100 then if self.Players[PlayerName].PenaltyWarning < 1 then MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName + 30 ):ToAll() self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 end @@ -264,9 +253,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) ClientGroup = GROUP:NewFromDCSUnit( UnitData ) ClientGroup:Destroy() MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName + 10 ):ToAll() end @@ -294,7 +281,7 @@ function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() + 20 ):ToAll() self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) end @@ -311,7 +298,7 @@ function SCORING:_AddMissionScore( MissionName, Score ) PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + 20 ):ToAll() self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) end end @@ -421,9 +408,7 @@ function SCORING:_EventOnHit( Event ) MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + 2 ):ToAll() self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) else @@ -433,9 +418,7 @@ function SCORING:_EventOnHit( Event ) MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + 2 ):ToAll() self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) end @@ -556,7 +539,7 @@ function SCORING:ReportScoreAll() PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) end end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() end @@ -669,7 +652,7 @@ function SCORING:ReportScorePlayer() PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) end end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() end diff --git a/Moose Development/Moose/Sead.lua b/Moose Development/Moose/Sead.lua index dd47ff2e5..489c1ecf9 100644 --- a/Moose Development/Moose/Sead.lua +++ b/Moose Development/Moose/Sead.lua @@ -3,13 +3,6 @@ -- @author to be searched on the forum -- @author (co) Flightcontrol (Modified and enriched with functionality) -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - --- The SEAD class -- @type SEAD -- @extends Base#BASE diff --git a/Moose Development/Moose/Set.lua b/Moose Development/Moose/Set.lua index 8b9190c68..775e3005c 100644 --- a/Moose Development/Moose/Set.lua +++ b/Moose Development/Moose/Set.lua @@ -181,14 +181,6 @@ -- @module Set -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - --- SET_BASE class -- @type SET_BASE -- @extends Base#BASE diff --git a/Moose Development/Moose/Spawn.lua b/Moose Development/Moose/Spawn.lua index 93715afe6..3a2e588b6 100644 --- a/Moose Development/Moose/Spawn.lua +++ b/Moose Development/Moose/Spawn.lua @@ -74,14 +74,6 @@ -- @module Spawn -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - --- SPAWN Class -- @type SPAWN -- @extends Base#BASE @@ -783,7 +775,7 @@ end -- If no index is given, it will return the first group in the list. -- @param #SPAWN self -- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP +-- @return Group#GROUP self function SPAWN:GetGroupFromIndex( SpawnIndex ) self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) diff --git a/Moose Development/Moose/Stage.lua b/Moose Development/Moose/Stage.lua index d28c22c7d..839fcb500 100644 --- a/Moose Development/Moose/Stage.lua +++ b/Moose Development/Moose/Stage.lua @@ -2,11 +2,11 @@ -- @module STAGE -- @author Flightcontrol -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) + + + + + --- The STAGE class -- @type diff --git a/Moose Development/Moose/StatHandler.lua b/Moose Development/Moose/StatHandler.lua index 22b6072b3..1e3f2b29f 100644 --- a/Moose Development/Moose/StatHandler.lua +++ b/Moose Development/Moose/StatHandler.lua @@ -1,7 +1,7 @@ --- Provides a logging of statistics in a running DCS Mission. -- @script eStatHandler -Include.File( "Routines" ) + --Handler table diff --git a/Moose Development/Moose/Static.lua b/Moose Development/Moose/Static.lua index ba6467023..76e385b57 100644 --- a/Moose Development/Moose/Static.lua +++ b/Moose Development/Moose/Static.lua @@ -31,9 +31,9 @@ -- @module Static -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The STATIC class diff --git a/Moose Development/Moose/Task.lua b/Moose Development/Moose/Task.lua index 68cd199e1..09e38917e 100644 --- a/Moose Development/Moose/Task.lua +++ b/Moose Development/Moose/Task.lua @@ -1,11 +1,11 @@ --- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. -- @module TASK -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) + + + + + --- The TASK class -- @type TASK diff --git a/Moose Development/Moose/Unit.lua b/Moose Development/Moose/Unit.lua index cdb8a43f8..8d1a1c1fb 100644 --- a/Moose Development/Moose/Unit.lua +++ b/Moose Development/Moose/Unit.lua @@ -68,9 +68,9 @@ -- @module Unit -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The UNIT class -- @type UNIT diff --git a/Moose Development/Moose/Zone.lua b/Moose Development/Moose/Zone.lua index a27c3f1df..7a93f1616 100644 --- a/Moose Development/Moose/Zone.lua +++ b/Moose Development/Moose/Zone.lua @@ -62,10 +62,10 @@ -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Point" ) + + + + diff --git a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua index 0f7292e6f..52bfe1b8a 100644 --- a/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua +++ b/Moose Mission Setup/Moose Mission Update/l10n/DEFAULT/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160608_1752' ) +env.info( 'Moose Generation Timestamp: 20160609_1242' ) local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -28,10 +28,6 @@ env.info("Loaded MOOSE Include Engine") -- @module routines -- @author Flightcontrol ---Include.File( "Trace" ) ---Include.File( "Message" ) - - env.setErrorMessageBoxEnabled(false) --- Extract of MIST functions. @@ -2336,19 +2332,19 @@ end function MessageToAll( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) + MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) end function MessageToRed( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) end function MessageToBlue( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) end function getCarrierHeight( CarrierGroup ) @@ -2603,7 +2599,7 @@ env.info(( 'Init: Scripts Loaded v1.1' )) -- @module Base -- @author FlightControl -Include.File( "Routines" ) + local _TraceOn = true local _TraceLevel = 1 @@ -3076,10 +3072,6 @@ end -- @module Scheduler -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) - - --- The SCHEDULER class -- @type SCHEDULER -- @extends Base#BASE @@ -3200,9 +3192,6 @@ end -- @module Event -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) - --- The EVENT structure -- @type EVENT -- @field #EVENT.Events Events @@ -3710,9 +3699,6 @@ end --- Encapsulation of DCS World Menu system in a set of MENU classes. -- @module Menu -Include.File( "Routines" ) -Include.File( "Base" ) - --- The MENU class -- @type MENU -- @extends Base#BASE @@ -4226,11 +4212,6 @@ end -- @module Group -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - --- The GROUP class -- @type GROUP -- @extends Base#BASE @@ -6752,7 +6733,7 @@ function GROUP:Message( Message, Duration ) local DCSGroup = self:GetDCSGroup() if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) end return nil @@ -6892,9 +6873,9 @@ end -- @module Unit -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The UNIT class -- @type UNIT @@ -7684,10 +7665,10 @@ end -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Point" ) + + + + @@ -8138,10 +8119,10 @@ end -- @module Client -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) + + + + --- The CLIENT class @@ -8563,16 +8544,16 @@ function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, M else self.Messages[MessageId].MessageInterval = MessageInterval end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) else if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() end else if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() end end @@ -8612,9 +8593,9 @@ end -- @module Static -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The STATIC class @@ -8694,15 +8675,15 @@ end -- @module Database -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Static" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) -Include.File( "Scheduler" ) + + + + + + + + + --- DATABASE class @@ -9462,14 +9443,6 @@ end -- @module Set -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - --- SET_BASE class -- @type SET_BASE -- @extends Base#BASE @@ -10465,10 +10438,6 @@ end -- @module Point -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Point" ) - --- The POINT_VEC3 class -- @type POINT_VEC3 -- @extends Base#BASE @@ -10637,8 +10606,73 @@ end Include.File( "Routines" ) Include.File( "Base" ) -Include.File( "Database" ) +Include.File( "Scheduler" ) Include.File( "Event" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Zone" ) +Include.File( "Client" ) +Include.File( "Static" ) +Include.File( "Database" ) +Include.File( "Set" ) +Include.File( "Point" ) +Include.File( "Moose" ) +Include.File( "Scoring" ) +Include.File( "Cargo" ) +Include.File( "Message" ) +Include.File( "Stage" ) +Include.File( "Task" ) +Include.File( "GoHomeTask" ) +Include.File( "DestroyBaseTask" ) +Include.File( "DestroyGroupsTask" ) +Include.File( "DestroyRadarsTask" ) +Include.File( "DestroyUnitTypesTask" ) +Include.File( "PickupTask" ) +Include.File( "DeployTask" ) +Include.File( "NoTask" ) +Include.File( "RouteTask" ) +Include.File( "Mission" ) +Include.File( "CleanUp" ) +Include.File( "Spawn" ) +Include.File( "Movement" ) +Include.File( "Sead" ) +Include.File( "Escort" ) +Include.File( "MissileTrainer" ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- The order of the declarations is important here. Don't touch it. @@ -10657,13 +10691,6 @@ _DATABASE = DATABASE:New() -- Database#DATABASE -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - --- The Scoring class -- @type SCORING -- @field Players A collection of the current players that have joined the game. @@ -10826,7 +10853,7 @@ function SCORING:_EventOnDeadOrCrash( Event ) MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + 5 ):ToAll() self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) else PlayerData.Score = PlayerData.Score + 10 @@ -10835,7 +10862,7 @@ function SCORING:_EventOnDeadOrCrash( Event ) MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + 5 ):ToAll() self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) end end @@ -10886,9 +10913,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName + 2 ):ToAll() self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) @@ -10902,9 +10927,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) if self.Players[PlayerName].Penalty > 100 then if self.Players[PlayerName].PenaltyWarning < 1 then MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName + 30 ):ToAll() self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 end @@ -10914,9 +10937,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) ClientGroup = GROUP:NewFromDCSUnit( UnitData ) ClientGroup:Destroy() MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName + 10 ):ToAll() end @@ -10944,7 +10965,7 @@ function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() + 20 ):ToAll() self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) end @@ -10961,7 +10982,7 @@ function SCORING:_AddMissionScore( MissionName, Score ) PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + 20 ):ToAll() self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) end end @@ -11071,9 +11092,7 @@ function SCORING:_EventOnHit( Event ) MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + 2 ):ToAll() self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) else @@ -11083,9 +11102,7 @@ function SCORING:_EventOnHit( Event ) MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + 2 ):ToAll() self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) end @@ -11206,7 +11223,7 @@ function SCORING:ReportScoreAll() PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) end end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() end @@ -11319,7 +11336,7 @@ function SCORING:ReportScorePlayer() PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) end end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() end @@ -11469,10 +11486,10 @@ end --- CARGO Classes -- @module CARGO -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) + + + + --- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". @@ -12546,20 +12563,32 @@ function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) return Cargo end ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. +--- This module contains the MESSAGE class. +-- +-- 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- ================================================= +-- Message System to display Messages to Clients, Coalitions or All. -- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- Messages can contain a category which is indicating the category of the message. +-- +-- 1.1) MESSAGE construction methods +-- --------------------------------- +-- Messages are created with MESSAGE:@{New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- 1.2) Send messages with MESSAGE To methods +-- ------------------------------------------ +-- Messages are sent to: +-- * Clients with MESSAGE:@{ToClient}(). +-- * Coalitions with MESSAGE:@{ToCoalition}(). +-- * All Players with MESSAGE:@{ToAll}(). +-- -- @module Message - -Include.File( "Base" ) +-- @author FlightControl --- The MESSAGE class -- @type MESSAGE +-- @extends Base#BASE MESSAGE = { ClassName = "MESSAGE", MessageCategory = 0, @@ -12570,9 +12599,8 @@ MESSAGE = { --- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. -- @param self -- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. -- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". -- @return #MESSAGE -- @usage -- -- Create a series of new Messages. @@ -12580,15 +12608,15 @@ MESSAGE = { -- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". -- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". -- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + self:F( { MessageText, MessageDuration, MessageCategory } ) - -- When no messagecategory is given, we don't show it as a title... + -- When no MessageCategory is given, we don't show it as a title... if MessageCategory and MessageCategory ~= "" then self.MessageCategory = MessageCategory .. ": " else @@ -12596,7 +12624,6 @@ function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) end self.MessageDuration = MessageDuration - self.MessageID = MessageID self.MessageTime = timer.getTime() self.MessageText = MessageText @@ -12722,89 +12749,89 @@ end ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - +----- The MESSAGEQUEUE class +---- @type MESSAGEQUEUE +--MESSAGEQUEUE = { +-- ClientGroups = {}, +-- CoalitionSides = {} +--} +-- +--function MESSAGEQUEUE:New( RefreshInterval ) +-- local self = BASE:Inherit( self, BASE:New() ) +-- self:F( { RefreshInterval } ) +-- +-- self.RefreshInterval = RefreshInterval +-- +-- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) +-- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) +-- +-- return self +--end +-- +----- This function is called automatically by the MESSAGEQUEUE scheduler. +--function MESSAGEQUEUE:_DisplayMessages() +-- +-- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- if MessageData.MessageSent == false then +-- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageSent = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- +-- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. +-- -- Because the Client messages will overwrite the Coalition messages (for that Client). +-- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do +-- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do +-- if MessageData.MessageGroup == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageGroup = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- +-- -- Now check if the Client also has messages that belong to the Coalition of the Client... +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- local CoalitionGroup = Group.getByName( ClientGroupName ) +-- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then +-- if MessageData.MessageCoalition == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageCoalition = true +-- end +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- end +-- +-- return true +--end +-- +----- The _MessageQueue object is created when the MESSAGE class module is loaded. +----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) +-- --- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. -- @module STAGE -- @author Flightcontrol -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) + + + + + --- The STAGE class -- @type @@ -13766,11 +13793,11 @@ _TransportStageAction = { --- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. -- @module TASK -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) + + + + + --- The TASK class -- @type TASK @@ -14231,8 +14258,6 @@ end --- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. -- @module GOHOMETASK -Include.File("Task") - --- The GOHOMETASK class -- @type GOHOMETASK = { @@ -14269,7 +14294,7 @@ end -- @see DESTROYUNITTYPESTASK -- @see DESTROY_RADARS_TASK -Include.File("Task") + --- The DESTROYBASETASK class -- @type DESTROYBASETASK @@ -14347,7 +14372,7 @@ end --- DESTROYGROUPSTASK -- @module DESTROYGROUPSTASK -Include.File("DestroyBaseTask") + --- The DESTROYGROUPSTASK class -- @type @@ -14404,7 +14429,7 @@ end --- Task class to destroy radar installations. -- @module DESTROYRADARSTASK -Include.File("DestroyBaseTask") + --- The DESTROYRADARS class -- @type @@ -14445,7 +14470,7 @@ end --- Set TASK to destroy certain unit types. -- @module DESTROYUNITTYPESTASK -Include.File("DestroyBaseTask") + --- The DESTROYUNITTYPESTASK class -- @type @@ -14498,9 +14523,6 @@ end -- @module PICKUPTASK -- @parent TASK -Include.File("Task") -Include.File("Cargo") - --- The PICKUPTASK class -- @type PICKUPTASK = { @@ -14653,7 +14675,7 @@ end --- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. -- @module DEPLOYTASK -Include.File( "Task" ) + --- A DeployTask -- @type DEPLOYTASK @@ -14811,8 +14833,6 @@ end --- A NOTASK is a dummy activity... But it will show a Mission Briefing... -- @module NOTASK -Include.File("Task") - --- The NOTASK class -- @type NOTASK = { @@ -14880,11 +14900,6 @@ end -- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. -- @module Mission -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - --- The MISSION class -- @type MISSION -- @extends Base#BASE @@ -15069,7 +15084,7 @@ function MISSION:ReportToAll() for TaskID, TaskData in pairs( Tasks ) do TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() end @@ -15528,7 +15543,7 @@ function MISSIONSCHEDULER:TimeShow() self.TimeIntervalCount = self.TimeIntervalCount + 1 if self.TimeIntervalCount >= self.TimeTriggerShow then local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() self.TimeIntervalCount = 0 end end @@ -15551,11 +15566,11 @@ end -- @module CleanUp -- @author Flightcontrol -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) + + + + + --- The CLEANUP class. -- @type CLEANUP @@ -15607,7 +15622,6 @@ function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) self:F( { GroupObject, CleanUpGroupName } ) if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() trigger.action.deactivateGroup(GroupObject) self:T( { "GroupObject Destroyed", GroupObject } ) end @@ -15621,7 +15635,6 @@ function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) self:F( { CleanUpUnit, CleanUpUnitName } ) if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() local CleanUpGroup = Unit.getGroup(CleanUpUnit) -- TODO Client bug in 1.5.3 if CleanUpGroup and CleanUpGroup:isExist() then @@ -15691,7 +15704,6 @@ function CLEANUP:_EventCrash( Event ) self:F( { Event } ) --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() -- self:T("before getGroup") -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired -- self:T("after getGroup") @@ -15826,7 +15838,6 @@ function CLEANUP:_CleanUpScheduler() --self:T( CleanUpUnitVec2 ) local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then if CleanUpSurfaceType == land.SurfaceType.RUNWAY then @@ -15858,7 +15869,6 @@ function CLEANUP:_CleanUpScheduler() else UnitData.CleanUpTime = timer.getTime() UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() end end @@ -15952,14 +15962,6 @@ end -- @module Spawn -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - --- SPAWN Class -- @type SPAWN -- @extends Base#BASE @@ -16661,7 +16663,7 @@ end -- If no index is given, it will return the first group in the list. -- @param #SPAWN self -- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP +-- @return Group#GROUP self function SPAWN:GetGroupFromIndex( SpawnIndex ) self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) @@ -17147,8 +17149,6 @@ end -- on defined intervals (currently every minute). -- @module MOVEMENT -Include.File( "Routines" ) - --- the MOVEMENT class -- @type MOVEMENT = { @@ -17275,13 +17275,6 @@ end -- @author to be searched on the forum -- @author (co) Flightcontrol (Modified and enriched with functionality) -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - --- The SEAD class -- @type SEAD -- @extends Base#BASE @@ -17511,11 +17504,11 @@ end -- @module Escort -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) + + + + + --- -- @type ESCORT @@ -18764,9 +18757,6 @@ end -- @author FlightControl -Include.File( "Client" ) -Include.File( "Scheduler" ) - --- The MISSILETRAINER class -- @type MISSILETRAINER -- @extends Base#BASE @@ -18911,9 +18901,9 @@ function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) self.MessagesOnOff = MessagesOnOff if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() end return self @@ -18928,9 +18918,9 @@ function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) self.TrackingToAll = TrackingToAll if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() end return self @@ -18945,9 +18935,9 @@ function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) self.TrackingOnOff = TrackingOnOff if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() end return self @@ -18966,7 +18956,7 @@ function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) self.TrackingFrequency = 0.5 end if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() end return self @@ -18981,9 +18971,9 @@ function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) self.AlertsToAll = AlertsToAll if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() end return self @@ -18998,9 +18988,9 @@ function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) self.AlertsHitsOnOff = AlertsHitsOnOff if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() end return self @@ -19015,9 +19005,9 @@ function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) self.AlertsLaunchesOnOff = AlertsLaunchesOnOff if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() end return self @@ -19032,9 +19022,9 @@ function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) self.DetailsRangeOnOff = DetailsRangeOnOff if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() end return self @@ -19049,9 +19039,9 @@ function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) self.DetailsBearingOnOff = DetailsBearingOnOff if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() end return self @@ -19066,9 +19056,9 @@ function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) self.MenusOnOff = MenusOnOff if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() end return self @@ -19119,7 +19109,7 @@ function MISSILETRAINER._MenuMessages( MenuParameters ) if MenuParameters.Distance ~= nil then self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() end end @@ -19155,7 +19145,7 @@ function MISSILETRAINER:_EventShot( Event ) string.format( "%s launched a %s", TrainerSourceUnit:GetTypeName(), TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) if self.AlertsToAll then Message:ToAll() @@ -19270,7 +19260,7 @@ function MISSILETRAINER:_TrackMissiles() TrainerWeapon:getTypeName(), TrainerSourceUnit:GetTypeName(), TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) + ), 15, "Hit Alert" ) if self.AlertsToAll == true then Message:ToAll() @@ -19291,7 +19281,7 @@ function MISSILETRAINER:_TrackMissiles() string.format( "%s launched by %s self destructed!", TrainerWeaponTypeName, TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) + ), 5, "Tracking" ) if self.AlertsToAll == true then Message:ToAll() @@ -19365,7 +19355,7 @@ function MISSILETRAINER:_TrackMissiles() -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) end end end diff --git a/Moose Mission Setup/Moose.lua b/Moose Mission Setup/Moose.lua index 0f7292e6f..52bfe1b8a 100644 --- a/Moose Mission Setup/Moose.lua +++ b/Moose Mission Setup/Moose.lua @@ -1,5 +1,5 @@ env.info( '*** MOOSE STATIC INCLUDE START *** ' ) -env.info( 'Moose Generation Timestamp: 20160608_1752' ) +env.info( 'Moose Generation Timestamp: 20160609_1242' ) local base = _G env.info("Loading MOOSE " .. base.timer.getAbsTime() ) @@ -28,10 +28,6 @@ env.info("Loaded MOOSE Include Engine") -- @module routines -- @author Flightcontrol ---Include.File( "Trace" ) ---Include.File( "Message" ) - - env.setErrorMessageBoxEnabled(false) --- Extract of MIST functions. @@ -2336,19 +2332,19 @@ end function MessageToAll( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "Message", MsgTime, MsgName ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) + MESSAGE:New( MsgText, MsgTime, "Message" ):ToCoalition( coalition.side.RED ):ToCoalition( coalition.side.BLUE ) end function MessageToRed( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "To Red Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) + MESSAGE:New( MsgText, MsgTime, "To Red Coalition" ):ToCoalition( coalition.side.RED ) end function MessageToBlue( MsgText, MsgTime, MsgName ) --trace.f() - MESSAGE:New( MsgText, "To Blue Coalition", MsgTime, MsgName ):ToCoalition( coalition.side.RED ) + MESSAGE:New( MsgText, MsgTime, "To Blue Coalition" ):ToCoalition( coalition.side.RED ) end function getCarrierHeight( CarrierGroup ) @@ -2603,7 +2599,7 @@ env.info(( 'Init: Scripts Loaded v1.1' )) -- @module Base -- @author FlightControl -Include.File( "Routines" ) + local _TraceOn = true local _TraceLevel = 1 @@ -3076,10 +3072,6 @@ end -- @module Scheduler -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) - - --- The SCHEDULER class -- @type SCHEDULER -- @extends Base#BASE @@ -3200,9 +3192,6 @@ end -- @module Event -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) - --- The EVENT structure -- @type EVENT -- @field #EVENT.Events Events @@ -3710,9 +3699,6 @@ end --- Encapsulation of DCS World Menu system in a set of MENU classes. -- @module Menu -Include.File( "Routines" ) -Include.File( "Base" ) - --- The MENU class -- @type MENU -- @extends Base#BASE @@ -4226,11 +4212,6 @@ end -- @module Group -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Unit" ) - --- The GROUP class -- @type GROUP -- @extends Base#BASE @@ -6752,7 +6733,7 @@ function GROUP:Message( Message, Duration ) local DCSGroup = self:GetDCSGroup() if DCSGroup then - return MESSAGE:New( Message, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")", Duration, self:GetClassNameAndID() ) + return MESSAGE:New( Message, Duration, self:GetCallsign() .. " (" .. self:GetTypeName() .. ")" ) end return nil @@ -6892,9 +6873,9 @@ end -- @module Unit -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The UNIT class -- @type UNIT @@ -7684,10 +7665,10 @@ end -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Point" ) + + + + @@ -8138,10 +8119,10 @@ end -- @module Client -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Cargo" ) -Include.File( "Message" ) + + + + --- The CLIENT class @@ -8563,16 +8544,16 @@ function CLIENT:Message( Message, MessageDuration, MessageId, MessageCategory, M else self.Messages[MessageId].MessageInterval = MessageInterval end - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) else if self:GetClientGroupDCSUnit() and not self:GetClientGroupDCSUnit():inAir() then if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + 10 then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration , MessageCategory):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() end else if timer.getTime() - self.Messages[MessageId].MessageTime >= self.Messages[MessageId].MessageDuration + self.Messages[MessageId].MessageInterval then - MESSAGE:New( Message, MessageCategory, MessageDuration, MessageId ):ToClient( self ) + MESSAGE:New( Message, MessageDuration, MessageCategory ):ToClient( self ) self.Messages[MessageId].MessageTime = timer.getTime() end end @@ -8612,9 +8593,9 @@ end -- @module Static -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) + + + --- The STATIC class @@ -8694,15 +8675,15 @@ end -- @module Database -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Static" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) -Include.File( "Scheduler" ) + + + + + + + + + --- DATABASE class @@ -9462,14 +9443,6 @@ end -- @module Set -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Event" ) -Include.File( "Client" ) - --- SET_BASE class -- @type SET_BASE -- @extends Base#BASE @@ -10465,10 +10438,6 @@ end -- @module Point -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Point" ) - --- The POINT_VEC3 class -- @type POINT_VEC3 -- @extends Base#BASE @@ -10637,8 +10606,73 @@ end Include.File( "Routines" ) Include.File( "Base" ) -Include.File( "Database" ) +Include.File( "Scheduler" ) Include.File( "Event" ) +Include.File( "Menu" ) +Include.File( "Group" ) +Include.File( "Unit" ) +Include.File( "Zone" ) +Include.File( "Client" ) +Include.File( "Static" ) +Include.File( "Database" ) +Include.File( "Set" ) +Include.File( "Point" ) +Include.File( "Moose" ) +Include.File( "Scoring" ) +Include.File( "Cargo" ) +Include.File( "Message" ) +Include.File( "Stage" ) +Include.File( "Task" ) +Include.File( "GoHomeTask" ) +Include.File( "DestroyBaseTask" ) +Include.File( "DestroyGroupsTask" ) +Include.File( "DestroyRadarsTask" ) +Include.File( "DestroyUnitTypesTask" ) +Include.File( "PickupTask" ) +Include.File( "DeployTask" ) +Include.File( "NoTask" ) +Include.File( "RouteTask" ) +Include.File( "Mission" ) +Include.File( "CleanUp" ) +Include.File( "Spawn" ) +Include.File( "Movement" ) +Include.File( "Sead" ) +Include.File( "Escort" ) +Include.File( "MissileTrainer" ) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + -- The order of the declarations is important here. Don't touch it. @@ -10657,13 +10691,6 @@ _DATABASE = DATABASE:New() -- Database#DATABASE -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Menu" ) -Include.File( "Group" ) -Include.File( "Event" ) - - --- The Scoring class -- @type SCORING -- @field Players A collection of the current players that have joined the game. @@ -10826,7 +10853,7 @@ function SCORING:_EventOnDeadOrCrash( Event ) MESSAGE:New( "Player '" .. PlayerName .. "' killed a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerData.Kill[TargetCategory][TargetType].PenaltyKill .. " times. Penalty: -" .. PlayerData.Kill[TargetCategory][TargetType].Penalty .. ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/PENALTY" .. PlayerName .. "/" .. InitUnitName ):ToAll() + 5 ):ToAll() self:ScoreCSV( PlayerName, "KILL_PENALTY", 1, -125, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) else PlayerData.Score = PlayerData.Score + 10 @@ -10835,7 +10862,7 @@ function SCORING:_EventOnDeadOrCrash( Event ) MESSAGE:New( "Player '" .. PlayerName .. "' killed an enemy " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. PlayerData.Kill[TargetCategory][TargetType].ScoreKill .. " times. Score: " .. PlayerData.Kill[TargetCategory][TargetType].Score .. ". Score Total:" .. PlayerData.Score - PlayerData.Penalty, - "", 5, "/SCORE" .. PlayerName .. "/" .. InitUnitName ):ToAll() + 5 ):ToAll() self:ScoreCSV( PlayerName, "KILL_SCORE", 1, 10, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) end end @@ -10886,9 +10913,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) self.Players[PlayerName].PenaltyCoalition = self.Players[PlayerName].PenaltyCoalition + 1 MESSAGE:New( "Player '" .. PlayerName .. "' changed coalition from " .. _SCORINGCoalition[self.Players[PlayerName].UnitCoalition] .. " to " .. _SCORINGCoalition[UnitCoalition] .. "(changed " .. self.Players[PlayerName].PenaltyCoalition .. " times the coalition). 50 Penalty points added.", - "", - 2, - "/PENALTYCOALITION" .. PlayerName + 2 ):ToAll() self:ScoreCSV( PlayerName, "COALITION_PENALTY", 1, -50, self.Players[PlayerName].UnitName, _SCORINGCoalition[self.Players[PlayerName].UnitCoalition], _SCORINGCategory[self.Players[PlayerName].UnitCategory], self.Players[PlayerName].UnitType, UnitName, _SCORINGCoalition[UnitCoalition], _SCORINGCategory[UnitCategory], UnitData:getTypeName() ) @@ -10902,9 +10927,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) if self.Players[PlayerName].Penalty > 100 then if self.Players[PlayerName].PenaltyWarning < 1 then MESSAGE:New( "Player '" .. PlayerName .. "': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than 150, you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: " .. self.Players[PlayerName].Penalty, - "", - 30, - "/PENALTYCOALITION" .. PlayerName + 30 ):ToAll() self.Players[PlayerName].PenaltyWarning = self.Players[PlayerName].PenaltyWarning + 1 end @@ -10914,9 +10937,7 @@ function SCORING:_AddPlayerFromUnit( UnitData ) ClientGroup = GROUP:NewFromDCSUnit( UnitData ) ClientGroup:Destroy() MESSAGE:New( "Player '" .. PlayerName .. "' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", - "", - 10, - "/PENALTYCOALITION" .. PlayerName + 10 ):ToAll() end @@ -10944,7 +10965,7 @@ function SCORING:_AddMissionTaskScore( PlayerUnit, MissionName, Score ) MESSAGE:New( "Player '" .. PlayerName .. "' has finished another Task in Mission '" .. MissionName .. "'. " .. Score .. " Score points added.", - "", 20, "/SCORETASK" .. PlayerName ):ToAll() + 20 ):ToAll() self:ScoreCSV( PlayerName, "TASK_" .. MissionName:gsub( ' ', '_' ), 1, Score, PlayerUnit:getName() ) end @@ -10961,7 +10982,7 @@ function SCORING:_AddMissionScore( MissionName, Score ) PlayerData.Mission[MissionName].ScoreMission = PlayerData.Mission[MissionName].ScoreMission + Score MESSAGE:New( "Player '" .. PlayerName .. "' has finished Mission '" .. MissionName .. "'. " .. Score .. " Score points added.", - "", 20, "/SCOREMISSION" .. PlayerName ):ToAll() + 20 ):ToAll() self:ScoreCSV( PlayerName, "MISSION_" .. MissionName:gsub( ' ', '_' ), 1, Score ) end end @@ -11071,9 +11092,7 @@ function SCORING:_EventOnHit( Event ) MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a friendly " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].PenaltyHit .. " times. Penalty: -" .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Penalty .. ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/PENALTY" .. InitPlayerName .. "/" .. InitUnitName + 2 ):ToAll() self:ScoreCSV( InitPlayerName, "HIT_PENALTY", 1, -25, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) else @@ -11083,9 +11102,7 @@ function SCORING:_EventOnHit( Event ) MESSAGE:New( "Player '" .. InitPlayerName .. "' hit a target " .. TargetUnitCategory .. " ( " .. TargetType .. " ) " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].ScoreHit .. " times. Score: " .. self.Players[InitPlayerName].Hit[TargetCategory][TargetUnitName].Score .. ". Score Total:" .. self.Players[InitPlayerName].Score - self.Players[InitPlayerName].Penalty, - "", - 2, - "/SCORE" .. InitPlayerName .. "/" .. InitUnitName + 2 ):ToAll() self:ScoreCSV( InitPlayerName, "HIT_SCORE", 1, 1, InitUnitName, InitUnitCoalition, InitUnitCategory, InitUnitType, TargetUnitName, TargetUnitCoalition, TargetUnitCategory, TargetUnitType ) end @@ -11206,7 +11223,7 @@ function SCORING:ReportScoreAll() PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score:%d (%d Score -%d Penalties)%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) end end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() end @@ -11319,7 +11336,7 @@ function SCORING:ReportScorePlayer() PlayerMessage = PlayerMessage .. string.format( "Player '%s' Score = %d ( %d Score, -%d Penalties ):%s", PlayerName, PlayerScore - PlayerPenalty, PlayerScore, PlayerPenalty, ScoreMessage ) end end - MESSAGE:New( PlayerMessage, "Player Scores", 30, "AllPlayerScores"):ToAll() + MESSAGE:New( PlayerMessage, 30, "Player Scores" ):ToAll() end @@ -11469,10 +11486,10 @@ end --- CARGO Classes -- @module CARGO -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Message" ) -Include.File( "Scheduler" ) + + + + --- Clients are those Groups defined within the Mission Editor that have the skillset defined as "Client" or "Player". @@ -12546,20 +12563,32 @@ function CARGO_SLINGLOAD:UnLoad( Client, TargetZoneName ) return Cargo end ---- Message System to display Messages for Clients and Coalitions or All. --- Messages are grouped on the display panel per Category to improve readability for the players. +--- This module contains the MESSAGE class. +-- +-- 1) @{Message#MESSAGE} class, extends @{Base#BASE} +-- ================================================= +-- Message System to display Messages to Clients, Coalitions or All. -- Messages are shown on the display panel for an amount of seconds, and will then disappear. --- Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. --- Messages are created with MESSAGE:@{New}(). --- Messages are sent to Clients with MESSAGE:@{ToClient}(). --- Messages are sent to Coalitions with MESSAGE:@{ToCoalition}(). --- Messages are sent to All Players with MESSAGE:@{ToAll}(). +-- Messages can contain a category which is indicating the category of the message. +-- +-- 1.1) MESSAGE construction methods +-- --------------------------------- +-- Messages are created with MESSAGE:@{New}. Note that when the MESSAGE object is created, no message is sent yet. +-- To send messages, you need to use the To functions. +-- +-- 1.2) Send messages with MESSAGE To methods +-- ------------------------------------------ +-- Messages are sent to: +-- * Clients with MESSAGE:@{ToClient}(). +-- * Coalitions with MESSAGE:@{ToCoalition}(). +-- * All Players with MESSAGE:@{ToAll}(). +-- -- @module Message - -Include.File( "Base" ) +-- @author FlightControl --- The MESSAGE class -- @type MESSAGE +-- @extends Base#BASE MESSAGE = { ClassName = "MESSAGE", MessageCategory = 0, @@ -12570,9 +12599,8 @@ MESSAGE = { --- Creates a new MESSAGE object. Note that these MESSAGE objects are not yet displayed on the display panel. You must use the functions @{ToClient} or @{ToCoalition} or @{ToAll} to send these Messages to the respective recipients. -- @param self -- @param #string MessageText is the text of the Message. --- @param #string MessageCategory is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability. -- @param #number MessageDuration is a number in seconds of how long the MESSAGE should be shown on the display panel. --- @param #string MessageID is a string expressing the ID of the Message. +-- @param #string MessageCategory (optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ". -- @return #MESSAGE -- @usage -- -- Create a series of new Messages. @@ -12580,15 +12608,15 @@ MESSAGE = { -- -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". -- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". -- -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". --- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) --- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) --- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) --- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) -function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) +-- MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) +-- MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +-- MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +-- MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score") +function MESSAGE:New( MessageText, MessageDuration, MessageCategory ) local self = BASE:Inherit( self, BASE:New() ) - self:F( { MessageText, MessageCategory, MessageDuration, MessageID } ) + self:F( { MessageText, MessageDuration, MessageCategory } ) - -- When no messagecategory is given, we don't show it as a title... + -- When no MessageCategory is given, we don't show it as a title... if MessageCategory and MessageCategory ~= "" then self.MessageCategory = MessageCategory .. ": " else @@ -12596,7 +12624,6 @@ function MESSAGE:New( MessageText, MessageCategory, MessageDuration, MessageID ) end self.MessageDuration = MessageDuration - self.MessageID = MessageID self.MessageTime = timer.getTime() self.MessageText = MessageText @@ -12722,89 +12749,89 @@ end ---- The MESSAGEQUEUE class --- @type MESSAGEQUEUE -MESSAGEQUEUE = { - ClientGroups = {}, - CoalitionSides = {} -} - -function MESSAGEQUEUE:New( RefreshInterval ) - local self = BASE:Inherit( self, BASE:New() ) - self:F( { RefreshInterval } ) - - self.RefreshInterval = RefreshInterval - - --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) - self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) - - return self -end - ---- This function is called automatically by the MESSAGEQUEUE scheduler. -function MESSAGEQUEUE:_DisplayMessages() - - -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - if MessageData.MessageSent == false then - --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageSent = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - - -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. - -- Because the Client messages will overwrite the Coalition messages (for that Client). - for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do - for MessageID, MessageData in pairs( ClientGroupData.Messages ) do - if MessageData.MessageGroup == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageGroup = true - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - - -- Now check if the Client also has messages that belong to the Coalition of the Client... - for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do - for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do - local CoalitionGroup = Group.getByName( ClientGroupName ) - if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then - if MessageData.MessageCoalition == false then - trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) - MessageData.MessageCoalition = true - end - end - local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() - if MessageTimeLeft <= 0 then - MessageData = nil - end - end - end - end - - return true -end - ---- The _MessageQueue object is created when the MESSAGE class module is loaded. ---_MessageQueue = MESSAGEQUEUE:New( 0.5 ) - +----- The MESSAGEQUEUE class +---- @type MESSAGEQUEUE +--MESSAGEQUEUE = { +-- ClientGroups = {}, +-- CoalitionSides = {} +--} +-- +--function MESSAGEQUEUE:New( RefreshInterval ) +-- local self = BASE:Inherit( self, BASE:New() ) +-- self:F( { RefreshInterval } ) +-- +-- self.RefreshInterval = RefreshInterval +-- +-- --self.DisplayFunction = routines.scheduleFunction( self._DisplayMessages, { self }, 0, RefreshInterval ) +-- self.DisplayFunction = SCHEDULER:New( self, self._DisplayMessages, {}, 0, RefreshInterval ) +-- +-- return self +--end +-- +----- This function is called automatically by the MESSAGEQUEUE scheduler. +--function MESSAGEQUEUE:_DisplayMessages() +-- +-- -- First we display all messages that a coalition needs to receive... Also those who are not in a client (CA module clients...). +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- if MessageData.MessageSent == false then +-- --trigger.action.outTextForCoalition( CoalitionSideID, MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageSent = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- +-- -- Then we send the messages for each individual client, but also to be included are those Coalition messages for the Clients who belong to a coalition. +-- -- Because the Client messages will overwrite the Coalition messages (for that Client). +-- for ClientGroupName, ClientGroupData in pairs( self.ClientGroups ) do +-- for MessageID, MessageData in pairs( ClientGroupData.Messages ) do +-- if MessageData.MessageGroup == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageGroup = true +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- +-- -- Now check if the Client also has messages that belong to the Coalition of the Client... +-- for CoalitionSideID, CoalitionSideData in pairs( self.CoalitionSides ) do +-- for MessageID, MessageData in pairs( CoalitionSideData.Messages ) do +-- local CoalitionGroup = Group.getByName( ClientGroupName ) +-- if CoalitionGroup and CoalitionGroup:getCoalition() == CoalitionSideID then +-- if MessageData.MessageCoalition == false then +-- trigger.action.outTextForGroup( Group.getByName(ClientGroupName):getID(), MessageData.MessageCategory .. '\n' .. MessageData.MessageText:gsub("\n$",""):gsub("\n$",""), MessageData.MessageDuration ) +-- MessageData.MessageCoalition = true +-- end +-- end +-- local MessageTimeLeft = ( MessageData.MessageTime + MessageData.MessageDuration ) - timer.getTime() +-- if MessageTimeLeft <= 0 then +-- MessageData = nil +-- end +-- end +-- end +-- end +-- +-- return true +--end +-- +----- The _MessageQueue object is created when the MESSAGE class module is loaded. +----_MessageQueue = MESSAGEQUEUE:New( 0.5 ) +-- --- Stages within a @{TASK} within a @{MISSION}. All of the STAGE functionality is considered internally administered and not to be used by any Mission designer. -- @module STAGE -- @author Flightcontrol -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) + + + + + --- The STAGE class -- @type @@ -13766,11 +13793,11 @@ _TransportStageAction = { --- The TASK Classes define major end-to-end activities within a MISSION. The TASK Class is the Master Class to orchestrate these activities. From this class, many concrete TASK classes are inherited. -- @module TASK -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Stage" ) + + + + + --- The TASK class -- @type TASK @@ -14231,8 +14258,6 @@ end --- A GOHOMETASK orchestrates the travel back to the home base, which is a specific zone defined within the ME. -- @module GOHOMETASK -Include.File("Task") - --- The GOHOMETASK class -- @type GOHOMETASK = { @@ -14269,7 +14294,7 @@ end -- @see DESTROYUNITTYPESTASK -- @see DESTROY_RADARS_TASK -Include.File("Task") + --- The DESTROYBASETASK class -- @type DESTROYBASETASK @@ -14347,7 +14372,7 @@ end --- DESTROYGROUPSTASK -- @module DESTROYGROUPSTASK -Include.File("DestroyBaseTask") + --- The DESTROYGROUPSTASK class -- @type @@ -14404,7 +14429,7 @@ end --- Task class to destroy radar installations. -- @module DESTROYRADARSTASK -Include.File("DestroyBaseTask") + --- The DESTROYRADARS class -- @type @@ -14445,7 +14470,7 @@ end --- Set TASK to destroy certain unit types. -- @module DESTROYUNITTYPESTASK -Include.File("DestroyBaseTask") + --- The DESTROYUNITTYPESTASK class -- @type @@ -14498,9 +14523,6 @@ end -- @module PICKUPTASK -- @parent TASK -Include.File("Task") -Include.File("Cargo") - --- The PICKUPTASK class -- @type PICKUPTASK = { @@ -14653,7 +14675,7 @@ end --- A DEPLOYTASK orchestrates the deployment of CARGO within a specific landing zone. -- @module DEPLOYTASK -Include.File( "Task" ) + --- A DeployTask -- @type DEPLOYTASK @@ -14811,8 +14833,6 @@ end --- A NOTASK is a dummy activity... But it will show a Mission Briefing... -- @module NOTASK -Include.File("Task") - --- The NOTASK class -- @type NOTASK = { @@ -14880,11 +14900,6 @@ end -- A @{CLIENT} needs to be registered within the @{MISSION} through the function @{AddClient}. A @{TASK} needs to be registered within the @{MISSION} through the function @{AddTask}. -- @module Mission -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Client" ) -Include.File( "Task" ) - --- The MISSION class -- @type MISSION -- @extends Base#BASE @@ -15069,7 +15084,7 @@ function MISSION:ReportToAll() for TaskID, TaskData in pairs( Tasks ) do TaskText = TaskText .. " - Task " .. TaskID .. ": " .. TaskData.Name .. ": " .. TaskData:GetGoalProgress() .. "\n" end - MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), "Mission Command: Mission Report", 10, self.Name .. '/Status'):ToAll() + MESSAGE:New( self.MissionCoalition .. ' "' .. self.Name .. '": ' .. self.MissionStatus .. ' ( ' .. self.MissionPriority .. ' mission )' .. AlivePlayers .. "\n" .. TaskText:gsub("\n$",""), 10, "Mission Command: Mission Report" ):ToAll() end @@ -15528,7 +15543,7 @@ function MISSIONSCHEDULER:TimeShow() self.TimeIntervalCount = self.TimeIntervalCount + 1 if self.TimeIntervalCount >= self.TimeTriggerShow then local TimeMsg = string.format("%00d", ( self.TimeSeconds / 60 ) - ( timer.getTime() / 60 )) .. ' minutes left until mission reload.' - MESSAGE:New( TimeMsg, "Mission time", self.TimeShow, '/TimeMsg' ):ToAll() + MESSAGE:New( TimeMsg, self.TimeShow, "Mission time" ):ToAll() self.TimeIntervalCount = 0 end end @@ -15551,11 +15566,11 @@ end -- @module CleanUp -- @author Flightcontrol -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) + + + + + --- The CLEANUP class. -- @type CLEANUP @@ -15607,7 +15622,6 @@ function CLEANUP:_DestroyGroup( GroupObject, CleanUpGroupName ) self:F( { GroupObject, CleanUpGroupName } ) if GroupObject then -- and GroupObject:isExist() then - --MESSAGE:New( "Destroy Group " .. CleanUpGroupName, CleanUpGroupName, 1, CleanUpGroupName ):ToAll() trigger.action.deactivateGroup(GroupObject) self:T( { "GroupObject Destroyed", GroupObject } ) end @@ -15621,7 +15635,6 @@ function CLEANUP:_DestroyUnit( CleanUpUnit, CleanUpUnitName ) self:F( { CleanUpUnit, CleanUpUnitName } ) if CleanUpUnit then - --MESSAGE:New( "Destroy " .. CleanUpUnitName, CleanUpUnitName, 1, CleanUpUnitName ):ToAll() local CleanUpGroup = Unit.getGroup(CleanUpUnit) -- TODO Client bug in 1.5.3 if CleanUpGroup and CleanUpGroup:isExist() then @@ -15691,7 +15704,6 @@ function CLEANUP:_EventCrash( Event ) self:F( { Event } ) --TODO: This stuff is not working due to a DCS bug. Burning units cannot be destroyed. - --MESSAGE:New( "Crash ", "Crash", 10, "Crash" ):ToAll() -- self:T("before getGroup") -- local _grp = Unit.getGroup(event.initiator)-- Identify the group that fired -- self:T("after getGroup") @@ -15826,7 +15838,6 @@ function CLEANUP:_CleanUpScheduler() --self:T( CleanUpUnitVec2 ) local CleanUpSurfaceType = land.getSurfaceType(CleanUpUnitVec2) --self:T( CleanUpSurfaceType ) - --MESSAGE:New( "Surface " .. CleanUpUnitName .. " = " .. CleanUpSurfaceTypeText[CleanUpSurfaceType], CleanUpUnitName, 10, CleanUpUnitName ):ToAll() if CleanUpUnit and CleanUpUnit:getLife() <= CleanUpUnit:getLife0() * 0.95 then if CleanUpSurfaceType == land.SurfaceType.RUNWAY then @@ -15858,7 +15869,6 @@ function CLEANUP:_CleanUpScheduler() else UnitData.CleanUpTime = timer.getTime() UnitData.CleanUpMoved = true - --MESSAGE:New( "Moved " .. CleanUpUnitName, CleanUpUnitName, 10, CleanUpUnitName ):ToAll() end end @@ -15952,14 +15962,6 @@ end -- @module Spawn -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) -Include.File( "Event" ) -Include.File( "Scheduler" ) - --- SPAWN Class -- @type SPAWN -- @extends Base#BASE @@ -16661,7 +16663,7 @@ end -- If no index is given, it will return the first group in the list. -- @param #SPAWN self -- @param #number SpawnIndex The index of the group to return. --- @return Group#GROUP +-- @return Group#GROUP self function SPAWN:GetGroupFromIndex( SpawnIndex ) self:F( { self.SpawnTemplatePrefix, self.SpawnAliasPrefix, SpawnIndex } ) @@ -17147,8 +17149,6 @@ end -- on defined intervals (currently every minute). -- @module MOVEMENT -Include.File( "Routines" ) - --- the MOVEMENT class -- @type MOVEMENT = { @@ -17275,13 +17275,6 @@ end -- @author to be searched on the forum -- @author (co) Flightcontrol (Modified and enriched with functionality) -Include.File( "Routines" ) -Include.File( "Event" ) -Include.File( "Base" ) -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Task" ) - --- The SEAD class -- @type SEAD -- @extends Base#BASE @@ -17511,11 +17504,11 @@ end -- @module Escort -- @author FlightControl -Include.File( "Routines" ) -Include.File( "Base" ) -Include.File( "Database" ) -Include.File( "Group" ) -Include.File( "Zone" ) + + + + + --- -- @type ESCORT @@ -18764,9 +18757,6 @@ end -- @author FlightControl -Include.File( "Client" ) -Include.File( "Scheduler" ) - --- The MISSILETRAINER class -- @type MISSILETRAINER -- @extends Base#BASE @@ -18911,9 +18901,9 @@ function MISSILETRAINER:InitMessagesOnOff( MessagesOnOff ) self.MessagesOnOff = MessagesOnOff if self.MessagesOnOff == true then - MESSAGE:New( "Messages ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Messages ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Messages OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Messages OFF", 15, "Menu" ):ToAll() end return self @@ -18928,9 +18918,9 @@ function MISSILETRAINER:InitTrackingToAll( TrackingToAll ) self.TrackingToAll = TrackingToAll if self.TrackingToAll == true then - MESSAGE:New( "Missile tracking to all players ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking to all players ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Missile tracking to all players OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking to all players OFF", 15, "Menu" ):ToAll() end return self @@ -18945,9 +18935,9 @@ function MISSILETRAINER:InitTrackingOnOff( TrackingOnOff ) self.TrackingOnOff = TrackingOnOff if self.TrackingOnOff == true then - MESSAGE:New( "Missile tracking ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Missile tracking OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking OFF", 15, "Menu" ):ToAll() end return self @@ -18966,7 +18956,7 @@ function MISSILETRAINER:InitTrackingFrequency( TrackingFrequency ) self.TrackingFrequency = 0.5 end if self.TrackingFrequency then - MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Missile tracking frequency is " .. self.TrackingFrequency .. " seconds.", 15, "Menu" ):ToAll() end return self @@ -18981,9 +18971,9 @@ function MISSILETRAINER:InitAlertsToAll( AlertsToAll ) self.AlertsToAll = AlertsToAll if self.AlertsToAll == true then - MESSAGE:New( "Alerts to all players ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts to all players ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts to all players OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts to all players OFF", 15, "Menu" ):ToAll() end return self @@ -18998,9 +18988,9 @@ function MISSILETRAINER:InitAlertsHitsOnOff( AlertsHitsOnOff ) self.AlertsHitsOnOff = AlertsHitsOnOff if self.AlertsHitsOnOff == true then - MESSAGE:New( "Alerts Hits ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Hits ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts Hits OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Hits OFF", 15, "Menu" ):ToAll() end return self @@ -19015,9 +19005,9 @@ function MISSILETRAINER:InitAlertsLaunchesOnOff( AlertsLaunchesOnOff ) self.AlertsLaunchesOnOff = AlertsLaunchesOnOff if self.AlertsLaunchesOnOff == true then - MESSAGE:New( "Alerts Launches ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Launches ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Alerts Launches OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Alerts Launches OFF", 15, "Menu" ):ToAll() end return self @@ -19032,9 +19022,9 @@ function MISSILETRAINER:InitRangeOnOff( DetailsRangeOnOff ) self.DetailsRangeOnOff = DetailsRangeOnOff if self.DetailsRangeOnOff == true then - MESSAGE:New( "Range display ON", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Range display ON", 15, "Menu" ):ToAll() else - MESSAGE:New( "Range display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Range display OFF", 15, "Menu" ):ToAll() end return self @@ -19049,9 +19039,9 @@ function MISSILETRAINER:InitBearingOnOff( DetailsBearingOnOff ) self.DetailsBearingOnOff = DetailsBearingOnOff if self.DetailsBearingOnOff == true then - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() else - MESSAGE:New( "Bearing display OFF", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Bearing display OFF", 15, "Menu" ):ToAll() end return self @@ -19066,9 +19056,9 @@ function MISSILETRAINER:InitMenusOnOff( MenusOnOff ) self.MenusOnOff = MenusOnOff if self.MenusOnOff == true then - MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Menus are ENABLED (only when a player rejoins a slot)", 15, "Menu" ):ToAll() else - MESSAGE:New( "Menus are DISABLED", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Menus are DISABLED", 15, "Menu" ):ToAll() end return self @@ -19119,7 +19109,7 @@ function MISSILETRAINER._MenuMessages( MenuParameters ) if MenuParameters.Distance ~= nil then self.Distance = MenuParameters.Distance - MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", "Menu", 15, "ID" ):ToAll() + MESSAGE:New( "Hit detection distance set to " .. self.Distance .. " meters", 15, "Menu" ):ToAll() end end @@ -19155,7 +19145,7 @@ function MISSILETRAINER:_EventShot( Event ) string.format( "%s launched a %s", TrainerSourceUnit:GetTypeName(), TrainerWeaponName - ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ),"Launch Alert", 5, "ID" ) + ) .. self:_AddRange( Client, TrainerWeapon ) .. self:_AddBearing( Client, TrainerWeapon ), 5, "Launch Alert" ) if self.AlertsToAll then Message:ToAll() @@ -19270,7 +19260,7 @@ function MISSILETRAINER:_TrackMissiles() TrainerWeapon:getTypeName(), TrainerSourceUnit:GetTypeName(), TrainerTargetUnit:GetPlayerName() - ),"Hit Alert", 15, "ID" ) + ), 15, "Hit Alert" ) if self.AlertsToAll == true then Message:ToAll() @@ -19291,7 +19281,7 @@ function MISSILETRAINER:_TrackMissiles() string.format( "%s launched by %s self destructed!", TrainerWeaponTypeName, TrainerSourceUnit:GetTypeName() - ),"Tracking", 5, "ID" ) + ), 5, "Tracking" ) if self.AlertsToAll == true then Message:ToAll() @@ -19365,7 +19355,7 @@ function MISSILETRAINER:_TrackMissiles() -- Once the Player Client and the Other Player Client tracking messages are prepared, show them. if ClientData.MessageToClient ~= "" or ClientData.MessageToAll ~= "" then - local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, "Tracking", 1, "ID" ):ToClient( Client ) + local Message = MESSAGE:New( ClientData.MessageToClient .. ClientData.MessageToAll, 1, "Tracking" ):ToClient( Client ) end end end diff --git a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.lua b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.lua index 1066f424a..fe8b75910 100644 --- a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.lua +++ b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.lua @@ -1,6 +1,6 @@ -Include.File( 'Cleanup' ) -Include.File( 'Spawn' ) -Include.File( 'Event') + + + Clean = CLEANUP:New( 'CLEAN_BATUMI', 180 ) diff --git a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz index 7dbf52cac..2ddd4a78b 100644 Binary files a/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz and b/Moose Test Missions/Moose_Test_CLEANUP/Moose_Test_CLEANUP.miz differ diff --git a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua b/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua deleted file mode 100644 index d299d3501..000000000 --- a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua +++ /dev/null @@ -1,108 +0,0 @@ - -Include.File( 'UnitSet' ) -Include.File( 'GroupSet' ) -Include.File( 'Spawn' ) - -DBBluePlanes = UNITSET:New() - :FilterCoalitions( "blue" ) - :FilterCategories( "plane" ) - :FilterStart() - -DBRedVehicles = UNITSET:New() - :FilterCoalitions( "red" ) - :FilterCategories( "ground" ) - :FilterStart() - -DBShips = UNITSET:New() - :FilterCategories( "ship" ) - :FilterStart() - -DBBelgium = UNITSET:New() - :FilterCategories( "helicopter" ) - :FilterCountries( "BELGIUM" ) - :FilterStart() - -DBNorthKorea = UNITSET:New() - :FilterCountries( "NORTH_KOREA" ) - :FilterStart() - -DBKA50Vinson = UNITSET:New() - :FilterTypes( { "Ka-50", "VINSON" } ) - :FilterStart() - -DBBluePlanesGroup = GROUPSET:New() - :FilterCoalitions( "blue" ) - :FilterCategories( "plane" ) - :FilterStart() - -DBNorthKoreaGroup = GROUPSET:New() - :FilterCountries( "NORTH_KOREA" ) - :FilterStart() - -DBBluePlanes:Flush() -DBRedVehicles:Flush() -DBShips:Flush() -DBBelgium:Flush() -DBNorthKorea:Flush() -DBKA50Vinson:Flush() -DBBluePlanesGroup:Flush() -DBNorthKoreaGroup:Flush() - - -SpawnUS_Plane = SPAWN:New( 'Database Spawn Test USA Plane') -GroupUS_Plane = SpawnUS_Plane:Spawn() - -SpawnUS_Vehicle = SPAWN:New( 'Database Spawn Test USA Vehicle') -GroupUS_Vehicle = SpawnUS_Vehicle:Spawn() - -SpawnUS_Ship = SPAWN:New( 'Database Spawn Test USA Ship') -GroupUS_Ship = SpawnUS_Ship:Spawn() - -SpawnRU_Vehicle = SPAWN:New( 'Database Spawn Test RUSSIA Vehicle') -GroupRU_Vehicle = SpawnRU_Vehicle:Spawn() - -SpawnRU_Ship = SPAWN:New( 'Database Spawn Test RUSSIA Ship') -GroupRU_Ship = SpawnRU_Ship:Spawn() - -SpawnUS_AttackVehicle = SPAWN:New( 'Database Spawn Test USA Attack Vehicle' ) -SpawnRU_AttackVehicle = SPAWN:New( 'Database Spawn Test RUSSIA Attack Vehicle' ) - -for i = 1, 2 do - GroupRU_AttackVehicle = SpawnRU_AttackVehicle:SpawnInZone( ZONE:New("Spawn Zone RU"), true) - GroupUS_AttackVehicle = SpawnUS_AttackVehicle:SpawnInZone( ZONE:New("Spawn Zone US"), true) -end - - ---DBBlue:TraceDatabase() -SCHEDULER:New( DBBluePlanes, DBBluePlanes.Flush, { }, 1 ) -SCHEDULER:New( DBRedVehicles, DBRedVehicles.Flush, { }, 1 ) -SCHEDULER:New( DBShips, DBShips.Flush, { }, 1 ) -SCHEDULER:New( DBBelgium, DBBelgium.Flush, { }, 1 ) -SCHEDULER:New( DBNorthKorea, DBNorthKorea.Flush, { }, 1 ) -SCHEDULER:New( DBKA50Vinson, DBKA50Vinson.Flush, { }, 1 ) - -SCHEDULER:New( DBBluePlanesGroup, DBBluePlanesGroup.Flush, { }, 1 ) -SCHEDULER:New( DBNorthKoreaGroup, DBNorthKoreaGroup.Flush, { }, 1 ) - -DBRedVehicles - :ForEachUnit( function( MooseUnit ) - DBRedVehicles:T( MooseUnit:GetName() ) - end ) - -local function FlushPlayers() - - _DATABASE:E( "FlushPlayers" ) - _DATABASE - :ForEachPlayerAlive( function( Player ) - _DATABASE:E( Player ) - MESSAGE:New( Player, "Test", 5, "Player Test" ):ToAll() - return true - end ) - return true -end - -_DATABASE:E( "Schedule" ) -local PlayerShow = SCHEDULER:New( nil, FlushPlayers, {}, 1, 10 ) - - - diff --git a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz b/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz deleted file mode 100644 index 0ec5118d7..000000000 Binary files a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.miz and /dev/null differ diff --git a/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz b/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz index adef34e4c..e1d4bb895 100644 Binary files a/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz and b/Moose Test Missions/Moose_Test_DESTROY/MOOSE_Test_DESTROY.miz differ diff --git a/Moose Test Missions/Moose_Test_DESTROY/Moose_Test_DESTROY.lua b/Moose Test Missions/Moose_Test_DESTROY/Moose_Test_DESTROY.lua index 2caa20805..a6efabd7f 100644 --- a/Moose Test Missions/Moose_Test_DESTROY/Moose_Test_DESTROY.lua +++ b/Moose Test Missions/Moose_Test_DESTROY/Moose_Test_DESTROY.lua @@ -1,13 +1,3 @@ --- MOOSE include files. -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "DestroyGroupsTask" ) -Include.File( "DestroyRadarsTask" ) -Include.File( "DestroyUnitTypesTask" ) -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Zone" ) -Include.File( "Event" ) do local Mission = MISSION:New( 'Destroy Gound', 'Ground', 'Briefing', 'CCCP' ) diff --git a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua index e6803dad4..732b5b5ac 100644 --- a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua +++ b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.lua @@ -1,7 +1,7 @@ -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "Spawn" ) -Include.File( "Escort" ) + + + + diff --git a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz index 17306c194..355f1f252 100644 Binary files a/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz and b/Moose Test Missions/Moose_Test_ESCORT/MOOSE_Test_ESCORT.miz differ diff --git a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua index c8d4596ff..b28f6644d 100644 --- a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua +++ b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.lua @@ -2,7 +2,7 @@ -- Only use Include.File when developing new MOOSE classes. -- When using Moose.lua in the DO SCIPTS FILE initialization box, -- these Include.File statements are not needed, because all classes within Moose will be loaded. -Include.File("MissileTrainer") + -- This is an example of a global local Trainer = MISSILETRAINER diff --git a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz index 018d968c3..69c931104 100644 Binary files a/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz and b/Moose Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz differ diff --git a/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz b/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz index b154eabb3..07d8b34a1 100644 Binary files a/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz and b/Moose Test Missions/Moose_Test_SEAD/MOOSE_Test_SEAD.miz differ diff --git a/Moose Test Missions/Moose_Test_SEAD/Moose_Test_SEAD.lua b/Moose Test Missions/Moose_Test_SEAD/Moose_Test_SEAD.lua index 736f8600e..ea28a16be 100644 --- a/Moose Test Missions/Moose_Test_SEAD/Moose_Test_SEAD.lua +++ b/Moose Test Missions/Moose_Test_SEAD/Moose_Test_SEAD.lua @@ -1,4 +1,4 @@ -Include.File( "Sead" ) + -- CCCP SEAD Defenses diff --git a/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.lua b/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.lua index d5ed824df..be6eb4cad 100644 --- a/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.lua +++ b/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.lua @@ -1,6 +1,6 @@ -Include.File( 'Set' ) -Include.File( 'Spawn' ) + + SetVehicles = SET_GROUP:New() diff --git a/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.miz b/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.miz index d479a16e0..0dfc8dcb6 100644 Binary files a/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.miz and b/Moose Test Missions/Moose_Test_SET_GROUP/Moose_Test_SET_GROUP.miz differ diff --git a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.lua b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.lua index c2f784faa..cbab519b1 100644 --- a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.lua +++ b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.lua @@ -1,4 +1,4 @@ -Include.File( "Spawn" ) + -- Tests Anapa: Spawn Basics diff --git a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz index f29ec7778..d7288cbcd 100644 Binary files a/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz and b/Moose Test Missions/Moose_Test_SPAWN/MOOSE_Test_SPAWN.miz differ diff --git a/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.lua b/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.lua index 5dbb5b963..76f282b8c 100644 --- a/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.lua +++ b/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.lua @@ -10,7 +10,7 @@ -- @author FlightControl -Include.File("Spawn") + do diff --git a/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz b/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz index 42de42467..1855e720b 100644 Binary files a/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz and b/Moose Test Missions/Moose_Test_SPAWN_Repeat/MOOSE_Test_SPAWN_Repeat.miz differ diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.lua b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.lua index 53728aaa4..28bf2a9d8 100644 --- a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.lua +++ b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.lua @@ -1,15 +1,15 @@ -Include.File( "Mission" ) -Include.File( "Client" ) -Include.File( "DeployTask" ) -Include.File( "PickupTask" ) -Include.File( "DestroyGroupsTask" ) -Include.File( "DestroyRadarsTask" ) -Include.File( "DestroyUnitTypesTask" ) -Include.File( "GoHomeTask" ) -Include.File( "Spawn" ) -Include.File( "Movement" ) -Include.File( "Sead" ) -Include.File( "CleanUp" ) + + + + + + + + + + + + do local Mission = MISSION:New( 'Pickup', 'Operational', 'Pickup Troops', 'NATO' ) diff --git a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz index 0ac932082..9930ee92b 100644 Binary files a/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz and b/Moose Test Missions/Moose_Test_TASK_Pickup_and_Deploy/MOOSE_Test_TASK_Pickup_and_Deploy.miz differ diff --git a/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.lua b/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.lua index dc09e4e7d..d05eb4b02 100644 --- a/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.lua +++ b/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.lua @@ -1,7 +1,7 @@ -Include.File( "Group" ) -Include.File( "Unit" ) -Include.File( "Client" ) + + + BASE:TraceClass( "UNIT" ) BASE:TraceClass( "GROUP" ) diff --git a/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz b/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz index 8957c9541..b4fd92676 100644 Binary files a/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz and b/Moose Test Missions/Moose_Test_WRAPPER/Moose_Test_WRAPPER.miz differ diff --git a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua index d9bbe059d..cfdfbbf70 100644 --- a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua +++ b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.lua @@ -1,7 +1,7 @@ -Include.File( "Zone" ) -Include.File( "Group" ) -Include.File( "Scheduler" ) + + + local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) diff --git a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz index b080d8a4c..82222cecf 100644 Binary files a/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz and b/Moose Test Missions/Moose_Test_ZONE/Moose_Test_ZONE.miz differ diff --git a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua index bfa24fa60..55404345d 100644 --- a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua +++ b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.lua @@ -1,7 +1,7 @@ -Include.File( "Zone" ) -Include.File( "Group" ) -Include.File( "Scheduler" ) + + + local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) diff --git a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz index 3d83bba99..83e754f6a 100644 Binary files a/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz and b/Moose Test Missions/Moose_Test_ZONE_POLYGON/Moose_Test_ZONE_POLYGON.miz differ diff --git a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua index 1d01e5451..34d4c7699 100644 --- a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua +++ b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.lua @@ -1,7 +1,7 @@ -Include.File( "Zone" ) -Include.File( "Group" ) -Include.File( "Scheduler" ) + + + local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) diff --git a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz index 0ebf5cfa9..7fdebb91a 100644 Binary files a/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz and b/Moose Test Missions/Moose_Test_ZONE_RADIUS/Moose_Test_ZONE_RADIUS.miz differ diff --git a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.lua b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.lua index 3573a123c..a034ab8d5 100644 --- a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.lua +++ b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.lua @@ -1,7 +1,7 @@ -Include.File( "Zone" ) -Include.File( "Group" ) -Include.File( "Scheduler" ) + + + local GroupInside = GROUP:FindByName( "Test Inside Polygon" ) local GroupOutside = GROUP:FindByName( "Test Outside Polygon" ) diff --git a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz index ec99c5cac..69196e86d 100644 Binary files a/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz and b/Moose Test Missions/Moose_Test_ZONE_UNIT/Moose_Test_ZONE_UNIT.miz differ diff --git a/Moose Training/Documentation/GroupSet.html b/Moose Training/Documentation/GroupSet.html deleted file mode 100644 index e0ae7f72c..000000000 --- a/Moose Training/Documentation/GroupSet.html +++ /dev/null @@ -1,620 +0,0 @@ - - - - - - -
-
- -
-
-
-
- -
-

Module GroupSet

- -

Create and manage a set of groups.

- - - -

#GROUPSET class

-

Mission designers can use the GROUPSET class to build sets of groups belonging to certain:

- -
    -
  • Coalitions
  • -
  • Categories
  • -
  • Countries
  • -
  • Starting with certain prefix strings.
  • -
- -

GROUPSET construction methods:

-

Create a new GROUPSET object with the GROUPSET.New method:

- - - - -

GROUPSET filter criteria:

-

You can set filter criteria to define the set of groups within the GROUPSET. -Filter criteria are defined by:

- - - -

Once the filter criteria have been set for the GROUPSET, you can start filtering using:

- - - -

Planned filter criteria within development are (so these are not yet available):

- - - - -

GROUPSET iterators:

-

Once the filters have been defined and the GROUPSET has been built, you can iterate the GROUPSET with the available iterator methods. -The iterator methods will walk the GROUPSET set, and call for each element within the set a function that you provide. -The following iterator methods are currently available within the GROUPSET:

- - - - -

Global(s)

- - - - - -
GROUPSET - -
-

Type GROUPSET

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
GROUPSET:AddInDatabase(Event) -

Handles the Database to check on an event (birth) that the Object was added in the Database.

-
GROUPSET.ClassName - -
GROUPSET.Filter - -
GROUPSET:FilterCategories(Categories) -

Builds a set of groups out of categories.

-
GROUPSET:FilterCoalitions(Coalitions) -

Builds a set of groups of coalitions.

-
GROUPSET:FilterCountries(Countries) -

Builds a set of groups of defined countries.

-
GROUPSET.FilterMeta - -
GROUPSET:FilterPrefixes(Prefixes) -

Builds a set of groups of defined GROUP prefixes.

-
GROUPSET:FilterStart() -

Starts the filtering.

-
GROUPSET:FindGroup(GroupName) -

Finds a Group based on the Group Name.

-
GROUPSET:FindInDatabase(Event) -

Handles the Database to check on any event that Object exists in the Database.

-
GROUPSET:ForEachGroup(IteratorFunction, ...) -

Interate the GROUPSET and call an interator function for each alive GROUP, providing the GROUP and optional parameters.

-
GROUPSET:IsIncludeObject(MooseGroup) - -
GROUPSET:New() -

Creates a new GROUPSET object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names.

-
- -

Global(s)

-
-
- - #GROUPSET - -GROUPSET - -
-
- - - -
-
-

Type GroupSet

- -

Type GROUPSET

- -

GROUPSET class

- -

Field(s)

-
-
- - -GROUPSET:AddInDatabase(Event) - -
-
- -

Handles the Database to check on an event (birth) that the Object was added in the Database.

- - -

This is required, because sometimes the _DATABASE birth event gets called later than the SET birth event!

- -

Parameter

- -

Return values

-
    -
  1. - -

    #string: -The name of the GROUP

    - -
  2. -
  3. - -

    #table: -The GROUP

    - -
  4. -
-
-
-
-
- - #string - -GROUPSET.ClassName - -
-
- - - -
-
-
-
- - - -GROUPSET.Filter - -
-
- - - -
-
-
-
- - -GROUPSET:FilterCategories(Categories) - -
-
- -

Builds a set of groups out of categories.

- - -

Possible current categories are plane, helicopter, ground, ship.

- -

Parameter

-
    -
  • - -

    #string Categories : -Can take the following values: "plane", "helicopter", "ground", "ship".

    - -
  • -
-

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - -GROUPSET:FilterCoalitions(Coalitions) - -
-
- -

Builds a set of groups of coalitions.

- - -

Possible current coalitions are red, blue and neutral.

- -

Parameter

-
    -
  • - -

    #string Coalitions : -Can take the following values: "red", "blue", "neutral".

    - -
  • -
-

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - -GROUPSET:FilterCountries(Countries) - -
-
- -

Builds a set of groups of defined countries.

- - -

Possible current countries are those known within DCS world.

- -

Parameter

-
    -
  • - -

    #string Countries : -Can take those country strings known within DCS world.

    - -
  • -
-

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - - -GROUPSET.FilterMeta - -
-
- - - -
-
-
-
- - -GROUPSET:FilterPrefixes(Prefixes) - -
-
- -

Builds a set of groups of defined GROUP prefixes.

- - -

All the groups starting with the given prefixes will be included within the set.

- -

Parameter

-
    -
  • - -

    #string Prefixes : -The prefix of which the group name starts with.

    - -
  • -
-

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - -GROUPSET:FilterStart() - -
-
- -

Starts the filtering.

- -

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - -GROUPSET:FindGroup(GroupName) - -
-
- -

Finds a Group based on the Group Name.

- -

Parameter

-
    -
  • - -

    #string GroupName :

    - -
  • -
-

Return value

- -

Group#GROUP: -The found Group.

- -
-
-
-
- - -GROUPSET:FindInDatabase(Event) - -
-
- -

Handles the Database to check on any event that Object exists in the Database.

- - -

This is required, because sometimes the _DATABASE event gets called later than the SET event or vise versa!

- -

Parameter

- -

Return values

-
    -
  1. - -

    #string: -The name of the GROUP

    - -
  2. -
  3. - -

    #table: -The GROUP

    - -
  4. -
-
-
-
-
- - -GROUPSET:ForEachGroup(IteratorFunction, ...) - -
-
- -

Interate the GROUPSET and call an interator function for each alive GROUP, providing the GROUP and optional parameters.

- -

Parameters

-
    -
  • - -

    #function IteratorFunction : -The function that will be called when there is an alive GROUP in the GROUPSET. The function needs to accept a GROUP parameter.

    - -
  • -
  • - -

    ... :

    - -
  • -
-

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - -GROUPSET:IsIncludeObject(MooseGroup) - -
-
- - - -

Parameter

- -

Return value

- -

#GROUPSET: -self

- -
-
-
-
- - -GROUPSET:New() - -
-
- -

Creates a new GROUPSET object, building a set of groups belonging to a coalitions, categories, countries, types or with defined prefix names.

- -

Return value

- -

#GROUPSET:

- - -

Usage:

-
-- Define a new GROUPSET Object. This DBObject will contain a reference to all alive GROUPS.
-DBObject = GROUPSET:New()
- -
-
- -
- -
- - diff --git a/Moose Training/Documentation/Message.html b/Moose Training/Documentation/Message.html index b272f052c..b19eb8463 100644 --- a/Moose Training/Documentation/Message.html +++ b/Moose Training/Documentation/Message.html @@ -71,16 +71,28 @@

Module Message

-

Message System to display Messages for Clients and Coalitions or All.

+

This module contains the MESSAGE class.

-

Messages are grouped on the display panel per Category to improve readability for the players. + +

1) Message#MESSAGE class, extends Base#BASE

+

Message System to display Messages to Clients, Coalitions or All. Messages are shown on the display panel for an amount of seconds, and will then disappear. -Messages are identified by an ID. The messages with the same ID belonging to the same category will be overwritten if they were still being displayed on the display panel. -Messages are created with MESSAGE:New(). -Messages are sent to Clients with MESSAGE:ToClient(). -Messages are sent to Coalitions with MESSAGE:ToCoalition(). -Messages are sent to All Players with MESSAGE:ToAll().

+Messages can contain a category which is indicating the category of the message.

+ +

1.1) MESSAGE construction methods

+

Messages are created with Message#MESSAGE.New. Note that when the MESSAGE object is created, no message is sent yet. +To send messages, you need to use the To functions.

+ +

1.2) Send messages with MESSAGE To methods

+

Messages are sent to:

+ +

Global(s)

@@ -88,12 +100,6 @@ Messages are sent to All Players with MESSAGE:ToAll().< - - - -
MESSAGE -
MESSAGEQUEUE -
@@ -118,7 +124,7 @@ Messages are sent to All Players with MESSAGE:ToAll().< - MESSAGE:New(MessageText, MessageCategory, MessageDuration, MessageID) + MESSAGE:New(MessageText, MessageDuration, MessageCategory)

Creates a new MESSAGE object.

@@ -151,34 +157,6 @@ Messages are sent to All Players with MESSAGE:ToAll().< MESSAGE:ToRed()

Sends a MESSAGE to the Red Coalition.

- - - - -

Type MESSAGEQUEUE

- - - - - - - - - - - - - - - -
MESSAGEQUEUE.ClientGroups - -
MESSAGEQUEUE.CoalitionSides - -
MESSAGEQUEUE:New(RefreshInterval) - -
MESSAGEQUEUE:_DisplayMessages() -

This function is called automatically by the MESSAGEQUEUE scheduler.

@@ -196,20 +174,6 @@ Messages are sent to All Players with MESSAGE:ToAll().< - - -
-
- - #MESSAGEQUEUE - -MESSAGEQUEUE - -
-
- - -

Type Message

@@ -265,7 +229,7 @@ Messages are sent to All Players with MESSAGE:ToAll().<
-MESSAGE:New(MessageText, MessageCategory, MessageDuration, MessageID) +MESSAGE:New(MessageText, MessageDuration, MessageCategory)
@@ -285,20 +249,14 @@ is the text of the Message.

  • -

    #string MessageCategory : -is a string expressing the Category of the Message. Messages are grouped on the display panel per Category to improve readability.

    - -
  • -
  • -

    #number MessageDuration : is a number in seconds of how long the MESSAGE should be shown on the display panel.

  • -

    #string MessageID : -is a string expressing the ID of the Message.

    +

    #string MessageCategory : +(optional) is a string expressing the "category" of the Message. The category will be shown as the first text in the message followed by a ": ".

  • @@ -313,10 +271,10 @@ is a string expressing the ID of the Message.

    -- MessageRED is meant to be sent to the RED players only, for 10 seconds, and is classified as "End of Mission", with ID "Win". -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". -- MessageClient1 is meant to be sent to a Client, for 25 seconds, and is classified as "Score", with ID "Score". -MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", "End of Mission", 25, "Win" ) -MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) -MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", "Score", 25, "Score" ) -MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", "Score", 25, "Score" ) +MessageAll = MESSAGE:New( "To all Players: BLUE has won! Each player of BLUE wins 50 points!", 25, "End of Mission" ) +MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", 25, "Penalty" ) +MessageClient1 = MESSAGE:New( "Congratulations, you've just hit a target", 25, "Score" ) +MessageClient2 = MESSAGE:New( "Congratulations, you've just killed a target", 25, "Score")
    @@ -481,74 +439,6 @@ or MessageRED = MESSAGE:New( "To the RED Players: You receive a penalty because you've killed one of your own units", "Penalty", 25, "Score" ) MessageRED:ToRed() - - - -

    Type MESSAGEQUEUE

    - -

    The MESSAGEQUEUE class

    - -

    Field(s)

    -
    -
    - - - -MESSAGEQUEUE.ClientGroups - -
    -
    - - - -
    -
    -
    -
    - - - -MESSAGEQUEUE.CoalitionSides - -
    -
    - - - -
    -
    -
    -
    - - -MESSAGEQUEUE:New(RefreshInterval) - -
    -
    - - - -

    Parameter

    -
      -
    • - -

      RefreshInterval :

      - -
    • -
    -
    -
    -
    -
    - - -MESSAGEQUEUE:_DisplayMessages() - -
    -
    - -

    This function is called automatically by the MESSAGEQUEUE scheduler.

    -
    diff --git a/Moose Training/Documentation/Spawn.html b/Moose Training/Documentation/Spawn.html index dd8c1ec10..ef75c88e3 100644 --- a/Moose Training/Documentation/Spawn.html +++ b/Moose Training/Documentation/Spawn.html @@ -777,8 +777,8 @@ The index of the group to return.

    Return value

    -

    Group#GROUP:

    - +

    Group#GROUP: +self

    diff --git a/Moose Training/Documentation/UnitSet.html b/Moose Training/Documentation/UnitSet.html deleted file mode 100644 index 4f6d4cbad..000000000 --- a/Moose Training/Documentation/UnitSet.html +++ /dev/null @@ -1,685 +0,0 @@ - - - - - - -
    -
    - -
    -
    -
    -
    - -
    -

    Module UnitSet

    - -

    Create and manage a set of units.

    - - - -

    #UNITSET class

    -

    Mission designers can use the UNITSET class to build sets of units belonging to certain:

    - -
      -
    • Coalitions
    • -
    • Categories
    • -
    • Countries
    • -
    • Unit types
    • -
    • Starting with certain prefix strings.
    • -
    - -

    UNITSET construction methods:

    -

    Create a new UNITSET object with the UNITSET.New method:

    - - - - -

    UNITSET filter criteria:

    -

    You can set filter criteria to define the set of units within the UNITSET. -Filter criteria are defined by:

    - - - -

    Once the filter criteria have been set for the UNITSET, you can start filtering using:

    - - - -

    Planned filter criteria within development are (so these are not yet available):

    - - - - -

    UNITSET iterators:

    -

    Once the filters have been defined and the UNITSET has been built, you can iterate the UNITSET with the available iterator methods. -The iterator methods will walk the UNITSET set, and call for each element within the set a function that you provide. -The following iterator methods are currently available within the UNITSET:

    - - - -

    Planned iterators methods in development are (so these are not yet available):

    - - - - -

    Global(s)

    - - - - - -
    UNITSET - -
    -

    Type UNITSET

    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    UNITSET:AddInDatabase(Event) -

    Handles the Database to check on an event (birth) that the Object was added in the Database.

    -
    UNITSET.ClassName - -
    UNITSET.Filter - -
    UNITSET:FilterCategories(Categories) -

    Builds a set of units out of categories.

    -
    UNITSET:FilterCoalitions(Coalitions) -

    Builds a set of units of coalitions.

    -
    UNITSET:FilterCountries(Countries) -

    Builds a set of units of defined countries.

    -
    UNITSET.FilterMeta - -
    UNITSET:FilterPrefixes(Prefixes) -

    Builds a set of units of defined unit prefixes.

    -
    UNITSET:FilterStart() -

    Starts the filtering.

    -
    UNITSET:FilterTypes(Types) -

    Builds a set of units of defined unit types.

    -
    UNITSET:FindInDatabase(Event) -

    Handles the Database to check on any event that Object exists in the Database.

    -
    UNITSET:FindUnit(UnitName) -

    Finds a Unit based on the Unit Name.

    -
    UNITSET:ForEachUnit(IteratorFunction, ...) -

    Interate the UNITSET and call an interator function for each alive UNIT, providing the UNIT and optional parameters.

    -
    UNITSET:IsIncludeObject(MUnit) - -
    UNITSET:New() -

    Creates a new UNITSET object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names.

    -
    UNITSET.Units - -
    - -

    Global(s)

    -
    -
    - - #UNITSET - -UNITSET - -
    -
    - - - -
    -
    -

    Type UnitSet

    - -

    Type UNITSET

    - -

    UNITSET class

    - -

    Field(s)

    -
    -
    - - -UNITSET:AddInDatabase(Event) - -
    -
    - -

    Handles the Database to check on an event (birth) that the Object was added in the Database.

    - - -

    This is required, because sometimes the _DATABASE birth event gets called later than the SET birth event!

    - -

    Parameter

    - -

    Return values

    -
      -
    1. - -

      #string: -The name of the UNIT

      - -
    2. -
    3. - -

      #table: -The UNIT

      - -
    4. -
    -
    -
    -
    -
    - - #string - -UNITSET.ClassName - -
    -
    - - - -
    -
    -
    -
    - - - -UNITSET.Filter - -
    -
    - - - -
    -
    -
    -
    - - -UNITSET:FilterCategories(Categories) - -
    -
    - -

    Builds a set of units out of categories.

    - - -

    Possible current categories are plane, helicopter, ground, ship.

    - -

    Parameter

    -
      -
    • - -

      #string Categories : -Can take the following values: "plane", "helicopter", "ground", "ship".

      - -
    • -
    -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:FilterCoalitions(Coalitions) - -
    -
    - -

    Builds a set of units of coalitions.

    - - -

    Possible current coalitions are red, blue and neutral.

    - -

    Parameter

    -
      -
    • - -

      #string Coalitions : -Can take the following values: "red", "blue", "neutral".

      - -
    • -
    -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:FilterCountries(Countries) - -
    -
    - -

    Builds a set of units of defined countries.

    - - -

    Possible current countries are those known within DCS world.

    - -

    Parameter

    -
      -
    • - -

      #string Countries : -Can take those country strings known within DCS world.

      - -
    • -
    -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - - -UNITSET.FilterMeta - -
    -
    - - - -
    -
    -
    -
    - - -UNITSET:FilterPrefixes(Prefixes) - -
    -
    - -

    Builds a set of units of defined unit prefixes.

    - - -

    All the units starting with the given prefixes will be included within the set.

    - -

    Parameter

    -
      -
    • - -

      #string Prefixes : -The prefix of which the unit name starts with.

      - -
    • -
    -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:FilterStart() - -
    -
    - -

    Starts the filtering.

    - -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:FilterTypes(Types) - -
    -
    - -

    Builds a set of units of defined unit types.

    - - -

    Possible current types are those types known within DCS world.

    - -

    Parameter

    -
      -
    • - -

      #string Types : -Can take those type strings known within DCS world.

      - -
    • -
    -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:FindInDatabase(Event) - -
    -
    - -

    Handles the Database to check on any event that Object exists in the Database.

    - - -

    This is required, because sometimes the _DATABASE event gets called later than the SET event or vise versa!

    - -

    Parameter

    - -

    Return values

    -
      -
    1. - -

      #string: -The name of the UNIT

      - -
    2. -
    3. - -

      #table: -The UNIT

      - -
    4. -
    -
    -
    -
    -
    - - -UNITSET:FindUnit(UnitName) - -
    -
    - -

    Finds a Unit based on the Unit Name.

    - -

    Parameter

    -
      -
    • - -

      #string UnitName :

      - -
    • -
    -

    Return value

    - -

    Unit#UNIT: -The found Unit.

    - -
    -
    -
    -
    - - -UNITSET:ForEachUnit(IteratorFunction, ...) - -
    -
    - -

    Interate the UNITSET and call an interator function for each alive UNIT, providing the UNIT and optional parameters.

    - -

    Parameters

    -
      -
    • - -

      #function IteratorFunction : -The function that will be called when there is an alive UNIT in the UNITSET. The function needs to accept a UNIT parameter.

      - -
    • -
    • - -

      ... :

      - -
    • -
    -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:IsIncludeObject(MUnit) - -
    -
    - - - -

    Parameter

    - -

    Return value

    - -

    #UNITSET: -self

    - -
    -
    -
    -
    - - -UNITSET:New() - -
    -
    - -

    Creates a new UNITSET object, building a set of units belonging to a coalitions, categories, countries, types or with defined prefix names.

    - -

    Return value

    - -

    #UNITSET:

    - - -

    Usage:

    -
    -- Define a new UNITSET Object. This DBObject will contain a reference to all alive Units.
    -DBObject = UNITSET:New()
    - -
    -
    -
    -
    - - - -UNITSET.Units - -
    -
    - - - -
    -
    - -
    - -
    - - diff --git a/Moose Training/Documentation/index.html b/Moose Training/Documentation/index.html index 71f021a69..96be59ebe 100644 --- a/Moose Training/Documentation/index.html +++ b/Moose Training/Documentation/index.html @@ -249,7 +249,7 @@ Message -

    Message System to display Messages for Clients and Coalitions or All.

    +

    This module contains the MESSAGE class.

    diff --git a/Moose Training/Documentation/stylesheet.css b/Moose Training/Documentation/stylesheet.css index 1b82635b5..3477e7fe8 100644 --- a/Moose Training/Documentation/stylesheet.css +++ b/Moose Training/Documentation/stylesheet.css @@ -1,131 +1,884 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +@import url('https://fonts.googleapis.com/css?family=Architects+Daughter'); + html { - color: #000; - background: #FFF; + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ } -body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,button,textarea,p,blockquote,th,td { - margin: 0; - padding: 0; -} -table { - border-collapse: collapse; - border-spacing: 0; -} -fieldset,img { - border: 0; -} -address,caption,cite,code,dfn,em,strong,th,var,optgroup { - font-style: inherit; - font-weight: inherit; -} -del,ins { - text-decoration: none; -} -li { - list-style: bullet; - margin-left: 20px; -} -caption,th { - text-align: left; -} -h1,h2,h3,h4,h5,h6 { - font-size: 100%; - font-weight: bold; -} -q:before,q:after { - content: ''; -} -abbr,acronym { - border: 0; - font-variant: normal; -} -sup { - vertical-align: baseline; -} -sub { - vertical-align: baseline; -} -legend { - color: #000; -} -input,button,textarea,select,optgroup,option { - font-family: inherit; - font-size: inherit; - font-style: inherit; - font-weight: inherit; -} -input,button,textarea,select {*font-size:100%; -} -/* END RESET */ + +/** + * Remove default margin. + */ body { - margin-left: 1em; - margin-right: 1em; - font-family: arial, helvetica, geneva, sans-serif; - background-color: #ffffff; margin: 0px; + margin: 0; } -code, tt { font-family: monospace; } +/* HTML5 display definitions + ========================================================================== */ -body, p, td, th { font-size: .95em; line-height: 1.2em;} +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ -p, ul { margin: 10px 0 0 10px;} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} -strong { font-weight: bold;} +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ -em { font-style: italic;} +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ h1 { - font-size: 1.5em; - margin: 25px 0 20px 0; + margin: 0.67em 0; + font-size: 2em; } -h2, h3, h4 { margin: 15px 0 10px 0; } -h2 { font-size: 1.25em; } -h3 { font-size: 1.15em; } -h4 { font-size: 1.06em; } -a:link { font-weight: bold; color: #004080; text-decoration: none; } -a:visited { font-weight: bold; color: #006699; text-decoration: none; } -a:link:hover { text-decoration: underline; } +/** + * Address styling not present in IE 8/9. + */ + +mark { + color: #000; + background: #ff0; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ hr { - color:#cccccc; - background: #00007f; - height: 1px; + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; } -blockquote { margin-left: 3em; } +/** + * Contain overflow in all browsers. + */ -ul { list-style-type: disc; } - -p.name { - font-family: "Andale Mono", monospace; - padding-top: 1em; +pre { + overflow: auto; } -p:first-child { - margin-top: 0px; +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; } -pre.example { - background-color: rgb(245, 245, 245); - border: 1px solid silver; - padding: 10px; - margin: 10px 0 10px 0; - font-family: "Andale Mono", monospace; - font-size: .85em; +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + margin: 0; /* 3 */ + font: inherit; /* 2 */ + color: inherit; /* 1 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-box-sizing: content-box; /* 2 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; /* 1 */ +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + padding: 0.35em 0.625em 0.75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + padding: 0; /* 2 */ + border: 0; /* 1 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-spacing: 0; + border-collapse: collapse; +} + +td, +th { + padding: 0; +} + +/* LAYOUT STYLES */ +body { + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + color: #666; + background: #fafafa url(../../images/body-bg.jpg) 0 0 repeat; + margin-left: 1em; + margin-right: 1em; + margin: 0px; +} + +p { + margin-top: 0; +} + + +a { + color: #2879d0; +} +a:hover { + color: #2268b2; +} + +header { + padding-top: 40px; + padding-bottom: 40px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x; + border-bottom: solid 1px #275da1; +} + +h1 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 32px; + font-weight: normal; + line-height: 1.5; +} + +h2 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 26px; + font-weight: normal; + line-height: 1.3; +} + +h3 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 22px; + font-weight: normal; + line-height: 1.1; +} + +.inner { + position: relative; + width: 940px; + margin: 0 auto; +} + +#content-wrapper { + padding-top: 30px; + border-top: solid 1px #fff; +} + +#main-content { + float: left; + width: 690px; +} + +#main-content img { + max-width: 100%; +} + +aside#sidebar { + float: right; + width: 200px; + min-height: 504px; + padding-left: 20px; + font-size: 12px; + line-height: 1.3; + background: transparent url(../../images/sidebar-bg.jpg) 0 0 no-repeat; +} + +aside#sidebar p.repo-owner, +aside#sidebar p.repo-owner a { + font-weight: bold; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + width: 134px; + height: 58px; + padding-top: 22px; + padding-left: 68px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 23px; + line-height: 1.2; + color: #fff; +} +a.button small { + display: block; + font-size: 11px; +} +header a.button { + position: absolute; + top: 0; + right: 0; + background: transparent url(../images/github-button.png) 0 0 no-repeat; +} +aside a.button { + display: block; + width: 138px; + padding-left: 64px; + margin-bottom: 20px; + font-size: 21px; + background: transparent url(../images/download-button.png) 0 0 no-repeat; +} + +code, pre { + margin-bottom: 30px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 13px; + color: #222; +} + +code { + padding: 0 3px; + background-color: #f2f8fc; + border: solid 1px #dbe7f3; } pre { - background-color: rgb(245, 245, 245); - border: 1px solid silver; - padding: 10px; - margin: 10px 0 10px 0; - font-family: "Andale Mono", monospace; + padding: 20px; + overflow: auto; + text-shadow: none; + background: #fff; + border: solid 1px #f2f2f2; +} +pre code { + padding: 0; + color: #2879d0; + background-color: #fff; + border: none; +} + +ul, ol, dl { + margin-bottom: 20px; } -table.index { border: 1px #00007f; } -table.index td { text-align: left; vertical-align: top; } +/* COMMON STYLES */ + +hr { + height: 0; + margin-top: 1em; + margin-bottom: 1em; + border: 0; + border-top: solid 1px #ddd; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + font-weight: 300; + text-align: center; + border: 1px solid #ebebeb; +} + +form { + padding: 20px; + background: #f2f2f2; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +#main-content h1 { + margin-top: 0; + margin-bottom: 0; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 2.8em; + font-weight: normal; + color: #474747; + text-indent: 6px; + letter-spacing: -1px; +} + +#main-content h1:before { + padding-right: 0.3em; + margin-left: -0.9em; + color: #9ddcff; + content: "/"; +} + +#main-content h2 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 22px; + font-weight: bold; + color: #474747; + text-indent: 4px; +} +#main-content h2:before { + padding-right: 0.3em; + margin-left: -1.5em; + content: "//"; + color: #9ddcff; +} + +#main-content h3 { + margin-top: 24px; + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 18px; + font-weight: bold; + color: #474747; + text-indent: 3px; +} + +#main-content h3:before { + padding-right: 0.3em; + margin-left: -2em; + content: "///"; + color: #9ddcff; +} + +#main-content h4 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 15px; + font-weight: bold; + color: #474747; + text-indent: 3px; +} + +h4:before { + padding-right: 0.3em; + margin-left: -2.8em; + content: "////"; + color: #9ddcff; +} + +#main-content h5 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 14px; + color: #474747; + text-indent: 3px; +} +h5:before { + padding-right: 0.3em; + margin-left: -3.2em; + content: "/////"; + color: #9ddcff; +} + +#main-content h6 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: .8em; + color: #474747; + text-indent: 3px; +} +h6:before { + padding-right: 0.3em; + margin-left: -3.7em; + content: "//////"; + color: #9ddcff; +} + +p { + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + padding: 0 0 0 30px; + margin-bottom: 20px; + font-size: 1.6em; + border-left: 10px solid #e9e9e9; +} + +ul { + list-style-position: inside; + list-style: disc; + padding-left: 20px; +} + +ol { + list-style-position: inside; + list-style: decimal; + padding-left: 3px; +} + +footer { + padding-top: 20px; + padding-bottom: 30px; + margin-top: 40px; + font-size: 13px; + color: #aaa; + background: transparent url('../../images/hr.png') 0 0 no-repeat; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: '.'; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) { } + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) { + .inner { + width: 740px; + } + header h1, header h2 { + width: 340px; + } + header h1 { + font-size: 60px; + } + header h2 { + font-size: 30px; + } + #main-content { + width: 490px; + } + #main-content h1:before, + #main-content h2:before, + #main-content h3:before, + #main-content h4:before, + #main-content h5:before, + #main-content h6:before { + padding-right: 0; + margin-left: 0; + content: none; + } +} + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + .inner { + width: 93%; + } + header { + padding: 20px 0; + } + header .inner { + position: relative; + } + header h1, header h2 { + width: 100%; + } + header h1 { + font-size: 48px; + } + header h2 { + font-size: 24px; + } + header a.button { + position: relative; + display: inline-block; + width: auto; + height: auto; + padding: 5px 10px; + margin-top: 15px; + font-size: 13px; + line-height: 1; + color: #2879d0; + text-align: center; + background-color: #9ddcff; + background-image: none; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + header a.button small { + display: inline; + font-size: 13px; + } + #main-content, + aside#sidebar { + float: none; + width: 100% ! important; + } + aside#sidebar { + min-height: 0; + padding: 20px 0; + margin-top: 20px; + background-image: none; + border-top: solid 1px #ddd; + } + aside#sidebar a.button { + display: none; + } + #main-content h1:before, + #main-content h2:before, + #main-content h3:before, + #main-content h4:before, + #main-content h5:before, + #main-content h6:before { + padding-right: 0; + margin-left: 0; + content: none; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) { } + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) { } + #container { margin-left: 1em; @@ -144,7 +897,8 @@ table.index td { text-align: left; vertical-align: top; } } #main { - background-color: #f0f0f0; + color: #666; + background: #fafafa url(../../images/body-bg.jpg) 0 0 repeat; border-left: 2px solid #cccccc; } @@ -152,20 +906,28 @@ table.index td { text-align: left; vertical-align: top; } float: left; width: 18em; vertical-align: top; - background-color: #f0f0f0; overflow: scroll; position: fixed; height:100%; + background: #2e7bcf url(../../images/header-bg.jpg) 0 0 repeat-x; + color: #fff; } #navigation h2 { - background-color:#e7e7e7; - font-size:1.1em; - color:#000000; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x; + border-bottom: solid 1px #275da1; + width: 540px; + margin-top: 0; + margin-bottom: 0.2em; + font-size: 36px; + font-weight: normal; + line-height: 1; + color: #fff; + letter-spacing: -1px; text-align: left; padding:0.2em; border-top:1px solid #dddddd; - border-bottom:1px solid #dddddd; } #navigation ul @@ -173,16 +935,24 @@ table.index td { text-align: left; vertical-align: top; } font-size:1em; list-style-type: none; margin: 1px 1px 10px 1px; + color: #fff; } #navigation li { text-indent: -1em; display: block; margin: 3px 0px 0px 22px; + color: #fff; } +#navigation ul li a { + color: #fff; +} + + #navigation li li a { margin: 0px 3px 0px -1em; + color: #fff; } #content { @@ -193,6 +963,27 @@ table.index td { text-align: left; vertical-align: top; } background-color: #ffffff; } + +#content h2 a { + color: #000; + border-bottom: 1px solid #000; +} + +#content h2 a code { +font-size: 22px; +font-weight: 400; +background-color: transparent; +color: #2879d0; +border: none; +} + +#content h1 code { +font-size: 26px; +font-weight: 400; +background-color: transparent; +border: none; +} + #about { clear: both; padding: 5px; @@ -200,70 +991,45 @@ table.index td { text-align: left; vertical-align: top; } background-color: #ffffff; } -@media print { - body { - font: 12pt "Times New Roman", "TimeNR", Times, serif; - } - a { font-weight: bold; color: #004080; text-decoration: underline; } - - #main { - background-color: #ffffff; - border-left: 0px; - } - - #container { - margin-left: 2%; - margin-right: 2%; - background-color: #ffffff; - } - - #content { - padding: 1em; - background-color: #ffffff; - } - - #navigation { - display: none; - } - pre.example { - font-family: "Andale Mono", monospace; - font-size: 10pt; - page-break-inside: avoid; - } -} - -table.module_list { - border-width: 1px; - border-style: solid; - border-color: #cccccc; - border-collapse: collapse; -} -table.module_list td { - border-width: 1px; - padding: 3px; - border-style: solid; - border-color: #cccccc; -} -table.module_list td.name { background-color: #f0f0f0; } -table.module_list td.summary { width: 100%; } - - table.function_list { border-width: 1px; border-style: solid; border-color: #cccccc; border-collapse: collapse; } + table.function_list td { border-width: 1px; padding: 3px; border-style: solid; border-color: #cccccc; + word-wrap:break-word; } -table.function_list td.name { background-color: #f0f0f0; } -table.function_list td.summary { width: 100%; } -dl.table dt, dl.function dt {border-top: 1px solid #ccc; padding-top: 1em;} -dl.table dd, dl.function dd {padding-bottom: 1em; margin: 10px 0 0 20px;} -dl.table h3, dl.function h3 {font-size: .95em;} +table.function_list td.name { font-weight: 400; width:50%; white-space: normal; text-align:left;} +table.function_list td.summary { width: 50%; } + +dl.table dt, dl.function { + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +dl.table dt, dl.function dt { + border-top: 1px solid #000; + padding-top: 0.5em; + padding-bottom: 0.5em; + border-bottom: 1px solid #ccc; +} + +dl.table dd, dl.function dd { + padding-bottom: 0.5em; + margin: 20px 0 0 20px; +} + +dl.table dd, dl.function dd p { + font-weight : normal; +} + +dl.table h3, dl.function h3 {font-size: 1.5em;} diff --git a/Moose Training/Stylesheet/stylesheet.css b/Moose Training/Stylesheet/stylesheet.css new file mode 100644 index 000000000..3477e7fe8 --- /dev/null +++ b/Moose Training/Stylesheet/stylesheet.css @@ -0,0 +1,1035 @@ +/*! normalize.css v3.0.2 | MIT License | git.io/normalize */ + +/** + * 1. Set default font family to sans-serif. + * 2. Prevent iOS text size adjust after orientation change, without disabling + * user zoom. + */ + +@import url('https://fonts.googleapis.com/css?family=Architects+Daughter'); + +html { + font-family: sans-serif; /* 1 */ + -webkit-text-size-adjust: 100%; /* 2 */ + -ms-text-size-adjust: 100%; /* 2 */ +} + +/** + * Remove default margin. + */ + +body { + margin: 0; +} + +/* HTML5 display definitions + ========================================================================== */ + +/** + * Correct `block` display not defined for any HTML5 element in IE 8/9. + * Correct `block` display not defined for `details` or `summary` in IE 10/11 + * and Firefox. + * Correct `block` display not defined for `main` in IE 11. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} + +/** + * 1. Correct `inline-block` display not defined in IE 8/9. + * 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera. + */ + +audio, +canvas, +progress, +video { + display: inline-block; /* 1 */ + vertical-align: baseline; /* 2 */ +} + +/** + * Prevent modern browsers from displaying `audio` without controls. + * Remove excess height in iOS 5 devices. + */ + +audio:not([controls]) { + display: none; + height: 0; +} + +/** + * Address `[hidden]` styling not present in IE 8/9/10. + * Hide the `template` element in IE 8/9/11, Safari, and Firefox < 22. + */ + +[hidden], +template { + display: none; +} + +/* Links + ========================================================================== */ + +/** + * Remove the gray background color from active links in IE 10. + */ + +a { + background-color: transparent; +} + +/** + * Improve readability when focused and also mouse hovered in all browsers. + */ + +a:active, +a:hover { + outline: 0; +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Address styling not present in IE 8/9/10/11, Safari, and Chrome. + */ + +abbr[title] { + border-bottom: 1px dotted; +} + +/** + * Address style set to `bolder` in Firefox 4+, Safari, and Chrome. + */ + +b, +strong { + font-weight: bold; +} + +/** + * Address styling not present in Safari and Chrome. + */ + +dfn { + font-style: italic; +} + +/** + * Address variable `h1` font-size and margin within `section` and `article` + * contexts in Firefox 4+, Safari, and Chrome. + */ + +h1 { + margin: 0.67em 0; + font-size: 2em; +} + +/** + * Address styling not present in IE 8/9. + */ + +mark { + color: #000; + background: #ff0; +} + +/** + * Address inconsistent and variable font size in all browsers. + */ + +small { + font-size: 80%; +} + +/** + * Prevent `sub` and `sup` affecting `line-height` in all browsers. + */ + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove border when inside `a` element in IE 8/9/10. + */ + +img { + border: 0; +} + +/** + * Correct overflow not hidden in IE 9/10/11. + */ + +svg:not(:root) { + overflow: hidden; +} + +/* Grouping content + ========================================================================== */ + +/** + * Address margin not present in IE 8/9 and Safari. + */ + +figure { + margin: 1em 40px; +} + +/** + * Address differences between Firefox and other browsers. + */ + +hr { + height: 0; + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +/** + * Contain overflow in all browsers. + */ + +pre { + overflow: auto; +} + +/** + * Address odd `em`-unit font size rendering in all browsers. + */ + +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} + +/* Forms + ========================================================================== */ + +/** + * Known limitation: by default, Chrome and Safari on OS X allow very limited + * styling of `select`, unless a `border` property is set. + */ + +/** + * 1. Correct color not being inherited. + * Known issue: affects color of disabled elements. + * 2. Correct font properties not being inherited. + * 3. Address margins set differently in Firefox 4+, Safari, and Chrome. + */ + +button, +input, +optgroup, +select, +textarea { + margin: 0; /* 3 */ + font: inherit; /* 2 */ + color: inherit; /* 1 */ +} + +/** + * Address `overflow` set to `hidden` in IE 8/9/10/11. + */ + +button { + overflow: visible; +} + +/** + * Address inconsistent `text-transform` inheritance for `button` and `select`. + * All other form control elements do not inherit `text-transform` values. + * Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera. + * Correct `select` style inheritance in Firefox. + */ + +button, +select { + text-transform: none; +} + +/** + * 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio` + * and `video` controls. + * 2. Correct inability to style clickable `input` types in iOS. + * 3. Improve usability and consistency of cursor style between image-type + * `input` and others. + */ + +button, +html input[type="button"], /* 1 */ +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; /* 2 */ + cursor: pointer; /* 3 */ +} + +/** + * Re-set default cursor for disabled elements. + */ + +button[disabled], +html input[disabled] { + cursor: default; +} + +/** + * Remove inner padding and border in Firefox 4+. + */ + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +/** + * Address Firefox 4+ setting `line-height` on `input` using `!important` in + * the UA stylesheet. + */ + +input { + line-height: normal; +} + +/** + * It's recommended that you don't attempt to style these elements. + * Firefox's implementation doesn't respect box-sizing, padding, or width. + * + * 1. Address box sizing set to `content-box` in IE 8/9/10. + * 2. Remove excess padding in IE 8/9/10. + */ + +input[type="checkbox"], +input[type="radio"] { + box-sizing: border-box; /* 1 */ + padding: 0; /* 2 */ +} + +/** + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ + +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} + +/** + * 1. Address `appearance` set to `searchfield` in Safari and Chrome. + * 2. Address `box-sizing` set to `border-box` in Safari and Chrome + * (include `-moz` to future-proof). + */ + +input[type="search"] { + -webkit-box-sizing: content-box; /* 2 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; /* 1 */ +} + +/** + * Remove inner padding and search cancel button in Safari and Chrome on OS X. + * Safari (but not Chrome) clips the cancel button when the search input has + * padding (and `textfield` appearance). + */ + +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} + +/** + * Define consistent border, margin, and padding. + */ + +fieldset { + padding: 0.35em 0.625em 0.75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} + +/** + * 1. Correct `color` not being inherited in IE 8/9/10/11. + * 2. Remove padding so people aren't caught out if they zero out fieldsets. + */ + +legend { + padding: 0; /* 2 */ + border: 0; /* 1 */ +} + +/** + * Remove default vertical scrollbar in IE 8/9/10/11. + */ + +textarea { + overflow: auto; +} + +/** + * Don't inherit the `font-weight` (applied by a rule above). + * NOTE: the default cannot safely be changed in Chrome and Safari on OS X. + */ + +optgroup { + font-weight: bold; +} + +/* Tables + ========================================================================== */ + +/** + * Remove most spacing between table cells. + */ + +table { + border-spacing: 0; + border-collapse: collapse; +} + +td, +th { + padding: 0; +} + +/* LAYOUT STYLES */ +body { + font-family: 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 15px; + font-weight: 400; + line-height: 1.5; + color: #666; + background: #fafafa url(../../images/body-bg.jpg) 0 0 repeat; + margin-left: 1em; + margin-right: 1em; + margin: 0px; +} + +p { + margin-top: 0; +} + + +a { + color: #2879d0; +} +a:hover { + color: #2268b2; +} + +header { + padding-top: 40px; + padding-bottom: 40px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x; + border-bottom: solid 1px #275da1; +} + +h1 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 32px; + font-weight: normal; + line-height: 1.5; +} + +h2 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 26px; + font-weight: normal; + line-height: 1.3; +} + +h3 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 22px; + font-weight: normal; + line-height: 1.1; +} + +.inner { + position: relative; + width: 940px; + margin: 0 auto; +} + +#content-wrapper { + padding-top: 30px; + border-top: solid 1px #fff; +} + +#main-content { + float: left; + width: 690px; +} + +#main-content img { + max-width: 100%; +} + +aside#sidebar { + float: right; + width: 200px; + min-height: 504px; + padding-left: 20px; + font-size: 12px; + line-height: 1.3; + background: transparent url(../../images/sidebar-bg.jpg) 0 0 no-repeat; +} + +aside#sidebar p.repo-owner, +aside#sidebar p.repo-owner a { + font-weight: bold; +} + +#downloads { + margin-bottom: 40px; +} + +a.button { + width: 134px; + height: 58px; + padding-top: 22px; + padding-left: 68px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 23px; + line-height: 1.2; + color: #fff; +} +a.button small { + display: block; + font-size: 11px; +} +header a.button { + position: absolute; + top: 0; + right: 0; + background: transparent url(../images/github-button.png) 0 0 no-repeat; +} +aside a.button { + display: block; + width: 138px; + padding-left: 64px; + margin-bottom: 20px; + font-size: 21px; + background: transparent url(../images/download-button.png) 0 0 no-repeat; +} + +code, pre { + margin-bottom: 30px; + font-family: Monaco, "Bitstream Vera Sans Mono", "Lucida Console", Terminal, monospace; + font-size: 13px; + color: #222; +} + +code { + padding: 0 3px; + background-color: #f2f8fc; + border: solid 1px #dbe7f3; +} + +pre { + padding: 20px; + overflow: auto; + text-shadow: none; + background: #fff; + border: solid 1px #f2f2f2; +} +pre code { + padding: 0; + color: #2879d0; + background-color: #fff; + border: none; +} + +ul, ol, dl { + margin-bottom: 20px; +} + + +/* COMMON STYLES */ + +hr { + height: 0; + margin-top: 1em; + margin-bottom: 1em; + border: 0; + border-top: solid 1px #ddd; +} + +table { + width: 100%; + border: 1px solid #ebebeb; +} + +th { + font-weight: 500; +} + +td { + font-weight: 300; + text-align: center; + border: 1px solid #ebebeb; +} + +form { + padding: 20px; + background: #f2f2f2; + +} + + +/* GENERAL ELEMENT TYPE STYLES */ + +#main-content h1 { + margin-top: 0; + margin-bottom: 0; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 2.8em; + font-weight: normal; + color: #474747; + text-indent: 6px; + letter-spacing: -1px; +} + +#main-content h1:before { + padding-right: 0.3em; + margin-left: -0.9em; + color: #9ddcff; + content: "/"; +} + +#main-content h2 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 22px; + font-weight: bold; + color: #474747; + text-indent: 4px; +} +#main-content h2:before { + padding-right: 0.3em; + margin-left: -1.5em; + content: "//"; + color: #9ddcff; +} + +#main-content h3 { + margin-top: 24px; + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 18px; + font-weight: bold; + color: #474747; + text-indent: 3px; +} + +#main-content h3:before { + padding-right: 0.3em; + margin-left: -2em; + content: "///"; + color: #9ddcff; +} + +#main-content h4 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 15px; + font-weight: bold; + color: #474747; + text-indent: 3px; +} + +h4:before { + padding-right: 0.3em; + margin-left: -2.8em; + content: "////"; + color: #9ddcff; +} + +#main-content h5 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: 14px; + color: #474747; + text-indent: 3px; +} +h5:before { + padding-right: 0.3em; + margin-left: -3.2em; + content: "/////"; + color: #9ddcff; +} + +#main-content h6 { + margin-bottom: 8px; + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + font-size: .8em; + color: #474747; + text-indent: 3px; +} +h6:before { + padding-right: 0.3em; + margin-left: -3.7em; + content: "//////"; + color: #9ddcff; +} + +p { + margin-bottom: 20px; +} + +a { + text-decoration: none; +} + +p a { + font-weight: 400; +} + +blockquote { + padding: 0 0 0 30px; + margin-bottom: 20px; + font-size: 1.6em; + border-left: 10px solid #e9e9e9; +} + +ul { + list-style-position: inside; + list-style: disc; + padding-left: 20px; +} + +ol { + list-style-position: inside; + list-style: decimal; + padding-left: 3px; +} + +footer { + padding-top: 20px; + padding-bottom: 30px; + margin-top: 40px; + font-size: 13px; + color: #aaa; + background: transparent url('../../images/hr.png') 0 0 no-repeat; +} + +footer a { + color: #666; +} +footer a:hover { + color: #444; +} + +/* MISC */ +.clearfix:after { + display: block; + height: 0; + clear: both; + visibility: hidden; + content: '.'; +} + +.clearfix {display: inline-block;} +* html .clearfix {height: 1%;} +.clearfix {display: block;} + +/* #Media Queries +================================================== */ + +/* Smaller than standard 960 (devices and browsers) */ +@media only screen and (max-width: 959px) { } + +/* Tablet Portrait size to standard 960 (devices and browsers) */ +@media only screen and (min-width: 768px) and (max-width: 959px) { + .inner { + width: 740px; + } + header h1, header h2 { + width: 340px; + } + header h1 { + font-size: 60px; + } + header h2 { + font-size: 30px; + } + #main-content { + width: 490px; + } + #main-content h1:before, + #main-content h2:before, + #main-content h3:before, + #main-content h4:before, + #main-content h5:before, + #main-content h6:before { + padding-right: 0; + margin-left: 0; + content: none; + } +} + +/* All Mobile Sizes (devices and browser) */ +@media only screen and (max-width: 767px) { + .inner { + width: 93%; + } + header { + padding: 20px 0; + } + header .inner { + position: relative; + } + header h1, header h2 { + width: 100%; + } + header h1 { + font-size: 48px; + } + header h2 { + font-size: 24px; + } + header a.button { + position: relative; + display: inline-block; + width: auto; + height: auto; + padding: 5px 10px; + margin-top: 15px; + font-size: 13px; + line-height: 1; + color: #2879d0; + text-align: center; + background-color: #9ddcff; + background-image: none; + border-radius: 5px; + -moz-border-radius: 5px; + -webkit-border-radius: 5px; + } + header a.button small { + display: inline; + font-size: 13px; + } + #main-content, + aside#sidebar { + float: none; + width: 100% ! important; + } + aside#sidebar { + min-height: 0; + padding: 20px 0; + margin-top: 20px; + background-image: none; + border-top: solid 1px #ddd; + } + aside#sidebar a.button { + display: none; + } + #main-content h1:before, + #main-content h2:before, + #main-content h3:before, + #main-content h4:before, + #main-content h5:before, + #main-content h6:before { + padding-right: 0; + margin-left: 0; + content: none; + } +} + +/* Mobile Landscape Size to Tablet Portrait (devices and browsers) */ +@media only screen and (min-width: 480px) and (max-width: 767px) { } + +/* Mobile Portrait Size to Mobile Landscape Size (devices and browsers) */ +@media only screen and (max-width: 479px) { } + + +#container { + margin-left: 1em; + margin-right: 1em; + background-color: #f0f0f0; +} + +#product { + text-align: center; + border-bottom: 1px solid #cccccc; + background-color: #ffffff; +} + +#product big { + font-size: 2em; +} + +#main { + color: #666; + background: #fafafa url(../../images/body-bg.jpg) 0 0 repeat; + border-left: 2px solid #cccccc; +} + +#navigation { + float: left; + width: 18em; + vertical-align: top; + overflow: scroll; + position: fixed; + height:100%; + background: #2e7bcf url(../../images/header-bg.jpg) 0 0 repeat-x; + color: #fff; +} + +#navigation h2 { + font-family: 'Architects Daughter', 'Helvetica Neue', Helvetica, Arial, serif; + background: #2e7bcf url(../images/header-bg.jpg) 0 0 repeat-x; + border-bottom: solid 1px #275da1; + width: 540px; + margin-top: 0; + margin-bottom: 0.2em; + font-size: 36px; + font-weight: normal; + line-height: 1; + color: #fff; + letter-spacing: -1px; + text-align: left; + padding:0.2em; + border-top:1px solid #dddddd; +} + +#navigation ul +{ + font-size:1em; + list-style-type: none; + margin: 1px 1px 10px 1px; + color: #fff; +} + +#navigation li { + text-indent: -1em; + display: block; + margin: 3px 0px 0px 22px; + color: #fff; +} + +#navigation ul li a { + color: #fff; +} + + +#navigation li li a { + margin: 0px 3px 0px -1em; + color: #fff; +} + +#content { + margin-left: 18em; + padding: 1em; + border-left: 2px solid #cccccc; + border-right: 2px solid #cccccc; + background-color: #ffffff; +} + + +#content h2 a { + color: #000; + border-bottom: 1px solid #000; +} + +#content h2 a code { +font-size: 22px; +font-weight: 400; +background-color: transparent; +color: #2879d0; +border: none; +} + +#content h1 code { +font-size: 26px; +font-weight: 400; +background-color: transparent; +border: none; +} + +#about { + clear: both; + padding: 5px; + border-top: 2px solid #cccccc; + background-color: #ffffff; +} + +table.function_list { + border-width: 1px; + border-style: solid; + border-color: #cccccc; + border-collapse: collapse; +} + +table.function_list td { + border-width: 1px; + padding: 3px; + border-style: solid; + border-color: #cccccc; + word-wrap:break-word; +} + +table.function_list td.name { font-weight: 400; width:50%; white-space: normal; text-align:left;} +table.function_list td.summary { width: 50%; } + + +dl.table dt, dl.function { + border-left: 1px solid #ccc; + border-right: 1px solid #ccc; + border-bottom: 1px solid #ccc; +} + +dl.table dt, dl.function dt { + border-top: 1px solid #000; + padding-top: 0.5em; + padding-bottom: 0.5em; + border-bottom: 1px solid #ccc; +} + +dl.table dd, dl.function dd { + padding-bottom: 0.5em; + margin: 20px 0 0 20px; +} + +dl.table dd, dl.function dd p { + font-weight : normal; +} + +dl.table h3, dl.function h3 {font-size: 1.5em;}