Make: mod into modpack

This commit is contained in:
Coder12a
2019-12-16 18:23:32 -06:00
parent 54389cda26
commit b0301130dc
32 changed files with 48 additions and 44 deletions

170
fac_database/init.lua Normal file
View File

@ -0,0 +1,170 @@
--! @class factions
--! @brief main class for factions
factions = {}
-- database
factions.root = {}
factions.factions = {}
factions.parcels = {}
factions.players = {}
factions.player_ips = {}
if factions_config.database == "colddb" then
-- Create cold databases.
factions.root = colddb.Colddb(minetest.get_worldpath() .. "/factions")
factions.factions = factions.root.sub_database("factions")
factions.parcels = factions.root.sub_database("parcels")
factions.players = factions.root.sub_database("players")
factions.player_ips = factions.root.sub_database("ips")
elseif factions_config.database == "mod_storage" then
dofile (minetest.get_modpath("fac_database") .. "/storagedb.lua")
factions.root = storagedb.Storagedb("factions")
factions.factions = factions.root.sub_database("factions")
factions.parcels = factions.root.sub_database("parcels")
factions.players = factions.root.sub_database("players")
factions.player_ips = factions.root.sub_database("ips")
end
-- Memory only storage.
factions.onlineplayers = {}
-- Table creation.
-- Create a empty faction.
function factions.create_faction_table()
local table = {
name = "",
--! @brief power of a faction (needed for parcel claiming)
power = factions_config.power,
--! @brief maximum power of a faction
maxpower = factions_config.maxpower,
--! @brief power currently in use
usedpower = 0,
--! @brief list of player names
players = {},
--! @brief table of ranks/permissions
ranks = starting_ranks,
--! @brief name of the leader
leader = nil,
--! @brief spawn of the faction
spawn = {x = 0, y = 0, z = 0},
--! @brief default joining rank for new members
default_rank = "member",
--! @brief default rank assigned to the leader
default_leader_rank = "leader",
--! @brief faction's description string
description = "Default faction description.",
--! @brief faction's message of the day.
message_of_the_day = "",
--! @brief list of players currently invited (can join with /f join)
invited_players = {},
--! @brief table of claimed parcels (keys are parcelpos strings)
land = {},
--! @brief table of allies
allies = {},
--
request_inbox = {},
--! @brief table of enemies
enemies = {},
--!
neutral = {},
--! @brief table of parcels/factions that are under attack
attacked_parcels = {},
--! @brief whether faction is closed or open (boolean)
join_free = false,
--! @brief gives certain privileges
is_admin = false,
--! @brief last time anyone logged on
last_logon = os.time(),
--! @brief how long this has been without parcels
no_parcel = os.time(),
--! @brief access table
access = {players = {}, factions = {}},
}
return table
end
-- Create a empty ip table.
function factions.create_ip_table()
local table = {
ip = ""
}
return table
end
-- Create a empty player table.
function factions.create_player_table()
local table = {
faction = ""
}
return table
end
-- Create a empty claim table.
function factions.create_parcel_table()
local table = {
faction = ""
}
return table
end
-- helper functions
function factions.db_is_empty(table)
for k, v in pairs(table) do
return false
end
return true
end
function factions.remove_key(db, db_name, db_data, key, write)
if not db_data then
db_data = db.get(db_name)
end
db_data[key] = nil
if factions.db_is_empty(db_data) then
db.remove(db_name)
return nil
end
if write then
db.set(db_name, db_data)
end
return db_data
end
-- faction data check on load
local function update_data(db, db_name, db_data, empty_table, write)
local needs_update = false
if not db_data then
db_data = db.get(db_name)
end
for k, v in pairs(empty_table) do
if db_data[k] == nil then
db_data[k] = v
needs_update = true
minetest.log("Adding property " .. k .. " to " .. db_name .. " file.")
end
end
if write and needs_update then
db.set(db_name, db_data)
end
return db_data
end
minetest.register_on_mods_loaded(function()
minetest.log("Checking faction files.")
for k, v in factions.factions.iterate() do
update_data(factions.factions, k, nil, factions.create_faction_table(), true)
end
minetest.log("Checking parcel files.")
for k, v in factions.parcels.iterate() do
update_data(factions.parcels, k, nil, factions.create_parcel_table(), true)
end
minetest.log("Checking player files.")
for k, v in factions.players.iterate() do
update_data(factions.players, k, nil, factions.create_player_table(), true)
end
minetest.log("Checking ip files.")
for k, v in factions.player_ips.iterate() do
update_data(factions.player_ips, k, nil, factions.create_ip_table(), true)
end
end)

3
fac_database/mod.conf Normal file
View File

@ -0,0 +1,3 @@
name = fac_database
depends = fac_config
optional_depends = colddb

193
fac_database/storagedb.lua Normal file
View File

@ -0,0 +1,193 @@
local storage = minetest.get_mod_storage()
storagedb = {}
function storagedb.Storagedb(dir)
local self = {}
local directory = dir
local mem_pool = {}
local mem_pool_del = {}
local add_to_mem_pool = true
local serializer = minetest.serialize
local deserializer = minetest.deserialize
-- make tables weak so the garbage-collector will remove unused data
setmetatable(mem_pool, {__mode = "kv"})
setmetatable(mem_pool_del, {__mode = "kv"})
local function storekey(key)
local list = minetest.deserialize(storage:get_string(directory))
if not list then
list = {}
list[key] = key
else
list[key] = key
end
storage:set_string(directory, minetest.serialize(list))
end
local function removekey(key)
local list = minetest.deserialize(storage:get_string(directory))
if not list then
list = {}
else
list[key] = nil
end
storage:set_string(directory, minetest.serialize(list))
end
local function getkeys()
local list = minetest.deserialize(storage:get_string(directory))
if not list then
list = {}
end
return list
end
self.get_memory_pool = function()
return mem_pool
end
self.set_memory_pool = function(pool)
mem_pool = pool
end
self.add_to_memory_pool = function(value)
if value then
add_to_mem_pool = value
end
return add_to_mem_pool
end
self.get_serializer = function()
return serializer, deserializer
end
self.set_serializer = function(coder, decoder)
serializer = coder
deserializer = decoder
end
local function load_into_mem(name, _table)
if add_to_mem_pool then
mem_pool[name] = {mem = _table}
end
end
local function load_table(name)
local f = storage:get_string(string.format("%s/%s", directory, name))
if f then
local data = deserializer(f)
return data
end
return nil
end
local function save_table(name, _table)
if save_table == nil or name == nil then
return false
end
storekey(name)
storage:set_string(string.format("%s/%s", directory, name), minetest.serialize(_table))
end
local function save_key(name)
storage:set_string(string.format("%s/%s", directory, name), "")
end
local function load_key(name)
local f = storage:get_string(string.format("%s/%s", directory, name))
if f ~= "" then
return true
end
return false
end
self.set_mem = function(name, _table)
load_into_mem(name, _table)
mem_pool_del[name] = nil
end
self.save_mem = function(name)
if mem_pool[name] ~= nil then
save_table(name, mem_pool[name].mem)
end
mem_pool_del[name] = nil
end
self.clear_mem = function(name)
mem_pool[name] = nil
mem_pool_del[name] = nil
end
self.set = function(name, _table)
save_table(name, _table)
if add_to_mem_pool then
load_into_mem(name, _table)
end
mem_pool_del[name] = nil
end
self.set_key = function(name)
save_key(name)
if add_to_mem_pool then
load_into_mem(name, "")
end
mem_pool_del[name] = nil
end
self.get = function(name, callback)
if mem_pool_del[name] then
if callback then
callback(nil)
end
return nil
end
local pm = mem_pool[name]
if pm then
if callback then
callback(pm.mem)
end
return pm.mem
else
local _table = load_table(name)
if _table then
load_into_mem(name, _table)
if callback then
callback(_table)
end
return _table
end
end
mem_pool_del[name] = true
return nil
end
self.remove = function(name)
mem_pool[name] = nil
mem_pool_del[name] = true
removekey(name)
storage:set_string(string.format("%s/%s", directory, name), "")
end
self.sub_database = function(path)
local db = storagedb.Storagedb(dir .. "/" .. path)
return db
end
self.to_array = function()
local entries = {}
for k, v in pairs(getkeys()) do
entries[#entries + 1] = v
end
return entries
end
self.to_table = function()
local entries = {}
for k, v in pairs(getkeys()) do
entries[v] = true
end
return entries
end
self.iterate = function()
local entries = {}
for k, v in pairs(getkeys()) do
entries[v] = true
end
return pairs(entries)
end
return self
end