668 lines
21 KiB
Lua
668 lines
21 KiB
Lua
-------------------------------------------------------------------------------
|
|
---Description of the module.
|
|
---@class User
|
|
local User = {
|
|
---single-line comment
|
|
classname = "HMUser",
|
|
gui = "gui",
|
|
prefixe = "helmod",
|
|
version = "0.9.12",
|
|
tab_name = "HMProductionPanel",
|
|
delay_tips = 60*10
|
|
}
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get global variable for user
|
|
---@param key string
|
|
---@return any
|
|
function User.get(key)
|
|
if global["users"] == nil then
|
|
global["users"] = {}
|
|
end
|
|
local user_name = User.name()
|
|
if global["users"][user_name] == nil then
|
|
global["users"][user_name] = {}
|
|
end
|
|
|
|
if key ~= nil then
|
|
if global["users"][user_name][key] == nil then
|
|
global["users"][user_name][key] = {}
|
|
end
|
|
return global["users"][user_name][key]
|
|
end
|
|
return global["users"][user_name]
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get Name
|
|
---@return string
|
|
function User.name()
|
|
return Player.native().name or Player.native().index or "nil"
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return is admin player
|
|
---@return boolean
|
|
function User.isAdmin()
|
|
return Player.native().admin
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return is writer player
|
|
---@param model table
|
|
---@return boolean
|
|
function User.isReader(model)
|
|
return Player.isAdmin() or model.owner == Player.native().name or (model.share ~= nil and bit32.band(model.share, 1) > 0)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return is writer player
|
|
---@param model table
|
|
---@return boolean
|
|
function User.isWriter(model)
|
|
return Player.isAdmin() or model.owner == Player.native().name or (model.share ~= nil and bit32.band(model.share, 2) > 0)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return is writer player
|
|
---@param model table
|
|
---@return boolean
|
|
function User.isDeleter(model)
|
|
return Player.isAdmin() or model.owner == Player.native().name or (model.share ~= nil and bit32.band(model.share, 4) > 0)
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return is filter translate
|
|
---@return boolean
|
|
function User.isFilterTranslate()
|
|
return User.getModGlobalSetting("filter_translated_string_active") and (User.getParameter("filter-language") == nil or User.getParameter("filter-language") == "left")
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return is filter contain
|
|
---@return boolean
|
|
function User.isFilterContain()
|
|
return (User.getParameter("filter-contain") == nil or User.getParameter("filter-contain") == "left")
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get default settings
|
|
---@return table
|
|
function User.getDefaultSettings()
|
|
return {
|
|
display_pin_beacon = false,
|
|
display_pin_level = 4,
|
|
model_auto_compute = false,
|
|
model_loop_limit = 1000,
|
|
other_speed_panel=false,
|
|
filter_show_disable=true,
|
|
filter_show_hidden=false,
|
|
filter_show_hidden_player_crafting=true,
|
|
filter_show_lock_recipes=false
|
|
}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get sorted style
|
|
---@param key string
|
|
---@return string
|
|
function User.getSortedStyle(key)
|
|
local user_order = User.getParameter()
|
|
if user_order == nil then user_order = User.setParameter("order", {name="index",ascendant="true"}) end
|
|
local style = "helmod_button-sorted-none"
|
|
if user_order.name == key and user_order.ascendant then style = "helmod_button-sorted-up" end
|
|
if user_order.name == key and not(user_order.ascendant) then style = "helmod_button-sorted-down" end
|
|
return style
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get parameter
|
|
---@param property string
|
|
---@return any
|
|
function User.getParameter(property)
|
|
local parameter = User.get("parameter")
|
|
if parameter ~= nil and property ~= nil then
|
|
return parameter[property]
|
|
end
|
|
return parameter
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get preference
|
|
---@param type string
|
|
---@param name string
|
|
---@return any
|
|
function User.getPreference(type, name)
|
|
local preferences = User.get("preferences")
|
|
if preferences ~= nil and type ~= nil then
|
|
if name ~= nil and name ~= "" then
|
|
local preference_name = string.format("%s_%s", type, name)
|
|
return preferences[preference_name]
|
|
else
|
|
return preferences[type]
|
|
end
|
|
end
|
|
return preferences
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get default factory
|
|
---@param recipe table
|
|
---@return any
|
|
function User.getDefaultFactory(recipe)
|
|
local default_factory = User.getParameter("default_factory")
|
|
local recipe_prototype = RecipePrototype(recipe)
|
|
local category = recipe_prototype:getCategory()
|
|
if category ~= nil and default_factory ~= nil and default_factory[category] ~= nil then
|
|
return default_factory[category]
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set default factory
|
|
---@param recipe table
|
|
function User.setDefaultFactory(recipe)
|
|
local default_factory = User.getParameter("default_factory") or {}
|
|
local recipe_prototype = RecipePrototype(recipe)
|
|
local category = recipe_prototype:getCategory()
|
|
local factory = recipe.factory
|
|
if category ~= nil then
|
|
local default_category = {name = factory.name, fuel = factory.fuel}
|
|
if factory.module_priority ~= nil then
|
|
default_category.module_priority = {}
|
|
for _, priority in pairs(factory.module_priority) do
|
|
table.insert(default_category.module_priority, {name = priority.name, value = priority.value})
|
|
end
|
|
end
|
|
default_factory[category] = default_category
|
|
User.setParameter("default_factory", default_factory)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get default beacons
|
|
---@param recipe RecipeData
|
|
---@return {[uint] : BeaconData}
|
|
function User.getDefaultBeacons(recipe)
|
|
local default_beacons = User.getParameter("default_beacons")
|
|
local recipe_prototype = RecipePrototype(recipe)
|
|
local category = recipe_prototype:getCategory()
|
|
if category ~= nil and default_beacons ~= nil and default_beacons[category] ~= nil then
|
|
return default_beacons[category]
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get default beacons
|
|
---@param recipe RecipeData
|
|
---@return FactoryData
|
|
function User.getCurrentDefaultBeacon(recipe)
|
|
local default_beacons = User.getDefaultBeacons(recipe) or {}
|
|
local current_beacon_selection = User.getParameter("current_beacon_selection") or 1
|
|
return default_beacons[current_beacon_selection] or {}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set default beacon
|
|
---@param recipe table
|
|
function User.setDefaultBeacons(recipe)
|
|
local default_beacons = User.getParameter("default_beacons") or {}
|
|
local recipe_prototype = RecipePrototype(recipe)
|
|
local category = recipe_prototype:getCategory()
|
|
local beacons = recipe.beacons
|
|
local default_category = {}
|
|
if category ~= nil then
|
|
for _, beacon in pairs(beacons) do
|
|
local default_beacon = {name = beacon.name, combo = beacon.combo, per_factory = beacon.per_factory, per_factory_constant = beacon.per_factory_constant}
|
|
if beacon.module_priority ~= nil then
|
|
default_beacon.module_priority = {}
|
|
for _, priority in pairs(beacon.module_priority) do
|
|
table.insert(default_beacon.module_priority, {name = priority.name, value = priority.value})
|
|
end
|
|
end
|
|
table.insert(default_category, default_beacon)
|
|
end
|
|
default_beacons[category] = default_category
|
|
User.setParameter("default_beacons", default_beacons)
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get version
|
|
---@return string
|
|
function User.getVersion()
|
|
local parameter = User.get()
|
|
return parameter["version"] or ""
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set version
|
|
---@return any
|
|
function User.setVersion()
|
|
local parameter = User.get()
|
|
parameter["version"] = User.version
|
|
return User.version
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set
|
|
---@param property string
|
|
---@param value any
|
|
---@return any
|
|
function User.set(property, value)
|
|
User.setVersion()
|
|
local parameter = User.get()
|
|
parameter[property] = value
|
|
return value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set parameter
|
|
---@param property string
|
|
---@param value any
|
|
---@return nil
|
|
function User.setParameter(property, value)
|
|
if property == nil then
|
|
return nil
|
|
end
|
|
User.setVersion()
|
|
local parameter = User.get("parameter")
|
|
parameter[property] = value
|
|
return value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Create next event
|
|
---@param event table
|
|
---@param classname string
|
|
---@param method any
|
|
---@param index any
|
|
---@return table
|
|
function User.createNextEvent(event, classname, method, index)
|
|
if event == nil then
|
|
User.setParameter("next_event", nil)
|
|
local auto_pause = User.getParameter("auto-pause")
|
|
if not(game.is_multiplayer()) then
|
|
game.tick_paused = auto_pause
|
|
end
|
|
return {wait=false, method=method}
|
|
end
|
|
local index_name = string.format("index_%s",method)
|
|
event[index_name] = index
|
|
event.method = method
|
|
User.setParameter("next_event", {type_event=event.type, event=event, classname=classname})
|
|
game.tick_paused = false
|
|
return {wait=true, method=method}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set preference
|
|
---@param type string
|
|
---@param name string
|
|
---@param value any
|
|
---@return any
|
|
function User.setPreference(type, name, value)
|
|
if type == nil then
|
|
return nil
|
|
end
|
|
User.setVersion()
|
|
local preferences = User.get("preferences")
|
|
if name == nil then
|
|
local preference = defines.constant.preferences[type]
|
|
if value == nil then
|
|
value = preference.default_value
|
|
end
|
|
if preference.minimum_value ~= nil and value < preference.minimum_value then
|
|
value = preference.default_value
|
|
end
|
|
if preference.maximum_value ~= nil and value > preference.maximum_value then
|
|
value = preference.default_value
|
|
end
|
|
|
|
preferences[type] = value
|
|
else
|
|
local preference_name = string.format("%s_%s", type, name)
|
|
preferences[preference_name] = value
|
|
end
|
|
return value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get navigate
|
|
---@param property string
|
|
---@return table
|
|
function User.getNavigate(property)
|
|
local navigate = User.get("navigate")
|
|
if navigate ~= nil and property ~= nil then
|
|
return navigate[property]
|
|
elseif property ~= nil then
|
|
navigate[property] = {}
|
|
return navigate[property]
|
|
end
|
|
return navigate
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set navigate
|
|
---@param property string
|
|
---@param value any
|
|
---@return any
|
|
function User.setNavigate(property, value)
|
|
User.setVersion()
|
|
local navigate = User.get("navigate")
|
|
navigate[property] = value
|
|
return value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get user settings
|
|
---@return table
|
|
function User.getSettings()
|
|
local data_user = User.get()
|
|
if data_user["settings"] == nil then
|
|
data_user["settings"] = User.getDefaultSettings()
|
|
end
|
|
return data_user["settings"]
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get user settings
|
|
---@param property string
|
|
---@return any
|
|
function User.getSetting(property)
|
|
local settings = User.getSettings()
|
|
if settings ~= nil and property ~= nil then
|
|
local value = settings[property]
|
|
if value == nil then
|
|
value = User.getDefaultSettings()[property]
|
|
end
|
|
return value
|
|
end
|
|
return settings
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set setting
|
|
---@param property string
|
|
---@param value any
|
|
---@return any
|
|
function User.setSetting(property, value)
|
|
User.setVersion()
|
|
local settings = User.get("settings")
|
|
settings[property] = value
|
|
return value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get settings
|
|
---@param name string
|
|
---@return any
|
|
function User.getModSetting(name)
|
|
local property = nil
|
|
local property_name = string.format("%s_%s",User.prefixe,name)
|
|
if Player.native() ~= nil then
|
|
property = Player.native().mod_settings[property_name]
|
|
else
|
|
property = settings.global[property_name]
|
|
end
|
|
if property ~= nil then
|
|
return property.value
|
|
else
|
|
return defines.constant.settings_mod[name].default_value
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get settings
|
|
---@param name string
|
|
---@return any
|
|
function User.getModGlobalSetting(name)
|
|
local property = nil
|
|
local property_name = string.format("%s_%s",User.prefixe,name)
|
|
property = settings.global[property_name]
|
|
if property ~= nil then
|
|
return property.value
|
|
else
|
|
return defines.constant.settings_mod[name].default_value
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get preference settings
|
|
---@param type string
|
|
---@param name string
|
|
---@return any
|
|
function User.getPreferenceSetting(type, name)
|
|
local preference_type = User.getPreference(type)
|
|
if name == nil then
|
|
local preference = defines.constant.preferences[type]
|
|
if preference_type == nil then
|
|
return preference.default_value
|
|
end
|
|
if preference.minimum_value ~= nil and preference_type < preference.minimum_value then
|
|
return preference.default_value
|
|
end
|
|
if preference.maximum_value ~= nil and preference_type > preference.maximum_value then
|
|
return preference.default_value
|
|
end
|
|
return preference_type
|
|
end
|
|
if preference_type == nil then return false end
|
|
local preference_name = User.getPreference(type, name)
|
|
if preference_name ~= nil then
|
|
return preference_name
|
|
else
|
|
if defines.constant.preferences[type].items == nil or defines.constant.preferences[type].items[name] == nil then return false end
|
|
return defines.constant.preferences[type].items[name]
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Reset global variable for user
|
|
function User.reset()
|
|
local user_name = User.name()
|
|
global["users"][user_name] = {}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Reset global variable for all user
|
|
function User.resetAll()
|
|
global["users"] = {}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set Close Form
|
|
---@param classname string
|
|
---@param location table
|
|
function User.setCloseForm(classname, location)
|
|
local navigate = User.getNavigate()
|
|
if navigate[classname] == nil then navigate[classname] = {} end
|
|
navigate[classname]["open"] = false
|
|
if string.find(classname, "HMProductionPanel") then
|
|
game.tick_paused = false
|
|
end
|
|
navigate[classname]["location"] = location
|
|
navigate[classname]["tips"] = nil
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get location Form
|
|
---@param classname string
|
|
---@return table
|
|
function User.getLocationForm(classname)
|
|
local navigate = User.getNavigate()
|
|
if User.getPreferenceSetting("ui_glue") == true and User.getPreferenceSetting("ui_glue", classname) == true then
|
|
if navigate[User.tab_name] == nil or navigate[User.tab_name]["location"] == nil then return {x=50,y=50} end
|
|
return navigate[User.tab_name]["location"]
|
|
else
|
|
if navigate[classname] == nil or navigate[classname]["location"] == nil then return {x=200,y=100} end
|
|
return navigate[classname]["location"]
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set Active Form
|
|
---@param classname string
|
|
function User.setActiveForm(classname)
|
|
local navigate = User.getNavigate()
|
|
if User.getPreferenceSetting("ui_auto_close") == true then
|
|
if User.getPreferenceSetting("ui_auto_close", classname) == true then
|
|
for form_name,form in pairs(navigate) do
|
|
if Controller:getView(form_name) ~= nil and form_name ~= classname and User.getPreferenceSetting("ui_auto_close", form_name) == true then
|
|
Controller:getView(form_name):close()
|
|
end
|
|
end
|
|
end
|
|
end
|
|
if string.find(classname, "HMProductionPanel") then
|
|
if not(game.is_multiplayer()) and User.getParameter("auto-pause") then
|
|
game.tick_paused = true
|
|
else
|
|
game.tick_paused = false
|
|
end
|
|
end
|
|
|
|
if navigate[classname] == nil then navigate[classname] = {} end
|
|
navigate[classname]["open"] = true
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get main sizes
|
|
---@return number, number, number
|
|
function User.getMainSizes()
|
|
local width , height, scale = Player.getDisplaySizes()
|
|
local display_ratio_horizontal = User.getModSetting("display_ratio_horizontal")
|
|
local display_ratio_vertictal = User.getModSetting("display_ratio_vertical")
|
|
if type(width) == "number" and type(height) == "number" then
|
|
local width_main = math.ceil(width*display_ratio_horizontal)
|
|
local height_main = math.ceil(height*display_ratio_vertictal)
|
|
return width_main, height_main, scale
|
|
end
|
|
return 800, 600, scale
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---update
|
|
function User.update()
|
|
if User.getVersion() ~= User.version then
|
|
User.reset()
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Add translate
|
|
---@param request table --{player_index=number, localised_string=#string, result=#string, translated=#boolean}
|
|
function User.addTranslate(request)
|
|
if request.translated == true then
|
|
local localised_string = request.localised_string
|
|
local string_translated = request.result
|
|
if type(localised_string) == "table" then
|
|
local localised_value = localised_string[1]
|
|
if localised_value ~= nil and localised_value ~= "" then
|
|
local _,key = string.match(localised_value,"([^.]*).([^.]*)")
|
|
if key ~= nil and key ~= "" then
|
|
local translated = User.get("translated")
|
|
translated[key] = string_translated
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Is translate
|
|
---@return boolean
|
|
function User.isTranslate()
|
|
local translated = User.get("translated")
|
|
return translated ~= nil and table.size(translated) > 0
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get translate
|
|
---@param name string
|
|
---@return any
|
|
function User.getTranslate(name)
|
|
local translated = User.get("translated")
|
|
if translated == nil or translated[name] == nil then return name end
|
|
return translated[name]
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Reset translate
|
|
function User.resetTranslate()
|
|
local data_user = User.get()
|
|
data_user["translated"] = {}
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Return Cache User
|
|
---@param classname string
|
|
---@param name string
|
|
---@return table
|
|
function User.getCache(classname, name)
|
|
local data = User.get("cache")
|
|
if classname == nil and name == nil then return data end
|
|
if data[classname] == nil or data[classname][name] == nil then return nil end
|
|
return data[classname][name]
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Set Cache User
|
|
---@param classname string
|
|
---@param name string
|
|
---@param value any
|
|
function User.setCache(classname, name, value)
|
|
local data = User.get("cache")
|
|
if data[classname] == nil then data[classname] = {} end
|
|
data[classname][name] = value
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Has User Cache
|
|
---@param classname string
|
|
---@param name string
|
|
---@return boolean
|
|
function User.hasCache(classname, name)
|
|
local data = User.get("cache")
|
|
return data[classname] ~= nil and data[classname][name] ~= nil
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Reset cache
|
|
---@param classname string
|
|
---@param name string
|
|
function User.resetCache(classname, name)
|
|
local data = User.get("cache")
|
|
if classname == nil and name == nil then
|
|
User.set("cache",{})
|
|
elseif data[classname] ~= nil and name == nil then
|
|
data[classname] = nil
|
|
elseif data[classname] ~= nil then
|
|
data[classname][name] = nil
|
|
end
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get Function Product Sorter
|
|
---@return function
|
|
function User.getProductSorter()
|
|
local display_product_order = User.getPreferenceSetting("display_product_order")
|
|
if display_product_order == "name" then
|
|
return function(t,a,b) return t[b].name > t[a].name end
|
|
elseif display_product_order == "cost" then
|
|
return function(t,a,b) return t[b].amount < t[a].amount end
|
|
end
|
|
return nil
|
|
end
|
|
|
|
-------------------------------------------------------------------------------
|
|
---Get Function Product Sorter
|
|
function User.setParameterObjects(classname, model_id, block_id, recipe_id)
|
|
local parameter_objects = string.format("%s_%s", classname, "objects")
|
|
User.setParameter(parameter_objects, {name=parameter_objects, model=model_id, block=block_id, recipe=recipe_id})
|
|
end
|
|
|
|
return User
|