From 7efbd60b9ed5cf983f4a89c64676ca1b62219dfd Mon Sep 17 00:00:00 2001 From: FlightControl Date: Fri, 27 May 2016 13:21:39 +0200 Subject: [PATCH] DATABASE now also follows correctly the players. --- Moose Development/Moose/Base.lua | 5 +- Moose Development/Moose/Database.lua | 343 +++++++----------- Moose Development/Moose/Moose.lua | 2 +- Moose Development/Moose/Set.lua | 4 +- .../Moose_Test_DATABASE.lua | 15 + .../Moose_Test_DATABASE.miz | Bin 29075 -> 38047 bytes 6 files changed, 157 insertions(+), 212 deletions(-) diff --git a/Moose Development/Moose/Base.lua b/Moose Development/Moose/Base.lua index e2196c8ba..3586673d1 100644 --- a/Moose Development/Moose/Base.lua +++ b/Moose Development/Moose/Base.lua @@ -487,7 +487,10 @@ function BASE:E( Arguments ) end local LineCurrent = DebugInfoCurrent.currentline - local LineFrom = DebugInfoFrom.currentline + local LineFrom = -1 + if DebugInfoFrom then + LineFrom = DebugInfoFrom.currentline + end env.info( string.format( "%6d(%6d)/%1s:%20s%05d.%s(%s)" , LineCurrent, LineFrom, "E", self.ClassName, self.ClassID, Function, routines.utils.oneLineSerialize( Arguments ) ) ) end diff --git a/Moose Development/Moose/Database.lua b/Moose Development/Moose/Database.lua index b0fff9b76..66febcae9 100644 --- a/Moose Development/Moose/Database.lua +++ b/Moose Development/Moose/Database.lua @@ -1,64 +1,34 @@ ---- Manage sets of units and groups. +--- Manage the mission database. -- --- @{#Database} class +-- @{#DATABASE} class -- ================== --- Mission designers can use the DATABASE class to build sets of units belonging to certain: +-- Mission designers can use the DATABASE class to refer to: -- --- * Coalitions --- * Categories --- * Countries --- * Unit types --- * Starting with certain prefix strings. +-- * UNITS +-- * GROUPS +-- * players +-- * alive players +-- * CLIENTS +-- * alive CLIENTS -- --- This list will grow over time. Planned developments are to include filters and iterators. --- Additional filters will be added around @{Zone#ZONEs}, Radiuses, Active players, ... --- More iterators will be implemented in the near future ... --- --- Administers the Initial Sets of the Mission Templates as defined within the Mission Editor. --- --- DATABASE construction methods: --- ================================= --- Create a new DATABASE object with the @{#DATABASE.New} method: --- --- * @{#DATABASE.New}: Creates a new DATABASE object. --- --- --- DATABASE filter criteria: --- ========================= --- You can set filter criteria to define the set of units within the database. --- Filter criteria are defined by: --- --- * @{#DATABASE.FilterCoalitions}: Builds the DATABASE with the units belonging to the coalition(s). --- * @{#DATABASE.FilterCategories}: Builds the DATABASE with the units belonging to the category(ies). --- * @{#DATABASE.FilterTypes}: Builds the DATABASE with the units belonging to the unit type(s). --- * @{#DATABASE.FilterCountries}: Builds the DATABASE with the units belonging to the country(ies). --- * @{#DATABASE.FilterUnitPrefixes}: Builds the DATABASE with the units starting with the same prefix string(s). --- --- Once the filter criteria have been set for the DATABASE, you can start filtering using: --- --- * @{#DATABASE.FilterStart}: Starts the filtering of the units within the database. --- --- Planned filter criteria within development are (so these are not yet available): --- --- * @{#DATABASE.FilterGroupPrefixes}: Builds the DATABASE with the groups of the units starting with the same prefix string(s). --- * @{#DATABASE.FilterZones}: Builds the DATABASE with the units within a @{Zone#ZONE}. +-- On top, for internal MOOSE administration purposes, the DATBASE administers the Unit and Gruop templates as defined within the Mission Editor. -- +-- Moose will automatically create one instance of the DATABASE class into the **global** object _DATABASE. +-- Moose refers to _DATABASE within the framework extensively, but you can also refer to the _DATABASE object within your missions if required. -- -- DATABASE iterators: -- =================== --- Once the filters have been defined and the DATABASE has been built, you can iterate the database with the available iterator methods. +-- You can iterate the database with the available iterator methods. -- The iterator methods will walk the DATABASE set, and call for each element within the set a function that you provide. -- The following iterator methods are currently available within the DATABASE: -- --- * @{#DATABASE.ForEachAliveUnit}: Calls a function for each alive unit it finds within the DATABASE. +-- * @{#DATABASE.ForEachUnit}: Calls a function for each @{UNIT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachGroup}: Calls a function for each @{GROUP} it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayer}: Calls a function for each player it finds within the DATABASE. +-- * @{#DATABASE.ForEachPlayerAlive}: Calls a function for each alive player it finds within the DATABASE. +-- * @{#DATABASE.ForEachClient}: Calls a function for each @{CLIENT} it finds within the DATABASE. +-- * @{#DATABASE.ForEachClientAlive}: Calls a function for each alive @{CLIENT} it finds within the DATABASE. -- --- Planned iterators methods in development are (so these are not yet available): --- --- * @{#DATABASE.ForEachUnit}: Calls a function for each unit contained within the DATABASE. --- * @{#DATABASE.ForEachGroup}: Calls a function for each group contained within the DATABASE. --- * @{#DATABASE.ForEachUnitInZone}: Calls a function for each unit within a certain zone contained within the DATABASE. --- --- ==== -- @module Database -- @author FlightControl @@ -70,6 +40,7 @@ Include.File( "Unit" ) Include.File( "Event" ) Include.File( "Client" ) + --- DATABASE class -- @type DATABASE -- @extends Base#BASE @@ -85,34 +56,11 @@ DATABASE = { DCSGroups = {}, UNITS = {}, GROUPS = {}, - NavPoints = {}, - Statics = {}, - Players = {}, - PlayersAlive = {}, + PLAYERS = {}, + PLAYERSALIVE = {}, CLIENTS = {}, - ClientsAlive = {}, - Filter = { - Coalitions = nil, - Categories = nil, - Types = nil, - Countries = nil, - UnitPrefixes = nil, - GroupPrefixes = nil, - }, - FilterMeta = { - Coalitions = { - red = coalition.side.RED, - blue = coalition.side.BLUE, - neutral = coalition.side.NEUTRAL, - }, - Categories = { - plane = Unit.Category.AIRPLANE, - helicopter = Unit.Category.HELICOPTER, - ground = Unit.Category.GROUND_UNIT, - ship = Unit.Category.SHIP, - structure = Unit.Category.STRUCTURE, - }, - }, + CLIENTSALIVE = {}, + NavPoints = {}, } local _DATABASECoalition = @@ -147,12 +95,13 @@ function DATABASE:New() _EVENTDISPATCHER:OnCrash( self._EventOnDeadOrCrash, self ) - -- Add database with registered clients and already alive players - -- Follow alive players and clients _EVENTDISPATCHER:OnPlayerEnterUnit( self._EventOnPlayerEnterUnit, self ) _EVENTDISPATCHER:OnPlayerLeaveUnit( self._EventOnPlayerLeaveUnit, self ) + self:_RegisterTemplates() + self:_RegisterDatabase() + self:_RegisterPlayers() return self end @@ -167,6 +116,7 @@ function DATABASE:FindUnit( UnitName ) return UnitFound end + --- Adds a Unit based on the Unit Name in the DATABASE. -- @param #DATABASE self function DATABASE:AddUnit( DCSUnit, DCSUnitName ) @@ -175,6 +125,7 @@ function DATABASE:AddUnit( DCSUnit, DCSUnitName ) self.UNITS[DCSUnitName] = UNIT:Register( DCSUnitName ) end + --- Deletes a Unit from the DATABASE based on the Unit Name. -- @param #DATABASE self function DATABASE:DeleteUnit( DCSUnitName ) @@ -182,6 +133,7 @@ function DATABASE:DeleteUnit( DCSUnitName ) self.DCSUnits[DCSUnitName] = nil end + --- Finds a CLIENT based on the ClientName. -- @param #DATABASE self -- @param #string ClientName @@ -192,6 +144,7 @@ function DATABASE:FindClient( ClientName ) return ClientFound end + --- Adds a CLIENT based on the ClientName in the DATABASE. -- @param #DATABASE self function DATABASE:AddClient( ClientName ) @@ -200,6 +153,7 @@ function DATABASE:AddClient( ClientName ) self:E( self.CLIENTS[ClientName]:GetClassNameAndID() ) end + --- Finds a GROUP based on the GroupName. -- @param #DATABASE self -- @param #string GroupName @@ -210,6 +164,7 @@ function DATABASE:FindGroup( GroupName ) return GroupFound end + --- Adds a GROUP based on the GroupName in the DATABASE. -- @param #DATABASE self function DATABASE:AddGroup( DCSGroup, GroupName ) @@ -218,6 +173,30 @@ function DATABASE:AddGroup( DCSGroup, GroupName ) self.GROUPS[GroupName] = GROUP:Register( GroupName ) end +--- Adds a player based on the Player Name in the DATABASE. +-- @param #DATABASE self +function DATABASE:AddPlayer( UnitName, PlayerName ) + + if PlayerName then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self.PLAYERS[PlayerName] = PlayerName + self.PLAYERSALIVE[PlayerName] = PlayerName + self.CLIENTSALIVE[PlayerName] = self:FindClient( UnitName ) + end +end + +--- Deletes a player from the DATABASE based on the Player Name. +-- @param #DATABASE self +function DATABASE:DeletePlayer( PlayerName ) + + if PlayerName then + self:E( { "Clean player:", PlayerName } ) + self.PLAYERSALIVE[PlayerName] = nil + self.CLIENTSALIVE[PlayerName] = nil + end +end + + --- Instantiate new Groups within the DCSRTE. -- This method expects EXACTLY the same structure as a structure within the ME, and needs 2 additional fields defined: -- SpawnCountryID, SpawnCategoryID @@ -253,7 +232,6 @@ function DATABASE:Spawn( SpawnTemplate ) return SpawnGroup end - --- Set a status to a Group within the Database, this to check crossing events for example. function DATABASE:SetStatusGroup( GroupName, Status ) self:F2( Status ) @@ -261,7 +239,6 @@ function DATABASE:SetStatusGroup( GroupName, Status ) self.Templates.Groups[GroupName].Status = Status end - --- Get a status to a Group within the Database, this to check crossing events for example. function DATABASE:GetStatusGroup( GroupName ) self:F2( Status ) @@ -273,6 +250,7 @@ function DATABASE:GetStatusGroup( GroupName ) end end + --- Private method that registers new Group Templates within the DATABASE Object. -- @param #DATABASE self -- @param #table GroupTemplate @@ -317,6 +295,7 @@ function DATABASE:_RegisterTemplate( GroupTemplate ) end end + --- Private method that registers all alive players in the mission. -- @param #DATABASE self -- @return #DATABASE self @@ -328,9 +307,10 @@ function DATABASE:_RegisterPlayers() self:T3( { "UnitData:", UnitData } ) if UnitData and UnitData:isExist() then local UnitName = UnitData:getName() - if not self.PlayersAlive[UnitName] then - self:E( { "Add player for unit:", UnitName, UnitData:getPlayerName() } ) - self.PlayersAlive[UnitName] = UnitData:getPlayerName() + local PlayerName = UnitData:getPlayerName() + if not self.PLAYERS[PlayerName] then + self:E( { "Add player for unit:", UnitName, PlayerName } ) + self:AddPlayer( UnitName, PlayerName ) end end end @@ -339,6 +319,7 @@ function DATABASE:_RegisterPlayers() return self end + --- Private method that registers all datapoints within in the mission. -- @param #DATABASE self -- @return #DATABASE self @@ -384,14 +365,13 @@ function DATABASE:_EventOnBirth( Event ) self:F2( { Event } ) if Event.IniDCSUnit then - if self:_IsIncludeDCSUnit( Event.IniDCSUnit ) then - self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) - self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) - self:_EventOnPlayerEnterUnit( Event ) - end + self:AddUnit( Event.IniDCSUnit, Event.IniDCSUnitName ) + self:AddGroup( Event.IniDCSGroup, Event.IniDCSGroupName ) + self:_EventOnPlayerEnterUnit( Event ) end end + --- Handles the OnDead or OnCrash event for alive units set. -- @param #DATABASE self -- @param Event#EVENTDATA Event @@ -406,6 +386,7 @@ function DATABASE:_EventOnDeadOrCrash( Event ) end end + --- Handles the OnPlayerEnterUnit event to fill the active players table (with the unit filter applied). -- @param #DATABASE self -- @param Event#EVENTDATA Event @@ -413,16 +394,14 @@ function DATABASE:_EventOnPlayerEnterUnit( Event ) self:F2( { Event } ) if Event.IniDCSUnit then - if self:_IsIncludeDCSUnit( Event.IniDCSUnit ) then - if not self.PlayersAlive[Event.IniDCSUnitName] then - self:E( { "Add player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) - self.PlayersAlive[Event.IniDCSUnitName] = Event.IniDCSUnit:getPlayerName() - self.ClientsAlive[Event.IniDCSUnitName] = self.CLIENTS[ Event.IniDCSUnitName ] - end + local PlayerName = Event.IniDCSUnit:getPlayerName() + if not self.PLAYERSALIVE[PlayerName] then + self:AddPlayer( Event.IniDCSUnitName, PlayerName ) end end end + --- Handles the OnPlayerLeaveUnit event to clean the active players table. -- @param #DATABASE self -- @param Event#EVENTDATA Event @@ -430,19 +409,16 @@ function DATABASE:_EventOnPlayerLeaveUnit( Event ) self:F2( { Event } ) if Event.IniDCSUnit then - if self:_IsIncludeDCSUnit( Event.IniDCSUnit ) then - if self.PlayersAlive[Event.IniDCSUnitName] then - self:E( { "Cleaning player for unit:", Event.IniDCSUnitName, Event.IniDCSUnit:getPlayerName() } ) - self.PlayersAlive[Event.IniDCSUnitName] = nil - self.ClientsAlive[Event.IniDCSUnitName] = nil - end + local PlayerName = Event.IniDCSUnit:getPlayerName() + if self.PLAYERSALIVE[PlayerName] then + self:DeletePlayer( PlayerName ) end end end --- Iterators ---- Interate the DATABASE and call an interator function for the given set, providing the Object for each element within the set and optional parameters. +--- Iterate the DATABASE and call an iterator function for the given set, providing the Object for each element within the set and optional parameters. -- @param #DATABASE self -- @param #function IteratorFunction The function that will be called when there is an alive player in the database. -- @return #DATABASE self @@ -485,9 +461,9 @@ function DATABASE:ForEach( IteratorFunction, arg, Set ) end ---- Interate the DATABASE and call an interator function for each **alive** unit, providing the Unit and optional parameters. +--- Iterate the DATABASE and call an iterator function for each **alive** unit, providing the DCSUnit and optional parameters. -- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a UNIT parameter. +-- @param #function IteratorFunction The function that will be called when there is an alive unit in the database. The function needs to accept a DCSUnit parameter. -- @return #DATABASE self function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) self:F2( arg ) @@ -497,20 +473,58 @@ function DATABASE:ForEachDCSUnit( IteratorFunction, ... ) return self end ---- Interate the DATABASE and call an interator function for each **alive** player, providing the Unit of the player and optional parameters. + +--- Iterate the DATABASE and call an iterator function for each **alive** UNIT, providing the UNIT and optional parameters. -- @param #DATABASE self --- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @param #function IteratorFunction The function that will be called when there is an alive UNIT in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachUnit( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.UNITS ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each **alive** GROUP, providing the GROUP and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive GROUP in the database. The function needs to accept a GROUP parameter. +-- @return #DATABASE self +function DATABASE:ForEachGroup( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.GROUPS ) + + return self +end + + +--- Iterate the DATABASE and call an iterator function for each player, providing the player name and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an player in the database. The function needs to accept the player name. -- @return #DATABASE self function DATABASE:ForEachPlayer( IteratorFunction, ... ) self:F2( arg ) - self:ForEach( IteratorFunction, arg, self.PlayersAlive ) + self:ForEach( IteratorFunction, arg, self.PLAYERS ) return self end ---- Interate the DATABASE and call an interator function for each client, providing the Client to the function and optional parameters. +--- Iterate the DATABASE and call an iterator function for each **alive** player, providing the Unit of the player and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a UNIT parameter. +-- @return #DATABASE self +function DATABASE:ForEachPlayerAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.PLAYERSALIVE ) + + return self +end + +--- Iterate the DATABASE and call an iterator function for each CLIENT, providing the CLIENT to the function and optional parameters. -- @param #DATABASE self -- @param #function IteratorFunction The function that will be called when there is an alive player in the database. The function needs to accept a CLIENT parameter. -- @return #DATABASE self @@ -522,8 +536,20 @@ function DATABASE:ForEachClient( IteratorFunction, ... ) return self end +--- Iterate the DATABASE and call an iterator function for each **ALIVE** CLIENT, providing the CLIENT to the function and optional parameters. +-- @param #DATABASE self +-- @param #function IteratorFunction The function that will be called when there is an alive CLIENT in the database. The function needs to accept a CLIENT parameter. +-- @return #DATABASE self +function DATABASE:ForEachClientAlive( IteratorFunction, ... ) + self:F2( arg ) + + self:ForEach( IteratorFunction, arg, self.CLIENTSALIVE ) -function DATABASE:ScanEnvironment() + return self +end + + +function DATABASE:_RegisterTemplates() self:F2() self.Navpoints = {} @@ -586,110 +612,9 @@ function DATABASE:ScanEnvironment() end --if coa_name == 'red' or coa_name == 'blue' and type(coa_data) == 'table' then end --for coa_name, coa_data in pairs(mission.coalition) do - self:_RegisterDatabase() - self:_RegisterPlayers() - return self end ---- --- @param #DATABASE self --- @param DCSUnit#Unit DCSUnit --- @return #DATABASE self -function DATABASE:_IsIncludeDCSUnit( DCSUnit ) - self:F2( DCSUnit ) - local DCSUnitInclude = true - - if self.Filter.Coalitions then - local DCSUnitCoalition = false - for CoalitionID, CoalitionName in pairs( self.Filter.Coalitions ) do - self:T2( { "Coalition:", DCSUnit:getCoalition(), self.FilterMeta.Coalitions[CoalitionName], CoalitionName } ) - if self.FilterMeta.Coalitions[CoalitionName] and self.FilterMeta.Coalitions[CoalitionName] == DCSUnit:getCoalition() then - DCSUnitCoalition = true - end - end - DCSUnitInclude = DCSUnitInclude and DCSUnitCoalition - end - - if self.Filter.Categories then - local DCSUnitCategory = false - for CategoryID, CategoryName in pairs( self.Filter.Categories ) do - self:T2( { "Category:", DCSUnit:getDesc().category, self.FilterMeta.Categories[CategoryName], CategoryName } ) - if self.FilterMeta.Categories[CategoryName] and self.FilterMeta.Categories[CategoryName] == DCSUnit:getDesc().category then - DCSUnitCategory = true - end - end - DCSUnitInclude = DCSUnitInclude and DCSUnitCategory - end - - if self.Filter.Types then - local DCSUnitType = false - for TypeID, TypeName in pairs( self.Filter.Types ) do - self:T2( { "Type:", DCSUnit:getTypeName(), TypeName } ) - if TypeName == DCSUnit:getTypeName() then - DCSUnitType = true - end - end - DCSUnitInclude = DCSUnitInclude and DCSUnitType - end - - if self.Filter.Countries then - local DCSUnitCountry = false - for CountryID, CountryName in pairs( self.Filter.Countries ) do - self:T2( { "Country:", DCSUnit:getCountry(), CountryName } ) - if country.id[CountryName] == DCSUnit:getCountry() then - DCSUnitCountry = true - end - end - DCSUnitInclude = DCSUnitInclude and DCSUnitCountry - end - - if self.Filter.UnitPrefixes then - local DCSUnitPrefix = false - for UnitPrefixId, UnitPrefix in pairs( self.Filter.UnitPrefixes ) do - self:T2( { "Unit Prefix:", string.find( DCSUnit:getName(), UnitPrefix, 1 ), UnitPrefix } ) - if string.find( DCSUnit:getName(), UnitPrefix, 1 ) then - DCSUnitPrefix = true - end - end - DCSUnitInclude = DCSUnitInclude and DCSUnitPrefix - end - - self:T2( DCSUnitInclude ) - return DCSUnitInclude -end - ---- --- @param #DATABASE self --- @param DCSUnit#Unit DCSUnit --- @return #DATABASE self -function DATABASE:_IsAliveDCSUnit( DCSUnit ) - self:F2( DCSUnit ) - local DCSUnitAlive = false - if DCSUnit and DCSUnit:isExist() and DCSUnit:isActive() then - if self.DCSUnits[DCSUnit:getName()] then - DCSUnitAlive = true - end - end - self:T2( DCSUnitAlive ) - return DCSUnitAlive -end - ---- --- @param #DATABASE self --- @param DCSGroup#Group DCSGroup --- @return #DATABASE self -function DATABASE:_IsAliveDCSGroup( DCSGroup ) - self:F2( DCSGroup ) - local DCSGroupAlive = false - if DCSGroup and DCSGroup:isExist() then - if self.DCSGroups[DCSGroup:getName()] then - DCSGroupAlive = true - end - end - self:T2( DCSGroupAlive ) - return DCSGroupAlive -end diff --git a/Moose Development/Moose/Moose.lua b/Moose Development/Moose/Moose.lua index b9df585ce..123f51481 100644 --- a/Moose Development/Moose/Moose.lua +++ b/Moose Development/Moose/Moose.lua @@ -11,5 +11,5 @@ Include.File( "Event" ) _EVENTDISPATCHER = EVENT:New() -- #EVENT --- Declare the main database object, which is used internally by the MOOSE classes. -_DATABASE = DATABASE:New():ScanEnvironment() -- Database#DATABASE +_DATABASE = DATABASE:New() -- Database#DATABASE diff --git a/Moose Development/Moose/Set.lua b/Moose Development/Moose/Set.lua index 6b0ba0260..feff204a4 100644 --- a/Moose Development/Moose/Set.lua +++ b/Moose Development/Moose/Set.lua @@ -325,7 +325,7 @@ end --- Flushes the current SET contents in the log ... (for debug reasons). -- @param #SET self --- @return #SET self +-- @return #string A string with the names of the objects. function SET:Flush() self:F3() @@ -334,6 +334,8 @@ function SET:Flush() ObjectNames = ObjectNames .. ObjectName .. ", " end self:T( { "Objects in Set:", ObjectNames } ) + + return ObjectNames end diff --git a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua b/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua index cbea27ae9..d299d3501 100644 --- a/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua +++ b/Moose Test Missions/Moose_Test_DATABASE/Moose_Test_DATABASE.lua @@ -88,6 +88,21 @@ 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 index 7f9c38b8f44683700581f2ac62ab650541703abc..35621d8d47379b72dda92f0f740f4a5442d94ba8 100644 GIT binary patch delta 24800 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 delta 15804 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