forked from mtcontrib/factions
Major update.
This commit is contained in:
parent
15f674da93
commit
4353b6a050
10
README.md
10
README.md
@ -4,16 +4,18 @@ mod for minetest
|
|||||||
Mod for handling in game factions and reputation.
|
Mod for handling in game factions and reputation.
|
||||||
|
|
||||||
# TODO LIST
|
# TODO LIST
|
||||||
Complete the diplomacy system.
|
|
||||||
|
|
||||||
Add a show claim command (show small entity boxes like in protection mod).
|
Add a show claim command (show small entity boxes like in protection mod).
|
||||||
|
|
||||||
Make claim's depth not go to high or low. Or make it act like a protection block where you have to claim land upwards and downwards.
|
Make claim's depth not go to high or low. Or make it act like a protection block where you have to claim land upwards and downwards.
|
||||||
|
|
||||||
Make factions power max based on how many players are in the team, and players with the same ip address can not add to the power max.
|
|
||||||
|
|
||||||
Redo the parcel attack system.
|
Redo the parcel attack system.
|
||||||
|
|
||||||
Remove banner code.
|
Remove banner code.
|
||||||
|
|
||||||
|
# COMPLETED BUT NEEDS TESTING LIST
|
||||||
|
|
||||||
|
Make factions power max based on how many players are in the team, and players with the same ip address can not add to the power max.
|
||||||
|
|
||||||
Make factions without parcels disband after a few hours.
|
Make factions without parcels disband after a few hours.
|
||||||
|
|
||||||
|
Complete the diplomacy system.
|
332
chatcommands.lua
332
chatcommands.lua
@ -1,17 +1,3 @@
|
|||||||
-------------------------------------------------------------------------------
|
|
||||||
-- factions Mod by Sapier
|
|
||||||
--
|
|
||||||
-- License WTFPL
|
|
||||||
--
|
|
||||||
--! @file chatcommnd.lua
|
|
||||||
--! @brief factions chat interface
|
|
||||||
--! @copyright Sapier, agrecascino, shamoanjac, Coder12a
|
|
||||||
--! @author Sapier, agrecascino, shamoanjac, Coder12a
|
|
||||||
--! @date 2016-08-12
|
|
||||||
--
|
|
||||||
-- Contact sapier a t gmx net
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
local send_error = function(player, message)
|
local send_error = function(player, message)
|
||||||
minetest.chat_send_player(player, message)
|
minetest.chat_send_player(player, message)
|
||||||
end
|
end
|
||||||
@ -45,6 +31,7 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count)
|
|||||||
factions = {},
|
factions = {},
|
||||||
players = {},
|
players = {},
|
||||||
strings = {},
|
strings = {},
|
||||||
|
unknowns = {},
|
||||||
other = {}
|
other = {}
|
||||||
}
|
}
|
||||||
if not ignore_param_count then
|
if not ignore_param_count then
|
||||||
@ -87,9 +74,10 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count)
|
|||||||
elseif argtype == "string" then
|
elseif argtype == "string" then
|
||||||
table.insert(args.strings, arg)
|
table.insert(args.strings, arg)
|
||||||
else
|
else
|
||||||
minetest.log("error", "Bad format definition for function "..self.name)
|
table.insert(args.unknowns, arg)
|
||||||
send_error(player, "Internal server error")
|
--minetest.log("error", "Bad format definition for function "..self.name)
|
||||||
return false
|
--send_error(player, "Internal server error")
|
||||||
|
--return false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
for i=2, #argv do
|
for i=2, #argv do
|
||||||
@ -185,7 +173,7 @@ factions.register_command ("claim", {
|
|||||||
else
|
else
|
||||||
local parcel_faction = factions.get_parcel_faction(parcelpos)
|
local parcel_faction = factions.get_parcel_faction(parcelpos)
|
||||||
if not parcel_faction then
|
if not parcel_faction then
|
||||||
send_error(player, "You faction cannot claim any (more) parcel(s).")
|
send_error(player, "Your faction cannot claim any (more) parcel(s).")
|
||||||
return false
|
return false
|
||||||
elseif parcel_faction.name == faction.name then
|
elseif parcel_faction.name == faction.name then
|
||||||
send_error(player, "This parcel already belongs to your faction.")
|
send_error(player, "This parcel already belongs to your faction.")
|
||||||
@ -247,7 +235,7 @@ factions.register_command("version", {
|
|||||||
end
|
end
|
||||||
},false)
|
},false)
|
||||||
|
|
||||||
--show description of faction
|
--show description of faction
|
||||||
factions.register_command("info", {
|
factions.register_command("info", {
|
||||||
format = {"faction"},
|
format = {"faction"},
|
||||||
description = "Shows a faction's description.",
|
description = "Shows a faction's description.",
|
||||||
@ -303,8 +291,16 @@ factions.register_command("create", {
|
|||||||
end
|
end
|
||||||
local factionname = args.strings[1]
|
local factionname = args.strings[1]
|
||||||
if factions.can_create_faction(factionname) then
|
if factions.can_create_faction(factionname) then
|
||||||
|
local listofenemies = {}
|
||||||
|
for i in pairs(factions.factions) do
|
||||||
|
listofenemies[i] = factions.factions[i]
|
||||||
|
end
|
||||||
new_faction = factions.new_faction(factionname, nil)
|
new_faction = factions.new_faction(factionname, nil)
|
||||||
new_faction:add_player(player, new_faction.default_leader_rank)
|
new_faction:add_player(player, new_faction.default_leader_rank)
|
||||||
|
for i in pairs(listofenemies) do
|
||||||
|
new_faction:new_enemy(listofenemies[i].name)
|
||||||
|
listofenemies[i]:new_enemy(new_faction.name)
|
||||||
|
end
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
send_error(player, "Faction cannot be created.")
|
send_error(player, "Faction cannot be created.")
|
||||||
@ -417,6 +413,281 @@ factions.register_command("ranks", {
|
|||||||
end
|
end
|
||||||
},false)
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("rank_privileges", {
|
||||||
|
description = "List available rank privileges.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
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")
|
||||||
|
end
|
||||||
|
return true
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
if factions.faction_diplomacy then
|
||||||
|
factions.register_command("send_alliance", {
|
||||||
|
description = "Send an alliance request to another faction.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
format = {"string"},
|
||||||
|
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 at peace 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.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, args.strings[1] .. " is not a name of a faction.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("send_peace", {
|
||||||
|
description = "Send peace to another faction.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
format = {"string"},
|
||||||
|
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.at_peace_with[args.strings[1]] then
|
||||||
|
send_error(player, "You are already at peace.")
|
||||||
|
return false
|
||||||
|
end
|
||||||
|
if args.strings[1] == faction.name then
|
||||||
|
send_error(player, "You can not send a peace 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] = "peace"
|
||||||
|
factions.factions[args.strings[1]]:broadcast("A peace request from faction " .. faction.name .. " has been sent to you.")
|
||||||
|
faction:broadcast("A peace request was sent to faction " .. args.strings[1])
|
||||||
|
factions.save()
|
||||||
|
else
|
||||||
|
send_error(player, "You have already sent a request.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, args.strings[1] .. " is not a name of a faction.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("accept", {
|
||||||
|
description = "accept an request from another faction.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
format = {"string"},
|
||||||
|
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]] == "peace" then
|
||||||
|
faction:new_peace(args.strings[1])
|
||||||
|
factions.factions[args.strings[1]]:new_peace(faction.name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
faction.request_inbox[args.strings[1]] = nil
|
||||||
|
factions.save()
|
||||||
|
else
|
||||||
|
send_error(player, "No request was sent to you.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("refuse", {
|
||||||
|
description = "refuse an request from another faction.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
format = {"string"},
|
||||||
|
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.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("delcare_war", {
|
||||||
|
description = "Delcare war on a faction.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
format = {"string"},
|
||||||
|
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.at_peace_with[args.strings[1]] then
|
||||||
|
faction:end_peace(args.strings[1])
|
||||||
|
factions.factions[args.strings[1]]:end_peace(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.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("break", {
|
||||||
|
description = "Break an alliance.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
format = {"string"},
|
||||||
|
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_peace(args.strings[1])
|
||||||
|
factions.factions[args.strings[1]]:new_peace(faction.name)
|
||||||
|
factions.save()
|
||||||
|
else
|
||||||
|
send_error(player, "You where not allies to begin with.")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("inbox", {
|
||||||
|
description = "Check your diplomacy request inbox.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
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 == "peace" then
|
||||||
|
minetest.chat_send_player(player,"Peace request from faction " .. i .. "\n")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
empty = false
|
||||||
|
end
|
||||||
|
if empty then
|
||||||
|
minetest.chat_send_player(player,"none:")
|
||||||
|
end
|
||||||
|
else
|
||||||
|
send_error(player, "You do not have the diplomacy privilege.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("allies", {
|
||||||
|
description = "Shows the factions that are allied to you.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
on_success = function(player, faction, pos, parcelpos, args)
|
||||||
|
local empty = true
|
||||||
|
for i,k in pairs(faction.allies) do
|
||||||
|
minetest.chat_send_player(player,i .. "\n")
|
||||||
|
empty = false
|
||||||
|
end
|
||||||
|
if empty then
|
||||||
|
minetest.chat_send_player(player,"none:")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("at_peace_with", {
|
||||||
|
description = "Shows the factions that are at peace with you.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
on_success = function(player, faction, pos, parcelpos, args)
|
||||||
|
local empty = true
|
||||||
|
for i,k in pairs(faction.at_peace_with) do
|
||||||
|
minetest.chat_send_player(player,i .. "\n")
|
||||||
|
empty = false
|
||||||
|
end
|
||||||
|
if empty then
|
||||||
|
minetest.chat_send_player(player,"none:")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
|
||||||
|
factions.register_command("enemies", {
|
||||||
|
description = "Shows enemies of your faction.",
|
||||||
|
global_privileges = {"faction_user"},
|
||||||
|
on_success = function(player, faction, pos, parcelpos, args)
|
||||||
|
local empty = true
|
||||||
|
for i,k in pairs(faction.enemies) do
|
||||||
|
minetest.chat_send_player(player,i .. "\n")
|
||||||
|
empty = false
|
||||||
|
end
|
||||||
|
if empty then
|
||||||
|
minetest.chat_send_player(player,"none:")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
},false)
|
||||||
|
end
|
||||||
|
|
||||||
factions.register_command("who", {
|
factions.register_command("who", {
|
||||||
description = "List players in your faction, and their ranks.",
|
description = "List players in your faction, and their ranks.",
|
||||||
global_privileges = {"faction_user"},
|
global_privileges = {"faction_user"},
|
||||||
@ -505,7 +776,7 @@ factions.register_command("setspawn", {
|
|||||||
},false)
|
},false)
|
||||||
|
|
||||||
factions.register_command("where", {
|
factions.register_command("where", {
|
||||||
description = "See whose parcel your standing on.",
|
description = "See whose parcel you stand on.",
|
||||||
infaction = false,
|
infaction = false,
|
||||||
global_privileges = {"faction_user"},
|
global_privileges = {"faction_user"},
|
||||||
on_success = function(player, faction, pos, parcelpos, args)
|
on_success = function(player, faction, pos, parcelpos, args)
|
||||||
@ -543,7 +814,7 @@ factions.register_command("spawn", {
|
|||||||
},false)
|
},false)
|
||||||
|
|
||||||
factions.register_command("promote", {
|
factions.register_command("promote", {
|
||||||
description = "Promotes a player to a new rank.",
|
description = "Promotes a player to a rank",
|
||||||
format = {"player", "string"},
|
format = {"player", "string"},
|
||||||
faction_permissions = {"promote"},
|
faction_permissions = {"promote"},
|
||||||
global_privileges = {"faction_user"},
|
global_privileges = {"faction_user"},
|
||||||
@ -567,22 +838,7 @@ factions.register_command("power", {
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
},false)
|
},false)
|
||||||
--[[
|
|
||||||
factions.register_command("setbanner", {
|
|
||||||
description = "Sets the banner you're on as the faction's banner.",
|
|
||||||
faction_permissions = {"banner"},
|
|
||||||
on_success = function(player, faction, pos, parcelpos, args)
|
|
||||||
local meta = minetest.get_meta({x = pos.x, y = pos.y - 1, z = pos.z})
|
|
||||||
local banner = meta:get_string("banner")
|
|
||||||
if not banner then
|
|
||||||
minetest.chat_send_player(player, "No banner found.")
|
|
||||||
return false
|
|
||||||
end
|
|
||||||
faction:set_banner(banner)
|
|
||||||
end
|
|
||||||
},false)
|
|
||||||
--]]
|
|
||||||
--[[
|
|
||||||
factions.register_command("convert", {
|
factions.register_command("convert", {
|
||||||
description = "Load factions in the old format",
|
description = "Load factions in the old format",
|
||||||
infaction = false,
|
infaction = false,
|
||||||
@ -597,7 +853,7 @@ factions.register_command("convert", {
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
},false)
|
},false)
|
||||||
--]]
|
|
||||||
factions.register_command("free", {
|
factions.register_command("free", {
|
||||||
description = "Forcefully frees a parcel",
|
description = "Forcefully frees a parcel",
|
||||||
infaction = false,
|
infaction = false,
|
||||||
|
62
config.lua
62
config.lua
@ -1,28 +1,36 @@
|
|||||||
-------------------------------------------------------------------------------
|
factions_config = {}
|
||||||
-- factions Mod by Sapier
|
|
||||||
--
|
|
||||||
-- License WTFPL
|
|
||||||
--
|
|
||||||
--! @file config.lua
|
|
||||||
--! @brief settings file
|
|
||||||
--! @copyright Coder12a
|
|
||||||
--! @author Coder12a
|
|
||||||
--! @date 2018-03-13
|
|
||||||
--
|
|
||||||
-- Contact sapier a t gmx net
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
config = {}
|
factions_config.protection_max_depth = tonumber(minetest.setting_get("protection_max_depth")) or -512
|
||||||
config.protection_max_depth = tonumber(minetest.setting_get("protection_max_depth")) or -512
|
factions_config.power_per_parcel = tonumber(minetest.setting_get("power_per_parcel")) or 0.5
|
||||||
config.power_per_parcel = tonumber(minetest.setting_get("power_per_parcel")) or 0.5
|
factions_config.power_per_death = tonumber(minetest.setting_get("power_per_death")) or 0.25
|
||||||
config.power_per_death = tonumber(minetest.setting_get("power_per_death")) or 0.25
|
factions_config.power_per_tick = tonumber(minetest.setting_get("power_per_tick")) or 0.125
|
||||||
config.power_per_tick = tonumber(minetest.setting_get("power_per_tick")) or 0.125
|
factions_config.tick_time = tonumber(minetest.setting_get("tick_time")) or 60
|
||||||
config.tick_time = tonumber(minetest.setting_get("tick_time")) or 60
|
factions_config.power_per_attack = tonumber(minetest.setting_get("power_per_attack")) or 10
|
||||||
config.power_per_attack = tonumber(minetest.setting_get("power_per_attack")) or 10
|
factions_config.faction_name_max_length = tonumber(minetest.setting_get("faction_name_max_length")) or 50
|
||||||
config.faction_name_max_length = tonumber(minetest.setting_get("faction_name_max_length")) or 50
|
factions_config.rank_name_max_length = tonumber(minetest.setting_get("rank_name_max_length")) or 25
|
||||||
config.rank_name_max_length = tonumber(minetest.setting_get("rank_name_max_length")) or 25
|
factions_config.maximum_faction_inactivity = tonumber(minetest.setting_get("maximum_faction_inactivity")) or 604800
|
||||||
config.maximum_faction_inactivity = tonumber(minetest.setting_get("maximum_faction_inactivity")) or 604800
|
factions_config.maximum_parcelless_faction_time = tonumber(minetest.setting_get("maximum_parcelless_faction_time")) or 10800
|
||||||
config.power = tonumber(minetest.setting_get("power")) or 2
|
factions_config.power = tonumber(minetest.setting_get("power")) or 0
|
||||||
config.maxpower = tonumber(minetest.setting_get("maxpower")) or 2
|
factions_config.maxpower = tonumber(minetest.setting_get("maxpower")) or 0
|
||||||
config.power_per_banner = tonumber(minetest.setting_get("power_per_banner")) or 10.
|
factions_config.power_per_player = tonumber(minetest.setting_get("power_per_player")) or 2.
|
||||||
config.attack_parcel = minetest.settings:get_bool("attack_parcel") or false
|
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.protection_max_depth = -512
|
||||||
|
factions_config.power_per_parcel = 0.5
|
||||||
|
factions_config.power_per_death = 0.25
|
||||||
|
factions_config.power_per_tick = 0.125
|
||||||
|
factions_config.tick_time = 60
|
||||||
|
factions_config.power_per_attack = 10
|
||||||
|
factions_config.faction_name_max_length = 50
|
||||||
|
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.power_per_player = 2
|
||||||
|
factions_config.enable_power_per_player = true
|
||||||
|
factions_config.attack_parcel = false
|
||||||
|
factions_config.faction_diplomacy = true
|
||||||
|
--]]
|
345
factions.lua
345
factions.lua
@ -1,17 +1,3 @@
|
|||||||
-------------------------------------------------------------------------------
|
|
||||||
-- factions Mod by Sapier
|
|
||||||
--
|
|
||||||
-- License WTFPL
|
|
||||||
--
|
|
||||||
--! @file factions.lua
|
|
||||||
--! @brief factions core file
|
|
||||||
--! @copyright Sapier, agrecascino, shamoanjac, Coder12a
|
|
||||||
--! @author Sapier, agrecascino, shamoanjac, Coder12a
|
|
||||||
--! @date 2016-08-12
|
|
||||||
--
|
|
||||||
-- Contact sapier a t gmx net
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
--read some basic information
|
--read some basic information
|
||||||
local factions_worldid = minetest.get_worldpath()
|
local factions_worldid = minetest.get_worldpath()
|
||||||
|
|
||||||
@ -27,15 +13,26 @@ factions.players = {}
|
|||||||
|
|
||||||
factions.factions = {}
|
factions.factions = {}
|
||||||
--- settings
|
--- settings
|
||||||
factions.protection_max_depth = config.protection_max_depth
|
factions.protection_max_depth = factions_config.protection_max_depth
|
||||||
factions.power_per_parcel = config.power_per_parcel
|
factions.power_per_parcel = factions_config.power_per_parcel
|
||||||
factions.power_per_death = config.power_per_death
|
factions.power_per_death = factions_config.power_per_death
|
||||||
factions.power_per_tick = config.power_per_tick
|
factions.power_per_tick = factions_config.power_per_tick
|
||||||
factions.tick_time = config.tick_time
|
factions.tick_time = factions_config.tick_time
|
||||||
factions.power_per_attack = config.power_per_attack
|
factions.power_per_attack = factions_config.power_per_attack
|
||||||
factions.faction_name_max_length = config.faction_name_max_length
|
factions.faction_name_max_length = factions_config.faction_name_max_length
|
||||||
factions.rank_name_max_length = config.rank_name_max_length
|
factions.rank_name_max_length = factions_config.rank_name_max_length
|
||||||
factions.maximum_faction_inactivity = config.maximum_faction_inactivity
|
factions.maximum_faction_inactivity = factions_config.maximum_faction_inactivity
|
||||||
|
factions.maximum_parcelless_faction_time = factions_config.maximum_parcelless_faction_time
|
||||||
|
factions.attack_parcel = factions_config.attack_parcel
|
||||||
|
factions.faction_diplomacy = factions_config.faction_diplomacy
|
||||||
|
factions.power_per_player = factions_config.power_per_player
|
||||||
|
factions.enable_power_per_player = factions_config.enable_power_per_player
|
||||||
|
factions.power = factions_config.power
|
||||||
|
factions.maxpower = factions_config.maxpower
|
||||||
|
factions.attack_parcel = factions_config.attack_parcel
|
||||||
|
|
||||||
|
-- clear mem.
|
||||||
|
factions_config = nil
|
||||||
|
|
||||||
---------------------
|
---------------------
|
||||||
--! @brief returns whether a faction can be created or not (allows for implementation of blacklists and the like)
|
--! @brief returns whether a faction can be created or not (allows for implementation of blacklists and the like)
|
||||||
@ -71,23 +68,27 @@ factions.Faction.__index = factions.Faction
|
|||||||
-- description: set the faction's description
|
-- description: set the faction's description
|
||||||
-- ranks: create and delete ranks
|
-- ranks: create and delete ranks
|
||||||
-- spawn: set the faction's spawn
|
-- spawn: set the faction's spawn
|
||||||
-- banner: set the faction's banner
|
|
||||||
-- promote: set a player's rank
|
-- promote: set a player's rank
|
||||||
|
-- diplomacy: make war, or an alliance with other teams.
|
||||||
|
|
||||||
factions.permissions = {"disband", "claim", "playerslist", "build", "description", "ranks", "spawn", "banner", "promote"}
|
factions.permissions = {"disband", "claim", "playerslist", "build", "description", "ranks", "spawn", "promote"}
|
||||||
|
|
||||||
|
if factions.faction_diplomacy then
|
||||||
|
table.insert(factions.permissions,"diplomacy")
|
||||||
|
end
|
||||||
|
|
||||||
function factions.Faction:new(faction)
|
function factions.Faction:new(faction)
|
||||||
faction = {
|
faction = {
|
||||||
--! @brief power of a faction (needed for parcel claiming)
|
--! @brief power of a faction (needed for parcel claiming)
|
||||||
power = config.power,
|
power = factions.power,
|
||||||
--! @brief maximum power of a faction
|
--! @brief maximum power of a faction
|
||||||
maxpower = config.maxpower,
|
maxpower = factions.maxpower,
|
||||||
--! @brief power currently in use
|
--! @brief power currently in use
|
||||||
usedpower = 0.,
|
usedpower = 0.,
|
||||||
--! @brief list of player names
|
--! @brief list of player names
|
||||||
players = {},
|
players = {},
|
||||||
--! @brief table of ranks/permissions
|
--! @brief table of ranks/permissions
|
||||||
ranks = {["leader"] = {"disband", "claim", "playerslist", "build", "description", "ranks", "spawn", "banner", "promote"},
|
ranks = {["leader"] = factions.permissions,
|
||||||
["moderator"] = {"claim", "playerslist", "build", "spawn"},
|
["moderator"] = {"claim", "playerslist", "build", "spawn"},
|
||||||
["member"] = {"build"}
|
["member"] = {"build"}
|
||||||
},
|
},
|
||||||
@ -105,18 +106,22 @@ function factions.Faction:new(faction)
|
|||||||
land = {},
|
land = {},
|
||||||
--! @brief table of allies
|
--! @brief table of allies
|
||||||
allies = {},
|
allies = {},
|
||||||
|
--
|
||||||
|
request_inbox = {},
|
||||||
--! @brief table of enemies
|
--! @brief table of enemies
|
||||||
enemies = {},
|
enemies = {},
|
||||||
|
--!
|
||||||
|
at_peace_with = {},
|
||||||
--! @brief table of parcels/factions that are under attack
|
--! @brief table of parcels/factions that are under attack
|
||||||
attacked_parcels = {},
|
attacked_parcels = {},
|
||||||
--! @brief whether faction is closed or open (boolean)
|
--! @brief whether faction is closed or open (boolean)
|
||||||
join_free = false,
|
join_free = false,
|
||||||
--! @brief banner texture string
|
|
||||||
banner = "bg_white.png",
|
|
||||||
--! @brief gives certain privileges
|
--! @brief gives certain privileges
|
||||||
is_admin = false,
|
is_admin = false,
|
||||||
--! @brief last time anyone logged on
|
--! @brief last time anyone logged on
|
||||||
last_logon = os.time(),
|
last_logon = os.time(),
|
||||||
|
--! @brief how long this has been without parcels
|
||||||
|
no_parcel = os.time(),
|
||||||
} or faction
|
} or faction
|
||||||
setmetatable(faction, self)
|
setmetatable(faction, self)
|
||||||
return faction
|
return faction
|
||||||
@ -231,11 +236,29 @@ function factions.Faction.count_land(self)
|
|||||||
return count
|
return count
|
||||||
end
|
end
|
||||||
|
|
||||||
|
minetest.register_on_prejoinplayer(function(name, ip)
|
||||||
|
factions_ip.player_ips[name] = ip
|
||||||
|
end)
|
||||||
|
|
||||||
function factions.Faction.add_player(self, player, rank)
|
function factions.Faction.add_player(self, player, rank)
|
||||||
self:on_player_join(player)
|
self:on_player_join(player)
|
||||||
self.players[player] = rank or self.default_rank
|
self.players[player] = rank or self.default_rank
|
||||||
factions.players[player] = self.name
|
factions.players[player] = self.name
|
||||||
self.invited_players[player] = nil
|
self.invited_players[player] = nil
|
||||||
|
if factions.enable_power_per_player then
|
||||||
|
local ip = factions_ip.player_ips[player]
|
||||||
|
local notsame = true
|
||||||
|
for i,k in pairs(self.players) do
|
||||||
|
local other_ip = factions_ip.player_ips[k]
|
||||||
|
if other_ip == ip then
|
||||||
|
notsame = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if notsame then
|
||||||
|
self:increase_maxpower(factions.power_per_player)
|
||||||
|
end
|
||||||
|
end
|
||||||
local playerslist = minetest.get_connected_players()
|
local playerslist = minetest.get_connected_players()
|
||||||
for i in pairs(playerslist) do
|
for i in pairs(playerslist) do
|
||||||
local realplayer = playerslist[i]
|
local realplayer = playerslist[i]
|
||||||
@ -260,12 +283,26 @@ function factions.Faction.remove_player(self, player)
|
|||||||
factions.players[player] = nil
|
factions.players[player] = nil
|
||||||
self:on_player_leave(player)
|
self:on_player_leave(player)
|
||||||
self:check_players_in_faction(self)
|
self:check_players_in_faction(self)
|
||||||
|
if factions.enable_power_per_player then
|
||||||
|
local ip = factions_ip.player_ips[player]
|
||||||
|
local notsame = true
|
||||||
|
for i,k in pairs(self.players) do
|
||||||
|
local other_ip = factions_ip.player_ips[k]
|
||||||
|
if other_ip == ip then
|
||||||
|
notsame = false
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
if notsame then
|
||||||
|
self:decrease_maxpower(factions.power_per_player)
|
||||||
|
end
|
||||||
|
end
|
||||||
local playerslist = minetest.get_connected_players()
|
local playerslist = minetest.get_connected_players()
|
||||||
for i in pairs(playerslist) do
|
for i in pairs(playerslist) do
|
||||||
local realplayer = playerslist[i]
|
local realplayer = playerslist[i]
|
||||||
if realplayer:get_player_name() == player then
|
if realplayer:get_player_name() == player then
|
||||||
removeHud(realplayer,"1")
|
removeHud(realplayer,"factionName")
|
||||||
removeHud(realplayer,"2")
|
removeHud(realplayer,"powerWatch")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
factions.save()
|
factions.save()
|
||||||
@ -276,7 +313,7 @@ end
|
|||||||
function factions.Faction.can_claim_parcel(self, parcelpos)
|
function factions.Faction.can_claim_parcel(self, parcelpos)
|
||||||
local fac = factions.parcels[parcelpos]
|
local fac = factions.parcels[parcelpos]
|
||||||
if fac then
|
if fac then
|
||||||
if factions.factions[fac].power < 0. and self.power >= factions.power_per_parcel then
|
if factions.factions[fac].power < 0. and self.power >= factions.power_per_parcel and not self.allies[factions.factions[fac].name] and not self.at_peace_with[factions.factions[fac].name] then
|
||||||
return true
|
return true
|
||||||
else
|
else
|
||||||
return false
|
return false
|
||||||
@ -294,12 +331,14 @@ function factions.Faction.claim_parcel(self, parcelpos)
|
|||||||
if otherfac then
|
if otherfac then
|
||||||
local faction = factions.factions[otherfac]
|
local faction = factions.factions[otherfac]
|
||||||
faction:unclaim_parcel(parcelpos)
|
faction:unclaim_parcel(parcelpos)
|
||||||
|
faction:parcelless_check()
|
||||||
end
|
end
|
||||||
factions.parcels[parcelpos] = self.name
|
factions.parcels[parcelpos] = self.name
|
||||||
self.land[parcelpos] = true
|
self.land[parcelpos] = true
|
||||||
self:decrease_power(factions.power_per_parcel)
|
self:decrease_power(factions.power_per_parcel)
|
||||||
self:increase_usedpower(factions.power_per_parcel)
|
self:increase_usedpower(factions.power_per_parcel)
|
||||||
self:on_claim_parcel(parcelpos)
|
self:on_claim_parcel(parcelpos)
|
||||||
|
self:parcelless_check()
|
||||||
factions.save()
|
factions.save()
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -310,12 +349,44 @@ function factions.Faction.unclaim_parcel(self, parcelpos)
|
|||||||
self:increase_power(factions.power_per_parcel)
|
self:increase_power(factions.power_per_parcel)
|
||||||
self:decrease_usedpower(factions.power_per_parcel)
|
self:decrease_usedpower(factions.power_per_parcel)
|
||||||
self:on_unclaim_parcel(parcelpos)
|
self:on_unclaim_parcel(parcelpos)
|
||||||
|
self:parcelless_check()
|
||||||
factions.save()
|
factions.save()
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function factions.Faction.parcelless_check(self)
|
||||||
|
if self.land then
|
||||||
|
local count = 0
|
||||||
|
for index, value in pairs(self.land) do
|
||||||
|
count = count + 1
|
||||||
|
end
|
||||||
|
if count > 0 then
|
||||||
|
if self.no_parcel ~= -1 then
|
||||||
|
self:broadcast("Faction " .. self.name .. " will not be disbanded because it now has parcels.")
|
||||||
|
end
|
||||||
|
self.no_parcel = -1
|
||||||
|
else
|
||||||
|
self.no_parcel = os.time()
|
||||||
|
self:broadcast("Faction " .. self.name .. " will disband in " .. factions.maximum_parcelless_faction_time .. " seconds because it has no parcels.")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
--! @brief disband faction, updates global players and parcels table
|
--! @brief disband faction, updates global players and parcels table
|
||||||
function factions.Faction.disband(self, reason)
|
function factions.Faction.disband(self, reason)
|
||||||
local playerslist = minetest.get_connected_players()
|
local playerslist = minetest.get_connected_players()
|
||||||
|
for i,v in pairs(factions.factions) do
|
||||||
|
if v.name ~= self.name then
|
||||||
|
if v.enemies[self.name] then
|
||||||
|
v:end_enemy(self.name)
|
||||||
|
end
|
||||||
|
if v.allies[self.name] then
|
||||||
|
v:end_alliance(self.name)
|
||||||
|
end
|
||||||
|
if v.at_peace_with[self.name] then
|
||||||
|
v:end_peace(self.name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
for k, _ in pairs(factions.players) do -- remove players affiliation
|
for k, _ in pairs(factions.players) do -- remove players affiliation
|
||||||
factions.players[k] = nil
|
factions.players[k] = nil
|
||||||
end
|
end
|
||||||
@ -328,8 +399,8 @@ function factions.Faction.disband(self, reason)
|
|||||||
local realplayer = playerslist[i]
|
local realplayer = playerslist[i]
|
||||||
local faction = factions.get_player_faction(realplayer:get_player_name())
|
local faction = factions.get_player_faction(realplayer:get_player_name())
|
||||||
if not faction then
|
if not faction then
|
||||||
removeHud(realplayer,"1")
|
removeHud(realplayer,"factionName")
|
||||||
removeHud(realplayer,"2")
|
removeHud(realplayer,"powerWatch")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
factions.save()
|
factions.save()
|
||||||
@ -397,6 +468,9 @@ function factions.Faction.new_alliance(self, faction)
|
|||||||
self:on_new_alliance(faction)
|
self:on_new_alliance(faction)
|
||||||
if self.enemies[faction] then
|
if self.enemies[faction] then
|
||||||
self:end_enemy(faction)
|
self:end_enemy(faction)
|
||||||
|
end
|
||||||
|
if self.at_peace_with[faction] then
|
||||||
|
self:end_peace(faction)
|
||||||
end
|
end
|
||||||
factions.save()
|
factions.save()
|
||||||
end
|
end
|
||||||
@ -405,11 +479,30 @@ function factions.Faction.end_alliance(self, faction)
|
|||||||
self:on_end_alliance(faction)
|
self:on_end_alliance(faction)
|
||||||
factions.save()
|
factions.save()
|
||||||
end
|
end
|
||||||
|
function factions.Faction.new_peace(self, faction)
|
||||||
|
self.at_peace_with[faction] = true
|
||||||
|
self:on_new_peace(faction)
|
||||||
|
if self.allies[faction] then
|
||||||
|
self:end_alliance(faction)
|
||||||
|
end
|
||||||
|
if self.enemies[faction] then
|
||||||
|
self:end_enemy(faction)
|
||||||
|
end
|
||||||
|
factions.save()
|
||||||
|
end
|
||||||
|
function factions.Faction.end_peace(self, faction)
|
||||||
|
self.at_peace_with[faction] = nil
|
||||||
|
self:on_end_peace(faction)
|
||||||
|
factions.save()
|
||||||
|
end
|
||||||
function factions.Faction.new_enemy(self, faction)
|
function factions.Faction.new_enemy(self, faction)
|
||||||
self.enemies[faction] = true
|
self.enemies[faction] = true
|
||||||
self:on_new_enemy(faction)
|
self:on_new_enemy(faction)
|
||||||
if self.allies[faction] then
|
if self.allies[faction] then
|
||||||
self:end_alliance(faction)
|
self:end_alliance(faction)
|
||||||
|
end
|
||||||
|
if self.at_peace_with[faction] then
|
||||||
|
self:end_peace(faction)
|
||||||
end
|
end
|
||||||
factions.save()
|
factions.save()
|
||||||
end
|
end
|
||||||
@ -449,12 +542,6 @@ function factions.Faction.delete_rank(self, rank, newrank)
|
|||||||
factions.save()
|
factions.save()
|
||||||
end
|
end
|
||||||
|
|
||||||
--! @param newbanner texture string of the new banner
|
|
||||||
function factions.Faction.set_banner(self, newbanner)
|
|
||||||
self.banner = newbanner
|
|
||||||
self:on_new_banner()
|
|
||||||
end
|
|
||||||
|
|
||||||
--! @brief set a player's rank
|
--! @brief set a player's rank
|
||||||
function factions.Faction.promote(self, member, rank)
|
function factions.Faction.promote(self, member, rank)
|
||||||
self.players[member] = rank
|
self.players[member] = rank
|
||||||
@ -484,20 +571,24 @@ function factions.Faction.is_online(self)
|
|||||||
end
|
end
|
||||||
|
|
||||||
function factions.Faction.attack_parcel(self, parcelpos)
|
function factions.Faction.attack_parcel(self, parcelpos)
|
||||||
if config.attack_parcel then
|
if factions.attack_parcel then
|
||||||
local attacked_faction = factions.get_parcel_faction(parcelpos)
|
local attacked_faction = factions.get_parcel_faction(parcelpos)
|
||||||
if attacked_faction then
|
if attacked_faction then
|
||||||
self.power = self.power - factions.power_per_attack
|
if not self.allies[attacked_faction.name] then
|
||||||
if attacked_faction.attacked_parcels[parcelpos] then
|
self.power = self.power - factions.power_per_attack
|
||||||
attacked_faction.attacked_parcels[parcelpos][self.name] = true
|
if attacked_faction.attacked_parcels[parcelpos] then
|
||||||
|
attacked_faction.attacked_parcels[parcelpos][self.name] = true
|
||||||
|
else
|
||||||
|
attacked_faction.attacked_parcels[parcelpos] = {[self.name] = true}
|
||||||
|
end
|
||||||
|
attacked_faction:broadcast("Parcel ("..parcelpos..") is being attacked by "..self.name.."!!")
|
||||||
|
if self.power < 0. then -- punish memers
|
||||||
|
minetest.chat_send_all("Faction "..self.name.." has attacked too much and has now negative power!")
|
||||||
|
end
|
||||||
|
factions.save()
|
||||||
else
|
else
|
||||||
attacked_faction.attacked_parcels[parcelpos] = {[self.name] = true}
|
self:broadcast("You can not attack that parcel because it belongs to an ally.")
|
||||||
end
|
end
|
||||||
attacked_faction:broadcast("Parcel ("..parcelpos..") is being attacked by "..self.name.."!!")
|
|
||||||
if self.power < 0. then -- punish memers
|
|
||||||
minetest.chat_send_all("Faction "..self.name.." has attacked too much and has now negative power!")
|
|
||||||
end
|
|
||||||
factions.save()
|
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
@ -581,6 +672,22 @@ function factions.Faction.on_end_alliance(self, faction)
|
|||||||
self:broadcast("This faction is no longer allied with "..faction.."!")
|
self:broadcast("This faction is no longer allied with "..faction.."!")
|
||||||
end
|
end
|
||||||
|
|
||||||
|
function factions.Faction.on_new_peace(self, faction)
|
||||||
|
self:broadcast("This faction is now at peace with "..faction)
|
||||||
|
end
|
||||||
|
|
||||||
|
function factions.Faction.on_end_peace(self, faction)
|
||||||
|
self:broadcast("This faction is no longer at peace with "..faction.."!")
|
||||||
|
end
|
||||||
|
|
||||||
|
function factions.Faction.on_new_enemy(self, faction)
|
||||||
|
self:broadcast("This faction is now at war with "..faction)
|
||||||
|
end
|
||||||
|
|
||||||
|
function factions.Faction.on_end_enemy(self, faction)
|
||||||
|
self:broadcast("This faction is no longer at war with "..faction.."!")
|
||||||
|
end
|
||||||
|
|
||||||
function factions.Faction.on_set_spawn(self)
|
function factions.Faction.on_set_spawn(self)
|
||||||
self:broadcast("The faction spawn has been set to ("..util.coords3D_string(self.spawn)..").")
|
self:broadcast("The faction spawn has been set to ("..util.coords3D_string(self.spawn)..").")
|
||||||
end
|
end
|
||||||
@ -593,10 +700,6 @@ function factions.Faction.on_delete_rank(self, rank, newrank)
|
|||||||
self:broadcast("The rank "..rank.." has been deleted and replaced by "..newrank)
|
self:broadcast("The rank "..rank.." has been deleted and replaced by "..newrank)
|
||||||
end
|
end
|
||||||
|
|
||||||
function factions.Faction.on_new_banner(self)
|
|
||||||
self:broadcast("A new banner has been set.")
|
|
||||||
end
|
|
||||||
|
|
||||||
function factions.Faction.on_promote(self, member)
|
function factions.Faction.on_promote(self, member)
|
||||||
minetest.chat_send_player(member, "You have been promoted to "..self.players[member])
|
minetest.chat_send_player(member, "You have been promoted to "..self.players[member])
|
||||||
end
|
end
|
||||||
@ -702,6 +805,7 @@ function factions.save()
|
|||||||
else
|
else
|
||||||
minetest.log("error","MOD factions: unable to save factions world specific data!: " .. error)
|
minetest.log("error","MOD factions: unable to save factions world specific data!: " .. error)
|
||||||
end
|
end
|
||||||
|
factions_ip.save()
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@ -749,9 +853,13 @@ function factions.load()
|
|||||||
if not faction.last_logon then
|
if not faction.last_logon then
|
||||||
faction.last_logon = os.time()
|
faction.last_logon = os.time()
|
||||||
end
|
end
|
||||||
|
if not faction.no_parcel then
|
||||||
|
faction.no_parcel = os.time()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
file:close()
|
file:close()
|
||||||
end
|
end
|
||||||
|
factions_ip.load()
|
||||||
end
|
end
|
||||||
|
|
||||||
function factions.convert(filename)
|
function factions.convert(filename)
|
||||||
@ -806,104 +914,31 @@ factions.faction_tick = function()
|
|||||||
local now = os.time()
|
local now = os.time()
|
||||||
for facname, faction in pairs(factions.factions) do
|
for facname, faction in pairs(factions.factions) do
|
||||||
if faction:is_online() then
|
if faction:is_online() then
|
||||||
|
if factions.enable_power_per_player then
|
||||||
|
local playerslist = minetest.get_connected_players()
|
||||||
|
for i in pairs(playerslist) do
|
||||||
|
local faction_name = factions.get_player_faction(playerslist[i])
|
||||||
|
if facname == faction_name then
|
||||||
|
increase_power(power_per_tick)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
faction:increase_power(factions.power_per_tick)
|
faction:increase_power(factions.power_per_tick)
|
||||||
end
|
end
|
||||||
if now - faction.last_logon > factions.maximum_faction_inactivity then
|
if now - faction.last_logon > factions.maximum_faction_inactivity then
|
||||||
faction:disband()
|
faction:disband()
|
||||||
|
else
|
||||||
|
if faction.no_parcel ~= -1 and now - faction.no_parcel > factions.maximum_parcelless_faction_time then
|
||||||
|
faction:disband()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
hud_ids = {}
|
|
||||||
|
|
||||||
createHudFactionName = function(player,factionname)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local id_name = name .. "1"
|
|
||||||
if not hud_ids[id_name] then
|
|
||||||
hud_ids[id_name] = player:hud_add({
|
|
||||||
hud_elem_type = "text",
|
|
||||||
name = "factionName",
|
|
||||||
number = 0xFFFFFF,
|
|
||||||
position = {x=1, y = 0},
|
|
||||||
text = "Faction "..factionname,
|
|
||||||
scale = {x=1, y=1},
|
|
||||||
alignment = {x=-1, y=0},
|
|
||||||
offset = {x = -20, y = 20}
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
createHudPower = function(player,faction)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local id_name = name .. "2"
|
|
||||||
if not hud_ids[id_name] then
|
|
||||||
hud_ids[id_name] = player:hud_add({
|
|
||||||
hud_elem_type = "text",
|
|
||||||
name = "powerWatch",
|
|
||||||
number = 0xFFFFFF,
|
|
||||||
position = {x=0.9, y = .98},
|
|
||||||
text = "Power "..faction.power.."/"..faction.maxpower - faction.usedpower.."/"..faction.maxpower,
|
|
||||||
scale = {x=1, y=1},
|
|
||||||
alignment = {x=-1, y=0},
|
|
||||||
offset = {x = 0, y = 0}
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
updateHudPower = function(player,faction)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local id_name = name .. "2"
|
|
||||||
if hud_ids[id_name] then
|
|
||||||
player:hud_change(hud_ids[id_name],"text","Power "..faction.power.."/"..faction.maxpower - faction.usedpower.."/"..faction.maxpower)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
removeHud = function(player,numberString)
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local id_name = name .. numberString
|
|
||||||
if hud_ids[id_name] then
|
|
||||||
player:hud_remove(hud_ids[id_name])
|
|
||||||
hud_ids[id_name] = nil
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
hudUpdate = function()
|
|
||||||
minetest.after(.5,
|
|
||||||
function()
|
|
||||||
local playerslist = minetest.get_connected_players()
|
|
||||||
for i in pairs(playerslist) do
|
|
||||||
local player = playerslist[i]
|
|
||||||
local name = player:get_player_name()
|
|
||||||
local faction = factions.get_faction_at(player:getpos())
|
|
||||||
local id_name = name .. "0"
|
|
||||||
if hud_ids[id_name] then
|
|
||||||
player:hud_change(hud_ids[id_name],"text",(faction and faction.name) or "Wilderness")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
hudUpdate()
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
factionUpdate = function()
|
|
||||||
minetest.after(factions.tick_time,
|
|
||||||
function()
|
|
||||||
factions.faction_tick()
|
|
||||||
factionUpdate()
|
|
||||||
end)
|
|
||||||
end
|
|
||||||
|
|
||||||
minetest.register_on_joinplayer(
|
minetest.register_on_joinplayer(
|
||||||
function(player)
|
function(player)
|
||||||
local name = player:get_player_name()
|
local name = player:get_player_name()
|
||||||
hud_ids[name .. "0"] = player:hud_add({
|
createHudfactionLand(player)
|
||||||
hud_elem_type = "text",
|
|
||||||
name = "factionLand",
|
|
||||||
number = 0xFFFFFF,
|
|
||||||
position = {x=0.1, y = .98},
|
|
||||||
text = "Wilderness",
|
|
||||||
scale = {x=1, y=1},
|
|
||||||
alignment = {x=0, y=0},
|
|
||||||
})
|
|
||||||
local faction = factions.get_player_faction(name)
|
local faction = factions.get_player_faction(name)
|
||||||
if faction then
|
if faction then
|
||||||
faction.last_logon = os.time()
|
faction.last_logon = os.time()
|
||||||
@ -915,14 +950,9 @@ end
|
|||||||
|
|
||||||
minetest.register_on_leaveplayer(
|
minetest.register_on_leaveplayer(
|
||||||
function(player)
|
function(player)
|
||||||
local name = player:get_player_name()
|
removeHud(player,"factionLand")
|
||||||
local id_name = name .. "0"
|
removeHud(player,"factionName")
|
||||||
if hud_ids[id_name] then
|
removeHud(player,"powerWatch")
|
||||||
player:hud_remove(hud_ids[id_name])
|
|
||||||
hud_ids[id_name] = nil
|
|
||||||
end
|
|
||||||
removeHud(player,"1")
|
|
||||||
removeHud(player,"2")
|
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -975,22 +1005,15 @@ minetest.is_protected = function(pos, player)
|
|||||||
elseif player_faction then
|
elseif player_faction then
|
||||||
if parcel_faction.name == player_faction.name then
|
if parcel_faction.name == player_faction.name then
|
||||||
return not parcel_faction:has_permission(player, "build")
|
return not parcel_faction:has_permission(player, "build")
|
||||||
else
|
elseif parcel_faction.allies[player_faction.name] then
|
||||||
return not parcel_faction:parcel_is_attacked_by(parcelpos, player_faction)
|
return not player_faction:has_permission(player, "build")
|
||||||
|
else
|
||||||
|
return not parcel_faction:parcel_is_attacked_by(parcelpos, player_faction)
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
function grant_new_player_faction_user_priv(player)
|
|
||||||
local name = player.name
|
|
||||||
local privs = minetest.get_player_privs(name)
|
|
||||||
privs.faction_user = true
|
|
||||||
minetest.set_player_privs(name, privs)
|
|
||||||
end
|
|
||||||
|
|
||||||
register_on_newplayer(grant_new_player_faction_user_priv)
|
|
||||||
|
|
||||||
hudUpdate()
|
hudUpdate()
|
||||||
factionUpdate()
|
factionUpdate()
|
90
hud.lua
Normal file
90
hud.lua
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
hud_ids = {}
|
||||||
|
|
||||||
|
createHudfactionLand = function(player)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
hud_ids[name .. "factionLand"] = player:hud_add({
|
||||||
|
hud_elem_type = "text",
|
||||||
|
name = "factionLand",
|
||||||
|
number = 0xFFFFFF,
|
||||||
|
position = {x=0.1, y = .98},
|
||||||
|
text = "Wilderness",
|
||||||
|
scale = {x=1, y=1},
|
||||||
|
alignment = {x=0, y=0},
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
createHudFactionName = function(player,factionname)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local id_name = name .. "factionName"
|
||||||
|
if not hud_ids[id_name] then
|
||||||
|
hud_ids[id_name] = player:hud_add({
|
||||||
|
hud_elem_type = "text",
|
||||||
|
name = "factionName",
|
||||||
|
number = 0xFFFFFF,
|
||||||
|
position = {x=1, y = 0},
|
||||||
|
text = "Faction "..factionname,
|
||||||
|
scale = {x=1, y=1},
|
||||||
|
alignment = {x=-1, y=0},
|
||||||
|
offset = {x = -20, y = 20}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
createHudPower = function(player,faction)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local id_name = name .. "powerWatch"
|
||||||
|
if not hud_ids[id_name] then
|
||||||
|
hud_ids[id_name] = player:hud_add({
|
||||||
|
hud_elem_type = "text",
|
||||||
|
name = "powerWatch",
|
||||||
|
number = 0xFFFFFF,
|
||||||
|
position = {x=0.9, y = .98},
|
||||||
|
text = "Power "..faction.power.."/"..faction.maxpower - faction.usedpower.."/"..faction.maxpower,
|
||||||
|
scale = {x=1, y=1},
|
||||||
|
alignment = {x=-1, y=0},
|
||||||
|
offset = {x = 0, y = 0}
|
||||||
|
})
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
updateHudPower = function(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.maxpower - faction.usedpower.."/"..faction.maxpower)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
removeHud = function(player,hudname)
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local id_name = name .. hudname
|
||||||
|
if hud_ids[id_name] then
|
||||||
|
player:hud_remove(hud_ids[id_name])
|
||||||
|
hud_ids[id_name] = nil
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
hudUpdate = function()
|
||||||
|
minetest.after(3,
|
||||||
|
function()
|
||||||
|
local playerslist = minetest.get_connected_players()
|
||||||
|
for i in pairs(playerslist) do
|
||||||
|
local player = playerslist[i]
|
||||||
|
local name = player:get_player_name()
|
||||||
|
local faction = factions.get_faction_at(player:getpos())
|
||||||
|
local id_name = name .. "factionLand"
|
||||||
|
if hud_ids[id_name] then
|
||||||
|
player:hud_change(hud_ids[id_name],"text",(faction and faction.name) or "Wilderness")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
hudUpdate()
|
||||||
|
end)
|
||||||
|
end
|
||||||
|
|
||||||
|
factionUpdate = function()
|
||||||
|
minetest.after(factions.tick_time,
|
||||||
|
function()
|
||||||
|
factions.faction_tick()
|
||||||
|
factionUpdate()
|
||||||
|
end)
|
||||||
|
end
|
16
init.lua
16
init.lua
@ -1,17 +1,3 @@
|
|||||||
-------------------------------------------------------------------------------
|
|
||||||
-- factions Mod by Sapier
|
|
||||||
--
|
|
||||||
-- License WTFPL
|
|
||||||
--
|
|
||||||
--! @file init.lua
|
|
||||||
--! @brief factions mod to be used by other mods
|
|
||||||
--! @copyright Sapier, Coder12a
|
|
||||||
--! @author Sapier, Coder12a
|
|
||||||
--! @date 2013-05-08
|
|
||||||
--!
|
|
||||||
-- Contact sapier a t gmx net
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
factions_version = "0.8.1"
|
factions_version = "0.8.1"
|
||||||
|
|
||||||
core.log("action", "MOD: factions (by sapier) loading ...")
|
core.log("action", "MOD: factions (by sapier) loading ...")
|
||||||
@ -20,6 +6,8 @@ core.log("action", "MOD: factions (by sapier) loading ...")
|
|||||||
factions_modpath = minetest.get_modpath("factions")
|
factions_modpath = minetest.get_modpath("factions")
|
||||||
|
|
||||||
dofile (factions_modpath .. "/config.lua")
|
dofile (factions_modpath .. "/config.lua")
|
||||||
|
dofile (factions_modpath .. "/hud.lua")
|
||||||
|
dofile (factions_modpath .. "/ip.lua")
|
||||||
dofile (factions_modpath .. "/factions.lua")
|
dofile (factions_modpath .. "/factions.lua")
|
||||||
dofile (factions_modpath .. "/chatcommands.lua")
|
dofile (factions_modpath .. "/chatcommands.lua")
|
||||||
dofile (factions_modpath .. "/nodes.lua")
|
dofile (factions_modpath .. "/nodes.lua")
|
||||||
|
28
ip.lua
Normal file
28
ip.lua
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
factions_ip = {}
|
||||||
|
factions_ip.player_ips = {}
|
||||||
|
|
||||||
|
--read some basic information
|
||||||
|
local factions_worldid = minetest.get_worldpath()
|
||||||
|
|
||||||
|
function factions_ip.save()
|
||||||
|
local file,error = io.open(factions_worldid .. "/" .. "factions_iplist.conf","w")
|
||||||
|
|
||||||
|
if file ~= nil then
|
||||||
|
file:write(minetest.serialize(factions_ip.player_ips))
|
||||||
|
file:close()
|
||||||
|
else
|
||||||
|
minetest.log("error","MOD factions: unable to save faction player ips!: " .. error)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function factions_ip.load()
|
||||||
|
local file,error = io.open(factions_worldid .. "/" .. "factions_iplist.conf","r")
|
||||||
|
|
||||||
|
if file ~= nil then
|
||||||
|
local raw_data = file:read("*a")
|
||||||
|
factions_ip.player_ips = minetest.deserialize(raw_data)
|
||||||
|
file:close()
|
||||||
|
else
|
||||||
|
minetest.log("error","MOD factions: unable to load faction player ips!: " .. error)
|
||||||
|
end
|
||||||
|
end
|
@ -21,7 +21,7 @@ function factions.can_use_chest(pos, player)
|
|||||||
if not parcel_faction then
|
if not parcel_faction then
|
||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
return player_faction and (parcel_faction.name == player_faction.name)
|
return player_faction and (parcel_faction.name == player_faction.name or parcel_faction.allies[player_faction.name])
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.register_node("factions:chest", {
|
minetest.register_node("factions:chest", {
|
||||||
|
@ -18,14 +18,20 @@ faction_name_max_length (Faction name max) int 50
|
|||||||
rank_name_max_length (Rank name max length) int 25
|
rank_name_max_length (Rank name max length) int 25
|
||||||
# The maximum amount of inactivity before disbanning a faction.
|
# The maximum amount of inactivity before disbanning a faction.
|
||||||
maximum_faction_inactivity (Maximum faction inactivity) int 604800
|
maximum_faction_inactivity (Maximum faction inactivity) int 604800
|
||||||
|
# The maximum amount of time for a parcelless faction to disban.
|
||||||
|
maximum_parcelless_faction_time (Maximum parcelless faction time) int 10800
|
||||||
# Power of a starting faction (needed for parcel claiming).
|
# Power of a starting faction (needed for parcel claiming).
|
||||||
power (Starting power) float 2
|
power (Starting power) float 2
|
||||||
# Maximum power of a faction.
|
# Maximum power of a faction.
|
||||||
maxpower (Maximum power) float 2
|
maxpower (Maximum power) float 2
|
||||||
# How much power the banners make.
|
# How much power the players make.
|
||||||
power_per_banner (power-per-banner) float 10
|
power_per_player (power-per-player) float 10
|
||||||
|
|
||||||
[BoolSettings]
|
[BoolSettings]
|
||||||
|
|
||||||
|
# Enable or disabled power-per-player.
|
||||||
|
power_per_playerb (Enable power-per-player) bool true
|
||||||
# Enable or disabled attack_parcel function.
|
# Enable or disabled attack_parcel function.
|
||||||
attack_parcel (Enable attack parcel) bool false
|
attack_parcel (Enable attack parcel) bool false
|
||||||
|
# Enable or disabled faction diplomacy.
|
||||||
|
faction_diplomacy (Enable faction diplomacy) bool false
|
Loading…
Reference in New Issue
Block a user