From a419cd6c177606f64b42bbecd646eda1f661f10c Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Wed, 31 Oct 2018 16:15:08 -0500 Subject: [PATCH] Major update 2 --- README.md | 4 - chatcommands.lua | 573 ++++++++++++++++++++---------- config.lua | 6 +- depends.txt | 3 +- factions.lua | 328 +++++++++++++++-- hud.lua | 32 +- nodes.lua | 170 ++++----- settingtypes.txt | 4 +- textures/factions_chest_front.png | Bin 719 -> 0 bytes textures/factions_chest_side.png | Bin 646 -> 0 bytes textures/factions_chest_top.png | Bin 705 -> 0 bytes 11 files changed, 807 insertions(+), 313 deletions(-) delete mode 100644 textures/factions_chest_front.png delete mode 100644 textures/factions_chest_side.png delete mode 100644 textures/factions_chest_top.png diff --git a/README.md b/README.md index 0c0e36b..c5347c0 100644 --- a/README.md +++ b/README.md @@ -19,10 +19,6 @@ More claim and unclaim commands. faction access manage command. -More permissions. - -faction flags(Not to replace parcels). - Maybe expand on diplomacy. Write the forum topic better. diff --git a/chatcommands.lua b/chatcommands.lua index 1c6616c..d1c271f 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -94,8 +94,9 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count) end if self.faction_permissions then for i in ipairs(self.faction_permissions) do - if not player_faction:has_permission(player, self.faction_permissions[i]) then - send_error(player, "You don't have permissions to do that.") + local perm = self.faction_permissions[i] + if not player_faction:has_permission(player, perm) then + send_error(player, "You do not have the faction permission "..perm) return false end end @@ -120,7 +121,7 @@ end local init_commands init_commands = function() - if factions_config.faction_user_priv then + if factions_config.faction_user_priv == true then minetest.register_privilege("faction_user", { description = "this user is allowed to interact with faction mod", @@ -129,6 +130,7 @@ init_commands = function() ) end + minetest.register_privilege("faction_admin", { description = "this user is allowed to create or delete factions", @@ -137,20 +139,19 @@ init_commands = function() ) local def_privs = { interact=true} - if factions_config.faction_user_priv then + if factions_config.faction_user_priv == true then def_privs.faction_user = true end minetest.register_chatcommand("factions", { - params = " .. ", - description = "faction administration functions", + params = " parameters", + description = "Factions commands. Type /factions help for available commands.", privs = def_privs, func = factions_chat.cmdhandler, } ) - minetest.register_chatcommand("f", { params = " parameters", @@ -168,7 +169,7 @@ end local def_global_privileges = nil -if factions_config.faction_user_priv then +if factions_config.faction_user_priv == true then minetest.register_on_newplayer(function(player) local name = player:get_player_name() local privs = minetest.get_player_privs(name) @@ -208,6 +209,23 @@ factions.register_command ("claim", { end },false) +factions.register_command ("set_name", { + faction_permissions = {"name"}, + format = {"string"}, + description = "Change the faction's name.", + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + local factionname = args.strings[1] + if factions.can_create_faction(factionname) then + faction:set_name(factionname) + return true + else + send_error(player, "Faction cannot be renamed.") + return false + end + end +},false) + factions.register_command("unclaim", { faction_permissions = {"claim"}, description = "Unclaim the plot of land you're on.", @@ -280,7 +298,7 @@ factions.register_command("leave", { },false) factions.register_command("kick", { - faction_permissions = {"playerslist"}, + faction_permissions = {"kick"}, format = {"player"}, description = "Kick a player from your faction.", global_privileges = def_global_privileges, @@ -354,25 +372,45 @@ factions.register_command("disband", { end },false) -factions.register_command("close", { - faction_permissions = {"playerslist"}, - description = "Make your faction invite-only.", +factions.register_command("flag", { + faction_permissions = {"flags"}, + description = "Manage the faction's flags.", global_privileges = def_global_privileges, + format = {"string"}, on_success = function(player, faction, pos, parcelpos, args) - faction:toggle_join_free(false) + --"Make your faction invite-only." + --"Allow any player to join your faction." + --faction:toggle_join_free(false) + local flag_name = args.strings[1] + local bool = args.strings[2] + if (flag_name == "help" or flag_name == "flags") or not bool then + for i, k in pairs(factions.flags) do + minetest.chat_send_player(player, k..": ".. factions.flags_desc[i] .. "\n") + end + return true + end + if flag_name and bool then + local yes = false + if bool == "yes" then + yes = true + elseif bool == "no" then + yes = false + else + send_error(player, "Set the flags only to yes or no.") + return false + end + if flag_name == "open" then + faction:toggle_join_free(yes) + elseif flag_name == "monsters" then + elseif flag_name == "tax_kick" then + elseif flag_name == "animals" then + else + send_error(player, flag_name.." is not an flag.") + end + end return true end -},false) - -factions.register_command("open", { - faction_permissions = {"playerslist"}, - description = "Allow any player to join your faction.", - global_privileges = def_global_privileges, - on_success = function(player, faction, pos, parcelpos, args) - faction:toggle_join_free(true) - return true - end -},false) +},true) factions.register_command("description", { format = {"string"}, @@ -387,7 +425,7 @@ factions.register_command("description", { factions.register_command("invite", { format = {"player"}, - faction_permissions = {"playerslist"}, + faction_permissions = {"invite"}, description = "Invite a player to your faction.", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) @@ -398,7 +436,7 @@ factions.register_command("invite", { factions.register_command("uninvite", { format = {"player"}, - faction_permissions = {"playerslist"}, + faction_permissions = {"invite"}, description = "Revoke a player's invite.", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) @@ -435,7 +473,7 @@ factions.register_command("rank_privileges", { on_success = function(player, faction, pos, parcelpos, args) minetest.chat_send_player(player, "Privileges available:\n") for i, k in pairs(factions.permissions) do - minetest.chat_send_player(player, k .. "\n") + minetest.chat_send_player(player, k .. ": " .. factions.permissions_desc[i] .. "\n") end return true end @@ -443,7 +481,7 @@ factions.register_command("rank_privileges", { factions.register_command("set_message_of_the_day", { format = {"string"}, - faction_permissions = {"playerslist"}, + faction_permissions = {"motd"}, description = "Sets the message that shows up every time a faction member logs-in.", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) @@ -456,43 +494,40 @@ factions.register_command("set_message_of_the_day", { end },true) -if factions_config.faction_diplomacy then +if factions_config.faction_diplomacy == true then factions.register_command("send_alliance", { description = "Send an alliance request to another faction.", global_privileges = def_global_privileges, format = {"string"}, + faction_permissions = {"alliance"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - if factions.factions[args.strings[1]] then - if not factions.factions[args.strings[1]].request_inbox[faction.name] then - if faction.allies[args.strings[1]] then - send_error(player, "You are already allys.") - return false - end - if faction.enemies[args.strings[1]] then - send_error(player, "You need to be neutral in-order to send an alliance request.") - return false - end - if args.strings[1] == faction.name then - send_error(player, "You can not send an alliance to your own faction.") - return false - end - if faction.request_inbox[args.strings[1]] then - send_error(player, "Faction " .. args.strings[1] .. "has already sent a request to you.") - return false - end - factions.factions[args.strings[1]].request_inbox[faction.name] = "alliance" - factions.factions[args.strings[1]]:broadcast("An alliance request from faction " .. faction.name .. " has been sent to you.") - faction:broadcast("An alliance request was sent to faction " .. args.strings[1]) - factions.save() - else - send_error(player, "You have already sent a request.") + if factions.factions[args.strings[1]] then + if not factions.factions[args.strings[1]].request_inbox[faction.name] then + if faction.allies[args.strings[1]] then + send_error(player, "You are already allys.") + return false end + if faction.enemies[args.strings[1]] then + send_error(player, "You need to be neutral in-order to send an alliance request.") + return false + end + if args.strings[1] == faction.name then + send_error(player, "You can not send an alliance to your own faction.") + return false + end + if faction.request_inbox[args.strings[1]] then + send_error(player, "Faction " .. args.strings[1] .. "has already sent a request to you.") + return false + end + factions.factions[args.strings[1]].request_inbox[faction.name] = "alliance" + factions.factions[args.strings[1]]:broadcast("An alliance request from faction " .. faction.name .. " has been sent to you.") + faction:broadcast("An alliance request was sent to faction " .. args.strings[1]) + factions.save() else - send_error(player, args.strings[1] .. " is not a name of a faction.") + send_error(player, "You have already sent a request.") end else - send_error(player, "You do not have the diplomacy privilege.") + send_error(player, args.strings[1] .. " is not a name of a faction.") end end },false) @@ -501,38 +536,35 @@ if factions_config.faction_diplomacy then description = "Send neutral to another faction.", global_privileges = def_global_privileges, format = {"string"}, + faction_permissions = {"neutral"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - if factions.factions[args.strings[1]] then - if not factions.factions[args.strings[1]].request_inbox[faction.name] then - if faction.allies[args.strings[1]] then - send_error(player, "You are allys.") - return false - end - if faction.neutral[args.strings[1]] then - send_error(player, "You are already neutral with this faction.") - return false - end - if args.strings[1] == faction.name then - send_error(player, "You can not send a neutral request to your own faction.") - return false - end - if faction.request_inbox[args.strings[1]] then - send_error(player, "Faction " .. args.strings[1] .. "has already sent a request to you.") - return false - end - factions.factions[args.strings[1]].request_inbox[faction.name] = "neutral" - factions.factions[args.strings[1]]:broadcast("A neutral request from faction " .. faction.name .. " has been sent to you.") - faction:broadcast("A neutral request was sent to faction " .. args.strings[1]) - factions.save() - else - send_error(player, "You have already sent a request.") + if factions.factions[args.strings[1]] then + if not factions.factions[args.strings[1]].request_inbox[faction.name] then + if faction.allies[args.strings[1]] then + send_error(player, "You are allys.") + return false end + if faction.neutral[args.strings[1]] then + send_error(player, "You are already neutral with this faction.") + return false + end + if args.strings[1] == faction.name then + send_error(player, "You can not send a neutral request to your own faction.") + return false + end + if faction.request_inbox[args.strings[1]] then + send_error(player, "Faction " .. args.strings[1] .. "has already sent a request to you.") + return false + end + factions.factions[args.strings[1]].request_inbox[faction.name] = "neutral" + factions.factions[args.strings[1]]:broadcast("A neutral request from faction " .. faction.name .. " has been sent to you.") + faction:broadcast("A neutral request was sent to faction " .. args.strings[1]) + factions.save() else - send_error(player, args.strings[1] .. " is not a name of a faction.") + send_error(player, "You have already sent a request.") end else - send_error(player, "You do not have the diplomacy privilege.") + send_error(player, args.strings[1] .. " is not a name of a faction.") end end },false) @@ -541,29 +573,26 @@ if factions_config.faction_diplomacy then description = "accept an request from another faction.", global_privileges = def_global_privileges, format = {"string"}, + faction_permissions = {"accept_treaty"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - if faction.request_inbox[args.strings[1]] then - if args.strings[1] == faction.name then - send_error(player, "You can not accept an request from own faction.") - return false - end - if faction.request_inbox[args.strings[1]] == "alliance" then - faction:new_alliance(args.strings[1]) - factions.factions[args.strings[1]]:new_alliance(faction.name) - else - if faction.request_inbox[args.strings[1]] == "neutral" then - faction:new_neutral(args.strings[1]) - factions.factions[args.strings[1]]:new_neutral(faction.name) - end - end - faction.request_inbox[args.strings[1]] = nil - factions.save() - else - send_error(player, "No request was sent to you.") + if faction.request_inbox[args.strings[1]] then + if args.strings[1] == faction.name then + send_error(player, "You can not accept an request from own faction.") + return false end + if faction.request_inbox[args.strings[1]] == "alliance" then + faction:new_alliance(args.strings[1]) + factions.factions[args.strings[1]]:new_alliance(faction.name) + else + if faction.request_inbox[args.strings[1]] == "neutral" then + faction:new_neutral(args.strings[1]) + factions.factions[args.strings[1]]:new_neutral(faction.name) + end + end + faction.request_inbox[args.strings[1]] = nil + factions.save() else - send_error(player, "You do not have the diplomacy privilege.") + send_error(player, "No request was sent to you.") end end },false) @@ -572,22 +601,19 @@ if factions_config.faction_diplomacy then description = "refuse an request from another faction.", global_privileges = def_global_privileges, format = {"string"}, + faction_permissions = {"refuse_treaty"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - if faction.request_inbox[args.strings[1]] then - if args.strings[1] == faction.name then - send_error(player, "You can not refuse an request from your own faction.") - return false - end - faction.request_inbox[args.strings[1]] = nil - factions.factions[args.strings[1]]:broadcast("Faction " .. faction.name .. " refuse to be your ally.") - faction:broadcast("Refused an request from faction " .. args.strings[1]) - factions.save() - else - send_error(player, "No request was sent to you.") + if faction.request_inbox[args.strings[1]] then + if args.strings[1] == faction.name then + send_error(player, "You can not refuse an request from your own faction.") + return false end + faction.request_inbox[args.strings[1]] = nil + factions.factions[args.strings[1]]:broadcast("Faction " .. faction.name .. " refuse to be your ally.") + faction:broadcast("Refused an request from faction " .. args.strings[1]) + factions.save() else - send_error(player, "You do not have the diplomacy privilege.") + send_error(player, "No request was sent to you.") end end },false) @@ -596,29 +622,26 @@ if factions_config.faction_diplomacy then description = "Delcare war on a faction.", global_privileges = def_global_privileges, format = {"string"}, + faction_permissions = {"declare_war"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - if not faction.enemies[args.strings[1]] then - if args.strings[1] == faction.name then - send_error(player, "You can not delcare war on your own faction.") - return false - end - if faction.allies[args.strings[1]] then - faction:end_alliance(args.strings[1]) - factions.factions[args.strings[1]]:end_alliance(faction.name) - end - if faction.neutral[args.strings[1]] then - faction:end_neutral(args.strings[1]) - factions.factions[args.strings[1]]:end_neutral(faction.name) - end - faction:new_enemy(args.strings[1]) - factions.factions[args.strings[1]]:new_enemy(faction.name) - factions.save() - else - send_error(player, "You are already at war.") + if not faction.enemies[args.strings[1]] then + if args.strings[1] == faction.name then + send_error(player, "You can not delcare war on your own faction.") + return false end + if faction.allies[args.strings[1]] then + faction:end_alliance(args.strings[1]) + factions.factions[args.strings[1]]:end_alliance(faction.name) + end + if faction.neutral[args.strings[1]] then + faction:end_neutral(args.strings[1]) + factions.factions[args.strings[1]]:end_neutral(faction.name) + end + faction:new_enemy(args.strings[1]) + factions.factions[args.strings[1]]:new_enemy(faction.name) + factions.save() else - send_error(player, "You do not have the diplomacy privilege.") + send_error(player, "You are already at war.") end end },false) @@ -627,23 +650,20 @@ if factions_config.faction_diplomacy then description = "Break an alliance.", global_privileges = def_global_privileges, format = {"string"}, + faction_permissions = {"alliance"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - if faction.allies[args.strings[1]] then - if args.strings[1] == faction.name then - send_error(player, "You can not break an alliance from your own faction.") - return false - end - faction:end_alliance(args.strings[1]) - factions.factions[args.strings[1]]:end_alliance(faction.name) - faction:new_neutral(args.strings[1]) - factions.factions[args.strings[1]]:new_neutral(faction.name) - factions.save() - else - send_error(player, "You where not allies to begin with.") + if faction.allies[args.strings[1]] then + if args.strings[1] == faction.name then + send_error(player, "You can not break an alliance from your own faction.") + return false end + faction:end_alliance(args.strings[1]) + factions.factions[args.strings[1]]:end_alliance(faction.name) + faction:new_neutral(args.strings[1]) + factions.factions[args.strings[1]]:new_neutral(faction.name) + factions.save() else - send_error(player, "You do not have the diplomacy privilege.") + send_error(player, "You where not allies to begin with.") end end },false) @@ -651,24 +671,21 @@ if factions_config.faction_diplomacy then factions.register_command("inbox", { description = "Check your diplomacy request inbox.", global_privileges = def_global_privileges, + faction_permissions = {"accept_treaty","refuse_treaty","alliance","neutral","declare_war"}, on_success = function(player, faction, pos, parcelpos, args) - if faction:has_permission(player, "diplomacy") then - local empty = true - for i,k in pairs(faction.request_inbox) do - if k == "alliance" then - minetest.chat_send_player(player,"Alliance request from faction " .. i .. "\n") - else - if k == "neutral" then - minetest.chat_send_player(player,"neutral request from faction " .. i .. "\n") - end - end - empty = false + local empty = true + for i,k in pairs(faction.request_inbox) do + if k == "alliance" then + minetest.chat_send_player(player,"Alliance request from faction " .. i .. "\n") + else + if k == "neutral" then + minetest.chat_send_player(player,"neutral request from faction " .. i .. "\n") end - if empty then - minetest.chat_send_player(player,"none:") end - else - send_error(player, "You do not have the diplomacy privilege.") + empty = false + end + if empty then + minetest.chat_send_player(player,"none:") end end },false) @@ -737,7 +754,7 @@ factions.register_command("who", { local parcel_size_center = factions_config.parcel_size / 2 -factions.register_command("showparcel", { +factions.register_command("show_parcel", { description = "Shows parcel for six seconds.", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) @@ -755,10 +772,10 @@ factions.register_command("showparcel", { end },false) -factions.register_command("newrank", { +factions.register_command("new_rank", { description = "Add a new rank.", format = {"string"}, - faction_permissions = {"ranks"}, + faction_permissions = {"create_ranks"}, global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) if args.strings[1] then @@ -786,7 +803,7 @@ factions.register_command("newrank", { if not success then if args.strings[failindex] then send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") - else + else send_error(player, "No permission was given.") end return false @@ -799,16 +816,169 @@ factions.register_command("newrank", { end },true) -factions.register_command("delrank", { +factions.register_command("replace_privs", { + description = "Deletes current permissions and replaces them with the ones given.", + format = {"string"}, + faction_permissions = {"edit_ranks"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + if args.strings[1] then + local rank = args.strings[1] + if not faction.ranks[rank] then + send_error(player, "Rank does not exist") + return false + end + local success = false + local failindex = -1 + for _, f in pairs(args.strings) do + if f then + for q, r in pairs(factions.permissions) do + if f == r then + success = true + break + end + end + if not success and _ ~= 1 then + failindex = _ + break + end + end + end + if not success then + if args.strings[failindex] then + send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + else + send_error(player, "No permission was given.") + end + return false + end + faction:replace_privs(rank, args.other) + return true + end + send_error(player, "No rank was given.") + return false + end +},true) + +factions.register_command("remove_privs", { + description = "Remove permissions from a rank.", + format = {"string"}, + faction_permissions = {"edit_ranks"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + if args.strings[1] then + local rank = args.strings[1] + if not faction.ranks[rank] then + send_error(player, "Rank does not exist") + return false + end + local success = false + local failindex = -1 + for _, f in pairs(args.strings) do + if f then + for q, r in pairs(factions.permissions) do + if f == r then + success = true + break + end + end + if not success and _ ~= 1 then + failindex = _ + break + end + end + end + if not success then + if args.strings[failindex] then + send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + else + send_error(player, "No permission was given.") + end + return false + end + faction:remove_privs(rank, args.other) + return true + end + send_error(player, "No rank was given.") + return false + end +},true) + +factions.register_command("add_privs", { + description = "add permissions to a rank.", + format = {"string"}, + faction_permissions = {"edit_ranks"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + if args.strings[1] then + local rank = args.strings[1] + if not faction.ranks[rank] then + send_error(player, "Rank does not exist") + return false + end + local success = false + local failindex = -1 + for _, f in pairs(args.strings) do + if f then + for q, r in pairs(factions.permissions) do + if f == r then + success = true + break + end + end + if not success and _ ~= 1 then + failindex = _ + break + end + end + end + if not success then + if args.strings[failindex] then + send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + else + send_error(player, "No permission was given.") + end + return false + end + faction:add_privs(rank, args.other) + return true + end + send_error(player, "No rank was given.") + return false + end +},true) + +factions.register_command("set_rank_name", { + description = "Change the name of given rank.", + format = {"string","string"}, + faction_permissions = {"edit_ranks"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + local rank = args.strings[1] + local newrank = args.strings[2] + if not faction.ranks[rank] then + send_error(player, "The rank does not exist.") + return false + end + if faction.ranks[newrank] then + send_error(player, "This rank name was already taken.") + return false + end + faction:set_rank_name(rank, newrank) + return true + end +},falsw) + +factions.register_command("del_rank", { description = "Replace and delete a rank.", format = {"string", "string"}, - faction_permissions = {"ranks"}, + faction_permissions = {"delete_ranks"}, global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) local rank = args.strings[1] local newrank = args.strings[2] if not faction.ranks[rank] or not faction.ranks[newrank] then - send_error(player, "One of the specified ranks do not exist.") + send_error(player, "One of the specified ranks does not exist.") return false end faction:delete_rank(rank, newrank) @@ -816,10 +986,10 @@ factions.register_command("delrank", { end },false) -factions.register_command("change_def_rank", { +factions.register_command("set_def_rank", { description = "Change the default rank given to new players and also replace rankless players in this faction.", format = {"string"}, - faction_permissions = {"ranks"}, + faction_permissions = {"set_def_ranks"}, global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) local rank = args.strings[1] @@ -827,15 +997,25 @@ factions.register_command("change_def_rank", { send_error(player, "This rank does not exist.") return false end - faction:change_def_rank(rank) - faction.rankless = false + faction:set_def_rank(rank) return true end },false) -factions.register_command("setspawn", { +factions.register_command("reset_ranks", { + description = "Reset's all of the factions rankings back to the default ones.", + format = {}, + faction_permissions = {"reset_ranks"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + faction:reset_ranks() + return true + end +},false) + +factions.register_command("set_spawn", { description = "Set the faction's spawn", - faction_permissions = {"spawn"}, + faction_permissions = {"set_spawn"}, global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) faction:set_spawn(pos) @@ -843,6 +1023,35 @@ factions.register_command("setspawn", { end },false) +factions.register_command("del_spawn", { + description = "Set the faction's spawn to zero", + faction_permissions = {"unset_spawn"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + faction:set_spawn({x=0,y=0,z=0}) + return true + end +},false) + +if factions_config.spawn_teleport == true then + factions.register_command("tp_spawn", { + description = "Teleport to the faction's spawn", + faction_permissions = {"spawn"}, + global_privileges = def_global_privileges, + on_success = function(player, faction, pos, parcelpos, args) + if player then + minetest.chat_send_player(player, "Teleporting in five seconds.") + minetest.after(5, + function(faction,player) + faction:tp_spawn(player) + end,faction,player) + return true + end + return false + end + },false) +end + factions.register_command("where", { description = "See whose parcel you stand on.", infaction = false, @@ -865,7 +1074,7 @@ factions.register_command("help", { end },false) -factions.register_command("spawn", { +factions.register_command("get_spawn", { description = "Shows your faction's spawn", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) @@ -974,7 +1183,7 @@ factions.register_command("which", { end },false) -factions.register_command("setleader", { +factions.register_command("set_leader", { description = "Set a player as a faction's leader", infaction = false, global_privileges = {"faction_admin"}, @@ -1026,7 +1235,7 @@ factions.register_command("remove_admin", { end },false) -factions.register_command("resetpower", { +factions.register_command("reset_power", { description = "Reset a faction's power", infaction = false, global_privileges = {"faction_admin"}, @@ -1050,7 +1259,7 @@ factions.register_command("obliterate", { end },false) -factions.register_command("getspawn", { +factions.register_command("get_factions_spawn", { description = "Get a faction's spawn", infaction = false, global_privileges = {"faction_admin"}, diff --git a/config.lua b/config.lua index b4ad34b..c389abd 100644 --- a/config.lua +++ b/config.lua @@ -14,7 +14,7 @@ factions_config.rank_name_max_length = tonumber(minetest.settings:get("rank_name factions_config.maximum_faction_inactivity = tonumber(minetest.settings:get("maximum_faction_inactivity")) or 604800 factions_config.maximum_parcelless_faction_time = tonumber(minetest.settings:get("maximum_parcelless_faction_time")) or 10800 factions_config.power = tonumber(minetest.settings:get("power")) or 0 -factions_config.maxpower = tonumber(minetest.settings:get("maxpower")) or 0 +factions_config.maxpower = tonumber(minetest.settings:get("maxpower")) or 12 factions_config.power_per_player = tonumber(minetest.settings:get("power_per_player")) or 1 factions_config.powermax_per_player = tonumber(minetest.settings:get("powermax_per_player")) or 12 factions_config.parcel_size = tonumber(minetest.settings:get("parcel_size")) or 16 @@ -22,6 +22,7 @@ factions_config.protection_depth_height_limit = minetest.settings:get_bool("prot factions_config.enable_power_per_player = minetest.settings:get_bool("power_per_playerb") or true factions_config.attack_parcel = minetest.settings:get_bool("attack_parcel") or false factions_config.faction_diplomacy = minetest.settings:get_bool("faction_diplomacy") or true +factions_config.spawn_teleport = minetest.settings:get_bool("spawn_teleport") or false factions_config.protection_style = minetest.settings:get("protection_style") or "2d" factions_config.faction_user_priv = minetest.settings:get("faction_user_priv") or false -- END @@ -39,7 +40,7 @@ factions_config.rank_name_max_length = 25 factions_config.maximum_faction_inactivity = 604800 factions_config.maximum_parcelless_faction_time = 10800 factions_config.power = 0 -factions_config.maxpower = 0 +factions_config.maxpower = 12 factions_config.power_per_player = 1 factions_config.powermax_per_player = 12 factions_config.parcel_size = 16 @@ -47,6 +48,7 @@ factions_config.protection_depth_height_limit = true factions_config.enable_power_per_player = true factions_config.attack_parcel = false factions_config.faction_diplomacy = true +factions_config.spawn_teleport = false factions_config.protection_style = "2d" factions_config.faction_user_priv = false --]] \ No newline at end of file diff --git a/depends.txt b/depends.txt index 331d858..ff6f9a8 100644 --- a/depends.txt +++ b/depends.txt @@ -1 +1,2 @@ -default \ No newline at end of file +default? +doors? \ No newline at end of file diff --git a/factions.lua b/factions.lua index 6d35045..3c9218f 100644 --- a/factions.lua +++ b/factions.lua @@ -35,26 +35,95 @@ util = { factions.Faction.__index = factions.Faction +starting_ranks = {["leader"] = {"build","door","container","name","description","motd","invite","kick" + ,"title","set_spawn","unset_spawn","with_draw","territory","claim","access","disband","flags","create_ranks","edit_ranks","delete_ranks","set_def_ranks","reset_ranks","promote"}, + ["moderator"] = {"claim","door","build","set_spawn","invite","kick","promote"}, + ["member"] = {"build","container","door"} + } + -- Faction permissions: -- --- disband: disband the faction --- claim: (un)claim parcels --- playerslist: invite/kick players and open/close the faction -- build: dig and place nodes --- description: set the faction's description --- ranks: create and delete ranks --- spawn: set the faction's spawn +-- pain_build: dig and place nodes but take damage doing so +-- door: open/close or dig doors +-- container: be able to use containers like chest +-- name: set the faction's name +-- description: Set the faction description +-- motd: set the faction's message of the day +-- invite: (un)invite players to join the faction +-- kick: kick players off the faction +-- title: set territory titles +-- set_spawn: set the faction's spawn +-- unset_spawn: delete the faction's spawn +-- with_draw: withdraw money from the faction's bank +-- spawn: be able to teleport to the faction's spawn +-- territory: claim or unclaim territory +-- claim: (un)claim parcels of land +-- access: manage access to territory and parcels of land to players or factions +-- disband: disband the faction +-- flags: manage faction's flags +-- create_ranks: create new ranks +-- edit_ranks: edit rank name and permissions +-- delete_ranks: delete ranks +-- set_def_ranks: set the default rank given to new players +-- reset_ranks: reset the ranks back to the default ones -- promote: set a player's rank --- diplomacy: make war, or an alliance with other teams. +-- declare_war: be able to declare war with another faction +-- neutral: be able to send a neutral request to another faction +-- alliance: be able to send a alliance request to another faction and break alliance treaties too +-- accept_treaty: be able to accept a treaty request from another faction +-- refuse_treaty: be able to refuse a treaty request from another faction -factions.permissions = {"disband", "claim", "playerslist", "build", "description", "ranks", "spawn", "promote"} +factions.permissions = {"build","pain_build","door","container","name","description","motd","invite","kick" + ,"title","set_spawn","unset_spawn","with_draw","territory","claim","access","disband","flags","create_ranks","edit_ranks","delete_ranks","set_def_ranks","reset_ranks","promote"} +factions.permissions_desc = {"dig and place nodes","dig and place nodes but take damage doing so","open/close or dig","be able to use containers like chest","set the faction's name" + ,"Set the faction description","set the faction's message of the day","(un)invite players to join the faction","kick players off the faction","set territory titles","set the faction's spawn" + ,"delete the faction's spawn","withdraw money from the faction's bank","claim or unclaim territory","(un)claim parcels of land","manage access to territory and parcels of land to players or factions" + ,"disband the faction","manage faction's flags","create new ranks","edit rank permissions","delete ranks","set the default rank given to new players","reset the ranks back to the default ones","set a player's rank"} + +-- open: can the faction be joined without an invite? +-- monsters: can monsters spawn on your land? +-- tax_kick: will players be kicked for not paying tax? +-- animals: can animals spawn on your land? +factions.flags = {"open","monsters","tax_kick","animals"} +factions.flags_desc = {"can the faction be joined without an invite?","can monsters spawn on your land?(unused)","will players be kicked for not paying tax?(unused)","can animals spawn on your land?(unused)"} -if factions_config.faction_diplomacy then - table.insert(factions.permissions,"diplomacy") +if factions_config.faction_diplomacy == true then + table.insert(factions.permissions,"declare_war") + table.insert(factions.permissions,"neutral") + table.insert(factions.permissions,"alliance") + table.insert(factions.permissions,"accept_treaty") + table.insert(factions.permissions,"refuse_treaty") + + table.insert(factions.permissions_desc,"be able to declare war with another faction") + table.insert(factions.permissions_desc,"be able to send a neutral request to another faction") + table.insert(factions.permissions_desc,"be able to send a alliance request to another faction and break alliance treaties too") + table.insert(factions.permissions_desc,"be able to accept a treaty request from another faction") + table.insert(factions.permissions_desc,"be able to refuse a treaty request from another faction") + + local lt = starting_ranks["leader"] + table.insert(lt,"declare_war") + table.insert(lt,"neutral") + table.insert(lt,"alliance") + table.insert(lt,"accept_treaty") + table.insert(lt,"refuse_treaty") + starting_ranks["leader"] = lt +end + +if factions_config.spawn_teleport == true then + table.insert(factions.permissions,"spawn") + + table.insert(factions.permissions_desc,"be able to teleport to the faction's spawn") + + table.insert(starting_ranks["leader"],"spawn") + table.insert(starting_ranks["moderator"],"spawn") + table.insert(starting_ranks["member"],"spawn") + end function factions.Faction:new(faction) faction = { + name = "", --! @brief power of a faction (needed for parcel claiming) power = factions_config.power, --! @brief maximum power of a faction @@ -68,12 +137,11 @@ function factions.Faction:new(faction) --! @brief list of player names offline offlineplayers = {}, --! @brief table of ranks/permissions - ranks = {["leader"] = factions.permissions, - ["moderator"] = {"claim", "playerslist", "build", "spawn"}, - ["member"] = {"build"} - }, + 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 @@ -97,7 +165,7 @@ function factions.Faction:new(faction) --! @brief table of parcels/factions that are under attack attacked_parcels = {}, --! @brief whether faction is closed or open (boolean) - join_free = true, + join_free = false, --! @brief gives certain privileges is_admin = false, --! @brief if a player on the faction has a nil rank @@ -113,7 +181,7 @@ end --! @brief create a new empty faction -function factions.new_faction(name) +function factions.new_faction(name,do_not_save) local faction = factions.Faction:new(nil) faction.name = name factions.factions[name] = faction @@ -122,18 +190,57 @@ function factions.new_faction(name) function(f) f:on_no_parcel() end,faction) - factions.save() + if not do_not_save then + factions.save() + end return faction end function factions.start_diplomacy(name,faction) - for i in pairs(factions.factions) do + for i,fac in pairs(factions.factions) do if i ~= name and not (faction.neutral[i] or faction.allies[i] or faction.enemies[i]) then faction:new_enemy(i) + fac:new_enemy(name) end end end +function factions.Faction.set_name(self, name) + local oldname = self.name + local oldfaction = factions.factions[oldname] + self.name = name + for i,fac in pairs(factions.factions) do + if i ~= oldname then + if fac.neutral[oldname] then + fac.neutral[oldname] = nil + fac.neutral[name] = true + end + if fac.allies[oldname] then + fac.allies[oldname] = nil + fac.allies[name] = true + end + if fac.enemies[oldname] then + fac.enemies[oldname] = nil + fac.enemies[name] = true + end + end + end + for parcel in pairs(self.land) do + factions.parcels[parcel] = self.name + end + for playername in pairs(self.players) do + factions.players[playername] = self.name + end + factions.factions[oldname] = nil + factions.factions[name] = oldfaction + factions.factions[name].name = name + for playername in pairs(self.onlineplayers) do + updateFactionName(playername,name) + end + self:on_set_name(oldname) + factions.save() +end + function factions.Faction.increase_power(self, power) self.power = self.power + power if self.power > self.maxpower - self.usedpower then @@ -236,7 +343,6 @@ function factions.Faction.add_player(self, player, rank) end if notsame then self:increase_maxpower(factions_config.powermax_per_player) - --self:increase_power(factions_config.power_per_player) end end local pdata = minetest.get_player_by_name(player) @@ -378,8 +484,7 @@ function factions.Faction.disband(self, reason) factions.parcels[k] = nil end self:on_disband(reason) - local playerslist = self.onlineplayers - for i,l in pairs(playerslist) do + for i,l in pairs(self.onlineplayers) do removeHud(i,"factionName") removeHud(i,"powerWatch") end @@ -519,6 +624,13 @@ function factions.Faction.set_spawn(self, pos) factions.save() end +function factions.Faction.tp_spawn(self, playername) + player = minetest.get_player_by_name(playername) + if player then + player:moveto(self.spawn, false) + end +end + --! @brief create a new rank with permissions --! @param rank the name of the new rank --! @param rank a list with the permissions of the new rank @@ -528,14 +640,97 @@ function factions.Faction.add_rank(self, rank, perms) factions.save() end -function factions.Faction.change_def_rank(self, rank) +--! @brief replace an rank's permissions +--! @param rank the name of the rank to edit +--! @param add or remove permissions to the rank +function factions.Faction.replace_privs(self, rank, perms) + self.ranks[rank] = perms + self:on_replace_privs(rank) + factions.save() +end + +function factions.Faction.remove_privs(self, rank, perms) + local revoked = false + local p = self.ranks[rank] + for index, perm in pairs(p) do + if table_Contains(perms,perm) then + revoked = true + table.remove(p,index) + end + end + self.ranks[rank] = p + if revoked then + self:on_remove_privs(rank,perms) + else + self:broadcast("No privilege was revoked from rank "..rank..".") + end + factions.save() +end + +function factions.Faction.add_privs(self, rank, perms) + local added = false + local p = self.ranks[rank] + for index, perm in pairs(perms) do + if not table_Contains(p,perm) then + added = true + table.insert(p,perm) + end + end + self.ranks[rank] = p + if added then + self:on_add_privs(rank,perms) + else + self:broadcast("The rank "..rank.." already has these privileges.") + end + factions.save() +end + +function factions.Faction.set_rank_name(self, oldrank, newrank) + local copyrank = self.ranks[oldrank] + self.ranks[newrank] = copyrank + self.ranks[oldrank] = nil + for player, r in pairs(self.players) do + if r == oldrank then + self.players[player] = newrank + end + end + if oldrank == self.default_leader_rank then + self.default_leader_rank = newrank + self:broadcast("The default leader rank has been set to "..newrank) + end + if oldrank == self.default_rank then + self.default_rank = newrank + self:broadcast("The default rank given to new players is set to "..newrank) + end + self:on_set_rank_name(oldrank, newrank) + factions.save() +end + +function factions.Faction.set_def_rank(self, rank) for player, r in pairs(self.players) do if r == rank or r == nil or not self.ranks[r] then self.players[player] = rank end end self.default_rank = rank - self:on_change_def_rank(rank, rank) + self:on_set_def_rank(rank) + self.rankless = false + factions.save() +end + +function factions.Faction.reset_ranks(self) + self.ranks = starting_ranks + self.default_rank = "member" + self.default_leader_rank_rank = "leader" + for player, r in pairs(self.players) do + if not player == leader and (r == nil or not self.ranks[r]) then + self.players[player] = self.default_rank + elseif player == leader then + self.players[player] = self.default_leader_rank_rank + end + end + self:on_reset_ranks() + self.rankless = false factions.save() end @@ -639,6 +834,10 @@ function factions.Faction.on_create(self) --! @brief called when the faction is minetest.chat_send_all("Faction "..self.name.." has been created.") end +function factions.Faction.on_set_name(self,oldname) + minetest.chat_send_all("Faction "..oldname.." has been changed its name to "..self.name..".") +end + function factions.Faction.on_no_parcel(self) local now = os.time() - self.no_parcel local l = factions_config.maximum_parcelless_faction_time @@ -721,14 +920,34 @@ function factions.Faction.on_add_rank(self, rank) self:broadcast("The rank "..rank.." has been created with privileges: "..table.concat(self.ranks[rank], ", ")) end +function factions.Faction.on_replace_privs(self, rank) + self:broadcast("The privileges in rank "..rank.." have been delete and changed to: "..table.concat(self.ranks[rank], ", ")) +end + +function factions.Faction.on_remove_privs(self, rank,privs) + self:broadcast("The privileges in rank "..rank.." have been revoked: "..table.concat(privs, ", ")) +end + +function factions.Faction.on_add_privs(self, rank,privs) + self:broadcast("The privileges in rank "..rank.." have been added: "..table.concat(privs, ", ")) +end + +function factions.Faction.on_set_rank_name(self, rank,newrank) + self:broadcast("The name of rank "..rank.." has been changed to "..newrank) +end + function factions.Faction.on_delete_rank(self, rank, newrank) self:broadcast("The rank "..rank.." has been deleted and replaced by "..newrank) end -function factions.Faction.on_change_def_rank(self, rank) +function factions.Faction.on_set_def_rank(self, rank) self:broadcast("The default rank given to new players has been changed to "..rank) end +function factions.Faction.on_reset_ranks(self) + self:broadcast("All of the faction's ranks have been reset to the default ones.") +end + function factions.Faction.on_promote(self, member) minetest.chat_send_player(member, "You have been promoted to "..self.players[member]) end @@ -908,14 +1127,13 @@ function factions.load() if faction:count_land() > 0 then faction.no_parcel = -1 end - if faction.onlineplayers and faction.offlineplayers then - for i, _ in pairs(faction.onlineplayers) do + faction.onlineplayers = {} + faction.offlineplayers = {} + if faction.players then + for i, _ in pairs(faction.players) do faction.offlineplayers[i] = _ end - else - faction.offlineplayers = {} end - faction.onlineplayers = {} end misc_mod_data.data.factions_version = current_version misc_mod_data.save() @@ -968,7 +1186,10 @@ function factions.convert(filename) end local raw_data = file:read("*a") file:close() + local data = minetest.deserialize(raw_data) + local old_permissions = {"disband", "claim", "playerslist", "build", "description", "ranks", "spawn", "promote","diplomacy"} + for facname,faction in pairs(data) do local newfac = factions.new_faction(facname,true) for oi, ol in pairs(faction) do @@ -980,7 +1201,7 @@ function factions.convert(filename) newfac.players = faction.players end if faction.land then - newfac.land = faction.land + newfac.land = faction.land end if faction.ranks then newfac.ranks = faction.ranks @@ -990,6 +1211,35 @@ function factions.convert(filename) else newfac.rankless = false end + for rank,perm in pairs(faction.ranks) do + for index,value in pairs(perm) do + if value == "playerslist" then + table.remove(faction.ranks[rank],index) + table.insert(faction.ranks[rank],"kick") + table.insert(faction.ranks[rank],"invite") + elseif value == "ranks" then + table.remove(faction.ranks[rank],index) + table.insert(faction.ranks[rank],"create_ranks") + table.insert(faction.ranks[rank],"edit_ranks") + table.insert(faction.ranks[rank],"delete_ranks") + table.insert(faction.ranks[rank],"set_def_ranks") + table.insert(faction.ranks[rank],"reset_ranks") + elseif value == "diplomacy" then + table.remove(faction.ranks[rank],index) + table.insert(faction.ranks[rank],"declare_war") + table.insert(faction.ranks[rank],"neutral") + table.insert(faction.ranks[rank],"alliance") + table.insert(faction.ranks[rank],"accept_treaty") + table.insert(faction.ranks[rank],"refuse_treaty") + elseif value == "spawn" then + if not factions_config.spawn_teleport == true then + table.remove(faction.ranks[rank],index) + end + table.insert(faction.ranks[rank],"set_spawn") + table.insert(faction.ranks[rank],"unset_spawn") + end + end + end factions.start_diplomacy(facname,newfac) newfac:check_power() end @@ -1020,7 +1270,6 @@ function(player) end ) - function factions.faction_tick() local now = os.time() for facname, faction in pairs(factions.factions) do @@ -1056,12 +1305,12 @@ function(player) local l = factions_config.maximum_parcelless_faction_time minetest.chat_send_player(name,"This faction will disband in "..l-now.." seconds, because it has no parcels.") end - if faction:has_permission(name, "diplomacy") then + if faction:has_permission(name, "accept_treaty") or faction:has_permission(name, "refuse_treaty") then for _ in pairs(faction.request_inbox) do minetest.chat_send_player(name,"You have diplomatic requests in the inbox.") break end end if faction:has_permission(name, "ranks") then if faction.rankless then - minetest.chat_send_player(name,"You need to reset the default rank because there are rankless players in this faction. type /f change_def_rank") + minetest.chat_send_player(name,"You need to reset the default rank because there are rankless players in this faction. reset all the ranks back to default using /f reset_ranks (You will lose all of your custom ranks) or use /f change_def_rank") end end if faction.message_of_the_day and (faction.message_of_the_day ~= "" or faction.message_of_the_day ~= " ") then @@ -1090,6 +1339,7 @@ minetest.register_on_leaveplayer( end faction.offlineplayers[name] = 1 faction.onlineplayers[name] = nil + factions.save() end end ) @@ -1127,9 +1377,17 @@ minetest.is_protected = function(pos, player) return default_is_protected(pos, player) elseif player_faction then if parcel_faction.name == player_faction.name then - return not parcel_faction:has_permission(player, "build") + if parcel_faction:has_permission(player, "pain_build") then + local p = minetest.get_player_by_name(player) + p:set_hp(p:get_hp() - 0.5) + end + return not (parcel_faction:has_permission(player, "build") or parcel_faction:has_permission(player, "pain_build")) elseif parcel_faction.allies[player_faction.name] then - return not player_faction:has_permission(player, "build") + if player_faction:has_permission(player, "pain_build") then + local p = minetest.get_player_by_name(player) + p:set_hp(p:get_hp() - 0.5) + end + return not (player_faction:has_permission(player, "build") or player_faction:has_permission(player, "pain_build")) else return not parcel_faction:parcel_is_attacked_by(parcelpos, player_faction) end diff --git a/hud.lua b/hud.lua index 82c7549..6a008ae 100644 --- a/hud.lua +++ b/hud.lua @@ -56,14 +56,6 @@ function createHudPower(player,faction) end end -function updateHudPower(player,faction) - local name = player:get_player_name() - local id_name = name .. "powerWatch" - if hud_ids[id_name] then - player:hud_change(hud_ids[id_name],"text","Power "..faction.power.."/".. faction.usedpower .."/"..faction.maxpower) - end -end - function removeHud(player,hudname) local name = "" local p = {} @@ -81,6 +73,30 @@ function removeHud(player,hudname) end end +function updateHudPower(player,faction) + local name = player:get_player_name() + local id_name = name .. "powerWatch" + if hud_ids[id_name] then + player:hud_change(hud_ids[id_name],"text","Power "..faction.power.."/".. faction.usedpower .."/"..faction.maxpower) + end +end + +function updateFactionName(player,factionname) + local name = "" + local p = {} + if type(player) ~= "string" then + name = player:get_player_name() + p = player + else + name = player + p = minetest.get_player_by_name(player) + end + local id_name = name .. "factionName" + if hud_ids[id_name] then + p:hud_change(hud_ids[id_name],"text","Faction "..factionname) + end +end + function hudUpdateClaimInfo() local playerslist = minetest.get_connected_players() for i in pairs(playerslist) do diff --git a/nodes.lua b/nodes.lua index 6b2fcfa..c505cf6 100644 --- a/nodes.lua +++ b/nodes.lua @@ -1,93 +1,103 @@ -function factions.get_chest_formspec(pos) - local spos = pos.x..","..pos.y..","..pos.z - return "size[8,9]" .. - default.gui_bg .. - default.gui_bg_img .. - default.gui_slots .. - "list[nodemeta:"..spos..";main;0,0.3;8,4;]" .. - "list[current_player;main;0,4.85;8,1;]".. - "list[current_player;main;0,6.08;8,3;8]".. - "listring[nodemeta:"..spos..";main]".. - "listring[current_player;main]".. - default.get_hotbar_bg(0, 4.85) -end - -function factions.can_use_chest(pos, player) +function factions.can_use_node(pos, player,permission) if not player then return false end local parcel_faction = factions.get_faction_at(pos) - local player_faction = factions.get_player_faction(player) - if not parcel_faction then + if not parcel_faction then return true end - return player_faction and (parcel_faction.name == player_faction.name or parcel_faction.allies[player_faction.name]) + local player_faction = factions.get_player_faction(player) + if player_faction and (parcel_faction.name == player_faction.name or parcel_faction.allies[player_faction.name]) and player_faction:has_permission(player, permission) then + return true + end end - -minetest.register_node("factions:chest", { - tiles = {"factions_chest_top.png", "factions_chest_top.png", - "factions_chest_side.png", "factions_chest_side.png", - "factions_chest_side.png", "factions_chest_front.png"}, - groups = {choppy = 2}, - description = "Faction chest", - paramtype2 = "facedir", - on_construct = function(pos) - local meta = minetest.get_meta(pos) - meta:set_string("infotext", "Faction Chest") - meta:set_string("faction", "") - local inv = meta:get_inventory() - inv:set_size("main", 8*4) - end, - after_place_node = function(pos, placer) - local meta = minetest.get_meta(pos) - local cf = factions.get_player_faction(placer:get_player_name()) - if cf ~= nil then - meta:set_string("faction", cf.name or "") +-- Make default chest the faction chest. +if minetest.registered_nodes["default:chest"] then + minetest.register_lbm({ + label = "Replace faction chest with default one.", + name = "factions:replace_factions_chest", + nodenames = {"factions:chest"}, + action = function(pos, node) + minetest.swap_node(pos, {name="default:chest"}) + local parcel_faction = factions.get_faction_at(pos) + if parcel_faction then + local meta = minetest.get_meta(pos) + meta:set_string("faction", parcel_faction.name or "") meta:set_string("infotext", "Faction Chest (owned by faction " .. meta:get_string("faction") .. ")") end - end, - can_dig = function(pos,player) - local meta = minetest.get_meta(pos); - local inv = meta:get_inventory() - return inv:is_empty("main") and - factions.can_use_chest(pos, player:get_player_name()) - end, - allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) - if factions.can_use_chest(pos, player:get_player_name()) then - return count - else - return 0 - end - end, - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if factions.can_use_chest(pos, player:get_player_name()) then - return stack:get_count() - else - return 0 - end - end, - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if factions.can_use_chest(pos, player:get_player_name()) then - return stack:get_count() - else - return 0 - end - end, - on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if factions.can_use_chest(pos, clicker:get_player_name()) then - minetest.show_formspec(clicker:get_player_name(), "factions:chest", factions.get_chest_formspec(pos)) - end - return itemstack - end -}) - -minetest.register_craft({ - output = "factions:chest", - type = "shapeless", - recipe = {"default:chest_locked", "default:steel_ingot"} -}) - + end + }) + local dc = minetest.registered_nodes["default:chest"] + local def_on_rightclick = dc.on_rightclick + local clonenode = {} + for k,v in pairs(minetest.registered_nodes["default:chest"]) do clonenode[k] = v end + clonenode.after_place_node = function(pos, placer) + local parcel_faction = factions.get_faction_at(pos) + if parcel_faction then + local meta = minetest.get_meta(pos) + meta:set_string("faction", parcel_faction.name or "") + meta:set_string("infotext", "Faction Chest (owned by faction " .. + meta:get_string("faction") .. ")") + end + end + clonenode.can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and + factions.can_use_node(pos, player:get_player_name(),"container") + end + clonenode.allow_metadata_inventory_move = function(pos, from_list, from_index, + to_list, to_index, count, player) + if not factions.can_use_node(pos, player:get_player_name(),"container") then + return 0 + end + return count + end + clonenode.allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not factions.can_use_node(pos, player:get_player_name(),"container") then + return 0 + end + return stack:get_count() + end + clonenode.allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not factions.can_use_node(pos, player:get_player_name(),"container") then + return 0 + end + return stack:get_count() + end + clonenode.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not factions.can_use_node(pos, clicker:get_player_name(),"container") then + return itemstack + end + def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) + end + minetest.register_node(":default:chest",clonenode) +end +-- Edit default doors and trapdoors to make them require the door permission. +local doors = {"doors:door_wood_a","doors:door_wood_b","doors:door_steel_a","doors:door_steel_b","doors:door_glass_a","doors:door_glass_b" +,"doors:door_obsidian_glass_a","doors:door_obsidian_glass_b","doors:trapdoor","doors:trapdoor_open","doors:trapdoor_steel","doors:trapdoor_steel_open"} +for i,k in ipairs(doors) do + if minetest.registered_nodes[k] then + local dw = minetest.registered_nodes[k] + local def_after_place_node = dw.on_rightclick + local can_dig = dw.can_dig + local clonenode = {} + for k,v in pairs(minetest.registered_nodes[k]) do clonenode[k] = v end + clonenode.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if factions.can_use_node(pos, clicker:get_player_name(),"door") then + def_after_place_node(pos, node, clicker, itemstack, pointed_thing) + end + end + clonenode.can_dig = function(pos, digger) + if factions.can_use_node(pos, digger:get_player_name(),"door") then + return can_dig(pos, digger) + end + return false + end + minetest.register_node(":"..k,clonenode) + end +end -- Code below was copied from TenPlus1's protector mod(MIT) and changed up a bit. local x = math.floor(factions_config.parcel_size / 2.1) diff --git a/settingtypes.txt b/settingtypes.txt index 76a3f4b..1320274 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -25,7 +25,7 @@ maximum_parcelless_faction_time (Maximum parcelless faction time) int 10800 # Power of a starting faction (needed for parcel claiming). power (Starting power) float 0 # Maximum power of a starting faction. -maxpower (Starting Maximum power) float 0 +maxpower (Starting Maximum power) float 12 # How much power the players make. power_per_player (power-per-player) float 1 # How much max power is created per new player. @@ -43,6 +43,8 @@ factions_config.attack_parcel (Enable attack parcel) bool false faction_diplomacy (Enable faction diplomacy) bool true # Enable or disabled the max depth and height limit for a parcel protection_depth_height_limit (Enable protection depth height limit) bool true +# Enable or disabled faction spawn teleport +spawn_teleport (Enable spawn teleport) bool false # Enable or disabled the need for faction_user priv faction_user_priv (Enable faction user priv) bool false diff --git a/textures/factions_chest_front.png b/textures/factions_chest_front.png deleted file mode 100644 index d3fe58c62e52f9057de6f66af1259833c90ad1eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 719 zcmV;=0xe zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00K8jL_t(I%cYXbY8x>WhQE>K z;u$;B;Kng=+dwy67qaLp^hNp%-S)Mz?6QkOA*7o^AWa}Ki7#>HCTS#fF%!Fsbkzd~ z1QNf_|DP{7IXUtCM}+`cal>#B@ghrjIZ8-E$?ZeMs#GXr@xJ@RI*)2Cjc&2tGnl^Z z1ZLwAt#wEd0AQ?VG>91uVqz%>f`HaJidtj6r)&(`I_{n(XmpEeEu}K7N<|ijeEjs8 z)6-L|wK(V4{Q6E3NwPR(lBc9`#N7hqY&QGyCi4`HW>qRGW!Ti3;lYgQbc!(sr4+AZ zK@v(z)v~S>Wn*{@(r$wDDuXD4{arX!RdIcN&Eer8%jJ?Ek7;)y`u;n_=W0Hm18{M1 zu|5BD3m?Xsb)_k4jd7k>3aovNloF*B-h1Bf)kL8r2_@EfHnrxw$~uA0dy8@1x)w#l zLm7&osdD@};gm-N$#ws?o=Alv;>tJ-$2^=5f7;6EDr0meGHOrzwh|bo2 z7Gtc(l@4PawQhGDoLAZNlmvhWs=fh&1V+0je*jCXJlNQ=L8Sly002ovPDHLkV1oSf BF){!E diff --git a/textures/factions_chest_side.png b/textures/factions_chest_side.png deleted file mode 100644 index 98a70e699782e093923dde9d41c324b8c49130a6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 646 zcmV;10(t$3P)e zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00HhvL_t(I%cYXZP8&fKMNdsV zxzi8>iii}XZ1Mvv^8NXSh#v@%fDmJBda5~#Hh7aAPpVz%ymzmTxW2y5ykj&#)8DbG z3@1&=SzA(S#r~S&i_)8&LrqFy`l~hLa_%g8@mrF{cXbR0mS5p^;$ISt7 z(v&>x2DXDG=Zp}7Kf95p)YOIH%h?A~N?0Fx9v#1*dP=Q8tP$@mQS#2w0N>Y+=h4wm z4xjR|xR{Uv+Pa`N3ZoUJR>YLqPmY_hSpeI?GTMMoOPWnTV|}2vft)i+3Rb0|tqMw` zFj9~*AP<0);oIdYciVyc-AKxr%4piEU~~baBg7z}O|H=fZZ|IoA#gE~Qet-L z2)OuAv!5I}XG)`4ud26}l@#=|1E8ymH&Y8O`SEZ7{QA2m9ts?+XLf`H5dfnUDJAxke zSad^gZEa<4bO1wgWnpw>WFU8GbZ8()Nlj2!fese{00JpVL_t(I%cYaaPTepVMvtA? z8Ey!087h!kshhq4@4x6XRDFSh#CW*_i4(_D7YVTGu9m#Bj=%r-v$(mrN&Lsk0qX9a zRjD|x3(lH?BF}i(8@9d0xlZeMb7$)w_0@(HzV?8d;&$a1Btn+l%lTsp+ zf>ohtN=>0MloZ4S$a)6E1V64$xZn0X>^O3K!DHn1m(4U>(11 zH-wlNT|f#!UF297s8mK z%J20aT)>6-IrqlmLWJgO27EhjaUlSpvWyrbhhgHi8!jAWkcfT6g~%}Z&)@jl n)c^jg0!V;aHh?Ig`8@I$`}srxu#&Vy00000NkvXXu0mjf0o6Ab