Updated Module to use require

This commit is contained in:
Cooldude2606
2018-06-22 19:17:36 +01:00
parent 5602a2aece
commit 90450056bf
47 changed files with 1042 additions and 504 deletions

View File

@@ -233,19 +233,60 @@ Manager.sandbox = setmetatable({
local sandbox = tbl()
local env = type(env) == 'table' and env or type(env) ~= 'nil' and {env} or {}
-- new indexs are saved into sandbox and if _G does not have the index then look in sandbox
local old_mt = getmetatable(_G) or {}
setmetatable(env,{__index=sandbox})
setmetatable(_G,{__index=env,__newindex=sandbox})
-- runs the callback
local rtn = {pcall(callback,...)}
local success = table.remove(rtn,1)
-- this is to allow modules to be access with out the need of using Mangaer[name] also keeps global clean
setmetatable(_G,{__index=ReadOnlyManager})
setmetatable(_G,old_mt)
if success then return sandbox, success, rtn
else return sandbox, success, rtn[1] end
else return setmetatable({},{__index=tbl}) end
end
})
--- Allows access to modules via require and collections are returned as one object
-- @function Manager.require
-- @usage local Module = Manager.require(ModuleName)
-- @usage local Module = Manager.require[ModuleName]
-- @usage local SrcData = Manager.require(path)
-- @treturn table the module that was required, one object containg submodules for a
Manager.require = setmetatable({
__require=require
},{
__metatable=false,
__index=function(tbl,key) return tbl(key) end,
__call=function(tbl,path,env)
local raw_require = rawget(tbl,'__require')
local env = env or {}
-- runs in a sand box becuase sandbox everything
local sandbox, success, data = Manager.sandbox(raw_require,env,path)
-- if there was no error then it assumed the path existed and returns the data
if success then return data
else
-- else it assums the path was a module name and checks index for the module
if moduleIndex[path] then return rawget(Manager.loadModules,path) end
-- if its not listed then it tries to remove a version tag and tries again
local path_no_version = path.find('@') and path:sub(1,path:find('@')-1) or path
if moduleIndex[path_no_version] then return rawget(Manager.loadModules,path_no_version) end
-- still no then it will look for all modules that include this one in the name (like a collection)
local collection = {}
for module_name,path in pairs(moduleIndex) do
if module_name:find(path_no_version) then
local start, _end = module_name:find(path_no_version)
collection[module_name:sub(_end)] = rawget(Manager.loadModules,module_name)
end
end
-- if there is any keys in the collection the collection is returned else the errors with the require error
for _ in pairs(collection) do return collection end
error(data,2)
end
end
})
require = Manager.require
--- Loads the modules that are present in the index list
-- @function Manager.loadModules
-- @usage Manager.loadModules() -- loads all moddules in the index list
@@ -262,7 +303,7 @@ Manager.loadModules = setmetatable({},
for module_name,path in pairs(moduleIndex) do
Manager.verbose('Loading module: "'..module_name..'"; path: '..path)
-- runs the module in a sandbox env
local sandbox, success, module = Manager.sandbox(require,{module_name=setupModuleName(module_name),module_path=path},path..'/control')
local sandbox, success, module = Manager.sandbox(Manager.require.__require,{module_name=setupModuleName(module_name),module_path=path},path..'/control')
-- extracts the module into a global index table for later use
if success then
-- verbose to notifie of any globals that were attempted to be created

Binary file not shown.

View File

@@ -1,21 +0,0 @@
{
"name": "Commands",
"module": "commands",
"description": "A better command handler than the base game.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Commands"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Commands.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0"
}
}

View File

@@ -1,24 +0,0 @@
{
"name": "Gui",
"module": "Gui",
"description": "Adds a objective version to custom guis.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Gui",
"ExpGui"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Gui.zip",
"dependencies": {
"FactorioModGui": "^1.0.0",
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Server": "?^4.0.0"
}
}

View File

@@ -1,24 +0,0 @@
{
"name": "Ranking",
"module": "Ranking",
"description": "A full ranking system for factorio.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Ranking",
"Ranks",
"Permissions",
"Roles"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Server": "?^4.0.0"
}
}

View File

@@ -1,26 +0,0 @@
{
"name": "Server",
"module": "Server",
"description": "Adds a thread system and event listening and a admin bypass (recommend to disable /c and use optional /interface)",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Server",
"Thread",
"Interface",
"Events"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Server.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.String": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Commands": "?^4.0.0"
}
}

View File

@@ -1,25 +0,0 @@
{
"name": "Sync",
"module": "Sync",
"description": "Allows syncing with an outside server and info panle.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Info",
"Sync",
"External",
"Discord"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Sync.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Gui": "?^4.0.0"
}
}

View File

@@ -1,139 +0,0 @@
{
"name": "ExpGamingCore",
"version": "4.0.0",
"module": "Collection",
"description": "Explosive Gaming Core Files",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.zip",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core"
],
"author": "Cooldude2606",
"contact": "Discord: Cooldude2606#5241",
"license": "https://github.com/explosivegaming/scenario/blob/master/LICENSE",
"submodules": {
"Commands": {
"name": "Commands",
"module": "commands",
"description": "A better command handler than the base game.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Commands"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Commands.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0"
}
},
"Gui": {
"name": "Gui",
"module": "Gui",
"description": "Adds a objective version to custom guis.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Gui",
"ExpGui"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Gui.zip",
"dependencies": {
"FactorioModGui": "^1.0.0",
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Server": "?^4.0.0"
}
},
"Ranking": {
"name": "Ranking",
"module": "Ranking",
"description": "A full ranking system for factorio.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Ranking",
"Ranks",
"Permissions",
"Roles"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Server": "?^4.0.0"
}
},
"Server": {
"name": "Server",
"module": "Server",
"description": "Adds a thread system and event listening and a admin bypass (recommend to disable /c and use optional /interface)",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Server",
"Thread",
"Interface",
"Events"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Server.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.String": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Commands": "?^4.0.0"
}
},
"Sync": {
"name": "Sync",
"module": "Sync",
"description": "Allows syncing with an outside server and info panle.",
"keywords": [
"Library",
"Lib",
"ExpGaming",
"Core",
"Info",
"Sync",
"External",
"Discord"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Sync.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Gui": "?^4.0.0"
}
}
},
"dependencies": {}
}

View File

@@ -1,19 +0,0 @@
{
"name": "ExpGamingLib",
"module": "GlobalLib",
"description": "Adds some common functions used though out all ExpGaming modules",
"keywords": [
"ExpGaming",
"Lib"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingLib.zip",
"dependencies": {
"FactorioStdLib.Game": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0"
},
"author": "Cooldude2606",
"contact": "Discord: Cooldude2606#5241",
"license": "https://github.com/explosivegaming/scenario/blob/master/LICENSE"
}

View File

@@ -1,13 +0,0 @@
{
"name": "ExpGamingScenario",
"version": "0.16.51",
"module": "Scenario",
"description": "Explosive gaming's factorio secenario ran on every public server",
"modules": {
"ExpGamingCore": "^4.0.0",
"ExpGamingLib": "^4.0.0",
"FactorioModGui": "^1.0.0",
"FactorioStdLib": "^0.8.0"
},
"dependencies": {}
}

View File

@@ -1,17 +0,0 @@
{
"name": "FactorioModGui",
"module": "mod_gui",
"description": "A way to standadise the way mods hanndle their guis.",
"keywords": [
"Factorio",
"Gui",
"Non-Download",
"Included"
],
"version": "1.0.0",
"location": "url",
"dependencies": {},
"author": "Factorio Dev Team",
"contact": "Any other questions please feel free to ask on the modding help forum.",
"license": "C:/Program Files (x86)/Steam/steamapps/common/Factorio/data/licenses.txt"
}

View File

@@ -1,15 +0,0 @@
{
"name": "Time",
"module": "Time",
"description": "A defines module for retrieving the number of ticks in 1 unit of time.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"Time",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
}

View File

@@ -1,93 +0,0 @@
{
"name": "FactorioStdLib",
"module": "Collection",
"description": "Factorio Standard Library Projects",
"keywords": [
"Standard Library",
"Lib",
"StdLib"
],
"version": "0.8.0",
"location": "url",
"submodules": {
"Color": {
"name": "Color",
"module": "Color",
"description": "A defines module for retrieving colors by name.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"Color",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"Game": {
"name": "Game",
"module": "Game",
"description": "The game module.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"Game",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"String": {
"name": "String",
"module": "string",
"description": "Extends Lua 5.2 string.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"String",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"Table": {
"name": "Table",
"module": "table",
"description": "Extends Lua 5.2 table.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"Table",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"Time": {
"name": "Time",
"module": "Time",
"description": "A defines module for retrieving the number of ticks in 1 unit of time.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"Time",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
}
},
"author": "Afforess",
"contact": "https://github.com/Afforess/Factorio-Stdlib/issues",
"license": "https://github.com/Afforess/Factorio-Stdlib/blob/master/LICENSE",
"dependencies": {}
}

View File

@@ -4,6 +4,12 @@
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
-- this is optional and is hanndled by it being present
local success, Ranking = pcall(require,'ExpGamingCore.Ranking')
if not success then Ranking = nil end success = nil
--- Used as an error constant for validation
-- @field commands.error
-- @usage return commands.error, 'err message'

View File

@@ -1,7 +1,10 @@
{
"name": "Commands",
"version": "4.0.0",
"module": "commands",
"type": "Submodule",
"description": "A better command handler than the base game.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Commands.zip",
"keywords": [
"Library",
"Lib",
@@ -9,8 +12,9 @@
"Core",
"Commands"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Commands.zip",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",

View File

@@ -4,6 +4,9 @@
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local Gui = {}
local Gui_data = {}
local global = global()
@@ -154,8 +157,8 @@ script.on_event('on_player_respawned',function(event)
end)
function Gui:on_init()
if loaded_modules.Server then verbose('ExpGamingCore.Server is installed; Loading server src') require(module_path..'/src/server') end
if loaded_modules.Ranking then
if loaded_modules['ExpGamingCore.Server'] then verbose('ExpGamingCore.Server is installed; Loading server src') require(module_path..'/src/server') end
if loaded_modules['ExpGamingCore.Ranking'] then
verbose('ExpGamingCore.Ranking is installed; Loading ranking src')
script.on_event('on_rank_change',function(event)
Gui.toolbar.on_rank_change(event)

View File

@@ -1,7 +1,10 @@
{
"name": "Gui",
"version": "4.0.0",
"module": "Gui",
"type": "Submodule",
"description": "Adds a objective version to custom guis.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Gui.zip",
"keywords": [
"Library",
"Lib",
@@ -10,8 +13,9 @@
"Gui",
"ExpGui"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Gui.zip",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",

View File

@@ -7,7 +7,10 @@
--- This is a submodule of ExpGamingCore.Gui but for ldoc reasons it is under its own module
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local mod_gui = require("mod-gui")
local center = {}
center._center = {}

View File

@@ -7,7 +7,10 @@
--- This is a submodule of ExpGamingCore.Gui but for ldoc reasons it is under its own module
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local mod_gui = require("mod-gui")
local inputs = {}
inputs._input = {}
-- these are just so you can have short cuts to this

View File

@@ -7,7 +7,12 @@
--- This is a submodule of ExpGamingCore.Gui but for ldoc reasons it is under its own module
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local success, Ranking = pcall(require,'ExpGamingCore.Ranking')
if not success then Ranking = nil end success = nil
local mod_gui = require("mod-gui")
local left = {}
left._left = {}

View File

@@ -7,7 +7,9 @@
--- This is a submodule of ExpGamingCore.Gui but for ldoc reasons it is under its own module
-- @function _comment
local Game = require('FactorioStdLib.Game')
local mod_gui = require("mod-gui")
local popup = {}
popup._popup = {}

View File

@@ -7,6 +7,9 @@
--- This file will be loaded when ExpGamingCore.Commands is present
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Server = require('ExpGamingCore.Server')
--- Adds a server thread that allows the camera follows to be toggled off and on
-- @function __comment
script.on_event(-1,function(event)

View File

@@ -6,6 +6,7 @@
--- This is a submodule of ExpGamingCore.Gui but for ldoc reasons it is under its own module
-- @function _comment
local Gui = require('ExpGamingCore.Gui')
local mod_gui = require("mod-gui")
local gui_tset_close = Gui.inputs.add{

View File

@@ -7,7 +7,11 @@
--- This is a submodule of ExpGamingCore.Gui but for ldoc reasons it is under its own module
-- @function _comment
local Game = require('FactorioStdLib.Game')
local success, Ranking = pcall(require,'ExpGamingCore.Ranking')
if not success then Ranking = nil end success = nil
local mod_gui = require("mod-gui")
local toolbar = {}
--- Add a button to the toolbar, ranks need to be allowed to use these buttons if ranks is preset

View File

@@ -3,6 +3,10 @@
-- @alias Ranking
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local Ranking = {}
local module_verbose = false --true|false
@@ -427,15 +431,13 @@ script.on_event('on_tick',function(event)
end
end)
_G.Ranking = Ranking
verbose('Loading rank core...')
require(module_path..'/src/core')
require(module_path..'/src/core',{Ranking=Ranking})
verbose('Loading rank configs...')
require(module_path..'/src/config')
_G.Ranking = nil
require(module_path..'/src/config',{Ranking=Ranking})
function Ranking:on_init()
if loaded_modules.Server then verbose('ExpGamingCore.Server is installed; Loading server src') require(module_path..'/src/server') end
if loaded_modules['ExpGamingCore.Server'] then verbose('ExpGamingCore.Server is installed; Loading server src') require(module_path..'/src/server',{Ranking=Ranking}) end
end
function Ranking:on_post()

View File

@@ -1,7 +1,10 @@
{
"name": "Ranking",
"version": "4.0.0",
"module": "Ranking",
"type": "Submodule",
"description": "A full ranking system for factorio.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking.zip",
"keywords": [
"Library",
"Lib",
@@ -12,8 +15,9 @@
"Permissions",
"Roles"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking.zip",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",

View File

@@ -7,6 +7,10 @@
--- This file will be loaded when ExpGamingCore.Server is present
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local Server = require('ExpGamingCore.Server')
--- Print a message to all players of this rank
-- @usage rank:print('foo') -- prints to all members of this rank
-- @param rtn any value you want to return

View File

@@ -4,6 +4,9 @@
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local Server = {}
local module_verbose = false --true|false
@@ -464,7 +467,7 @@ end)
function Server:on_init()
for name,id in pairs(defines.events) do if not script.get_event_handler(id) then script.on_event(id,Server._thread_handler) end end
if loaded_modules.commands then verbose('ExpGamingCore.Commands is installed; Loading commands src') require(module_path..'/src/commands') end
if loaded_modules['ExpGamingCore.Commands'] then verbose('ExpGamingCore.Commands is installed; Loading commands src') require(module_path..'/src/commands',{Server=Server}) end
end
return Server

View File

@@ -1,7 +1,10 @@
{
"name": "Server",
"version": "4.0.0",
"module": "Server",
"type": "Submodule",
"description": "Adds a thread system and event listening and a admin bypass (recommend to disable /c and use optional /interface)",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Server.zip",
"keywords": [
"Library",
"Lib",
@@ -12,15 +15,15 @@
"Interface",
"Events"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Server.zip",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.String": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Commands": "?^4.0.0"
}
}

View File

@@ -7,6 +7,8 @@
--- This file will be loaded when ExpGamingCore.Commands is present
-- @function _comment
local Game = require('FactorioStdLib.Game')
--- Runs the given input from the script
-- @command interface
-- @param code The code that will be ran

View File

@@ -4,6 +4,9 @@
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local Sync = {}
local Sync_updates = {}
local module_verbose = false --true|false
@@ -292,8 +295,8 @@ script.on_event('on_tick',function(event)
end)
function Sync:on_init()
if loaded_modules.Gui then verbose('ExpGamingCore.Gui is installed; Loading gui src') require(module_path..'/src/gui') end
if loaded_modules.Ranking then verbose('ExpGamingCore.Ranking is installed; Loading ranking src') require(module_path..'/src/ranking') end
if loaded_modules['ExpGamingCore.Gui'] then verbose('ExpGamingCore.Gui is installed; Loading gui src') require(module_path..'/src/gui',{Sync=Sync}) end
if loaded_modules['ExpGamingCore.Ranking'] then verbose('ExpGamingCore.Ranking is installed; Loading ranking src') require(module_path..'/src/ranking',{Sync=Sync}) end
end
function Sync:on_post()

View File

@@ -1,7 +1,10 @@
{
"name": "Sync",
"version": "4.0.0",
"module": "Sync",
"type": "Submodule",
"description": "Allows syncing with an outside server and info panle.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Sync.zip",
"keywords": [
"Library",
"Lib",
@@ -12,8 +15,9 @@
"External",
"Discord"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Sync.zip",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",

View File

@@ -7,6 +7,9 @@
--- This file will be loaded when ExpGamingCore.Gui is present
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Gui = require('ExpGamingCore.Gui')
local Sync_gui_functions = {}
--- Adds a emeltent to the sever info gui

View File

@@ -6,7 +6,11 @@
--- This file will be loaded when ExpGamingCore.Ranking is present
-- @function _comment
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local Ranking = require('ExpGamingCore.Ranking')
--- Used as a redirect to Ranking._base_preset that will set the rank given to a player apon joining
-- @usage Sync.set_ranks{player_name=rank_name,...}
function Sync.set_ranks(...)

View File

@@ -1,7 +1,8 @@
{
"name": "ExpGamingCore",
"version": "4.0.0",
"module": "Collection",
"module": "expGamingCore",
"type": "Collection",
"description": "Explosive Gaming Core Files",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.zip",
"keywords": [
@@ -16,8 +17,11 @@
"submodules": {
"Commands": {
"name": "Commands",
"version": "4.0.0",
"module": "commands",
"type": "Submodule",
"description": "A better command handler than the base game.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Commands.zip",
"keywords": [
"Library",
"Lib",
@@ -25,8 +29,6 @@
"Core",
"Commands"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Commands.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
@@ -37,8 +39,10 @@
},
"Gui": {
"name": "Gui",
"version": "4.0.0",
"module": "Gui",
"description": "Adds a objective version to custom guis.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Gui.zip",
"keywords": [
"Library",
"Lib",
@@ -47,8 +51,6 @@
"Gui",
"ExpGui"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Gui.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
@@ -56,12 +58,15 @@
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Server": "?^4.0.0"
}
},
"type": "Submodule"
},
"Ranking": {
"name": "Ranking",
"version": "4.0.0",
"module": "Ranking",
"description": "A full ranking system for factorio.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking.zip",
"keywords": [
"Library",
"Lib",
@@ -72,20 +77,21 @@
"Permissions",
"Roles"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Ranking.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Server": "?^4.0.0"
}
},
"type": "Submodule"
},
"Server": {
"name": "Server",
"version": "4.0.0",
"module": "Server",
"description": "Adds a thread system and event listening and a admin bypass (recommend to disable /c and use optional /interface)",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Server.zip",
"keywords": [
"Library",
"Lib",
@@ -96,8 +102,6 @@
"Interface",
"Events"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Server.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Table": "^0.8.0",
@@ -106,12 +110,15 @@
"FactorioStdLib.Game": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Commands": "?^4.0.0"
}
},
"type": "Submodule"
},
"Sync": {
"name": "Sync",
"version": "4.0.0",
"module": "Sync",
"description": "Allows syncing with an outside server and info panle.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Sync.zip",
"keywords": [
"Library",
"Lib",
@@ -122,8 +129,6 @@
"External",
"Discord"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingCore.Sync.zip",
"dependencies": {
"ExpGamingLib": "^4.0.0",
"FactorioStdLib.Color": "^0.8.0",
@@ -131,8 +136,8 @@
"FactorioStdLib.Table": "^0.8.0",
"ExpGamingCore.Ranking": "?^4.0.0",
"ExpGamingCore.Gui": "?^4.0.0"
}
},
"type": "Submodule"
}
},
"dependencies": {}
}
}

View File

@@ -4,6 +4,9 @@
-- @author Cooldude2606
-- @license https://github.com/explosivegaming/scenario/blob/master/LICENSE
local Game = require('FactorioStdLib.Game')
local Color = require('FactorioStdLib.Color')
local module_verbose = false -- there is no verbose in this file so true will do nothing
local ExpLib = {}

View File

@@ -1,19 +1,20 @@
{
"name": "ExpGamingLib",
"version": "4.0.0",
"module": "GlobalLib",
"type": "Module",
"description": "Adds some common functions used though out all ExpGaming modules",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingLib.zip",
"keywords": [
"ExpGaming",
"Lib"
],
"version": "4.0.0",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/ExpGamingLib.zip",
"author": "Cooldude2606",
"contact": "Discord: Cooldude2606#5241",
"license": "https://github.com/explosivegaming/scenario/blob/master/LICENSE",
"dependencies": {
"FactorioStdLib.Game": "^0.8.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0"
},
"author": "Cooldude2606",
"contact": "Discord: Cooldude2606#5241",
"license": "https://github.com/explosivegaming/scenario/blob/master/LICENSE"
}
}

View File

@@ -0,0 +1,232 @@
--- A defines module for retrieving colors by name.
-- Extends the Factorio defines table.
-- @module StdLib.Color
-- @alias defines.color
-- defines table is automatically required in all mod loading stages.
-- luacheck: ignore 122/defines
-- Ignore assigning to read only defines table. defines table is not ready only, however
-- marking it this way allows warnings to be generated when trying to assign values
defines = defines or {} --luacheck: ignore defines (This is used for testing locally)
--- A table of colors allowing retrieval by color name.
-- @table defines.color
-- @field white {r=1.00,g=1.00,b=1.00}
-- @field black {r=0.00,g=0.00,b=0.00}
-- @field darkgrey {r=0.25,g=0.25,b=0.25}
-- @field grey {r=0.50,g=0.50,b=0.50}
-- @field lightgrey {r=0.75,g=0.75,b=0.75}
-- @field red {r=1.00,g=0.00,b=0.00}
-- @field darkred {r=0.50,g=0.00,b=0.00}
-- @field lightred {r=1.00,g=0.50,b=0.50}
-- @field green {r=0.00,g=1.00,b=0.00}
-- @field darkgreen {r=0.00,g=0.50,b=0.00}
-- @field lightgreen {r=0.50,g=1.00,b=0.50}
-- @field blue {r=0.00,g=0.00,b=1.00}
-- @field darkblue {r=0.00,g=0.00,b=0.50}
-- @field lightblue {r=0.50,g=0.50,b=1.00}
-- @field orange {r=1.00,g=0.55,b=0.10}
-- @field yellow {r=1.00,g=1.00,b=0.00}
-- @field pink {r=1.00,g=0.00,b=1.00}
-- @field purple {r=0.60,g=0.10,b=0.60}
-- @field brown {r=0.60,g=0.40,b=0.10}
defines.color = {
white={r=1.00,g=1.00,b=1.00},
black={r=0.00,g=0.00,b=0.00},
darkgrey={r=0.25,g=0.25,b=0.25},
grey={r=0.50,g=0.50,b=0.50},
lightgrey={r=0.75,g=0.75,b=0.75},
red={r=1.00,g=0.00,b=0.00},
darkred={r=0.50,g=0.00,b=0.00},
lightred={r=1.00,g=0.50,b=0.50},
green={r=0.00,g=1.00,b=0.00},
darkgreen={r=0.00,g=0.50,b=0.00},
lightgreen={r=0.50,g=1.00,b=0.50},
blue={r=0.00,g=0.00,b=1.00},
darkblue={r=0.00,g=0.00,b=0.50},
lightblue={r=0.50,g=0.50,b=1.00},
orange={r=1.00,g=0.55,b=0.10},
yellow={r=1.00,g=1.00,b=0.00},
pink={r=1.00,g=0.00,b=1.00},
purple={r=0.60,g=0.10,b=0.60},
brown={r=0.60,g=0.40,b=0.10}
}
local colors = defines.color
--- Returns white for dark colors or black for lighter colors.
-- @table defines.anticolor
defines.anticolor = {
green = colors.black, -- defines.color.black
grey = colors.black, -- defines.color.black
lightblue = colors.black, -- defines.color.black
lightgreen = colors.black, -- defines.color.black
lightgrey = colors.black, -- defines.color.black
lightred = colors.black, -- defines.color.black
orange = colors.black, -- defines.color.black
white = colors.black, -- defines.color.black
yellow = colors.black, -- defines.color.black
black = colors.white, -- defines.color.white
blue = colors.white, -- defines.color.white
brown = colors.white, -- defines.color.white
darkblue = colors.white, -- defines.color.white
darkgreen = colors.white, -- defines.color.white
darkgrey = colors.white, -- defines.color.white
darkred = colors.white, -- defines.color.white
pink = colors.white, -- defines.color.white
purple = colors.white, -- defines.color.white
red = colors.white -- defines.color.white
}
--- Returns a lighter color of a named color
-- @table defines.lightcolor
defines.lightcolor = {
white = colors.lightgrey, -- defines.color.lightgrey
grey = colors.darkgrey, -- defines.color.darkgrey
lightgrey = colors.grey, -- defines.color.grey
red = colors.lightred, -- defines.color.lightred
green = colors.lightgreen, -- defines.color.lightgreen
blue = colors.lightblue, -- defines.color.lightblue
yellow = colors.orange, -- defines.color.orange
pink = colors.purple -- defines.color.purple
}
-- added by cooldude260
--- Returns a lighter color of a named color.
-- @table defines.textcolor
-- @field info {r=0.21,g=0.95,b=1.00}
-- @field bg {r=0.00,g=0.00,b=0.00}
-- @field low {r=0.18,g=0.77,b=0.18}
-- @field med {r=1.00,g=0.89,b=0.26}
-- @field high {r=1.00,g=0.33,b=0.00}
-- @field crit {r=1.00,g=0.00,b=0.00}
defines.textcolor = {
info={r=0.21,g=0.95,b=1.00},
bg={r=0.00,g=0.00,b=0.00},
low={r=0.18,g=0.77,b=0.18},
med={r=1.00,g=0.89,b=0.26},
high={r=1.00,g=0.33,b=0.00},
crit={r=1.00,g=0.00,b=0.00}
}
-- metatable remade by cooldude
local _mt = {
__index=function(tbl,key)
return rawget(tbl,tostring(key):lower()) or rawget(defines.color,'white')
end,
__pairs=function(tbl)
return function()
local v
k, v = next(tbl, k)
return k, (v and {r = v['r'], g = v['g'], b = v['b'], a = v['a']}) or nil
end, tbl, nil
end,
__eq=function(tbl1,tbl2)
return tbl1.r == tbl2.r and tbl1.g == tbl2.g and tbl1.b == tbl2.b and tbl1.a == tbl2.a
end
}
setmetatable(defines.color, _mt)
setmetatable(defines.anticolor, _mt)
setmetatable(defines.textcolor, _mt)
setmetatable(defines.lightcolor, _mt)
local Color = {} --luacheck: allow defined top
--- Set a value for the alpha channel in the given color table.
-- `color.a` represents the alpha channel in the given color table.
-- <ul>
-- <li>If ***alpha*** is given, set `color.a` to it.
-- <li>If ***alpha*** is not given, and if the given color table does not have a value for `color.a`, set `color.a` to 1.
-- <li>If ***alpha*** is not given, and if the given color table already has a value for `color.a`, then leave `color.a` alone.
-- </ul>
-- @tparam[opt=white] defines.color|Concepts.Color color the color to configure
-- @tparam[opt=1] float alpha the alpha value (*[0 - 1]*) to set for the given color
-- @treturn a color table that has the specified value for the alpha channel
function Color.set(color, alpha)
color = color or defines.color.white
Color.to_table(color)
color.a = alpha or color.a or 1
return color
end
--- Converts a color in the array format to a color in the table format.
-- @tparam table c_arr the color to convert
-- @treturn a converted color &mdash; { r = c\_arr[1], g = c\_arr[2], b = c\_arr[3], a = c\_arr[4] }
function Color.to_table(c_arr)
if #c_arr > 0 then
return {r = c_arr[1], g = c_arr[2], b = c_arr[3], a = c_arr[4]}
end
return c_arr
end
--- Converts a color in the rgb format to a color table
-- @tparam[opt=0] int r 0-255 red
-- @tparam[opt=0] int g 0-255 green
-- @tparam[opt=0] int b 0-255 blue
-- @tparam[opt=255] int a 0-255 alpha
-- @treturn Concepts.Color
function Color.from_rgb(r, g, b, a)
r = r or 0
g = g or 0
b = b or 0
a = a or 255
return {r = r/255, g = g/255, b = b/255, a = a/255}
end
--- Get a color table with a hexadecimal string.
-- Optionally provide the value for the alpha channel.
-- @tparam string hex hexadecimal color string (#ffffff, not #fff)
-- @tparam[opt=1] float alpha the alpha value to set; such that ***[ 0 &#8924; value &#8924; 1 ]***
-- @treturn a color table with RGB converted from Hex and with alpha
function Color.from_hex(hex, alpha)
if not _G.Game then error('StdLib/Game not loaded') end
_G.Game.fail_if_missing(hex, "missing color hex value")
if hex:find("#") then hex = hex:sub(2) end
if not(#hex == 6) then error("invalid color hex value: "..hex) end
local number = tonumber(hex, 16)
return {
r = bit32.extract(number, 16, 8) / 255,
g = bit32.extract(number, 8, 8) / 255,
b = bit32.extract(number, 0, 8) / 255,
a = alpha or 1
}
end
--added by cooldude2606
--- Converts a color in the color table format to rgb
-- @tparam table color the color to convert
-- @treturn table the color as rgb
function Color.to_rgb(color)
local r = color.r or 0
local g = color.g or 0
local b = color.b or 0
local a = color.a or 0.5
return {r = r*255, g = g*255, b = b*255, a = a*255}
end
--added by cooldude2606
--- Converts a color in the color table format to hex
-- @tparam table color the color to convert
-- @treturn string the color as hex
function Color.to_hex(color)
local hexadecimal = '0x'
for key, value in pairs{math.floor(color.r*255),math.floor(color.g*255),math.floor(color.b*255)} do
local hex = ''
while(value > 0)do
local index = math.fmod(value, 16) + 1
value = math.floor(value / 16)
hex = string.sub('0123456789ABCDEF', index, index) .. hex
end
if string.len(hex) == 0 then hex = '00'
elseif string.len(hex) == 1 then hex = '0' .. hex
end
hexadecimal = hexadecimal .. hex
end
return hexadecimal
end
return Color

View File

@@ -1,7 +1,10 @@
{
"name": "Color",
"version": "0.8.0",
"module": "Color",
"type": "Submodule",
"description": "A defines module for retrieving colors by name.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.Color.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -9,7 +12,8 @@
"Color",
"Extends"
],
"version": "0.8.0",
"location": "url",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {}
}

View File

@@ -0,0 +1,110 @@
--- The game module.
-- @module StdLib.Game
local Game = { --luacheck: allow defined top
VALID_FILTER = function(v)
return v and v.valid
end,
_protect = function(module_name)
return {
__newindex = function() error("Attempt to mutatate read-only "..module_name.." Module") end,
__metatable = true
}
end,
_concat = function(lhs, rhs)
--Sanatize to remove address
return tostring(lhs):gsub("(%w+)%: %x+", "%1: (ADDR)") .. tostring(rhs):gsub("(%w+)%: %x+", "%1: (ADDR)")
end,
_rawstring = function (t)
local m = getmetatable(t)
local f = m.__tostring
m.__tostring = nil
local s = tostring(t)
m.__tostring = f
return s
end
}
-- No Doc
-- This is a helper global and functions until .16
-- to set the name of your mod in control.lua set _stdlib_mod_name = 'name of your mod'
-- luacheck: ignore _stdlib_mod_name
function Game.get_mod_name()
local ok, mod_name = pcall(function() return script.mod_name end)
return ok and mod_name or _stdlib_mod_name or "stdlib"
end
--- Print msg if specified var evaluates to false.
-- @tparam Mixed var variable to evaluate
-- @tparam[opt="missing value"] string msg message
function Game.fail_if_missing(var, msg)
if not var then
error(msg or "Missing value", 3)
end
return false
end
--- Return a valid player object from event, index, string, or userdata
-- @tparam string|number|LuaPlayer|event mixed
-- @treturn LuaPlayer a valid player or nil
function Game.get_player(mixed)
if type(mixed) == "table" then
if mixed.__self then
return mixed and mixed.valid and mixed
elseif mixed.player_index then
local player = game.players[mixed.player_index]
return player and player.valid and player
end
elseif mixed then
local player = game.players[mixed]
if type(mixed) == "string" and tonumber(mixed) then
for _, p in pairs(game.players) do
if p.name == mixed then
player = p
break
end
end
end
return player and player.valid and player
end
end
--- Return a valid force object from event, string, or userdata
-- @tparam string|LuaForce|event mixed
-- @treturn LuaForce a valid force or nil
function Game.get_force(mixed)
if type(mixed) == "table" then
if mixed.__self then
return mixed and mixed.valid and mixed
elseif mixed.force then
return Game.get_force(mixed.force)
end
elseif type(mixed) == "string" then
local force = game.forces[mixed]
return (force and force.valid) and force
end
end
--- Messages all players currently connected to the game.
--> Offline players are not counted as having received the message.
-- If no players exist msg is stored in the `global._print_queue` table.
-- @tparam string msg the message to send to players
-- @tparam[opt] ?|nil|boolean condition the condition to be true for a player to be messaged
-- @treturn uint the number of players who received the message.
function Game.print_all(msg, condition)
local num = 0
if #game.players > 0 then
for _, player in pairs(game.players) do
if condition == nil or select(2, pcall(condition, player)) then
player.print(msg)
num = num + 1
end
end
return num
else
global._print_queue = global._print_queue or {}
global._print_queue[#global._print_queue + 1] = msg
end
end
return Game

View File

@@ -1,7 +1,10 @@
{
"name": "Game",
"version": "0.8.0",
"module": "Game",
"type": "Submodule",
"description": "The game module.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.Game.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -9,7 +12,8 @@
"Game",
"Extends"
],
"version": "0.8.0",
"location": "url",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {}
}

View File

@@ -0,0 +1,86 @@
--- Extends Lua 5.2 string.
-- @module StdLib.String
-- @alias string
-- luacheck: globals string (Allow mutating string)
--- Returns a copy of the string with any leading or trailing whitespace from the string removed.
-- @tparam string s the string to remove leading or trailing whitespace from
-- @treturn string a copy of the string without leading or trailing whitespace
function string.trim(s)
return (s:gsub("^%s*(.-)%s*$", "%1"))
end
--- Tests if a string starts with a given substring.
-- @tparam string s the string to check for the start substring
-- @tparam string start the substring to test for
-- @treturn boolean true if the start substring was found in the string
function string.starts_with(s, start)
return string.find(s, start, 1, true) == 1
end
--- Tests if a string ends with a given substring.
-- @tparam string s the string to check for the end substring
-- @tparam string ends the substring to test for
-- @treturn boolean true if the end substring was found in the string
function string.ends_with(s, ends)
return #s >= #ends and string.find(s, ends, #s - #ends + 1, true) and true or false
end
--- Tests if a string contains a given substring.
-- @tparam string s the string to check for the substring
-- @tparam string contains the substring to test for
-- @treturn boolean true if the substring was found in the string
function string.contains(s, contains)
return s and string.find(s, contains) ~= nil
end
--- Tests whether a string is empty.
-- @tparam string s the string to test
-- @treturn boolean true if the string is empty
function string.is_empty(s)
return s == nil or s == ''
end
--- Splits a string into an array.
-- *Note:* Empty split substrings are not included in the resulting table.
-- <p>For example, `string.split("foo.bar...", ".", false)` results in the table `{"foo", "bar"}`.
-- @tparam string s the string to split
-- @tparam[opt="."] string sep the separator to use.
-- @tparam[opt=false] boolean pattern whether to interpret the separator as a lua pattern or plaintext for the string split
-- @treturn {string,...} an array of strings
function string.split(s, sep, pattern)
sep = sep or "."
sep = sep ~= "" and sep or "."
sep = not pattern and string.gsub(sep, "([^%w])", "%%%1") or sep
local fields = {}
local start_idx, end_idx = string.find(s, sep)
local last_find = 1
while start_idx do
local substr = string.sub(s, last_find, start_idx - 1)
if string.len(substr) > 0 then
table.insert(fields, string.sub(s, last_find, start_idx - 1))
end
last_find = end_idx + 1
start_idx, end_idx = string.find(s, sep, end_idx + 1)
end
local substr = string.sub(s, last_find)
if string.len(substr) > 0 then
table.insert(fields, string.sub(s, last_find))
end
return fields
end
-- added by cooldude2606
--- Returns a string as a hex format (also a string)
-- @usage a = 'foo'
-- string.to_hex(a) -- return '666f6f'
-- @tparam string str the string to encode
-- @treturn string the hex format of the string
function string.to_hex(str)
if not is_type(str,'string') then return '' end
return str:gsub('.',function (c)
return string.format('%02X',string.byte(c))
end)
end

View File

@@ -1,7 +1,10 @@
{
"name": "String",
"version": "0.8.0",
"module": "string",
"type": "Submodule",
"description": "Extends Lua 5.2 string.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.String.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -9,7 +12,8 @@
"String",
"Extends"
],
"version": "0.8.0",
"location": "url",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {}
}

View File

@@ -0,0 +1,397 @@
--- Extends Lua 5.2 table.
-- @module StdLib.Table
-- @alias table
-- luacheck: globals table (Allow mutating global table)
--- Given a mapping function, creates a transformed copy of the table
--- by calling the function for each element in the table, and using
--- the result as the new value for the key. Passes the index as second argument to the function.
--- @usage a= { 1, 2, 3, 4, 5}
---table.map(a, function(v) return v * 10 end) --produces: { 10, 20, 30, 40, 50 }
--- @usage a = {1, 2, 3, 4, 5}
---table.map(a, function(v, k, x) return v * k + x end, 100) --produces { 101, 104, 109, 116, 125}
-- @tparam table tbl the table to be mapped to the transform
-- @tparam function func the function to transform values
-- @param[opt] ... additional arguments passed to the function
-- @treturn table a new table containing the keys and mapped values
function table.map(tbl, func, ...)
local newtbl = {}
for i, v in pairs(tbl) do
newtbl[i] = func(v, i, ...)
end
return newtbl
end
--- Given a filter function, creates a filtered copy of the table
--- by calling the function for each element in the table, and
--- filtering out any key-value pairs for non-true results. Passes the index as second argument to the function.
--- @usage a= { 1, 2, 3, 4, 5}
---table.filter(a, function(v) return v % 2 == 0 end) --produces: { 2, 4 }
--- @usage a = {1, 2, 3, 4, 5}
---table.filter(a, function(v, k, x) return k % 2 == 1 end) --produces: { 1, 3, 5 }
-- @tparam table tbl the table to be filtered
-- @tparam function func the function to filter values
-- @param[opt] ... additional arguments passed to the function
-- @treturn table a new table containing the filtered key-value pairs
function table.filter(tbl, func, ...)
local newtbl = {}
local insert = #tbl > 0
for k, v in pairs(tbl) do
if func(v, k, ...) then
if insert then table.insert(newtbl, v)
else newtbl[k] = v end
end
end
return newtbl
end
--- Given a candidate search function, iterates over the table, calling the function
--- for each element in the table, and returns the first element the search function returned true.
--- Passes the index as second argument to the function.
--- @usage a= { 1, 2, 3, 4, 5}
---table.find(a, function(v) return v % 2 == 0 end) --produces: 2
--- @usage a = {1, 2, 3, 4, 5}
---table.find(a, function(v, k, x) return k % 2 == 1 end) --produces: 1
-- @tparam table tbl the table to be searched
-- @tparam function func the function to use to search for any matching element
-- @param[opt] ... additional arguments passed to the function
-- @treturn ?|nil|Mixed the first found value, or nil if none was found
function table.find(tbl, func, ...)
for k, v in pairs(tbl) do
if func(v, k, ...) then
return v, k
end
end
return nil
end
--- Given a candidate search function, iterates over the table, calling the function
-- for each element in the table, and returns true if search function returned true.
-- Passes the index as second argument to the function.
-- @usage a= { 1, 2, 3, 4, 5} table.any(a, function(v) return v % 2 == 0 end) --produces: true
-- @usage a = {1, 2, 3, 4, 5} table.any(a, function(v, k, x) return k % 2 == 1 end) --produces: true
-- @tparam table tbl the table to be searched
-- @tparam function func the function to use to search for any matching element
-- @param[opt] ... additional arguments passed to the function
-- @treturn boolean true if an element was found, false if none was found
function table.any(tbl, func, ...)
return table.find(tbl, func, ...) ~= nil
end
--- Given a function, apply it to each element in the table.
-- Passes the index as the second argument to the function.
-- <p>Iteration is aborted if the applied function returns true for any element during iteration.
-- @usage
-- a = {10, 20, 30, 40}
-- table.each(a, function(v) game.print(v) end) --prints 10, 20, 30, 40, 50
-- @tparam table tbl the table to be iterated
-- @tparam function func the function to apply to elements
-- @param[opt] ... additional arguments passed to the function
-- @treturn table the table where the given function has been applied to its elements
function table.each(tbl, func, ...)
for k, v in pairs(tbl) do
if func(v, k, ...) then
break
end
end
return tbl
end
--- Returns a new array that is a one-dimensional recursive flattening of the given array.
-- For every element that is an array, extract its elements into the new array.
-- <p>The optional level argument determines the level of recursion to flatten.
--> This function flattens an integer-indexed array, but not an associative array.
-- @tparam array tbl the array to be flattened
-- @tparam[opt] uint level recursive levels, or no limit to recursion if not supplied
-- @treturn array a new array that represents the flattened contents of the given array
function table.flatten(tbl, level)
local flattened = {}
table.each(tbl,
function(value)
if type(value) == "table" and #value > 0 then
if level then
if level > 0 then
table.merge(flattened, table.flatten(value, level - 1), true)
else
table.insert(flattened, value)
end
else
table.merge(flattened, table.flatten(value), true)
end
else
table.insert(flattened, value)
end
end
)
return flattened
end
--- Given an array, returns the first element or nil if no element exists.
-- @tparam array tbl the array
-- @treturn ?|nil|Mixed the first element
function table.first(tbl)
return tbl[1]
end
--- Given an array, returns the last element or nil if no elements exist.
-- @tparam array tbl the array
-- @treturn ?|nil|Mixed the last element or nil
function table.last(tbl)
local size = #tbl
if size == 0 then return nil end
return tbl[size]
end
--- Given an array of only numeric values, returns the minimum or nil if no element exists.
-- @tparam {number,...} tbl the array with only numeric values
-- @treturn ?|nil|number the minimum value
function table.min(tbl)
if #tbl == 0 then return nil end
local min = tbl[1]
for _, num in pairs(tbl) do
min = num < min and num or min
end
return min
end
---Given an array of only numeric values, returns the maximum or nil if no element exists.
-- @tparam {number,...} tbl the array with only numeric values
-- @treturn ?|nil|number the maximum value
function table.max(tbl)
if #tbl == 0 then return nil end
local max = tbl[1]
for _, num in pairs(tbl) do
max = num > max and num or max
end
return max
end
--- Given an array of only numeric values, return the sum of all values, or 0 for empty arrays.
-- @tparam {number,...} tbl the array with only numeric values
-- @treturn number the sum of the numbers or zero if the given array was empty
function table.sum(tbl)
local sum = 0
for _, num in pairs(tbl) do
sum = sum + num
end
return sum
end
--- Given an array of only numeric values, returns the average or nil if no element exists.
-- @tparam {number,...} tbl the array with only numeric values
-- @treturn ?|nil|number the average value
function table.avg(tbl)
local cnt = #tbl
return cnt ~= 0 and table.sum(tbl) / cnt or nil
end
--- Merges two tables &mdash; values from first get overwritten by the second.
--- @usage
-- function some_func(x, y, args)
-- args = table.merge({option1=false}, args)
-- if opts.option1 == true then return x else return y end
-- end
-- some_func(1,2) -- returns 2
-- some_func(1,2,{option1=true}) -- returns 1
-- @tparam table tblA first table
-- @tparam table tblB second table
-- @tparam[opt=false] boolean array_merge set to true to merge the tables as an array or false for an associative array
-- @treturn array|table an array or an associated array where tblA and tblB have been merged
function table.merge(tblA, tblB, array_merge)
if not tblB then
return tblA
end
if array_merge then
for _, v in pairs(tblB) do
table.insert(tblA, v)
end
else
for k, v in pairs(tblB) do
tblA[k] = v
end
end
return tblA
end
-- copied from factorio/data/core/luablib/util.lua
--- Creates a deep copy of table without copying Factorio objects.
-- @usage local copy = table.deepcopy[data.raw.["stone-furnace"]["stone-furnace"]] -- returns a copy of the stone furnace entity
-- @tparam table object the table to copy
-- @treturn table a copy of the table
function table.deepcopy(object)
local lookup_table = {}
local function _copy(this_object)
if type(this_object) ~= "table" then
return this_object
elseif this_object.__self then
return this_object
elseif lookup_table[this_object] then
return lookup_table[this_object]
end
local new_table = {}
lookup_table[this_object] = new_table
for index, value in pairs(this_object) do
new_table[_copy(index)] = _copy(value)
end
return setmetatable(new_table, getmetatable(this_object))
end
return _copy(object)
end
--- Returns a copy of all of the values in the table.
-- @tparam table tbl the table to copy the keys from, or an empty table if tbl is nil
-- @tparam[opt] boolean sorted whether to sort the keys (slower) or keep the random order from pairs()
-- @tparam[opt] boolean as_string whether to try and parse the values as strings, or leave them as their existing type
-- @treturn array an array with a copy of all the values in the table
function table.values(tbl, sorted, as_string)
if not tbl then return {} end
local valueset = {}
local n = 0
if as_string then --checking as_string /before/ looping is faster
for _, v in pairs(tbl) do
n = n + 1
valueset[n] = tostring(v)
end
else
for _, v in pairs(tbl) do
n = n + 1
valueset[n] = v
end
end
if sorted then
table.sort(valueset,
function(x, y) --sorts tables with mixed index types.
local tx = type(x) == 'number'
local ty = type(y) == 'number'
if tx == ty then
return x < y and true or false --similar type can be compared
elseif tx == true then
return true --only x is a number and goes first
else
return false --only y is a number and goes first
end
end
)
end
return valueset
end
--- Returns a copy of all of the keys in the table.
-- @tparam table tbl the table to copy the keys from, or an empty table if tbl is nil
-- @tparam[opt] boolean sorted whether to sort the keys (slower) or keep the random order from pairs()
-- @tparam[opt] boolean as_string whether to try and parse the keys as strings, or leave them as their existing type
-- @treturn array an array with a copy of all the keys in the table
function table.keys(tbl, sorted, as_string)
if not tbl then return {} end
local keyset = {}
local n = 0
if as_string then --checking as_string /before/ looping is faster
for k, _ in pairs(tbl) do
n = n + 1
keyset[n] = tostring(k)
end
else
for k, _ in pairs(tbl) do
n = n + 1
keyset[n] = k
end
end
if sorted then
table.sort(keyset,
function(x, y) --sorts tables with mixed index types.
local tx = type(x) == 'number'
local ty = type(y) == 'number'
if tx == ty then
return x < y and true or false --similar type can be compared
elseif tx == true then
return true --only x is a number and goes first
else
return false --only y is a number and goes first
end
end
)
end
return keyset
end
--- Removes keys from a table by setting the values associated with the keys to nil.
-- @usage local a = {1, 2, 3, 4}
--table.remove_keys(a, {1,3}) --returns {nil, 2, nil, 4}
-- @usage local b = {k1 = 1, k2 = 'foo', old_key = 'bar'}
--table.remove_keys(b, {'old_key'}) --returns {k1 = 1, k2 = 'foo'}
-- @tparam table tbl the table to remove the keys from
-- @tparam {Mixed,...} keys an array of keys that exist in the given table
-- @treturn table tbl without the specified keys
function table.remove_keys(tbl, keys)
for i = 1, #keys do
tbl[keys[i]] = nil
end
return tbl
end
--- Returns the number of keys in a table, if func is passed only count keys when the function is true.
-- @tparam table tbl to count keys
-- @tparam[opt] function func to incremement counter
-- @param[optchain] ... additional arguments passed to the function
-- @treturn number The number of keys matching the function or the number of all keys if func isn't passed
-- @treturn number The total number of keys
-- @usage local a = { 1, 2, 3, 4, 5}
-- table.count_keys(a) -- produces: 5, 5
-- @usage local a = {1, 2, 3, 4, 5}
-- table.count_keys(a, function(v, k) return k % 2 == 1 end) -- produces: 3, 5
function table.count_keys(tbl, func, ...)
if type(tbl) ~= 'table' then return 0, 0 end
local count, total = 0, 0
for k, v in pairs(tbl) do
total = total + 1
if func then
if func(v, k, ...) then
count = count + 1
end
else
count = count + 1
end
end
return count, total
end
--- Returns an inverted (***{[value] = key,...}***) copy of the given table. If the values are not unique, the assigned key depends on the order of pairs().
-- @usage local a = {k1 = 'foo', k2 = 'bar'}
--table.invert(a) --returns {'foo' = k1, 'bar' = k2}
-- @usage local b = {k1 = 'foo', k2 = 'bar', k3 = 'bar'}
--table.invert(b) --returns {'foo' = k1, 'bar' = ?}
-- @tparam table tbl the table to invert
-- @treturn table a new table with inverted mapping
function table.invert(tbl)
local inverted = {}
for k, v in pairs(tbl) do
inverted[v] = k
end
return inverted
end
--- Return the size of a table using built in table_size function
-- @function size
-- @tparam table table to use
-- @treturn int size of the table
table.size = table_size
--- For all string or number values in an array map them to a key = true table
-- @usage local a = {"v1", "v2"}
-- table.array_to_dict_bool(a) -- return {["v1"] = true, ["v2"]= true}
-- @tparam table tbl the table to convert
-- @treturn table the converted table
function table.arr_to_bool(tbl)
local newtbl = {}
for _, v in pairs(tbl) do
if type(v) == "string" or type(v) == "number" then
newtbl[v] = true
end
end
return newtbl
end

View File

@@ -1,7 +1,10 @@
{
"name": "Table",
"version": "0.8.0",
"module": "table",
"type": "Submodule",
"description": "Extends Lua 5.2 table.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.Table.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -9,7 +12,8 @@
"Table",
"Extends"
],
"version": "0.8.0",
"location": "url",
"author": "<blank>",
"contact": "<blank>",
"license": "<blank>",
"dependencies": {}
}

View File

@@ -1,19 +1,26 @@
{
"name": "FactorioStdLib",
"module": "Collection",
"version": "0.8.0",
"module": "factorioStdLib",
"type": "Collection",
"description": "Factorio Standard Library Projects",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.zip",
"keywords": [
"Standard Library",
"Lib",
"StdLib"
],
"version": "0.8.0",
"location": "url",
"author": "Afforess",
"contact": "https://github.com/Afforess/Factorio-Stdlib/issues",
"license": "https://github.com/Afforess/Factorio-Stdlib/blob/master/LICENSE",
"submodules": {
"Color": {
"name": "Color",
"version": "0.8.0",
"module": "Color",
"type": "Submodule",
"description": "A defines module for retrieving colors by name.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.Color.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -21,14 +28,15 @@
"Color",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"Game": {
"name": "Game",
"version": "0.8.0",
"module": "Game",
"type": "Submodule",
"description": "The game module.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.Game.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -36,14 +44,15 @@
"Game",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"String": {
"name": "String",
"version": "0.8.0",
"module": "string",
"type": "Submodule",
"description": "Extends Lua 5.2 string.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.String.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -51,14 +60,15 @@
"String",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"Table": {
"name": "Table",
"version": "0.8.0",
"module": "table",
"type": "Submodule",
"description": "Extends Lua 5.2 table.",
"location": "https://github.com/explosivegaming/scenario/releases/download/v4.0-core/FactorioStdLib.Table.zip",
"keywords": [
"Standard Library",
"Lib",
@@ -66,28 +76,7 @@
"Table",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
},
"Time": {
"name": "Time",
"module": "Time",
"description": "A defines module for retrieving the number of ticks in 1 unit of time.",
"keywords": [
"Standard Library",
"Lib",
"StdLib",
"Time",
"Extends"
],
"version": "0.8.0",
"location": "url",
"dependencies": {}
}
},
"author": "Afforess",
"contact": "https://github.com/Afforess/Factorio-Stdlib/issues",
"license": "https://github.com/Afforess/Factorio-Stdlib/blob/master/LICENSE",
"dependencies": {}
}
}

View File

@@ -1,12 +1,16 @@
{
"name": "ExpGamingScenario",
"version": "0.16.51",
"module": "Scenario",
"module": "expGamingScenario",
"type": "Scenario",
"description": "Explosive gaming's factorio secenario ran on every public server",
"modules": {
"ExpGamingCore": "^4.0.0",
"ExpGamingLib": "^4.0.0",
"FactorioModGui": "^1.0.0",
"FactorioStdLib.Color": "^0.8.0",
"FactorioStdLib.Game": "^0.8.0",
"FactorioStdLib.String": "^0.8.0",
"FactorioStdLib.Table": "^0.8.0",
"FactorioStdLib": "^0.8.0"
}
}