factions/init.lua

440 lines
18 KiB
Lua

-- FACTIONS
factions = {}
factions.intervale_between_save_in_seconds = 300 -- 5minutes
factions.faction_file_path = minetest.get_modpath("factions").."/factions.txt";
-- localisation
dofile(minetest.get_modpath("factions").."/localisation.lua")
-- datas
factions.factions_list = {}
factions.player_to_faction = {}
-- Prototype definition
function factions.factory_faction(name_val,fondateur_name_val,date_creation_val,description_val)
return {
name = name_val,
fondateur = fondateur_name_val,
date_creation = date_creation_val,
description = description_val,
free_to_join = false,
players = {},
}
end
-- DATA STORAGE
function factions.save_datas()
local file,err = io.open(factions.faction_file_path,"w+")
local separateur = "|"
for k,faction in pairs(factions.factions_list) do
file:write(faction["name"],separateur,faction["fondateur"],separateur,faction["date_creation"],separateur,faction["description"],separateur,tostring(faction["free_to_join"]),separateur);
for k,player_name in ipairs(faction["players"]) do
file:write(player_name,separateur)
end
end
io.close(file)
end
function factions.read_datas()
local nb_param_before_player_list = 6
local file,err = io.open(factions.faction_file_path,"r")
if file ~= nil then -- File exists
for line in file:lines() do
local players = {}
local faction_info = {}
local k = 1
for info in string.gmatch(line, "(.-)|") do
if k < nb_param_before_player_list then
table.insert(faction_info,info)
else
table.insert(players,info)
end
k = k+1
end
factions.factions_list[faction_info[1]] = factions.factory_faction(faction_info[1],faction_info[2],faction_info[3],faction_info[4])
factions.factions_list[faction_info[1]]["players"] = players
for k,p in pairs(players) do
factions.player_to_faction[p] = faction_info[1]
end
end
else -- File do not exists
io.close(io.open(factions.faction_file_path,"w+"))
factions.read_datas()
end
end
function factions.auto_save()
minetest.log("action","Factions mod : sauvegarde des informations de factions dans "..factions.faction_file_path)
factions.save_datas()
minetest.after(factions.intervale_between_save_in_seconds, factions.auto_save)
end
factions.read_datas()
factions.auto_save()
-- Access to data
function factions.get_faction(faction_name)
return factions.factions_list[faction_name]
end
function factions.is_faction_exist(faction_name)
return (factions.get_faction(faction_name) ~= nil)
end
function factions.is_free_to_join(faction_name)
if factions.is_faction_exist(faction_name) then
return factions.factions_list[faction_name]["free_to_join"]
else
return false
end
end
function factions.get_fondateur_of_faction(faction_name)
if factions.is_faction_exist(faction_name) then
return factions.factions_list[faction_name]["fondateur"]
else
return nil
end
end
function factions.get_description_of_faction(faction_name)
if factions.is_faction_exist(faction_name) then
return factions.factions_list[faction_name]["description"]
else
return nil
end
end
function factions.get_faction_name_of_player(player_name)
return factions.player_to_faction[player_name]
end
function factions.is_player_in_faction(player_name)
return (factions.get_faction_name_of_player(player_name) ~= nil)
end
-- PRIVS
-- FUNCTIONS
function factions.chat_send_faction_message(faction_name,msg)
if not factions.is_faction_exist(faction_name) then -- Inexistant faction
minetest.chat_send_player(player_name,localisation.translate("factions:inexistant_faction",faction_name))
return false
else
for key,player_name in ipairs(factions.factions_list[faction_name]["players"]) do
minetest.chat_send_player(player_name,"[/F] "..msg)
end
end
end
function factions.register_player_joining_faction(faction_name,player_name,operateur)
if not factions.is_faction_exist(faction_name) then
minetest.chat_send_player(operateur,localisation.translate("factions:inexistant_faction",faction_name))
return false
end
if not factions.is_player_in_faction(player_name) then
factions.player_to_faction[player_name] = faction_name
table.insert(factions.factions_list[faction_name]["players"],player_name)
factions.chat_send_faction_message(faction_name,localisation.translate("factions:player_join_faction",player_name,faction_name))
else
if factions.get_faction_name_of_player(player_name) == faction_name then
if player_name == operateur then
minetest.chat_send_player(operateur, localisation.translate("factions:self_already_in_faction"))
else
minetest.chat_send_player(operateur, localisation.translate("factions:already_in_faction",player_name))
end
else
minetest.chat_send_player(operateur, localisation.translate("factions:already_in_another_faction",factions.player_to_faction[player_name]))
end
end
end
function factions.register_player_leaving_faction(faction_name,player_name,operateur)
if not factions.is_faction_exist(faction_name) then
minetest.chat_send_player(operateur,localisation.translate("factions:inexistant_faction",faction_name))
return false
end
if factions.is_player_in_faction(player_name) and factions.get_faction_name_of_player(player_name) == faction_name then
for k,p in pairs(factions.player_to_faction) do
if k == player_name then
factions.player_to_faction[player_name] = nil
factions.chat_send_faction_message(faction_name,localisation.translate("factions:player_quit_faction",player_name,faction_name))
minetest.chat_send_player(player_name,localisation.translate("factions:player_quit_faction",player_name,faction_name))
break
end
end
for k,p in ipairs(factions.factions_list[faction_name]["players"]) do
if p == player_name then
table.remove(factions.factions_list[faction_name]["players"],k)
break
end
end
else
if not factions.is_player_in_faction(player_name) then
if player_name == operateur then
minetest.chat_send_player(operateur, localisation.translate("factions:self_no_faction"))
else
minetest.chat_send_player(operateur, localisation.translate("factions:no_faction",player_name))
end
else
minetest.chat_send_player(operateur, localisation.translate("factions:already_in_another_faction",factions.player_to_faction[player_name]))
end
end
end
function factions.register_faction(name,fondateur_name)
if not factions.is_faction_exist(name) and not factions.is_player_in_faction(fondateur_name) then
factions.factions_list[name] = factions.factory_faction(name,fondateur_name,os.date("!%c"),"Created by "..fondateur_name)
minetest.chat_send_all(localisation.translate("factions:create_faction",name,fondateur_name))
factions.register_player_joining_faction(name,fondateur_name)
else
if factions.is_faction_exist(name) then
minetest.chat_send_player(fondateur_name,localisation.translate("factions:existant_faction",name))
else -- Creator already in faction
minetest.chat_send_player(fondateur_name, localisation.translate("factions:already_in_another_faction",factions.player_to_faction[fondateur_name]))
end
end
end
function factions.disband_faction(name,fondateur_name)
if factions.is_faction_exist(name) and factions.is_player_in_faction(fondateur_name) then
minetest.chat_send_all(localisation.translate("factions:delete_faction",name,fondateur_name))
--local f_index = 1
for f_name,f in pairs(factions.factions_list) do
if f["name"] == name then
for i,p in ipairs(factions.factions_list[name]["players"]) do
factions.register_player_leaving_faction(name,p,fondateur_name)
end
factions.factions_list[f_name] = nil
break
end
--f_index = f_index + 1
end
end
end
-- CHAT COMMANDS
minetest.register_chatcommand("faction", {
params = "create <factionname>"..localisation.translate("factions:help_info_create").."\n"
.."info <factionname> : "..localisation.translate("factions:help_info_info").."\n"
.."list <factionname> : "..localisation.translate("factions:help_info_list").."\n"
.."join <factionname> : "..localisation.translate("factions:help_info_join").."\n"
.."leave: "..localisation.translate("factions:help_info_leave").."\n"
.."Faction Admin\n"
.."kick <playername> : "..localisation.translate("factions:help_info_kick").."\n"
.."invite <playername> : "..localisation.translate("factions:help_info_invite").."\n"
.."disband : "..localisation.translate("factions:help_info_disband").."\n"
.."set_free : "..localisation.translate("factions:help_info_set_free").."\n"
.."description <text>: "..localisation.translate("factions:help_info_description").."\n"
,
description = localisation.translate("factions:help_description"),
privs = {},
func = function(name, param)
local parameters = {string.match(param,"^([^ ]+)%s?(.*)")}
if parameters == nil then
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Action name like create, info"))
else
local action = parameters[1]
if action == "create" then
local faction_name = parameters[2]
if faction_name ~= nil then
factions.register_faction(faction_name,name,name)
else
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Faction name"))
end
return true
end
if action == "disband" then
local faction_name = factions.get_faction_name_of_player(name)
if faction_name ~= nil then
if factions.get_fondateur_of_faction(faction_name) == name then
factions.disband_faction(faction_name,name,name)
else
minetest.chat_send_player(name, localisation.translate("factions:insufficient_privilege"))
end
else
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Faction name"))
end
return true
end
if action == "list" then
local faction_list = {}
for k,f in pairs(factions.factions_list) do
table.insert(faction_list,k)
end
if #faction_list ~= 0 then
minetest.chat_send_player(name,"Factions("..#faction_list..") : "..table.concat(faction_list,","))
else
minetest.chat_send_player(name,localisation.translate("factions:no_faction_registered"))
end
return true
end
if action == "info" then
local faction_name = parameters[2]
if faction_name ~= "" then
if factions.is_faction_exist(faction_name) then
local str = ""
for key,par in pairs(factions.factions_list[faction_name]) do
if key == "players" then
str = str..key.." = "..table.concat(par,",")
else
str = str..key.." = "..tostring(par)
end
str = str.."\n"
end
minetest.chat_send_player(name,str)
else
minetest.chat_send_player(name,localisation.translate("factions:inexistant_faction",faction_name))
end
else
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Faction name"))
end
return true
end
if action == "join" then
local faction_name = parameters[2]
if faction_name ~= "" then
if factions.is_free_to_join(faction_name) then
factions.register_player_joining_faction(faction_name,name,name)
else
minetest.chat_send_player(name,localisation.translate("factions:not_free_to_join",faction_name))
end
else
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Faction name"))
end
return true
end
if action == "leave" then
local faction_name = factions.get_faction_name_of_player(name)
if faction_name ~= nil then
factions.register_player_leaving_faction(faction_name,name,name)
else
minetest.chat_send_player(name, localisation.translate("factions:self_no_faction"))
end
return true
end
if action == "invite" then
local faction_name = factions.get_faction_name_of_player(name)
local player_to_invite = parameters[2]
if faction_name ~= nil and faction_name == factions.get_faction_name_of_player(name) then
if player_to_invite ~= "" and factions.get_fondateur_of_faction(faction_name) == name then
factions.register_player_joining_faction(faction_name,player_to_invite,name)
factions.chat_send_faction_message(faction_name,localisation.translate("factions:player_invited",player_to_invite,name))
else
if factions.get_fondateur_of_faction(faction_name) == name then
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Player name"))
else
minetest.chat_send_player(name, localisation.translate("factions:insufficient_privilege"))
end
end
else
minetest.chat_send_player(name, localisation.translate("factions:self_no_faction"))
end
return true
end
if action == "kick" then
local faction_name = factions.get_faction_name_of_player(name)
local player_to_kick = parameters[2]
if faction_name ~= nil and faction_name == factions.get_faction_name_of_player(name) then
if player_to_kick ~= "" and factions.get_fondateur_of_faction(faction_name) == name then
factions.chat_send_faction_message(faction_name,localisation.translate("factions:player_kicked",player_to_kick,name))
factions.register_player_leaving_faction(faction_name,player_to_kick,name)
else
if factions.get_fondateur_of_faction(faction_name) == name then
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Player name"))
else
minetest.chat_send_player(name, localisation.translate("factions:insufficient_privilege"))
end
end
else
minetest.chat_send_player(name, localisation.translate("factions:self_no_faction"))
end
return true
end
if action == "description" then
local faction_name = factions.get_faction_name_of_player(name)
local desc = parameters[2]
if factions.is_faction_exist(faction_name) and factions.get_fondateur_of_faction(faction_name) == name then
factions.factions_list[faction_name]["description"] = desc
minetest.chat_send_all(localisation.translate("factions:new_faction_description",desc))
else
minetest.chat_send_player(name, localisation.translate("factions:insufficient_privilege"))
end
return true
end
if action == "set_free" then
local faction_name = factions.get_faction_name_of_player(name)
if factions.is_faction_exist(faction_name) and factions.get_fondateur_of_faction(faction_name) == name then
factions.factions_list[faction_name]["free_to_join"] = not factions.factions_list[faction_name]["free_to_join"]
if factions.is_free_to_join(faction_name) then
minetest.chat_send_all(localisation.translate("factions:allow_free_join_true",faction_name))
else
minetest.chat_send_all(localisation.translate("factions:allow_free_join_false",faction_name))
end
else
minetest.chat_send_player(name, localisation.translate("factions:insufficient_privilege"))
end
return true
end
if action == "save" then
if minetest.check_player_privs(name, {server=true}) then
factions.save_datas()
else
minetest.chat_send_player(name, localisation.translate("factions:insufficient_privilege"))
end
return true
end
if action == nil then
if factions.is_player_in_faction(name) then
local faction_name = factions.get_faction_name_of_player(name)
if faction_name ~= "" then
if factions.is_faction_exist(faction_name) then
local str = ""
for key,par in pairs(factions.factions_list[faction_name]) do
if key == "players" then
str = str..key.." = "..table.concat(par,",")
else
str = str..key.." = "..tostring(par)
end
str = str.."\n"
end
minetest.chat_send_player(name, localisation.translate("factions:current_faction",faction_name))
minetest.chat_send_player(name,str)
else
minetest.chat_send_player(name,localisation.translate("factions:inexistant_faction",faction_name))
end
else
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Faction name"))
end
return true
else
minetest.chat_send_player(name, localisation.translate("factions:self_no_faction"))
return true
end
end
if action ~= "" and action ~= nil then
minetest.chat_send_player(name,localisation.translate("factions:missing_argument","Action name"))
return true
end
end
end,
})
minetest.register_chatcommand("f", {
params = "<msg>",
description = "Faction channel",
privs = {},
func = function(name,param)
local faction_name = factions.player_to_faction[name]
if faction_name ~= nil then
factions.chat_send_faction_message(faction_name,param)
else
minetest.chat_send_player(name,localisation.translate("factions:self_no_faction"))
end
end,
})