From 6bfd210d2cf448164ed1c53fbde501c9d1b1a9fe Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 16 May 2019 17:57:46 -0500 Subject: [PATCH 01/32] Remove: name from is_player_connected param --- factions.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/factions.lua b/factions.lua index 2fdf980..3c079b7 100644 --- a/factions.lua +++ b/factions.lua @@ -232,7 +232,7 @@ function factions.add_player(name, player, rank) faction.invited_players[player] = nil local pdata = minetest.get_player_by_name(player) if pdata then - local ipc = pdata:is_player_connected(player) + local ipc = pdata:is_player_connected() if ipc then createHudFactionName(pdata, name) createHudPower(pdata, faction) @@ -283,7 +283,7 @@ function factions.remove_player(name, player) local pdata = minetest.get_player_by_name(player) if pdata then - local ipc = pdata:is_player_connected(player) + local ipc = pdata:is_player_connected() if ipc then removeHud(pdata,"factionName") From aa6bd52fd220ce5115486b80c57fcfeeeee364ba Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 16 May 2019 18:52:57 -0500 Subject: [PATCH 02/32] Add: factions namespace to settingtypes --- settingtypes.txt | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index f638a14..9e67057 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -1,55 +1,55 @@ [ValueSettings] # The max depth of protection from a parcel. -protection_max_depth (Protection max depth) float 512 +factions.protection_max_depth (Protection max depth) float 512 # The max height of protection from a parcel. -protection_max_height (Protection max height) float 10000 +factions.protection_max_height (Protection max height) float 10000 # Cost of power to claim a parcel of land. -power_per_parcel (Power-per-parcel) float 1 +factions.power_per_parcel (Power-per-parcel) float 1 # Power lost on death. -power_per_death (Power-per-death) float 1 +factions.power_per_death (Power-per-death) float 1 # Power regeneration rate. -power_per_tick (Power-per-tick) float 2 +factions.power_per_tick (Power-per-tick) float 2 # Faction timer. This timer regenerates power. -tick_time (Faction timer) float 60 +factions.tick_time (Faction timer) float 60 # Not in use. -power_per_attack (Power-per-attack) float 10 +factions.power_per_attack (Power-per-attack) float 10 # Limit how long a faction name can be. -faction_name_max_length (Faction name max) int 50 +factions.faction_name_max_length (Faction name max) int 50 # Limit how long a rank name can be. -rank_name_max_length (Rank name max length) int 25 +factions.rank_name_max_length (Rank name max length) int 25 # The maximum amount of inactivity before disbanning a faction. -maximum_faction_inactivity (Maximum faction inactivity) int 604800 +factions.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 +factions.maximum_parcelless_faction_time (Maximum parcelless faction time) int 10800 # Power of a starting faction (needed for parcel claiming). -power (Starting power) float 12 +factions.power (Starting power) float 12 # Maximum power of a starting faction. -maxpower (Starting Maximum power) float 0 +factions.maxpower (Starting Maximum power) float 0 # How much power the players make. -power_per_player (power-per-player) float 1 +factions.power_per_player (power-per-player) float 1 # How much max power is created per new player. -powermax_per_player (powermax-per-player) float 12 +factions.powermax_per_player (powermax-per-player) float 12 # parcel size -parcel_size (parcel-size) float 16 +factions.parcel_size (parcel-size) float 16 [BoolSettings] # Enable or disabled power-per-player. -power_per_playerb (Enable power-per-player) bool true +factions.power_per_playerb (Enable power-per-player) bool true # Enable or disabled attack_parcel function. -attack_parcel (Enable attack parcel) bool false +factions.attack_parcel (Enable attack parcel) bool false # Enable or disabled faction diplomacy. -faction_diplomacy (Enable faction diplomacy) bool true +factions.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 +factions.protection_depth_height_limit (Enable protection depth height limit) bool true # Enable or disabled faction spawn teleport -spawn_teleport (Enable spawn teleport) bool false +factions.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 +factions.faction_user_priv (Enable faction user priv) bool false [StringSettings] # Set the way that the parcel protection works (2d,3d). # 2d limits how far x and z can go but protection on the y goes up and down far. # 3d limits all three axis. -protection_style (Protection style) string 2d \ No newline at end of file +factions.protection_style (Protection style) string 2d \ No newline at end of file From 8069ab2443012e61f32d59c91ef633a8c30049a3 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 16 May 2019 18:57:15 -0500 Subject: [PATCH 03/32] Make: protection_style a enum --- settingtypes.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/settingtypes.txt b/settingtypes.txt index 9e67057..e5ee22c 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -49,7 +49,7 @@ factions.spawn_teleport (Enable spawn teleport) bool false factions.faction_user_priv (Enable faction user priv) bool false [StringSettings] -# Set the way that the parcel protection works (2d,3d). +# Set the way that the parcel protection works (2d, 3d). # 2d limits how far x and z can go but protection on the y goes up and down far. # 3d limits all three axis. -factions.protection_style (Protection style) string 2d \ No newline at end of file +factions.protection_style (Protection style) enum 2d 3d,2d \ No newline at end of file From f8c08623575ca73921ae6d652e13cfc159d13476 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 16 May 2019 18:59:18 -0500 Subject: [PATCH 04/32] Update: config --- config.lua | 46 +++++++++++++++++++++++----------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/config.lua b/config.lua index 4a5aee9..abb1967 100644 --- a/config.lua +++ b/config.lua @@ -1,24 +1,24 @@ factions_config = {} -factions_config.protection_max_depth = tonumber(minetest.settings:get("protection_max_depth")) or -512 -factions_config.protection_max_height = tonumber(minetest.settings:get("protection_max_height")) or 10000 -factions_config.power_per_parcel = tonumber(minetest.settings:get("power_per_parcel")) or 1 -factions_config.power_per_death = tonumber(minetest.settings:get("power_per_death")) or 1 -factions_config.power_per_tick = tonumber(minetest.settings:get("power_per_tick")) or 2 -factions_config.tick_time = tonumber(minetest.settings:get("tick_time")) or 60 -factions_config.power_per_attack = tonumber(minetest.settings:get("power_per_attack")) or 10 -factions_config.faction_name_max_length = tonumber(minetest.settings:get("faction_name_max_length")) or 50 -factions_config.rank_name_max_length = tonumber(minetest.settings:get("rank_name_max_length")) or 25 -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 12 -factions_config.maxpower = tonumber(minetest.settings:get("maxpower")) or 0 -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 -factions_config.protection_depth_height_limit = minetest.settings:get_bool("protection_depth_height_limit") or true -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 +factions_config.protection_max_depth = tonumber(minetest.settings:get("factions.protection_max_depth")) or -512 +factions_config.protection_max_height = tonumber(minetest.settings:get("factions.protection_max_height")) or 10000 +factions_config.power_per_parcel = tonumber(minetest.settings:get("factions.power_per_parcel")) or 1 +factions_config.power_per_death = tonumber(minetest.settings:get("factions.power_per_death")) or 1 +factions_config.power_per_tick = tonumber(minetest.settings:get("factions.power_per_tick")) or 2 +factions_config.tick_time = tonumber(minetest.settings:get("factions.tick_time")) or 60 +factions_config.power_per_attack = tonumber(minetest.settings:get("factions.power_per_attack")) or 10 +factions_config.faction_name_max_length = tonumber(minetest.settings:get("factions.faction_name_max_length")) or 50 +factions_config.rank_name_max_length = tonumber(minetest.settings:get("factions.rank_name_max_length")) or 25 +factions_config.maximum_faction_inactivity = tonumber(minetest.settings:get("factions.maximum_faction_inactivity")) or 604800 +factions_config.maximum_parcelless_faction_time = tonumber(minetest.settings:get("factions.maximum_parcelless_faction_time")) or 10800 +factions_config.power = tonumber(minetest.settings:get("factions.power")) or 12 +factions_config.maxpower = tonumber(minetest.settings:get("factions.maxpower")) or 0 +factions_config.power_per_player = tonumber(minetest.settings:get("factions.power_per_player")) or 1 +factions_config.powermax_per_player = tonumber(minetest.settings:get("factions.powermax_per_player")) or 12 +factions_config.parcel_size = tonumber(minetest.settings:get("factions.parcel_size")) or 16 +factions_config.protection_depth_height_limit = minetest.settings:get_bool("factions.protection_depth_height_limit") or true +factions_config.enable_power_per_player = minetest.settings:get_bool("factions.power_per_playerb") or true +factions_config.attack_parcel = minetest.settings:get_bool("factions.attack_parcel") or false +factions_config.faction_diplomacy = minetest.settings:get_bool("factions.faction_diplomacy") or true +factions_config.spawn_teleport = minetest.settings:get_bool("factions.spawn_teleport") or false +factions_config.protection_style = minetest.settings:get("factions.protection_style") or "2d" +factions_config.faction_user_priv = minetest.settings:get("factions.faction_user_priv") or false From cb80681b9f0e6495541ed4e6844284c15f97e09c Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 16 May 2019 20:05:49 -0500 Subject: [PATCH 05/32] Re-license: mod under MIT --- LICENSE | 542 +++----------------------------------------------------- 1 file changed, 21 insertions(+), 521 deletions(-) diff --git a/LICENSE b/LICENSE index 1f0e52b..315f675 100644 --- a/LICENSE +++ b/LICENSE @@ -1,521 +1,21 @@ -License of source code under old team. ------------- Begin ------------ -License WTFPL -Copyright (C) 2013-2016 Sapier, agrecascino, shamoanjac ------------- End ------------ - -License of media. ------------- Begin ------------ -following Textures created by Coder12a (CC BY-SA 3.0): -factions_display.png ------------- End ------------ - -License of source code under new team. ------------- Begin ------------ -Copyright (C) 2018 Coder12a - - GNU LESSER GENERAL PUBLIC LICENSE - Version 2.1, February 1999 - - Copyright (C) 1991, 1999 Free Software Foundation, Inc. - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - -[This is the first released version of the Lesser GPL. It also counts - as the successor of the GNU Library Public License, version 2, hence - the version number 2.1.] - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -Licenses are intended to guarantee your freedom to share and change -free software--to make sure the software is free for all its users. - - This license, the Lesser General Public License, applies to some -specially designated software packages--typically libraries--of the -Free Software Foundation and other authors who decide to use it. You -can use it too, but we suggest you first think carefully about whether -this license or the ordinary General Public License is the better -strategy to use in any particular case, based on the explanations below. - - When we speak of free software, we are referring to freedom of use, -not price. Our General Public Licenses are designed to make sure that -you have the freedom to distribute copies of free software (and charge -for this service if you wish); that you receive source code or can get -it if you want it; that you can change the software and use pieces of -it in new free programs; and that you are informed that you can do -these things. - - To protect your rights, we need to make restrictions that forbid -distributors to deny you these rights or to ask you to surrender these -rights. These restrictions translate to certain responsibilities for -you if you distribute copies of the library or if you modify it. - - For example, if you distribute copies of the library, whether gratis -or for a fee, you must give the recipients all the rights that we gave -you. You must make sure that they, too, receive or can get the source -code. If you link other code with the library, you must provide -complete object files to the recipients, so that they can relink them -with the library after making changes to the library and recompiling -it. And you must show them these terms so they know their rights. - - We protect your rights with a two-step method: (1) we copyright the -library, and (2) we offer you this license, which gives you legal -permission to copy, distribute and/or modify the library. - - To protect each distributor, we want to make it very clear that -there is no warranty for the free library. Also, if the library is -modified by someone else and passed on, the recipients should know -that what they have is not the original version, so that the original -author's reputation will not be affected by problems that might be -introduced by others. - - Finally, software patents pose a constant threat to the existence of -any free program. We wish to make sure that a company cannot -effectively restrict the users of a free program by obtaining a -restrictive license from a patent holder. Therefore, we insist that -any patent license obtained for a version of the library must be -consistent with the full freedom of use specified in this license. - - Most GNU software, including some libraries, is covered by the -ordinary GNU General Public License. This license, the GNU Lesser -General Public License, applies to certain designated libraries, and -is quite different from the ordinary General Public License. We use -this license for certain libraries in order to permit linking those -libraries into non-free programs. - - When a program is linked with a library, whether statically or using -a shared library, the combination of the two is legally speaking a -combined work, a derivative of the original library. The ordinary -General Public License therefore permits such linking only if the -entire combination fits its criteria of freedom. The Lesser General -Public License permits more lax criteria for linking other code with -the library. - - We call this license the "Lesser" General Public License because it -does Less to protect the user's freedom than the ordinary General -Public License. It also provides other free software developers Less -of an advantage over competing non-free programs. These disadvantages -are the reason we use the ordinary General Public License for many -libraries. However, the Lesser license provides advantages in certain -special circumstances. - - For example, on rare occasions, there may be a special need to -encourage the widest possible use of a certain library, so that it becomes -a de-facto standard. To achieve this, non-free programs must be -allowed to use the library. A more frequent case is that a free -library does the same job as widely used non-free libraries. In this -case, there is little to gain by limiting the free library to free -software only, so we use the Lesser General Public License. - - In other cases, permission to use a particular library in non-free -programs enables a greater number of people to use a large body of -free software. For example, permission to use the GNU C Library in -non-free programs enables many more people to use the whole GNU -operating system, as well as its variant, the GNU/Linux operating -system. - - Although the Lesser General Public License is Less protective of the -users' freedom, it does ensure that the user of a program that is -linked with the Library has the freedom and the wherewithal to run -that program using a modified version of the Library. - - The precise terms and conditions for copying, distribution and -modification follow. Pay close attention to the difference between a -"work based on the library" and a "work that uses the library". The -former contains code derived from the library, whereas the latter must -be combined with the library in order to run. - - GNU LESSER GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License Agreement applies to any software library or other -program which contains a notice placed by the copyright holder or -other authorized party saying it may be distributed under the terms of -this Lesser General Public License (also called "this License"). -Each licensee is addressed as "you". - - A "library" means a collection of software functions and/or data -prepared so as to be conveniently linked with application programs -(which use some of those functions and data) to form executables. - - The "Library", below, refers to any such software library or work -which has been distributed under these terms. A "work based on the -Library" means either the Library or any derivative work under -copyright law: that is to say, a work containing the Library or a -portion of it, either verbatim or with modifications and/or translated -straightforwardly into another language. (Hereinafter, translation is -included without limitation in the term "modification".) - - "Source code" for a work means the preferred form of the work for -making modifications to it. For a library, complete source code means -all the source code for all modules it contains, plus any associated -interface definition files, plus the scripts used to control compilation -and installation of the library. - - Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running a program using the Library is not restricted, and output from -such a program is covered only if its contents constitute a work based -on the Library (independent of the use of the Library in a tool for -writing it). Whether that is true depends on what the Library does -and what the program that uses the Library does. - - 1. You may copy and distribute verbatim copies of the Library's -complete source code as you receive it, in any medium, provided that -you conspicuously and appropriately publish on each copy an -appropriate copyright notice and disclaimer of warranty; keep intact -all the notices that refer to this License and to the absence of any -warranty; and distribute a copy of this License along with the -Library. - - You may charge a fee for the physical act of transferring a copy, -and you may at your option offer warranty protection in exchange for a -fee. - - 2. You may modify your copy or copies of the Library or any portion -of it, thus forming a work based on the Library, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) The modified work must itself be a software library. - - b) You must cause the files modified to carry prominent notices - stating that you changed the files and the date of any change. - - c) You must cause the whole of the work to be licensed at no - charge to all third parties under the terms of this License. - - d) If a facility in the modified Library refers to a function or a - table of data to be supplied by an application program that uses - the facility, other than as an argument passed when the facility - is invoked, then you must make a good faith effort to ensure that, - in the event an application does not supply such function or - table, the facility still operates, and performs whatever part of - its purpose remains meaningful. - - (For example, a function in a library to compute square roots has - a purpose that is entirely well-defined independent of the - application. Therefore, Subsection 2d requires that any - application-supplied function or table used by this function must - be optional: if the application does not supply it, the square - root function must still compute square roots.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Library, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Library, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote -it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Library. - -In addition, mere aggregation of another work not based on the Library -with the Library (or with a work based on the Library) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may opt to apply the terms of the ordinary GNU General Public -License instead of this License to a given copy of the Library. To do -this, you must alter all the notices that refer to this License, so -that they refer to the ordinary GNU General Public License, version 2, -instead of to this License. (If a newer version than version 2 of the -ordinary GNU General Public License has appeared, then you can specify -that version instead if you wish.) Do not make any other change in -these notices. - - Once this change is made in a given copy, it is irreversible for -that copy, so the ordinary GNU General Public License applies to all -subsequent copies and derivative works made from that copy. - - This option is useful when you wish to copy part of the code of -the Library into a program that is not a library. - - 4. You may copy and distribute the Library (or a portion or -derivative of it, under Section 2) in object code or executable form -under the terms of Sections 1 and 2 above provided that you accompany -it with the complete corresponding machine-readable source code, which -must be distributed under the terms of Sections 1 and 2 above on a -medium customarily used for software interchange. - - If distribution of object code is made by offering access to copy -from a designated place, then offering equivalent access to copy the -source code from the same place satisfies the requirement to -distribute the source code, even though third parties are not -compelled to copy the source along with the object code. - - 5. A program that contains no derivative of any portion of the -Library, but is designed to work with the Library by being compiled or -linked with it, is called a "work that uses the Library". Such a -work, in isolation, is not a derivative work of the Library, and -therefore falls outside the scope of this License. - - However, linking a "work that uses the Library" with the Library -creates an executable that is a derivative of the Library (because it -contains portions of the Library), rather than a "work that uses the -library". The executable is therefore covered by this License. -Section 6 states terms for distribution of such executables. - - When a "work that uses the Library" uses material from a header file -that is part of the Library, the object code for the work may be a -derivative work of the Library even though the source code is not. -Whether this is true is especially significant if the work can be -linked without the Library, or if the work is itself a library. The -threshold for this to be true is not precisely defined by law. - - If such an object file uses only numerical parameters, data -structure layouts and accessors, and small macros and small inline -functions (ten lines or less in length), then the use of the object -file is unrestricted, regardless of whether it is legally a derivative -work. (Executables containing this object code plus portions of the -Library will still fall under Section 6.) - - Otherwise, if the work is a derivative of the Library, you may -distribute the object code for the work under the terms of Section 6. -Any executables containing that work also fall under Section 6, -whether or not they are linked directly with the Library itself. - - 6. As an exception to the Sections above, you may also combine or -link a "work that uses the Library" with the Library to produce a -work containing portions of the Library, and distribute that work -under terms of your choice, provided that the terms permit -modification of the work for the customer's own use and reverse -engineering for debugging such modifications. - - You must give prominent notice with each copy of the work that the -Library is used in it and that the Library and its use are covered by -this License. You must supply a copy of this License. If the work -during execution displays copyright notices, you must include the -copyright notice for the Library among them, as well as a reference -directing the user to the copy of this License. Also, you must do one -of these things: - - a) Accompany the work with the complete corresponding - machine-readable source code for the Library including whatever - changes were used in the work (which must be distributed under - Sections 1 and 2 above); and, if the work is an executable linked - with the Library, with the complete machine-readable "work that - uses the Library", as object code and/or source code, so that the - user can modify the Library and then relink to produce a modified - executable containing the modified Library. (It is understood - that the user who changes the contents of definitions files in the - Library will not necessarily be able to recompile the application - to use the modified definitions.) - - b) Use a suitable shared library mechanism for linking with the - Library. A suitable mechanism is one that (1) uses at run time a - copy of the library already present on the user's computer system, - rather than copying library functions into the executable, and (2) - will operate properly with a modified version of the library, if - the user installs one, as long as the modified version is - interface-compatible with the version that the work was made with. - - c) Accompany the work with a written offer, valid for at - least three years, to give the same user the materials - specified in Subsection 6a, above, for a charge no more - than the cost of performing this distribution. - - d) If distribution of the work is made by offering access to copy - from a designated place, offer equivalent access to copy the above - specified materials from the same place. - - e) Verify that the user has already received a copy of these - materials or that you have already sent this user a copy. - - For an executable, the required form of the "work that uses the -Library" must include any data and utility programs needed for -reproducing the executable from it. However, as a special exception, -the materials to be distributed need not include anything that is -normally distributed (in either source or binary form) with the major -components (compiler, kernel, and so on) of the operating system on -which the executable runs, unless that component itself accompanies -the executable. - - It may happen that this requirement contradicts the license -restrictions of other proprietary libraries that do not normally -accompany the operating system. Such a contradiction means you cannot -use both them and the Library together in an executable that you -distribute. - - 7. You may place library facilities that are a work based on the -Library side-by-side in a single library together with other library -facilities not covered by this License, and distribute such a combined -library, provided that the separate distribution of the work based on -the Library and of the other library facilities is otherwise -permitted, and provided that you do these two things: - - a) Accompany the combined library with a copy of the same work - based on the Library, uncombined with any other library - facilities. This must be distributed under the terms of the - Sections above. - - b) Give prominent notice with the combined library of the fact - that part of it is a work based on the Library, and explaining - where to find the accompanying uncombined form of the same work. - - 8. You may not copy, modify, sublicense, link with, or distribute -the Library except as expressly provided under this License. Any -attempt otherwise to copy, modify, sublicense, link with, or -distribute the Library is void, and will automatically terminate your -rights under this License. However, parties who have received copies, -or rights, from you under this License will not have their licenses -terminated so long as such parties remain in full compliance. - - 9. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Library or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Library (or any work based on the -Library), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Library or works based on it. - - 10. Each time you redistribute the Library (or any work based on the -Library), the recipient automatically receives a license from the -original licensor to copy, distribute, link with or modify the Library -subject to these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties with -this License. - - 11. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Library at all. For example, if a patent -license would not permit royalty-free redistribution of the Library by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Library. - -If any portion of this section is held invalid or unenforceable under any -particular circumstance, the balance of the section is intended to apply, -and the section as a whole is intended to apply in other circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 12. If the distribution and/or use of the Library is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Library under this License may add -an explicit geographical distribution limitation excluding those countries, -so that distribution is permitted only in or among countries not thus -excluded. In such case, this License incorporates the limitation as if -written in the body of this License. - - 13. The Free Software Foundation may publish revised and/or new -versions of the Lesser General Public License from time to time. -Such new versions will be similar in spirit to the present version, -but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library -specifies a version number of this License which applies to it and -"any later version", you have the option of following the terms and -conditions either of that version or of any later version published by -the Free Software Foundation. If the Library does not specify a -license version number, you may choose any version ever published by -the Free Software Foundation. - - 14. If you wish to incorporate parts of the Library into other free -programs whose distribution conditions are incompatible with these, -write to the author to ask for permission. For software which is -copyrighted by the Free Software Foundation, write to the Free -Software Foundation; we sometimes make exceptions for this. Our -decision will be guided by the two goals of preserving the free status -of all derivatives of our free software and of promoting the sharing -and reuse of software generally. - - NO WARRANTY - - 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO -WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. -EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR -OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY -KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE -LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME -THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN -WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY -AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU -FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR -CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE -LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING -RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A -FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF -SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH -DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Libraries - - If you develop a new library, and you want it to be of the greatest -possible use to the public, we recommend making it free software that -everyone can redistribute and change. You can do so by permitting -redistribution under these terms (or, alternatively, under the terms of the -ordinary General Public License). - - To apply these terms, attach the following notices to the library. It is -safest to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least the -"copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 - USA - -Also add information on how to contact you by electronic and paper mail. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the library, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the - library `Frob' (a library for tweaking knobs) written by James Random - Hacker. - - , 1 April 1990 - Ty Coon, President of Vice - -That's all there is to it! ------------- End ------------ \ No newline at end of file +MIT License + +Copyright (c) 2019 Coder12a + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. From 49473f7ee1b4f5d6f9744e5a7ed413fea982e89d Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Mon, 20 May 2019 00:03:36 -0500 Subject: [PATCH 06/32] Use: new colddb features --- databases.lua | 9 +++++---- factions.lua | 18 +++--------------- 2 files changed, 8 insertions(+), 19 deletions(-) diff --git a/databases.lua b/databases.lua index d721a02..5dfc1c0 100644 --- a/databases.lua +++ b/databases.lua @@ -3,10 +3,11 @@ factions = {} -- Create cold databases. -factions.factions = colddb.Colddb(minetest.get_worldpath() .. "/factions/factions") -factions.parcels = colddb.Colddb(minetest.get_worldpath() .. "/factions/parcels") -factions.players = colddb.Colddb(minetest.get_worldpath() .. "/factions/players") -factions.player_ips = colddb.Colddb(minetest.get_worldpath() .. "/factions/ips") +factions.root = colddb.Colddb(minetest.get_worldpath() .. "/factions") +factions.factions = factions.root.sub_database("factions") +factions.parcels = factions.root.sub_database("parcels") +factions.players = factions.root.sub_database("players") +factions.player_ips = factions.root.sub_database("ips") -- Memory only storage. factions.onlineplayers = {} diff --git a/factions.lua b/factions.lua index 3c079b7..e3f4fc9 100644 --- a/factions.lua +++ b/factions.lua @@ -142,7 +142,7 @@ function factions.set_name(oldname, name) local faction = factions.factions.get(oldname) faction.name = name - for i, v in pairs(factions.get_faction_list()) do + for i, v in factions.factions.iterate() do if v ~= oldname then local fac = factions.factions.get(v) @@ -301,7 +301,7 @@ function factions.disband(name, reason) local faction = factions.factions.get(name) if not faction.is_admin then - for i, v in pairs(factions.get_faction_list()) do + for i, v in factions.factions.iterate() do local fac = factions.factions.get(v) if fac ~= nil and fac.name ~= name then if fac.enemies[name] then @@ -495,21 +495,9 @@ function factions.get_faction_at(pos) return factions.get_parcel_faction(parcelpos) end -function factions.get_faction_list() - - local names = {} - local directory = string.format("%s/factions/factions", minetest.get_worldpath()) - local nameslist = minetest.get_dir_list(directory) - for k, v in pairs(nameslist) do - names[#names + 1] = v:sub(0, v:len() - 5) - end - - return names -end - function factions.faction_tick() local now = os.time() - for i, facname in pairs(factions.get_faction_list()) do + for i, facname in factions.factions.iterate() do local faction = factions.factions.get(facname) if faction ~= nil then From 3567fb9e5e03792c43198fa04352ffb46b05a2f7 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Mon, 20 May 2019 17:04:42 -0500 Subject: [PATCH 07/32] Remove: sound_play whoosh --- factions.lua | 1 - 1 file changed, 1 deletion(-) diff --git a/factions.lua b/factions.lua index e3f4fc9..a1e996a 100644 --- a/factions.lua +++ b/factions.lua @@ -429,7 +429,6 @@ function factions.tp_spawn(name, playername) if player then player:set_pos(faction.spawn) - minetest.sound_play("whoosh", {pos = faction.spawn, gain = 0.5, max_hear_distance = 10}) end end From b504eb67946b00cc850e52b2de9113e43353bb78 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Mon, 20 May 2019 21:33:59 -0500 Subject: [PATCH 08/32] Fix: use iterate function --- chatcommands.lua | 4 ++-- diplomacy_events.lua | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index df56a21..35315ac 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -330,7 +330,7 @@ factions.register_command("list", { infaction = false, global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) - local list = factions.get_faction_list() + local list = factions.factions.iterate() local tosend = "Existing factions:" for i,v in ipairs(list) do @@ -1525,7 +1525,7 @@ factions.register_command("obliterate", { infaction = false, global_privileges = {"faction_admin"}, on_success = function(player, faction, pos, parcelpos, args) - for i, facname in pairs(factions.get_faction_list()) do + for i, facname in factions.factions.iterate() do factions.disband(facname, "obliterated") end return true diff --git a/diplomacy_events.lua b/diplomacy_events.lua index 54b510d..715981e 100644 --- a/diplomacy_events.lua +++ b/diplomacy_events.lua @@ -1,5 +1,5 @@ function factions.start_diplomacy(name, faction) - for l, i in pairs(factions.get_faction_list()) do + for l, i in factions.factions.iterate() do local fac = factions.factions.get(i) if i ~= name and not (faction.neutral[i] or faction.allies[i] or faction.enemies[i]) then if factions_config.faction_diplomacy == true then From dbe7f4aabd51cfb18afb6500fa7ef6703ae28b45 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Mon, 20 May 2019 21:49:33 -0500 Subject: [PATCH 09/32] Fix: crashing --- chatcommands.lua | 6 +++--- diplomacy_events.lua | 12 ++++++------ factions.lua | 6 +++--- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 35315ac..c3392c3 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -330,10 +330,10 @@ factions.register_command("list", { infaction = false, global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) - local list = factions.factions.iterate() + local list = factions.factions.to_array() local tosend = "Existing factions:" - for i,v in ipairs(list) do + for i, v in ipairs(list) do if i ~= #list then tosend = tosend .. " " .. v .. "," else @@ -1525,7 +1525,7 @@ factions.register_command("obliterate", { infaction = false, global_privileges = {"faction_admin"}, on_success = function(player, faction, pos, parcelpos, args) - for i, facname in factions.factions.iterate() do + for facname, i in factions.factions.iterate() do factions.disband(facname, "obliterated") end return true diff --git a/diplomacy_events.lua b/diplomacy_events.lua index 715981e..c720745 100644 --- a/diplomacy_events.lua +++ b/diplomacy_events.lua @@ -1,13 +1,13 @@ function factions.start_diplomacy(name, faction) for l, i in factions.factions.iterate() do - local fac = factions.factions.get(i) - if i ~= name and not (faction.neutral[i] or faction.allies[i] or faction.enemies[i]) then + local fac = factions.factions.get(l) + if l ~= name and not (faction.neutral[l] or faction.allies[l] or faction.enemies[l]) then if factions_config.faction_diplomacy == true then - factions.new_neutral(name, i) - factions.new_neutral(i, name) + factions.new_neutral(name, l) + factions.new_neutral(l, name) else - factions.new_enemy(name, i) - factions.new_enemy(i, name) + factions.new_enemy(name, l) + factions.new_enemy(l, name) end end end diff --git a/factions.lua b/factions.lua index a1e996a..67a8e4b 100644 --- a/factions.lua +++ b/factions.lua @@ -142,7 +142,7 @@ function factions.set_name(oldname, name) local faction = factions.factions.get(oldname) faction.name = name - for i, v in factions.factions.iterate() do + for v, i in factions.factions.iterate() do if v ~= oldname then local fac = factions.factions.get(v) @@ -301,7 +301,7 @@ function factions.disband(name, reason) local faction = factions.factions.get(name) if not faction.is_admin then - for i, v in factions.factions.iterate() do + for v, i in factions.factions.iterate() do local fac = factions.factions.get(v) if fac ~= nil and fac.name ~= name then if fac.enemies[name] then @@ -496,7 +496,7 @@ end function factions.faction_tick() local now = os.time() - for i, facname in factions.factions.iterate() do + for facname, i in factions.factions.iterate() do local faction = factions.factions.get(facname) if faction ~= nil then From 193828602b8ce726eca39a6ffa920d9d0f78357b Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Wed, 22 May 2019 18:43:41 -0500 Subject: [PATCH 10/32] Fix: chat cmd not working --- chatcommands.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/chatcommands.lua b/chatcommands.lua index c3392c3..4349132 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -1404,11 +1404,12 @@ factions.register_command("chat", { description = "Send a message to your faction's members", description_arg = " :", global_privileges = def_global_privileges, + format = {"string"}, on_success = function(player, faction, pos, parcelpos, args) local msg = table.concat(args.strings, " ") factions.broadcast(faction.name, msg, player) end -},true) +}, true) factions.register_command("force_update", { description = "Forces an update tick.", From 7fa6abd4aaaf3f1f4a6ee0068b2c7f2a3354d77b Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 23 May 2019 16:52:38 -0500 Subject: [PATCH 11/32] Update /f (un)claim help --- claim_events.lua | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/claim_events.lua b/claim_events.lua index f9646ba..d8bd61e 100644 --- a/claim_events.lua +++ b/claim_events.lua @@ -271,7 +271,7 @@ function factions.claim_all(player, faction) end function factions.claim_help(player, func) - local text = ", " + local text = "All params for /f claim: , " if func == "o" or func == "one" then text = "/f claim o\n/f claim one\n Claim one parcel." @@ -396,7 +396,7 @@ function factions.unclaim_all(player, faction) end function factions.unclaim_help(player, func) - local text = ", " + local text = "All params for /f unclaim: , " if func == "o" or func == "one" then text = "/f unclaim o\n/f unclaim one\n Unclaim one parcel." @@ -415,8 +415,7 @@ function factions.unclaim_help(player, func) minetest.chat_send_player(player, text) end -minetest.register_on_leaveplayer( - function(player) +minetest.register_on_leaveplayer(function(player) auto_list[player:get_player_name()] = nil end -) \ No newline at end of file +) From c8f3528a438a15dceb0aff4ba0e92ff756138136 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 24 May 2019 14:40:58 -0500 Subject: [PATCH 12/32] Allow: is_protected to work without player param --- chatcommands.lua | 24 ++++++++++++------------ player_events.lua | 12 ++++-------- protection_override.lua | 7 ++++++- 3 files changed, 22 insertions(+), 21 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 4349132..7cf0660 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -209,7 +209,7 @@ factions.register_command ("name", { return false end end -},false) +}, false) factions.register_command ("claim", { faction_permissions = {"claim"}, @@ -265,7 +265,7 @@ factions.register_command ("claim", { factions.claim_help(player, arg_two) end end -},true) +}, true) factions.register_command("unclaim", { faction_permissions = {"claim"}, @@ -321,7 +321,7 @@ factions.register_command("unclaim", { factions.unclaim_help(player, arg_two) end end -},true) +}, true) --list all known factions factions.register_command("list", { @@ -344,7 +344,7 @@ factions.register_command("list", { minetest.chat_send_player(player, tosend, false) return true end -},false) +}, false) --show factions mod version factions.register_command("version", { @@ -354,7 +354,7 @@ factions.register_command("version", { on_success = function(player, faction, pos, parcelpos, args) minetest.chat_send_player(player, "factions: version 0.8.8", false) end -},false) +}, false) --show description of faction factions.register_command("info", { @@ -369,7 +369,7 @@ factions.register_command("info", { args.factions[1].description, false) return true end -},false) +}, false) factions.register_command("leave", { description = "Leave your faction", @@ -379,7 +379,7 @@ factions.register_command("leave", { factions.remove_player(faction.name, player) return true end -},false) +}, false) factions.register_command("kick", { faction_permissions = {"kick"}, @@ -405,7 +405,7 @@ factions.register_command("kick", { return false end end -},false) +}, false) --create new faction factions.register_command("create", { @@ -433,7 +433,7 @@ factions.register_command("create", { return false end end -},false) +}, false) factions.register_command("join", { format = {"faction"}, @@ -461,7 +461,7 @@ factions.register_command("join", { return true end -},false) +}, false) factions.register_command("disband", { faction_permissions = {"disband"}, @@ -472,7 +472,7 @@ factions.register_command("disband", { factions.disband(faction.name) return true end -},false) +}, false) factions.register_command("flag", { faction_permissions = {"flags"}, @@ -513,7 +513,7 @@ factions.register_command("flag", { end return true end -},true) +}, true) factions.register_command("desc", { format = {"string"}, diff --git a/player_events.lua b/player_events.lua index c572cff..a81c69d 100644 --- a/player_events.lua +++ b/player_events.lua @@ -4,8 +4,7 @@ minetest.register_on_prejoinplayer(function(name, ip) factions.player_ips.set(name, ip) end) -minetest.register_on_joinplayer( -function(player) +minetest.register_on_joinplayer(function(player) local name = player:get_player_name() minetest.after(5, createHudfactionLand, player) local faction, facname = factions.get_player_faction(name) @@ -40,8 +39,7 @@ function(player) end ) -minetest.register_on_leaveplayer( - function(player) +minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() local faction, facname = factions.get_player_faction(name) local id_name1 = name .. "factionLand" @@ -69,8 +67,7 @@ minetest.register_on_leaveplayer( end ) -minetest.register_on_respawnplayer( - function(player) +minetest.register_on_respawnplayer(function(player) local name = player:get_player_name() local faction, facname = factions.get_player_faction(name) @@ -88,8 +85,7 @@ minetest.register_on_respawnplayer( end ) -minetest.register_on_dieplayer( -function(player) +minetest.register_on_dieplayer(function(player) local pname = player:get_player_name() if on_death[pname] then return diff --git a/protection_override.lua b/protection_override.lua index 2c9db80..9ce96e8 100644 --- a/protection_override.lua +++ b/protection_override.lua @@ -9,7 +9,11 @@ minetest.is_protected = function(pos, player) local parcelpos = factions.get_parcel_pos(pos) local parcel_faction, parcel_fac_name = factions.get_parcel_faction(parcelpos) - local player_faction, player_fac_name = factions.get_player_faction(player) + local player_faction + local player_fac_name + if player then + player_faction, player_fac_name = factions.get_player_faction(player) + end -- no faction if not parcel_faction then @@ -33,4 +37,5 @@ minetest.is_protected = function(pos, player) else return true end + return false end From 000862856677746b2c3a59edfba42a254dc92eec Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 27 Jun 2019 12:41:37 -0500 Subject: [PATCH 13/32] Fix: crash in diplomacy cmds --- chatcommands.lua | 52 +++++++++++++++++++++++++++++++++++------------- 1 file changed, 38 insertions(+), 14 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 7cf0660..67eee20 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -193,7 +193,7 @@ if factions_config.faction_user_priv == true then def_global_privileges = {"faction_user"} end -factions.register_command ("name", { +factions.register_command("name", { faction_permissions = {"name"}, format = {"string"}, description = "Change the faction's name.", @@ -642,7 +642,7 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - + if target_faction then if not target_faction.request_inbox[faction.name] then if faction.allies[target_name] then @@ -688,7 +688,7 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - + if target_faction then if not target_faction.request_inbox[faction.name] then if faction.allies[target_name] then @@ -734,6 +734,11 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) + + if not target_faction then + send_error(player, target_name .. " Is not a faction.") + return false + end if faction.request_inbox[target_name] then if target_name == faction.name then @@ -770,6 +775,11 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) + + if not target_faction then + send_error(player, target_name .. " Is not a faction.") + return false + end if faction.request_inbox[target_name] then if target_name == faction.name then @@ -797,6 +807,11 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) + + if not target_faction then + send_error(player, target_name .. " Is not a faction.") + return false + end if not faction.enemies[target_name] then if target_name == faction.name then @@ -832,6 +847,11 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) + + if not target_faction then + send_error(player, target_name .. " Is not a faction.") + return false + end if faction.allies[target_name] then if target_name == faction.name then @@ -1343,13 +1363,16 @@ factions.register_command("promote", { local promoter_faction, promoter_facname = factions.get_player_faction(player) - if player_faction and promoter_facname == facname then + if player_faction and promoter_facname == facname and player ~= name then factions.promote(faction.name, name, rank) minetest.chat_send_player(player, "Promoted " .. name .. " to " .. rank .. "!") return true elseif not player_faction or promoter_facname ~= facname then send_error(player, name .. " is not in your faction") return false + elseif player == name then + send_error(player, "You can not promote yourself!") + return false else send_error(player, name .. " cannot be promoted from your faction") return false @@ -1651,20 +1674,21 @@ local premade_help_admin = "" local a_z = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} -for l, j in pairs(a_z) do - for k, v in pairs(factions.commands) do - if k:sub(1, 1) == j then - if not v.dont_show_in_help then - if not table_Contains(v.global_privileges, "faction_admin") then - premade_help = premade_help .. "\t/f " .. k .. v.description_arg .. " " .. v.description .. "\n" +minetest.register_on_mods_loaded(function() + for l, j in pairs(a_z) do + for k, v in pairs(factions.commands) do + if k:sub(1, 1) == j then + if not v.dont_show_in_help then + if not table_Contains(v.global_privileges, "faction_admin") then + premade_help = premade_help .. "\t/f " .. k .. v.description_arg .. " " .. v.description .. "\n" + end + premade_help_admin = premade_help_admin .. "\t/f " .. k .. v.description_arg .. " " .. v.description .. "\n" end - premade_help_admin = premade_help_admin .. "\t/f " .. k .. v.description_arg .. " " .. v.description .. "\n" end end end -end - -a_z = nil + a_z = nil +end) ------------------------------------------------------------------------------- -- name: show_help(playername, parameter) From fd664c6b54e008a0b1209f52b38f32f5816de929 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 27 Jun 2019 13:51:59 -0500 Subject: [PATCH 14/32] Return: default_is_protected --- protection_override.lua | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/protection_override.lua b/protection_override.lua index 9ce96e8..f72ecbc 100644 --- a/protection_override.lua +++ b/protection_override.lua @@ -4,13 +4,14 @@ minetest.is_protected = function(pos, player) local y = pos.y if factions_config.protection_depth_height_limit and (pos.y < factions_config.protection_max_depth or pos.y > factions_config.protection_max_height) then - return false + return default_is_protected(pos, player) end local parcelpos = factions.get_parcel_pos(pos) local parcel_faction, parcel_fac_name = factions.get_parcel_faction(parcelpos) local player_faction local player_fac_name + if player then player_faction, player_fac_name = factions.get_player_faction(player) end @@ -37,5 +38,5 @@ minetest.is_protected = function(pos, player) else return true end - return false + return default_is_protected(pos, player) end From 7bd84b472816e6f050254e86438ad7eb841a1919 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 27 Jun 2019 17:55:24 -0500 Subject: [PATCH 15/32] Add: /claim list to help --- chatcommands.lua | 14 ++++++-------- claim_events.lua | 32 ++++++++++++-------------------- 2 files changed, 18 insertions(+), 28 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 67eee20..8470ac4 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -255,12 +255,11 @@ factions.register_command ("claim", { elseif arg_one == "all" then factions.claim_all(player, faction) elseif arg_one == "l" or arg_one == "list" then - local timer = 0 - minetest.chat_send_player(player, "All claims:") + local aclaims = "All claims:\n" for i in pairs(faction.land) do - minetest.after(timer, minetest.chat_send_player, player, i) - timer = timer + 0.1 + aclaims = aclaims .. i .. "\n" end + minetest.chat_send_player(player, aclaims) elseif arg_one == "h" or arg_one == "help" then factions.claim_help(player, arg_two) end @@ -311,12 +310,11 @@ factions.register_command("unclaim", { elseif arg_one == "all" then factions.unclaim_all(player, faction) elseif arg_one == "l" or arg_one == "list" then - local timer = 0 - minetest.chat_send_player(player, "All claims:") + local aclaims = "All claims:\n" for i in pairs(faction.land) do - minetest.after(timer, minetest.chat_send_player, player, i) - timer = timer + 0.1 + aclaims = aclaims .. i .. "\n" end + minetest.chat_send_player(player, aclaims) elseif arg_one == "h" or arg_one == "help" then factions.unclaim_help(player, arg_two) end diff --git a/claim_events.lua b/claim_events.lua index d8bd61e..f3cbda0 100644 --- a/claim_events.lua +++ b/claim_events.lua @@ -234,15 +234,9 @@ function factions.claim_circle(player, faction, r) pos.z = (math.floor(pos.z / parcel_size) * parcel_size) + parcel_size_center for i = 1, 360 do - minetest.after(0.05 * i, function(player, faction, r, pos) - - local angle = i * math.pi / 180 - - local rpos = {x = pos.x + r * math.cos(angle), y = pos.y, z = pos.z + r * math.sin(angle)} - - claim_helper(player, faction, factions.get_parcel_pos(rpos), true) - - end, player, faction, r, pos) + local angle = i * math.pi / 180 + local rpos = {x = pos.x + r * math.cos(angle), y = pos.y, z = pos.z + r * math.sin(angle)} + claim_helper(player, faction, factions.get_parcel_pos(rpos), true) end end @@ -271,7 +265,7 @@ function factions.claim_all(player, faction) end function factions.claim_help(player, func) - local text = "All params for /f claim: , " + local text = "All params for /f claim: , " if func == "o" or func == "one" then text = "/f claim o\n/f claim one\n Claim one parcel." @@ -283,6 +277,8 @@ function factions.claim_help(player, func) text = "/f claim s \n/f claim square \nClaim by square and radius." elseif func == "c" or func == "circle" then text = "/f claim c \n/f claim circle \nClaim by circle and radius." + elseif func == "l" or func == "list" then + text = "/f claim l\n/f claim list\nList all the faction's claimed land." elseif func == "all" then text = "/f claim all\nClaim all faction land." end @@ -365,15 +361,9 @@ function factions.unclaim_circle(player, faction, r) pos.z = (math.floor(pos.z / parcel_size) * parcel_size) + parcel_size_center for i = 1, 360 do - minetest.after(0.05 * i, function(player, faction, r, pos) - - local angle = i * math.pi / 180 - - local rpos = {x = pos.x + r * math.cos(angle), y = pos.y, z = pos.z + r * math.sin(angle)} - - unclaim_helper(player, faction, factions.get_parcel_pos(rpos), true) - - end, player, faction, r, pos) + local angle = i * math.pi / 180 + local rpos = {x = pos.x + r * math.cos(angle), y = pos.y, z = pos.z + r * math.sin(angle)} + unclaim_helper(player, faction, factions.get_parcel_pos(rpos), true) end end @@ -396,7 +386,7 @@ function factions.unclaim_all(player, faction) end function factions.unclaim_help(player, func) - local text = "All params for /f unclaim: , " + local text = "All params for /f unclaim: , " if func == "o" or func == "one" then text = "/f unclaim o\n/f unclaim one\n Unclaim one parcel." @@ -408,6 +398,8 @@ function factions.unclaim_help(player, func) text = "/f unclaim s \n/f unclaim square \nUnclaim by square and radius." elseif func == "c" or func == "circle" then text = "/f unclaim c \n/f unclaim circle \nUnclaim by circle and radius." + elseif func == "l" or func == "list" then + text = "/f claim l\n/f claim list\nList all the faction's claimed land." elseif func == "all" then text = "/f unclaim all\nUnclaim all faction land." end From a4a43aef2d8276a9597b00ba34f216d06790dc44 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 09:33:39 -0500 Subject: [PATCH 16/32] Remove: converter code --- convert.lua | 45 --------------------------------------------- init.lua | 1 - nodes.lua | 17 ----------------- 3 files changed, 63 deletions(-) delete mode 100644 convert.lua diff --git a/convert.lua b/convert.lua deleted file mode 100644 index 25f53f2..0000000 --- a/convert.lua +++ /dev/null @@ -1,45 +0,0 @@ -function ip_convert() - local path = minetest.get_worldpath() .. "/factions_iplist.txt" - local file, error = io.open(path, "r") - - if file ~= nil then - local raw_data = file:read("*a") - local ips = minetest.deserialize(raw_data) - file:close() - - for i, k in pairs(ips) do - factions.player_ips.set(i, k) - end - - os.rename(path, minetest.get_worldpath() .. "/factions_iplist_old.txt") - end -end - -function faction_convert() - local path = minetest.get_worldpath() .. "/factions.conf" - local file, error = io.open(path, "r") - - if file ~= nil then - local raw_data = file:read("*a") - local tabledata = minetest.deserialize(raw_data) - file:close() - - if tabledata then - for facname, faction in pairs(tabledata) do - factions.factions.set(facname, faction) - - for player, rank in pairs(faction.players) do - factions.players.set(player, facname) - end - - for parcelpos, val in pairs(faction.land) do - factions.parcels.set(parcelpos, facname) - end - end - os.rename(path, minetest.get_worldpath() .. "/factions_old.conf") - end - end -end - -ip_convert() -faction_convert() diff --git a/init.lua b/init.lua index 4d38ca5..3ff166b 100644 --- a/init.lua +++ b/init.lua @@ -15,7 +15,6 @@ dofile (factions_modpath .. "/claim_events.lua") dofile (factions_modpath .. "/factions.lua") dofile (factions_modpath .. "/chatcommands.lua") dofile (factions_modpath .. "/nodes.lua") -dofile (factions_modpath .. "/convert.lua") minetest.after(1, hudUpdateClaimInfo) minetest.after(factions_config.tick_time, factionUpdate) diff --git a/nodes.lua b/nodes.lua index b31ec20..048f96c 100644 --- a/nodes.lua +++ b/nodes.lua @@ -14,23 +14,6 @@ end -- 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) - local name = parcel_faction.name - meta:set_string("faction", name) - meta:set_string("infotext", "Faction Chest (owned by faction " .. - name .. ")") - end - end - }) - local dc = minetest.registered_nodes["default:chest"] local def_on_rightclick = dc.on_rightclick From 092be70b6f4ab490cb1b44678ab13fb3a2955973 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 09:46:15 -0500 Subject: [PATCH 17/32] Allow: player db to store more data --- factions.lua | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/factions.lua b/factions.lua index 67a8e4b..a4bdaca 100644 --- a/factions.lua +++ b/factions.lua @@ -176,7 +176,9 @@ function factions.set_name(oldname, name) end for playername in pairs(faction.players) do - factions.players.set(playername, name) + local data = factions.players.get(playername) or {} + data.faction = name + factions.players.set(playername, data) end for playername in pairs(factions.onlineplayers[oldname]) do @@ -228,7 +230,11 @@ function factions.add_player(name, player, rank) end faction.players[player] = rank or faction.default_rank - factions.players.set(player, name) + + local data = factions.players.get(player) or {} + data.faction = name + factions.players.set(player, data) + faction.invited_players[player] = nil local pdata = minetest.get_player_by_name(player) if pdata then @@ -473,9 +479,9 @@ function factions.get_parcel_pos(pos) end function factions.get_player_faction(playername) - local facname = factions.players.get(playername) - if facname then - local faction = factions.factions.get(facname) + local data = factions.players.get(playername) + if data then + local faction = factions.factions.get(faction.faction) return faction, facname end return nil From b9110391020981ce46cfd791fea805a5afb04f01 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 09:47:00 -0500 Subject: [PATCH 18/32] Fix: typo --- factions.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/factions.lua b/factions.lua index a4bdaca..37affa4 100644 --- a/factions.lua +++ b/factions.lua @@ -481,7 +481,7 @@ end function factions.get_player_faction(playername) local data = factions.players.get(playername) if data then - local faction = factions.factions.get(faction.faction) + local faction = factions.factions.get(data.faction) return faction, facname end return nil From e63b07cb991c7665a651c696bceea19051f57c8d Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 09:48:51 -0500 Subject: [PATCH 19/32] Fix: player error --- factions.lua | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/factions.lua b/factions.lua index 37affa4..7e982e5 100644 --- a/factions.lua +++ b/factions.lua @@ -481,7 +481,8 @@ end function factions.get_player_faction(playername) local data = factions.players.get(playername) if data then - local faction = factions.factions.get(data.faction) + local facname = data.faction + local faction = factions.factions.get(facname) return faction, facname end return nil From db914eec5a60e6561f6c2cb14956fe141002d0dd Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 13:28:12 -0500 Subject: [PATCH 20/32] Allow: players, claims, and ips to store more data --- claim_events.lua | 23 ++++++----- databases.lua | 100 ++++++++++++++++++++++++++++++++++++++++++++++ factions.lua | 61 +++------------------------- player_events.lua | 11 +++-- 4 files changed, 127 insertions(+), 68 deletions(-) diff --git a/claim_events.lua b/claim_events.lua index f3cbda0..c225af7 100644 --- a/claim_events.lua +++ b/claim_events.lua @@ -10,7 +10,7 @@ function factions.can_claim_parcel(name, parcelpos) local faction = factions.factions.get(name) if fn then - local fac = factions.factions.get(fn) + local fac = factions.factions.get(fn.faction) if fac.power < 0. and faction.power >= factions_config.power_per_parcel and not faction.allies[fn] and not faction.neutral[fn] then return true @@ -27,12 +27,16 @@ end --! @brief claim a parcel, update power and update global parcels table function factions.claim_parcel(name, parcelpos) -- check if claiming over other faction's territory - local otherfac = factions.parcels.get(parcelpos) - if otherfac then - factions.unclaim_parcel(otherfac, parcelpos) - factions.parcelless_check(otherfac) - end - factions.parcels.set(parcelpos, name) + local otherfac = factions.parcels.get(parcelpos) + + if otherfac then + local otherfac_name = otherfac.faction + factions.unclaim_parcel(otherfac_name, parcelpos) + factions.parcelless_check(otherfac_name) + end + local data = factions.create_claim_table() + data.faction = name + factions.parcels.set(parcelpos, data) local faction = factions.factions.get(name) @@ -85,8 +89,9 @@ function factions.parcelless_check(name) end function factions.get_parcel_faction(parcelpos) - local facname = factions.parcels.get(parcelpos) - if facname then + local data = factions.parcels.get(parcelpos) + if data then + local facname = data.faction local faction = factions.factions.get(facname) return faction, facname end diff --git a/databases.lua b/databases.lua index 5dfc1c0..e40b478 100644 --- a/databases.lua +++ b/databases.lua @@ -11,3 +11,103 @@ factions.player_ips = factions.root.sub_database("ips") -- Memory only storage. factions.onlineplayers = {} + +-- Table hook functions. + +-- Hook function to add or delete from the faction table. +function factions.on_create_faction_table(table) + return table +end + +-- Hook function to add or delete from the ip table. +function factions.on_create_ip_table(table) + return table +end + +-- Hook function to add or delete from the player table. +function factions.on_create_player_table(table) + return table +end + +-- Hook function to add or delete from the claim table. +function factions.on_create_claim_table(table) + return table +end + +-- Table creation. + +-- Create a empty faction. +function factions.create_faction_table() + local table = { + name = "", + --! @brief power of a faction (needed for parcel claiming) + power = factions_config.power, + --! @brief maximum power of a faction + maxpower = factions_config.maxpower, + --! @brief power currently in use + usedpower = 0., + --! @brief list of player names + players = {}, + --! @brief table of ranks/permissions + ranks = starting_ranks, + --! @brief name of the leader + leader = nil, + --! @brief spawn of the faction + spawn = {x = 0, y = 0, z = 0}, + --! @brief default joining rank for new members + default_rank = "member", + --! @brief default rank assigned to the leader + default_leader_rank = "leader", + --! @brief faction's description string + description = "Default faction description.", + --! @brief faction's message of the day. + message_of_the_day = "", + --! @brief list of players currently invited (can join with /f join) + invited_players = {}, + --! @brief table of claimed parcels (keys are parcelpos strings) + land = {}, + --! @brief table of allies + allies = {}, + -- + request_inbox = {}, + --! @brief table of enemies + enemies = {}, + --! + neutral = {}, + --! @brief table of parcels/factions that are under attack + attacked_parcels = {}, + --! @brief whether faction is closed or open (boolean) + join_free = false, + --! @brief gives certain privileges + is_admin = false, + --! @brief last time anyone logged on + last_logon = os.time(), + --! @brief how long this has been without parcels + no_parcel = os.time(), + } + return factions.on_create_faction_table(table) +end + +-- Create a empty ip table. +function factions.create_ip_table() + local table = { + ip = "" + } + return factions.on_create_ip_table(table) +end + +-- Create a empty player table. +function factions.create_player_table() + local table = { + faction = "" + } + return factions.on_create_player_table(table) +end + +-- Create a empty claim table. +function factions.create_claim_table() + local table = { + faction = "" + } + return factions.on_create_claim_table(table) +end diff --git a/factions.lua b/factions.lua index 7e982e5..0542277 100644 --- a/factions.lua +++ b/factions.lua @@ -70,60 +70,9 @@ if factions_config.faction_diplomacy == true then starting_ranks["leader"] = lt end -function factions.new() - return { - name = "", - --! @brief power of a faction (needed for parcel claiming) - power = factions_config.power, - --! @brief maximum power of a faction - maxpower = factions_config.maxpower, - --! @brief power currently in use - usedpower = 0., - --! @brief list of player names - players = {}, - --! @brief table of ranks/permissions - ranks = starting_ranks, - --! @brief name of the leader - leader = nil, - --! @brief spawn of the faction - spawn = {x=0, y=0, z=0}, - --! @brief default joining rank for new members - default_rank = "member", - --! @brief default rank assigned to the leader - default_leader_rank = "leader", - --! @brief faction's description string - description = "Default faction description.", - --! @brief faction's message of the day. - message_of_the_day = "", - --! @brief list of players currently invited (can join with /f join) - invited_players = {}, - --! @brief table of claimed parcels (keys are parcelpos strings) - land = {}, - --! @brief table of allies - allies = {}, - -- - request_inbox = {}, - --! @brief table of enemies - enemies = {}, - --! - neutral = {}, - --! @brief table of parcels/factions that are under attack - attacked_parcels = {}, - --! @brief whether faction is closed or open (boolean) - join_free = false, - --! @brief gives certain privileges - is_admin = false, - --! @brief last time anyone logged on - last_logon = os.time(), - --! @brief how long this has been without parcels - no_parcel = os.time(), - } -end - - --! @brief create a new empty faction function factions.new_faction(name) - local faction = factions.new() + local faction = factions.create_faction_table() faction.name = name factions.factions.set(name, faction) @@ -172,11 +121,13 @@ function factions.set_name(oldname, name) end for parcel in pairs(faction.land) do - factions.parcels.set(parcel, name) + local data = factions.create_claim_table() + data.faction = name + factions.parcels.set(parcel, data) end for playername in pairs(faction.players) do - local data = factions.players.get(playername) or {} + local data = factions.players.get(playername) or factions.create_player_table() data.faction = name factions.players.set(playername, data) end @@ -231,7 +182,7 @@ function factions.add_player(name, player, rank) faction.players[player] = rank or faction.default_rank - local data = factions.players.get(player) or {} + local data = factions.players.get(player) or factions.create_player_table() data.faction = name factions.players.set(player, data) diff --git a/player_events.lua b/player_events.lua index a81c69d..dac592a 100644 --- a/player_events.lua +++ b/player_events.lua @@ -1,7 +1,9 @@ local on_death = {} minetest.register_on_prejoinplayer(function(name, ip) - factions.player_ips.set(name, ip) + local data = factions.create_ip_table() + data.ip = ip + factions.player_ips.set(name, data) end) minetest.register_on_joinplayer(function(player) @@ -49,18 +51,19 @@ minetest.register_on_leaveplayer(function(player) end if faction then + faction.last_logon = os.time() + factions.factions.set(facname, faction) factions.onlineplayers[facname][name] = nil local id_name2 = name .. "factionName" local id_name3 = name .. "powerWatch" + if hud_ids[id_name2] then hud_ids[id_name2] = nil end if hud_ids[id_name3] then hud_ids[id_name3] = nil end - for k, v in pairs(factions.onlineplayers[facname]) do - return - end + factions.onlineplayers[facname] = nil on_death[name] = nil end From d00c120cd526821ec6a4d5c553b8c1ff47091b92 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 15:43:28 -0500 Subject: [PATCH 21/32] Remove: whole keys only if empty --- claim_events.lua | 2 +- databases.lua | 29 ++++++++++++++++++++++++++++- factions.lua | 6 +++--- 3 files changed, 32 insertions(+), 5 deletions(-) diff --git a/claim_events.lua b/claim_events.lua index c225af7..3249582 100644 --- a/claim_events.lua +++ b/claim_events.lua @@ -52,7 +52,7 @@ end --! @brief claim a parcel, update power and update global parcels table function factions.unclaim_parcel(name, parcelpos) - factions.parcels.remove(parcelpos) + factions.remove_key(factions.parcels, parcelpos, nil, "faction", true) local faction = factions.factions.get(name) diff --git a/databases.lua b/databases.lua index e40b478..7e2bbb8 100644 --- a/databases.lua +++ b/databases.lua @@ -99,7 +99,7 @@ end -- Create a empty player table. function factions.create_player_table() local table = { - faction = "" + faction = "", } return factions.on_create_player_table(table) end @@ -111,3 +111,30 @@ function factions.create_claim_table() } return factions.on_create_claim_table(table) end + +-- helper functions +function factions.db_is_empty(table) + for k, v in pairs(table) do + return false + end + return true +end + +function factions.remove_key(db, db_name, db_data, key, write) + if not db_data then + db_data = db.get(db_name) + end + + db_data[key] = nil + + if factions.db_is_empty(db_data) then + db.remove(db_name) + return nil + end + + if write then + db.set(db_name, db_data) + end + + return db_data +end diff --git a/factions.lua b/factions.lua index 0542277..a196038 100644 --- a/factions.lua +++ b/factions.lua @@ -220,7 +220,7 @@ function factions.remove_player(name, player) factions.factions.set(name, faction) - factions.players.remove(player) + factions.remove_key(factions.players, player, nil, "faction", true) factions.on_player_leave(name, player) if factions_config.enable_power_per_player then @@ -281,11 +281,11 @@ function factions.disband(name, reason) end for k, _ in pairs(faction.players) do -- remove players affiliation - factions.players.remove(k) + factions.remove_key(factions.players, k, nil, "faction", true) end for k, v in pairs(faction.land) do -- remove parcel claims - factions.parcels.remove(k) + factions.remove_key(factions.parcels, k, nil, "faction", true) end factions.on_disband(name, reason) From e962c88309622a1961429146b83d5fa6145dac0f Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 15:49:42 -0500 Subject: [PATCH 22/32] faction: protect can be bypassed now --- nodes.lua | 16 ++++++++-------- protection_override.lua | 4 ++++ 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/nodes.lua b/nodes.lua index 048f96c..de3dd50 100644 --- a/nodes.lua +++ b/nodes.lua @@ -40,7 +40,7 @@ if minetest.registered_nodes["default:chest"] then if def_allow_metadata_inventory_move then 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 + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then return 0 end return def_allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) @@ -48,7 +48,7 @@ if minetest.registered_nodes["default:chest"] then else 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 + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then return 0 end return count @@ -59,14 +59,14 @@ if minetest.registered_nodes["default:chest"] then local def_allow_metadata_inventory_put = dc.allow_metadata_inventory_put if def_allow_metadata_inventory_put then allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") then + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then return 0 end return def_allow_metadata_inventory_put(pos, listname, index, stack, player) end else allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") then + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then return 0 end return stack:get_count() @@ -77,14 +77,14 @@ if minetest.registered_nodes["default:chest"] then local def_allow_metadata_inventory_take = dc.allow_metadata_inventory_take if def_allow_metadata_inventory_take then allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") then + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then return 0 end return def_allow_metadata_inventory_take(pos, listname, index, stack, player) end else allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") then + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then return 0 end return stack:get_count() @@ -92,7 +92,7 @@ if minetest.registered_nodes["default:chest"] then end local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not factions.can_use_node(pos, clicker:get_player_name(), "container") then + if not factions.can_use_node(pos, clicker:get_player_name(), "container") and not minetest.check_player_privs(clicker, "protection_bypass") then return itemstack end return def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) @@ -151,7 +151,7 @@ for i, l in ipairs(doors) do local def_can_dig = dw.can_dig local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if factions.can_use_node(pos, clicker:get_player_name(), "door") then + if factions.can_use_node(pos, clicker:get_player_name(), "door") or minetest.check_player_privs(clicker, "protection_bypass") then def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) end return itemstack diff --git a/protection_override.lua b/protection_override.lua index f72ecbc..8ae54e1 100644 --- a/protection_override.lua +++ b/protection_override.lua @@ -1,6 +1,10 @@ local default_is_protected = minetest.is_protected minetest.is_protected = function(pos, player) + if minetest.check_player_privs(player, "protection_bypass") then + return default_is_protected(pos, player) + end + local y = pos.y if factions_config.protection_depth_height_limit and (pos.y < factions_config.protection_max_depth or pos.y > factions_config.protection_max_height) then From 5dfd32df1b48d83bf49620c8fe64b4638dcdff87 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 19:11:50 -0500 Subject: [PATCH 23/32] Remove: ip if player is not in a faction --- player_events.lua | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/player_events.lua b/player_events.lua index dac592a..2453aca 100644 --- a/player_events.lua +++ b/player_events.lua @@ -54,19 +54,14 @@ minetest.register_on_leaveplayer(function(player) faction.last_logon = os.time() factions.factions.set(facname, faction) factions.onlineplayers[facname][name] = nil - local id_name2 = name .. "factionName" - local id_name3 = name .. "powerWatch" - if hud_ids[id_name2] then - hud_ids[id_name2] = nil - end - if hud_ids[id_name3] then - hud_ids[id_name3] = nil - end - - factions.onlineplayers[facname] = nil - on_death[name] = nil + hud_ids[name .. "factionName"] = nil + hud_ids[name .. "powerWatch"] = nil + else + factions.remove_key(factions.player_ips, name, nil, "ip", true) end + + on_death[name] = nil end ) From c531294335b83946c8a114b13aecfb00ef6d626e Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Fri, 28 Jun 2019 19:52:28 -0500 Subject: [PATCH 24/32] Auto: add missing table properties --- claim_events.lua | 2 +- databases.lua | 57 +++++++++++++++++++++++++++++++++++++++++++----- factions.lua | 2 +- 3 files changed, 54 insertions(+), 7 deletions(-) diff --git a/claim_events.lua b/claim_events.lua index 3249582..363530e 100644 --- a/claim_events.lua +++ b/claim_events.lua @@ -34,7 +34,7 @@ function factions.claim_parcel(name, parcelpos) factions.unclaim_parcel(otherfac_name, parcelpos) factions.parcelless_check(otherfac_name) end - local data = factions.create_claim_table() + local data = factions.create_parcel_table() data.faction = name factions.parcels.set(parcelpos, data) diff --git a/databases.lua b/databases.lua index 7e2bbb8..56e9ee9 100644 --- a/databases.lua +++ b/databases.lua @@ -30,7 +30,7 @@ function factions.on_create_player_table(table) end -- Hook function to add or delete from the claim table. -function factions.on_create_claim_table(table) +function factions.on_create_parcel_table(table) return table end @@ -83,7 +83,9 @@ function factions.create_faction_table() --! @brief last time anyone logged on last_logon = os.time(), --! @brief how long this has been without parcels - no_parcel = os.time(), + no_parcel = os.time(), + --! @brief access table + access = {players = {}, factions = {}}, } return factions.on_create_faction_table(table) end @@ -99,17 +101,17 @@ end -- Create a empty player table. function factions.create_player_table() local table = { - faction = "", + faction = "" } return factions.on_create_player_table(table) end -- Create a empty claim table. -function factions.create_claim_table() +function factions.create_parcel_table() local table = { faction = "" } - return factions.on_create_claim_table(table) + return factions.on_create_parcel_table(table) end -- helper functions @@ -138,3 +140,48 @@ function factions.remove_key(db, db_name, db_data, key, write) return db_data end + +-- faction data check on load +local function update_data(db, db_name, db_data, empty_table, write) + local needs_update = false + + if not db_data then + db_data = db.get(db_name) + end + + for k, v in pairs(empty_table) do + if db_data[k] == nil then + db_data[k] = v + needs_update = true + minetest.log("Adding property " .. k .. " to " .. db_name .. " file.") + end + end + + if write and needs_update then + db.set(db_name, db_data) + end + + return db_data +end + +minetest.register_on_mods_loaded(function() + minetest.log("Checking faction files.") + for k, v in factions.factions.iterate() do + update_data(factions.factions, k, nil, factions.create_faction_table(), true) + end + + minetest.log("Checking parcel files.") + for k, v in factions.parcels.iterate() do + update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) + end + + minetest.log("Checking player files.") + for k, v in factions.players.iterate() do + update_data(factions.players, k, nil, factions.create_player_table(), true) + end + + minetest.log("Checking ip files.") + for k, v in factions.player_ips.iterate() do + update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) + end +end) diff --git a/factions.lua b/factions.lua index a196038..30256f5 100644 --- a/factions.lua +++ b/factions.lua @@ -121,7 +121,7 @@ function factions.set_name(oldname, name) end for parcel in pairs(faction.land) do - local data = factions.create_claim_table() + local data = factions.create_parcel_table() data.faction = name factions.parcels.set(parcel, data) end From 0dd50e71414e780c6553cee481176e11b2ad8350 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sat, 29 Jun 2019 14:57:55 -0500 Subject: [PATCH 25/32] Remove: optional_depends --- chatcommands.lua | 17 +-- databases.lua | 30 +--- mod.conf | 3 +- nodes.lua | 349 ++++++++++++++++++++++++----------------------- 4 files changed, 187 insertions(+), 212 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 8470ac4..6958efe 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -123,14 +123,6 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, end end -factions.register_commands = function(cmd_names, cmd, ignore_param_count, or_perm) - local hide = false - for k, v in pairs(cmd_names) do - factions.register_command(k, cmd, ignore_param_count, or_perm, hide) - hide = true - end -end - local init_commands init_commands = function() @@ -1670,9 +1662,9 @@ local premade_help = "" local premade_help_admin = "" -local a_z = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} +local a_z = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} -minetest.register_on_mods_loaded(function() +function factions.create_help_text() for l, j in pairs(a_z) do for k, v in pairs(factions.commands) do if k:sub(1, 1) == j then @@ -1685,7 +1677,10 @@ minetest.register_on_mods_loaded(function() end end end - a_z = nil +end + +minetest.register_on_mods_loaded(function() + factions.create_help_text() end) ------------------------------------------------------------------------------- diff --git a/databases.lua b/databases.lua index 56e9ee9..032ef04 100644 --- a/databases.lua +++ b/databases.lua @@ -12,28 +12,6 @@ factions.player_ips = factions.root.sub_database("ips") -- Memory only storage. factions.onlineplayers = {} --- Table hook functions. - --- Hook function to add or delete from the faction table. -function factions.on_create_faction_table(table) - return table -end - --- Hook function to add or delete from the ip table. -function factions.on_create_ip_table(table) - return table -end - --- Hook function to add or delete from the player table. -function factions.on_create_player_table(table) - return table -end - --- Hook function to add or delete from the claim table. -function factions.on_create_parcel_table(table) - return table -end - -- Table creation. -- Create a empty faction. @@ -87,7 +65,7 @@ function factions.create_faction_table() --! @brief access table access = {players = {}, factions = {}}, } - return factions.on_create_faction_table(table) + return table end -- Create a empty ip table. @@ -95,7 +73,7 @@ function factions.create_ip_table() local table = { ip = "" } - return factions.on_create_ip_table(table) + return table end -- Create a empty player table. @@ -103,7 +81,7 @@ function factions.create_player_table() local table = { faction = "" } - return factions.on_create_player_table(table) + return table end -- Create a empty claim table. @@ -111,7 +89,7 @@ function factions.create_parcel_table() local table = { faction = "" } - return factions.on_create_parcel_table(table) + return table end -- helper functions diff --git a/mod.conf b/mod.conf index 28d1621..2a4f577 100644 --- a/mod.conf +++ b/mod.conf @@ -1,4 +1,3 @@ name = factions -description = Mod for handling in game factions and reputation. +description = Mc style faction system. depends = colddb -optional_depends = default, doors, xdecor, ts_doors diff --git a/nodes.lua b/nodes.lua index de3dd50..f0ed8f9 100644 --- a/nodes.lua +++ b/nodes.lua @@ -12,195 +12,198 @@ function factions.can_use_node(pos, player, permission) end end --- Make default chest the faction chest. -if minetest.registered_nodes["default:chest"] then - local dc = minetest.registered_nodes["default:chest"] - local def_on_rightclick = dc.on_rightclick +minetest.register_on_mods_loaded(function() + -- Make default chest the faction chest. + if minetest.registered_nodes["default:chest"] then + local dc = minetest.registered_nodes["default:chest"] + local def_on_rightclick = dc.on_rightclick - local after_place_node = function(pos, placer) - local parcel_faction = factions.get_faction_at(pos) - if parcel_faction then + local after_place_node = function(pos, placer) + local parcel_faction = factions.get_faction_at(pos) + if parcel_faction then + local meta = minetest.get_meta(pos) + local name = parcel_faction.name + meta:set_string("faction", name) + meta:set_string("infotext", "Faction Container (owned by faction " .. + name .. ")") + end + end + + local can_dig = function(pos, player) local meta = minetest.get_meta(pos) - local name = parcel_faction.name - meta:set_string("faction", name) - meta:set_string("infotext", "Faction Container (owned by faction " .. - name .. ")") - end - end - - local 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 - - local allow_metadata_inventory_move - local def_allow_metadata_inventory_move = dc.allow_metadata_inventory_move - if def_allow_metadata_inventory_move then - 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") and not minetest.check_player_privs(player, "protection_bypass") then - return 0 - end - return def_allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) - end - else - 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") and not minetest.check_player_privs(player, "protection_bypass") then - return 0 - end - return count - end - end - - local allow_metadata_inventory_put - local def_allow_metadata_inventory_put = dc.allow_metadata_inventory_put - if def_allow_metadata_inventory_put then - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then - return 0 - end - return def_allow_metadata_inventory_put(pos, listname, index, stack, player) - end - else - allow_metadata_inventory_put = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then - return 0 - end - return stack:get_count() - end - end - - local allow_metadata_inventory_take - local def_allow_metadata_inventory_take = dc.allow_metadata_inventory_take - if def_allow_metadata_inventory_take then - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then - return 0 - end - return def_allow_metadata_inventory_take(pos, listname, index, stack, player) - end - else - allow_metadata_inventory_take = function(pos, listname, index, stack, player) - if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then - return 0 - end - return stack:get_count() - end - end - - local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if not factions.can_use_node(pos, clicker:get_player_name(), "container") and not minetest.check_player_privs(clicker, "protection_bypass") then - return itemstack - end - return def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - end - - minetest.override_item("default:chest", {after_place_node = after_place_node, - can_dig = can_dig, - allow_metadata_inventory_move = allow_metadata_inventory_move, - allow_metadata_inventory_put = allow_metadata_inventory_put, - allow_metadata_inventory_take = allow_metadata_inventory_take, - on_rightclick = on_rightclick}) -end - -local door_items = {"doors:door_wood", "doors:door_steel", "doors:door_glass", "doors:door_obsidian_glass", "doors:woodglass_door", "doors:slide_door", - "doors:screen_door", "doors:rusty_prison_door", "doors:prison_door", "doors:japanese_door", "ts_doors:door_default_aspen_wood", "ts_doors:door_full_default_aspen_wood", - "ts_doors:door_default_pine_wood", "ts_doors:door_full_default_pine_wood", "ts_doors:door_default_acacia_wood", "ts_doors:door_full_default_acacia_wood", - "ts_doors:door_default_wood", "ts_doors:door_full_default_wood", "ts_doors:door_default_junglewood", "ts_doors:door_full_default_junglewood", - "ts_doors:door_default_bronzeblock", "ts_doors:door_full_default_bronzeblock", "ts_doors:door_default_copperblock", "ts_doors:door_full_default_copperblock", - "ts_doors:door_default_diamondblock", "ts_doors:door_full_default_diamondblock", "ts_doors:door_full_default_goldblock", "ts_doors:door_default_steelblock", "ts_doors:door_full_default_steelblock"} - -local trapdoor_items = {"doors:trapdoor", "doors:trapdoor_steel", "ts_doors:trapdoor_default_aspen_wood", "ts_doors:trapdoor_full_default_aspen_wood", - "ts_doors:trapdoor_default_wood", "ts_doors:trapdoor_full_default_wood", "ts_doors:trapdoor_default_acacia_wood", "ts_doors:trapdoor_full_default_acacia_wood", - "ts_doors:trapdoor_default_bronzeblock", "ts_doors:trapdoor_full_default_bronzeblock", "ts_doors:trapdoor_default_copperblock", "ts_doors:trapdoor_full_default_copperblock", "ts_doors:trapdoor_full_default_diamondblock", - "ts_doors:door_default_goldblock", "ts_doors:trapdoor_default_steelblock", "ts_doors:trapdoor_full_default_steelblock", "ts_doors:trapdoor_default_pine_wood", "ts_doors:trapdoor_full_default_pine_wood", - "ts_doors:trapdoor_full_default_goldblock", "ts_doors:trapdoor_default_junglewood", "ts_doors:trapdoor_full_default_junglewood", - "ts_doors:trapdoor_default_diamondblock", "ts_doors:trapdoor_default_goldblock"} - --- Edit default doors and trapdoors to make them require the door permission. -local doors = {} - -local all_items = {} - -local item_count = 1 - -local old_i = 0 - -for i, l in ipairs(door_items) do - doors[item_count] = l .. "_a" - doors[item_count + 1] = l .. "_b" - all_items[i] = l - item_count = item_count + 2 - old_i = old_i + 1 -end - -for i, l in ipairs(trapdoor_items) do - doors[item_count] = l - doors[item_count + 1] = l .. "_open" - all_items[old_i + i] = l - item_count = item_count + 2 -end - -for i, l in ipairs(doors) do - local dw = minetest.registered_nodes[l] - if dw then - local def_on_rightclick = dw.on_rightclick - local def_can_dig = dw.can_dig - - local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) - if factions.can_use_node(pos, clicker:get_player_name(), "door") or minetest.check_player_privs(clicker, "protection_bypass") then - def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - end - return itemstack + local inv = meta:get_inventory() + return inv:is_empty("main") and + factions.can_use_node(pos, player:get_player_name(), "container") end - local can_dig = nil - - if def_can_dig then - can_dig = function(pos, digger) - if factions.can_use_node(pos, digger:get_player_name(), "door") then - return def_can_dig(pos, digger) + local allow_metadata_inventory_move + local def_allow_metadata_inventory_move = dc.allow_metadata_inventory_move + if def_allow_metadata_inventory_move then + 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") and not minetest.check_player_privs(player, "protection_bypass") then + return 0 end - return false + return def_allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) end else - can_dig = function(pos, digger) - if factions.can_use_node(pos, digger:get_player_name(), "door") then - return true + 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") and not minetest.check_player_privs(player, "protection_bypass") then + return 0 end - return false + return count end end - minetest.override_item(l, {on_rightclick = on_rightclick, - can_dig = can_dig}) + + local allow_metadata_inventory_put + local def_allow_metadata_inventory_put = dc.allow_metadata_inventory_put + if def_allow_metadata_inventory_put then + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then + return 0 + end + return def_allow_metadata_inventory_put(pos, listname, index, stack, player) + end + else + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then + return 0 + end + return stack:get_count() + end + end + + local allow_metadata_inventory_take + local def_allow_metadata_inventory_take = dc.allow_metadata_inventory_take + if def_allow_metadata_inventory_take then + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then + return 0 + end + return def_allow_metadata_inventory_take(pos, listname, index, stack, player) + end + else + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not factions.can_use_node(pos, player:get_player_name(), "container") and not minetest.check_player_privs(player, "protection_bypass") then + return 0 + end + return stack:get_count() + end + end + + local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if not factions.can_use_node(pos, clicker:get_player_name(), "container") and not minetest.check_player_privs(clicker, "protection_bypass") then + return itemstack + end + return def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) + end + + minetest.override_item("default:chest", {after_place_node = after_place_node, + can_dig = can_dig, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_take = allow_metadata_inventory_take, + on_rightclick = on_rightclick}) end -end -for i, l in ipairs(all_items) do - local it = minetest.registered_items[l] - if it then - local def_on_place = it.on_place - if def_on_place ~= nil then - local on_place = function(itemstack, placer, pointed_thing) - local r = def_on_place(itemstack, placer, pointed_thing) - local pos = pointed_thing.above - local parcel_faction = factions.get_faction_at(pos) - if parcel_faction then - local meta = minetest.get_meta(pos) - local name = parcel_faction.name - meta:set_string("faction", name) - meta:set_string("infotext", "Faction Door (owned by faction " .. - name .. ")") + local door_items = {"doors:door_wood", "doors:door_steel", "doors:door_glass", "doors:door_obsidian_glass", "doors:woodglass_door", "doors:slide_door", + "doors:screen_door", "doors:rusty_prison_door", "doors:prison_door", "doors:japanese_door", "ts_doors:door_default_aspen_wood", "ts_doors:door_full_default_aspen_wood", + "ts_doors:door_default_pine_wood", "ts_doors:door_full_default_pine_wood", "ts_doors:door_default_acacia_wood", "ts_doors:door_full_default_acacia_wood", + "ts_doors:door_default_wood", "ts_doors:door_full_default_wood", "ts_doors:door_default_junglewood", "ts_doors:door_full_default_junglewood", + "ts_doors:door_default_bronzeblock", "ts_doors:door_full_default_bronzeblock", "ts_doors:door_default_copperblock", "ts_doors:door_full_default_copperblock", + "ts_doors:door_default_diamondblock", "ts_doors:door_full_default_diamondblock", "ts_doors:door_full_default_goldblock", "ts_doors:door_default_steelblock", "ts_doors:door_full_default_steelblock"} + + local trapdoor_items = {"doors:trapdoor", "doors:trapdoor_steel", "ts_doors:trapdoor_default_aspen_wood", "ts_doors:trapdoor_full_default_aspen_wood", + "ts_doors:trapdoor_default_wood", "ts_doors:trapdoor_full_default_wood", "ts_doors:trapdoor_default_acacia_wood", "ts_doors:trapdoor_full_default_acacia_wood", + "ts_doors:trapdoor_default_bronzeblock", "ts_doors:trapdoor_full_default_bronzeblock", "ts_doors:trapdoor_default_copperblock", "ts_doors:trapdoor_full_default_copperblock", "ts_doors:trapdoor_full_default_diamondblock", + "ts_doors:door_default_goldblock", "ts_doors:trapdoor_default_steelblock", "ts_doors:trapdoor_full_default_steelblock", "ts_doors:trapdoor_default_pine_wood", "ts_doors:trapdoor_full_default_pine_wood", + "ts_doors:trapdoor_full_default_goldblock", "ts_doors:trapdoor_default_junglewood", "ts_doors:trapdoor_full_default_junglewood", + "ts_doors:trapdoor_default_diamondblock", "ts_doors:trapdoor_default_goldblock"} + + -- Edit default doors and trapdoors to make them require the door permission. + local doors = {} + + local all_items = {} + + local item_count = 1 + + local old_i = 0 + + for i, l in ipairs(door_items) do + doors[item_count] = l .. "_a" + doors[item_count + 1] = l .. "_b" + all_items[i] = l + item_count = item_count + 2 + old_i = old_i + 1 + end + + for i, l in ipairs(trapdoor_items) do + doors[item_count] = l + doors[item_count + 1] = l .. "_open" + all_items[old_i + i] = l + item_count = item_count + 2 + end + + for i, l in ipairs(doors) do + local dw = minetest.registered_nodes[l] + if dw then + local def_on_rightclick = dw.on_rightclick + local def_can_dig = dw.can_dig + + local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + if factions.can_use_node(pos, clicker:get_player_name(), "door") or minetest.check_player_privs(clicker, "protection_bypass") then + def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) end - return r + return itemstack end - minetest.override_item(l, {on_place = on_place}) + + local can_dig = nil + + if def_can_dig then + can_dig = function(pos, digger) + if factions.can_use_node(pos, digger:get_player_name(), "door") then + return def_can_dig(pos, digger) + end + return false + end + else + can_dig = function(pos, digger) + if factions.can_use_node(pos, digger:get_player_name(), "door") then + return true + end + return false + end + end + minetest.override_item(l, {on_rightclick = on_rightclick, + can_dig = can_dig}) end end -end + + for i, l in ipairs(all_items) do + local it = minetest.registered_items[l] + if it then + local def_on_place = it.on_place + if def_on_place ~= nil then + local on_place = function(itemstack, placer, pointed_thing) + local r = def_on_place(itemstack, placer, pointed_thing) + local pos = pointed_thing.above + local parcel_faction = factions.get_faction_at(pos) + if parcel_faction then + local meta = minetest.get_meta(pos) + local name = parcel_faction.name + meta:set_string("faction", name) + meta:set_string("infotext", "Faction Door (owned by faction " .. + name .. ")") + end + return r + end + minetest.override_item(l, {on_place = on_place}) + end + end + 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) From 0a91ad8e6c670b3fc77cf546625b6207a7a2a7a0 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sun, 7 Jul 2019 16:33:04 -0500 Subject: [PATCH 26/32] Add: mod storage database --- config.lua | 1 + databases.lua | 35 ++++++--- init.lua | 1 + mod.conf | 2 +- settingtypes.txt | 4 +- storagedb.lua | 193 +++++++++++++++++++++++++++++++++++++++++++++++ 6 files changed, 224 insertions(+), 12 deletions(-) create mode 100644 storagedb.lua diff --git a/config.lua b/config.lua index abb1967..f8565ff 100644 --- a/config.lua +++ b/config.lua @@ -22,3 +22,4 @@ factions_config.faction_diplomacy = minetest.settings:get_bool("factions.faction factions_config.spawn_teleport = minetest.settings:get_bool("factions.spawn_teleport") or false factions_config.protection_style = minetest.settings:get("factions.protection_style") or "2d" factions_config.faction_user_priv = minetest.settings:get("factions.faction_user_priv") or false +factions_config.database = minetest.settings:get("factions.database") or "mod_storage" diff --git a/databases.lua b/databases.lua index 032ef04..64f96cb 100644 --- a/databases.lua +++ b/databases.lua @@ -2,12 +2,27 @@ --! @brief main class for factions factions = {} --- Create cold databases. -factions.root = colddb.Colddb(minetest.get_worldpath() .. "/factions") -factions.factions = factions.root.sub_database("factions") -factions.parcels = factions.root.sub_database("parcels") -factions.players = factions.root.sub_database("players") -factions.player_ips = factions.root.sub_database("ips") +-- database +factions.root = {} +factions.factions = {} +factions.parcels = {} +factions.players = {} +factions.player_ips = {} + +if factions_config.database == "colddb" then + -- Create cold databases. + factions.root = colddb.Colddb(minetest.get_worldpath() .. "/factions") + factions.factions = factions.root.sub_database("factions") + factions.parcels = factions.root.sub_database("parcels") + factions.players = factions.root.sub_database("players") + factions.player_ips = factions.root.sub_database("ips") +elseif factions_config.database == "mod_storage" then + factions.root = storagedb.Storagedb("factions") + factions.factions = factions.root.sub_database("factions") + factions.parcels = factions.root.sub_database("parcels") + factions.players = factions.root.sub_database("players") + factions.player_ips = factions.root.sub_database("ips") +end -- Memory only storage. factions.onlineplayers = {} @@ -145,21 +160,21 @@ end minetest.register_on_mods_loaded(function() minetest.log("Checking faction files.") for k, v in factions.factions.iterate() do - update_data(factions.factions, k, nil, factions.create_faction_table(), true) + --update_data(factions.factions, k, nil, factions.create_faction_table(), true) end minetest.log("Checking parcel files.") for k, v in factions.parcels.iterate() do - update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) + --update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) end minetest.log("Checking player files.") for k, v in factions.players.iterate() do - update_data(factions.players, k, nil, factions.create_player_table(), true) + --update_data(factions.players, k, nil, factions.create_player_table(), true) end minetest.log("Checking ip files.") for k, v in factions.player_ips.iterate() do - update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) + --update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) end end) diff --git a/init.lua b/init.lua index 3ff166b..79cdb39 100644 --- a/init.lua +++ b/init.lua @@ -2,6 +2,7 @@ factions_modpath = minetest.get_modpath("factions") dofile (factions_modpath .. "/config.lua") +dofile (factions_modpath .. "/storagedb.lua") dofile (factions_modpath .. "/databases.lua") dofile (factions_modpath .. "/eventcallbacks.lua") dofile (factions_modpath .. "/diplomacy_events.lua") diff --git a/mod.conf b/mod.conf index 2a4f577..204cf48 100644 --- a/mod.conf +++ b/mod.conf @@ -1,3 +1,3 @@ name = factions description = Mc style faction system. -depends = colddb +optional_depends = colddb diff --git a/settingtypes.txt b/settingtypes.txt index e5ee22c..369e23a 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -52,4 +52,6 @@ factions.faction_user_priv (Enable faction user priv) bool false # Set the way that the parcel protection works (2d, 3d). # 2d limits how far x and z can go but protection on the y goes up and down far. # 3d limits all three axis. -factions.protection_style (Protection style) enum 2d 3d,2d \ No newline at end of file +factions.protection_style (Protection style) enum 2d 3d,2d +# Set the type of database to use. +factions.database (Database) enum mod_storage colddb,mod_storage diff --git a/storagedb.lua b/storagedb.lua new file mode 100644 index 0000000..d7da0c3 --- /dev/null +++ b/storagedb.lua @@ -0,0 +1,193 @@ +local storage = minetest.get_mod_storage() +storagedb = {} + +function storagedb.Storagedb(dir) + local self = {} + + local directory = dir + local mem_pool = {} + local mem_pool_del = {} + local add_to_mem_pool = true + local serializer = minetest.serialize + local deserializer = minetest.deserialize + + -- make tables weak so the garbage-collector will remove unused data + setmetatable(mem_pool, {__mode = "kv"}) + setmetatable(mem_pool_del, {__mode = "kv"}) + + local function storekey(key) + local list = minetest.deserialize(storage:get_string(directory)) + if not list then + list = {} + list[dir .. "/" .. key] = key + else + list[dir .. "/" .. key] = key + end + storage:set_string(directory, minetest.serialize(list)) + end + local function removekey(key) + local list = minetest.deserialize(storage:get_string(directory)) + if not list then + list = {} + else + list[dir .. "/" .. key] = nil + end + storage:set_string(directory, minetest.serialize(list)) + end + local function getkeys() + local list = minetest.deserialize(storage:get_string(directory)) + if not list then + list = {} + end + return list + end + + self.get_memory_pool = function() + return mem_pool + end + self.set_memory_pool = function(pool) + mem_pool = pool + end + self.add_to_memory_pool = function(value) + if value then + add_to_mem_pool = value + end + return add_to_mem_pool + end + self.get_serializer = function() + return serializer, deserializer + end + self.set_serializer = function(coder, decoder) + serializer = coder + deserializer = decoder + end + local function load_into_mem(name, _table) + if add_to_mem_pool then + mem_pool[name] = {mem = _table} + end + end + local function load_table(name) + local f = storage:get_string(string.format("%s/%s", directory, name)) + if f then + local data = deserializer(f) + return data + end + return nil + end + local function save_table(name, _table) + if save_table == nil or name == nil then + return false + end + storekey(name) + storage:set_string(string.format("%s/%s", directory, name), minetest.serialize(_table)) + end + local function save_key(name) + storage:set_string(string.format("%s/%s", directory, name), "") + end + local function load_key(name) + local f = storage:get_string(string.format("%s/%s", directory, name)) + if f ~= "" then + return true + end + return false + end + self.set_mem = function(name, _table) + load_into_mem(name, _table) + mem_pool_del[name] = nil + end + self.save_mem = function(name) + if mem_pool[name] ~= nil then + save_table(name, mem_pool[name].mem) + end + mem_pool_del[name] = nil + end + + self.clear_mem = function(name) + mem_pool[name] = nil + mem_pool_del[name] = nil + end + + self.set = function(name, _table) + save_table(name, _table) + if add_to_mem_pool then + load_into_mem(name, _table) + end + mem_pool_del[name] = nil + end + + self.set_key = function(name) + save_key(name) + if add_to_mem_pool then + load_into_mem(name, "") + end + mem_pool_del[name] = nil + end + + self.get = function(name, callback) + if mem_pool_del[name] then + if callback then + callback(nil) + end + return nil + end + local pm = mem_pool[name] + if pm then + if callback then + callback(pm.mem) + end + return pm.mem + else + local _table = load_table(name) + if _table then + load_into_mem(name, _table) + if callback then + callback(_table) + end + return _table + end + end + mem_pool_del[name] = true + return nil + end + + self.remove = function(name) + mem_pool[name] = nil + mem_pool_del[name] = true + removekey(name) + storage:set_string(string.format("%s/%s", directory, name), "") + end + + self.sub_database = function(path) + local db = storagedb.Storagedb(dir .. "/" .. path) + return db + end + self.to_array = function() + local entries = {} + + for k, v in pairs(getkeys()) do + entries[#entries + 1] = v + end + + return entries + end + self.to_table = function() + local entries = {} + + for k, v in pairs(getkeys()) do + entries[v] = true + end + + return entries + end + self.iterate = function() + local entries = {} + + for k, v in pairs(getkeys()) do + entries[v] = true + end + + return pairs(entries) + end + + return self +end From a98d1893f874fe280360f1683b30427ebb8a6d85 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sun, 7 Jul 2019 16:42:02 -0500 Subject: [PATCH 27/32] Uncomment: update_data --- databases.lua | 8 ++++---- storagedb.lua | 6 +++--- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/databases.lua b/databases.lua index 64f96cb..4846106 100644 --- a/databases.lua +++ b/databases.lua @@ -160,21 +160,21 @@ end minetest.register_on_mods_loaded(function() minetest.log("Checking faction files.") for k, v in factions.factions.iterate() do - --update_data(factions.factions, k, nil, factions.create_faction_table(), true) + update_data(factions.factions, k, nil, factions.create_faction_table(), true) end minetest.log("Checking parcel files.") for k, v in factions.parcels.iterate() do - --update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) + update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) end minetest.log("Checking player files.") for k, v in factions.players.iterate() do - --update_data(factions.players, k, nil, factions.create_player_table(), true) + update_data(factions.players, k, nil, factions.create_player_table(), true) end minetest.log("Checking ip files.") for k, v in factions.player_ips.iterate() do - --update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) + update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) end end) diff --git a/storagedb.lua b/storagedb.lua index d7da0c3..e7e059f 100644 --- a/storagedb.lua +++ b/storagedb.lua @@ -19,9 +19,9 @@ function storagedb.Storagedb(dir) local list = minetest.deserialize(storage:get_string(directory)) if not list then list = {} - list[dir .. "/" .. key] = key + list[key] = key else - list[dir .. "/" .. key] = key + list[key] = key end storage:set_string(directory, minetest.serialize(list)) end @@ -30,7 +30,7 @@ function storagedb.Storagedb(dir) if not list then list = {} else - list[dir .. "/" .. key] = nil + list[key] = nil end storage:set_string(directory, minetest.serialize(list)) end From 6f953b27d42fac61ab2699f6923dd75a31376a19 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sat, 20 Jul 2019 18:01:54 -0500 Subject: [PATCH 28/32] Re-order: register_command params --- chatcommands.lua | 169 ++++++++++++++++++++++++----------------------- 1 file changed, 86 insertions(+), 83 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 6958efe..94c4ce6 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -6,15 +6,17 @@ factions_chat = {} factions.commands = {} -factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, dont_show_in_help) +factions.register_command = function(cmd_name, cmd) factions.commands[cmd_name] = { -- default command name = cmd_name, faction_permissions = {}, global_privileges = {}, format = {}, infaction = true, - description = "This command has no description.", - dont_show_in_help = dont_show_in_help, + description = "This command has no description.", + ignore_param_limit = false, + or_perm = false, + dont_show_in_help = false, run = function(self, player, argv) if self.global_privileges then local tmp = {} @@ -35,7 +37,7 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, unknowns = {}, other = {} } - if not ignore_param_count then + if not self.ignore_param_limit then if #argv < #(self.format) then send_error(player, "Not enough parameters.") return false @@ -94,16 +96,16 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, if self.faction_permissions then for i in ipairs(self.faction_permissions) do local perm = self.faction_permissions[i] - if not or_perm and not factions.has_permission(facname, player, perm) then + if not self.or_perm and not factions.has_permission(facname, player, perm) then send_error(player, "You do not have the faction permission " .. perm) return false - elseif or_perm and factions.has_permission(facname, player, perm) then + elseif self.or_perm and factions.has_permission(facname, player, perm) then one_p = true break end end end - if or_perm and one_p == false then + if self.or_perm and one_p == false then send_error(player, "You do not have any of faction permissions required.") return false end @@ -201,7 +203,7 @@ factions.register_command("name", { return false end end -}, false) +}) factions.register_command ("claim", { faction_permissions = {"claim"}, @@ -209,6 +211,7 @@ factions.register_command ("claim", { description_arg = ":", format = {"string"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local arg_one = args.strings[1] local arg_two = args.strings[2] @@ -256,7 +259,7 @@ factions.register_command ("claim", { factions.claim_help(player, arg_two) end end -}, true) +}) factions.register_command("unclaim", { faction_permissions = {"claim"}, @@ -264,6 +267,7 @@ factions.register_command("unclaim", { description_arg = ":", format = {"string"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local arg_one = args.strings[1] local arg_two = args.strings[2] @@ -311,7 +315,7 @@ factions.register_command("unclaim", { factions.unclaim_help(player, arg_two) end end -}, true) +}) --list all known factions factions.register_command("list", { @@ -334,7 +338,7 @@ factions.register_command("list", { minetest.chat_send_player(player, tosend, false) return true end -}, false) +}) --show factions mod version factions.register_command("version", { @@ -344,7 +348,7 @@ factions.register_command("version", { on_success = function(player, faction, pos, parcelpos, args) minetest.chat_send_player(player, "factions: version 0.8.8", false) end -}, false) +}) --show description of faction factions.register_command("info", { @@ -359,7 +363,7 @@ factions.register_command("info", { args.factions[1].description, false) return true end -}, false) +}) factions.register_command("leave", { description = "Leave your faction", @@ -369,7 +373,7 @@ factions.register_command("leave", { factions.remove_player(faction.name, player) return true end -}, false) +}) factions.register_command("kick", { faction_permissions = {"kick"}, @@ -395,7 +399,7 @@ factions.register_command("kick", { return false end end -}, false) +}) --create new faction factions.register_command("create", { @@ -423,7 +427,7 @@ factions.register_command("create", { return false end end -}, false) +}) factions.register_command("join", { format = {"faction"}, @@ -451,7 +455,7 @@ factions.register_command("join", { return true end -}, false) +}) factions.register_command("disband", { faction_permissions = {"disband"}, @@ -462,7 +466,7 @@ factions.register_command("disband", { factions.disband(faction.name) return true end -}, false) +}) factions.register_command("flag", { faction_permissions = {"flags"}, @@ -470,6 +474,7 @@ factions.register_command("flag", { description_arg = " :", global_privileges = def_global_privileges, format = {"string"}, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) --"Make your faction invite-only." --"Allow any player to join your " @@ -503,7 +508,7 @@ factions.register_command("flag", { end return true end -}, true) +}) factions.register_command("desc", { format = {"string"}, @@ -511,11 +516,12 @@ factions.register_command("desc", { description = "Set your faction's description", description_arg = " :", global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) factions.set_description(faction.name, table.concat(args.strings," ")) return true end -},true) +}) factions.register_command("invite", { format = {"player"}, @@ -534,7 +540,7 @@ factions.register_command("invite", { end return true end -},false) +}) factions.register_command("invites", { description = "List invited players.", @@ -553,7 +559,7 @@ factions.register_command("invites", { end return true end -},false) +}) factions.register_command("uninvite", { format = {"player"}, @@ -566,7 +572,7 @@ factions.register_command("uninvite", { minetest.chat_send_player(player, "Invite canceled.") return true end -},false) +}) factions.register_command("delete", { global_privileges = {"faction_admin"}, @@ -578,7 +584,7 @@ factions.register_command("delete", { factions.disband(args.factions[1].name) return true end -},false) +}) factions.register_command("ranks", { description = "List ranks within your faction", @@ -590,7 +596,7 @@ factions.register_command("ranks", { end return true end -},false) +}) factions.register_command("rank_privileges", { description = "List available rank privileges", @@ -604,7 +610,7 @@ factions.register_command("rank_privileges", { end return true end -},false) +}) factions.register_command("motd", { format = {"string"}, @@ -612,6 +618,7 @@ factions.register_command("motd", { description = "Sets the message that shows up every time a faction member logs-in", description_arg = " :", global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local s = "" for i, l in pairs(args.strings) do @@ -620,7 +627,7 @@ factions.register_command("motd", { factions.set_message_of_the_day(faction.name, "Message of the day: " .. s) return true end -},true) +}) if factions_config.faction_diplomacy == true then factions.register_command("send_alliance", { @@ -667,7 +674,7 @@ if factions_config.faction_diplomacy == true then send_error(player, target_name .. " is not a name of a faction") end end - },false) + }) factions.register_command("send_neutral", { description = "Send neutral to another faction", @@ -713,7 +720,7 @@ if factions_config.faction_diplomacy == true then send_error(player, target_name .. " is not a name of a faction") end end - },false) + }) factions.register_command("accept", { description = "accept an request from another faction", @@ -754,7 +761,7 @@ if factions_config.faction_diplomacy == true then send_error(player, "No request was sent to you.") end end - },false) + }) factions.register_command("refuse", { description = "refuse an request from another faction", @@ -786,7 +793,7 @@ if factions_config.faction_diplomacy == true then send_error(player, "No request was sent to you.") end end - },false) + }) factions.register_command("declare_war", { description = "Declare war on a faction", @@ -826,7 +833,7 @@ if factions_config.faction_diplomacy == true then send_error(player, "You are already at war.") end end - },false) + }) factions.register_command("break", { description = "Break an alliance.", @@ -858,7 +865,7 @@ if factions_config.faction_diplomacy == true then send_error(player, "You where not allies to begin with.") end end - },false) + }) factions.register_command("inbox", { description = "Check your diplomacy request inbox.", @@ -884,7 +891,7 @@ if factions_config.faction_diplomacy == true then minetest.chat_send_player(player, "none:") end end - },false) + }) factions.register_command("allies", { description = "Shows the factions that are allied to you.", @@ -902,7 +909,7 @@ if factions_config.faction_diplomacy == true then minetest.chat_send_player(player, "none:") end end - },false) + }) factions.register_command("neutral", { description = "Shows the factions that are neutral with you.", @@ -920,7 +927,7 @@ if factions_config.faction_diplomacy == true then minetest.chat_send_player(player, "none:") end end - },false) + }) factions.register_command("enemies", { description = "Shows enemies of your faction", @@ -938,7 +945,7 @@ if factions_config.faction_diplomacy == true then minetest.chat_send_player(player, "none:") end end - },false) + }) end factions.register_command("who", { @@ -946,7 +953,8 @@ factions.register_command("who", { description_arg = " (none | ):", infaction = false, global_privileges = def_global_privileges, - format = {"string"}, + format = {"string"}, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local str = args.strings[1] @@ -978,7 +986,7 @@ factions.register_command("who", { return true end -},true) +}) local parcel_size_center = factions_config.parcel_size / 2 @@ -987,6 +995,7 @@ factions.register_command("show_parcel", { description_arg = ":", global_privileges = def_global_privileges, infaction = false, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local parcel_faction = factions.get_parcel_faction(parcelpos) @@ -1002,7 +1011,7 @@ factions.register_command("show_parcel", { minetest.add_entity(ppos, "factions:display") return true end -},false) +}) factions.register_command("new_rank", { description = "Add a new rank.", @@ -1010,6 +1019,7 @@ factions.register_command("new_rank", { format = {"string"}, faction_permissions = {"ranks"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) if args.strings[1] then local rank = args.strings[1] @@ -1049,7 +1059,7 @@ factions.register_command("new_rank", { send_error(player, "No rank was given.") return false end -},true) +}) factions.register_command("replace_privs", { description = "Deletes current permissions and replaces them with the ones given.", @@ -1057,6 +1067,7 @@ factions.register_command("replace_privs", { format = {"string"}, faction_permissions = {"ranks"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) if args.strings[1] then local rank = args.strings[1] @@ -1096,7 +1107,7 @@ factions.register_command("replace_privs", { send_error(player, "No rank was given.") return false end -},true) +}) factions.register_command("remove_privs", { description = "Remove permissions from a rank.", @@ -1104,6 +1115,7 @@ factions.register_command("remove_privs", { format = {"string"}, faction_permissions = {"ranks"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) if args.strings[1] then local rank = args.strings[1] @@ -1143,7 +1155,7 @@ factions.register_command("remove_privs", { send_error(player, "No rank was given.") return false end -},true) +}) factions.register_command("add_privs", { description = "add permissions to a rank.", @@ -1151,6 +1163,7 @@ factions.register_command("add_privs", { format = {"string"}, faction_permissions = {"ranks"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) if args.strings[1] then local rank = args.strings[1] @@ -1190,7 +1203,7 @@ factions.register_command("add_privs", { send_error(player, "No rank was given.") return false end -},true) +}) factions.register_command("set_rank_name", { description = "Change the name of given rank.", @@ -1212,7 +1225,7 @@ factions.register_command("set_rank_name", { factions.set_rank_name(faction.name, rank, newrank) return true end -},false) +}) factions.register_command("del_rank", { description = "Replace and delete a rank.", @@ -1230,7 +1243,7 @@ factions.register_command("del_rank", { factions.delete_rank(faction.name, rank, newrank) return true end -},false) +}) factions.register_command("set_def_rank", { description = "Change the default rank given to new players and also replace rankless players in this faction", @@ -1247,7 +1260,7 @@ factions.register_command("set_def_rank", { factions.set_def_rank(faction.name, rank) return true end -},false) +}) factions.register_command("reset_ranks", { description = "Reset's all of the factions rankings back to the default ones.", @@ -1259,7 +1272,7 @@ factions.register_command("reset_ranks", { factions.reset_ranks(faction.name) return true end -},false) +}) factions.register_command("sethome", { description = "Set the faction's spawn", @@ -1270,7 +1283,7 @@ factions.register_command("sethome", { factions.set_spawn(faction.name, pos) return true end -},false) +}) factions.register_command("unsethome", { description = "Set the faction's spawn to zero", @@ -1281,7 +1294,7 @@ factions.register_command("unsethome", { factions.set_spawn(faction.name, {x = 0, y = 0, z = 0}) return true end -},false) +}) if factions_config.spawn_teleport == true then factions.register_command("home", { @@ -1295,7 +1308,7 @@ if factions_config.spawn_teleport == true then end return false end - },false) + }) end factions.register_command("where", { @@ -1309,7 +1322,7 @@ factions.register_command("where", { minetest.chat_send_player(player, "You are standing on parcel " .. parcelpos .. ", part of " .. place_name) return true end -},false) +}) factions.register_command("help", { description = "Shows help for commands.", @@ -1320,7 +1333,7 @@ factions.register_command("help", { factions_chat.show_help(player) return true end -},false) +}) factions.register_command("gethome", { description = "Shows your faction's spawn", @@ -1336,7 +1349,7 @@ factions.register_command("gethome", { return false end end -},false) +}) factions.register_command("promote", { description = "Promotes a player to a rank", @@ -1372,7 +1385,7 @@ factions.register_command("promote", { return false end end -},false) +}) factions.register_command("power", { description = "Display your faction's power", @@ -1394,7 +1407,7 @@ factions.register_command("power", { minetest.chat_send_player(player, "Power: " .. faction.power .. " / " .. faction.maxpower - faction.usedpower .. "\nPower per " .. factions_config.tick_time .. " seconds: " .. pps .. "\nPower per death: -" .. factions_config.power_per_death) return true end -},false) +}) factions.register_command("free", { description = "Forcefully frees a parcel", @@ -1411,18 +1424,19 @@ factions.register_command("free", { return true end end -},false) +}) factions.register_command("chat", { description = "Send a message to your faction's members", description_arg = " :", global_privileges = def_global_privileges, format = {"string"}, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local msg = table.concat(args.strings, " ") factions.broadcast(faction.name, msg, player) end -}, true) +}) factions.register_command("force_update", { description = "Forces an update tick.", @@ -1432,7 +1446,7 @@ factions.register_command("force_update", { on_success = function(player, faction, pos, parcelpos, args) factions.faction_tick() end -},false) +}) factions.register_command("player", { description = "Get which faction a player is in", @@ -1440,6 +1454,7 @@ factions.register_command("player", { infaction = false, format = {"string"}, global_privileges = def_global_privileges, + ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local playername = args.strings[1] if not playername then @@ -1454,7 +1469,7 @@ factions.register_command("player", { return true end end -},true) +}) factions.register_command("set_leader", { description = "Set a player as a faction's leader", @@ -1474,7 +1489,7 @@ factions.register_command("set_leader", { factions.set_leader(targetfaction.name, playername) return true end -},false) +}) factions.register_command("set_admin", { description = "Make a faction an admin faction", @@ -1495,7 +1510,7 @@ factions.register_command("set_admin", { return true end -},false) +}) factions.register_command("remove_admin", { description = "Make a faction not an admin faction", @@ -1515,7 +1530,7 @@ factions.register_command("remove_admin", { return true end -},false) +}) factions.register_command("reset_power", { description = "Reset a faction's power", @@ -1530,7 +1545,7 @@ factions.register_command("reset_power", { return true end -},false) +}) factions.register_command("obliterate", { @@ -1544,7 +1559,7 @@ factions.register_command("obliterate", { end return true end -},false) +}) factions.register_command("get_factions_spawn", { description = "Get a faction's spawn", @@ -1562,7 +1577,7 @@ factions.register_command("get_factions_spawn", { return false end end -},false) +}) factions.register_command("stats", { description = "Get stats of a faction", @@ -1587,7 +1602,7 @@ factions.register_command("stats", { minetest.chat_send_player(player, "Power: " .. f.power .. " / " .. f.maxpower - f.usedpower .. "\nPower per " .. factions_config.tick_time .. " seconds: " .. pps .. "\nPower per death: -" .. factions_config.power_per_death) return true end -},false) +}) factions.register_command("seen", { description = "Check the last time a faction had a member logged in", @@ -1606,7 +1621,7 @@ factions.register_command("seen", { hours % 24 .. " hour(s), " .. minutes % 60 .. " minutes, " .. time % 60 .. " second(s) ago.") return true end -},false) +}) ------------------------------------------------------------------------------- -- name: cmdhandler(playername, parameter) @@ -1619,13 +1634,10 @@ factions.register_command("seen", { --! @param parameter data supplied to command ------------------------------------------------------------------------------- factions_chat.cmdhandler = function (playername,parameter) - local player = minetest.env:get_player_by_name(playername) local params = parameter:split(" ") local player_faction, facname = factions.get_player_faction(playername) - - if parameter == nil or - parameter == "" then + if parameter == nil or parameter == "" then if player_faction then minetest.chat_send_player(playername, "You are in faction " .. player_faction.name .. ". Type /f help for a list of commands.") else @@ -1633,20 +1645,16 @@ factions_chat.cmdhandler = function (playername,parameter) end return end - local cmd = factions.commands[params[1]] if not cmd then send_error(playername, "Unknown command.") return false end - local argv = {} for i=2, #params, 1 do table.insert(argv, params[i]) end - - cmd:run(playername, argv) - + cmd:run(playername, argv) end function table_Contains(t, v) @@ -1659,9 +1667,7 @@ function table_Contains(t, v) end local premade_help = "" - local premade_help_admin = "" - local a_z = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} function factions.create_help_text() @@ -1693,15 +1699,12 @@ end) --! @param playername name ------------------------------------------------------------------------------- function factions_chat.show_help(playername) - local MSG = function(text) minetest.chat_send_player(playername, text, false) end - MSG("factions mod") MSG("Usage:") - local has, missing = minetest.check_player_privs(playername, { - faction_admin = true}) + local has, missing = minetest.check_player_privs(playername, {faction_admin = true}) if has then MSG(premade_help_admin) else From 15d0d98937e22ffe16b476431cfb2e78a5d77e9e Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sat, 14 Sep 2019 14:50:43 -0500 Subject: [PATCH 29/32] Code: clean up part 0 --- chatcommands.lua | 376 ++++++++++++---------------------------- claim_events.lua | 47 +---- databases.lua | 13 +- diplomacy_events.lua | 15 -- eventcallbacks.lua | 30 ---- factions.lua | 46 ++--- hud.lua | 3 - init.lua | 2 - invite_events.lua | 4 - nodes.lua | 10 -- player_events.lua | 49 ++---- power_events.lua | 27 +-- protection_override.lua | 5 - rank_events.lua | 30 ---- settingtypes.txt | 2 + 15 files changed, 167 insertions(+), 492 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index 94c4ce6..c8f4fbd 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -1,9 +1,4 @@ -local send_error = function(player, message) - minetest.chat_send_player(player, message) -end - factions_chat = {} - factions.commands = {} factions.register_command = function(cmd_name, cmd) @@ -25,7 +20,7 @@ factions.register_command = function(cmd_name, cmd) end local bool, missing_privs = minetest.check_player_privs(player, tmp) if not bool then - send_error(player, "Unauthorized.") + minetest.chat_send_player(player, "Unauthorized.") return false end end @@ -39,7 +34,7 @@ factions.register_command = function(cmd_name, cmd) } if not self.ignore_param_limit then if #argv < #(self.format) then - send_error(player, "Not enough parameters.") + minetest.chat_send_player(player, "Not enough parameters.") return false end else @@ -54,14 +49,13 @@ factions.register_command = function(cmd_name, cmd) end end end - for i in ipairs(self.format) do local argtype = self.format[i] local arg = argv[i] if argtype == "faction" then local fac = factions.get_faction(arg) if not fac then - send_error(player, "Specified faction "..arg.." does not exist") + minetest.chat_send_player(player, "Specified faction " .. arg .. " does not exist") return false else table.insert(args.factions, fac) @@ -71,7 +65,7 @@ factions.register_command = function(cmd_name, cmd) if data then table.insert(args.players, arg) else - send_error(player, "Player does not exist.") + minetest.chat_send_player(player, "Player does not exist.") return false end elseif argtype == "string" then @@ -85,7 +79,6 @@ factions.register_command = function(cmd_name, cmd) table.insert(args.other, argv[i]) end end - -- checks permissions local player_faction, facname = factions.get_player_faction(player) if self.infaction and not player_faction then @@ -97,7 +90,7 @@ factions.register_command = function(cmd_name, cmd) for i in ipairs(self.faction_permissions) do local perm = self.faction_permissions[i] if not self.or_perm and not factions.has_permission(facname, player, perm) then - send_error(player, "You do not have the faction permission " .. perm) + minetest.chat_send_player(player, "You do not have the faction permission " .. perm) return false elseif self.or_perm and factions.has_permission(facname, player, perm) then one_p = true @@ -106,10 +99,9 @@ factions.register_command = function(cmd_name, cmd) end end if self.or_perm and one_p == false then - send_error(player, "You do not have any of faction permissions required.") + minetest.chat_send_player(player, "You do not have any of faction permissions required.") return false end - -- get some more data local pos = minetest.get_player_by_name(player):get_pos() local parcelpos = factions.get_parcel_pos(pos) @@ -127,7 +119,6 @@ end local init_commands init_commands = function() - if factions_config.faction_user_priv == true then minetest.register_privilege("faction_user", { @@ -136,20 +127,16 @@ init_commands = function() } ) end - - minetest.register_privilege("faction_admin", { description = "this user is allowed to create or delete factions", give_to_singleplayer = true, } ) - local def_privs = {interact = true} if factions_config.faction_user_priv == true then def_privs.faction_user = true end - minetest.register_chatcommand("f", { params = " parameters", @@ -158,7 +145,6 @@ init_commands = function() func = factions_chat.cmdhandler, } ) - minetest.register_chatcommand("faction", { params = " parameters", @@ -168,14 +154,10 @@ init_commands = function() } ) end - - ------------------------------------------- -- R E G I S T E R E D C O M M A N D S | ------------------------------------------- - local def_global_privileges = nil - if factions_config.faction_user_priv == true then minetest.register_on_newplayer(function(player) local name = player:get_player_name() @@ -186,7 +168,6 @@ if factions_config.faction_user_priv == true then ) def_global_privileges = {"faction_user"} end - factions.register_command("name", { faction_permissions = {"name"}, format = {"string"}, @@ -199,12 +180,11 @@ factions.register_command("name", { factions.set_name(faction.name, factionname) return true else - send_error(player, "Faction cannot be renamed.") + minetest.chat_send_player(player, "Faction cannot be renamed.") return false end end }) - factions.register_command ("claim", { faction_permissions = {"claim"}, description = "Claim the plot of land you're on.", @@ -224,12 +204,10 @@ factions.register_command ("claim", { elseif arg_one == "s" or arg_one == "square" then if arg_two then local r = tonumber(arg_two) - if not r then - send_error(player, "Only use numbers in the second cmd parameter [0-9].") + minetest.chat_send_player(player, "Only use numbers in the second cmd parameter [0-9].") return end - factions.claim_square(player, faction, r) else factions.claim_square(player, faction, 3) @@ -237,12 +215,10 @@ factions.register_command ("claim", { elseif arg_one == "c" or arg_one == "circle" then if arg_two then local r = tonumber(arg_two) - if not r then - send_error(player, "Only use numbers in the second cmd parameter [0-9].") + minetest.chat_send_player(player, "Only use numbers in the second cmd parameter [0-9].") return end - factions.claim_circle(player, faction, r) else factions.claim_circle(player, faction, 3) @@ -260,7 +236,6 @@ factions.register_command ("claim", { end end }) - factions.register_command("unclaim", { faction_permissions = {"claim"}, description = "Unclaim the plot of land you're on.", @@ -280,12 +255,10 @@ factions.register_command("unclaim", { elseif arg_one == "s" or arg_one == "square" then if arg_two then local r = tonumber(arg_two) - if not r then - send_error(player, "Only use numbers in the second cmd parameter [0-9].") + minetest.chat_send_player(player, "Only use numbers in the second cmd parameter [0-9].") return end - factions.unclaim_square(player, faction, r) else factions.unclaim_square(player, faction, 3) @@ -293,12 +266,10 @@ factions.register_command("unclaim", { elseif arg_one == "c" or arg_one == "circle" then if arg_two then local r = tonumber(arg_two) - if not r then - send_error(player, "Only use numbers in the second cmd parameter [0-9].") + minetest.chat_send_player(player, "Only use numbers in the second cmd parameter [0-9].") return end - factions.unclaim_circle(player, faction, r) else factions.unclaim_circle(player, faction, 3) @@ -316,7 +287,6 @@ factions.register_command("unclaim", { end end }) - --list all known factions factions.register_command("list", { description = "List all registered factions.", @@ -326,7 +296,6 @@ factions.register_command("list", { on_success = function(player, faction, pos, parcelpos, args) local list = factions.factions.to_array() local tosend = "Existing factions:" - for i, v in ipairs(list) do if i ~= #list then tosend = tosend .. " " .. v .. "," @@ -334,12 +303,10 @@ factions.register_command("list", { tosend = tosend .. " " .. v end end - minetest.chat_send_player(player, tosend, false) return true end }) - --show factions mod version factions.register_command("version", { description = "Displays mod version.", @@ -349,7 +316,6 @@ factions.register_command("version", { minetest.chat_send_player(player, "factions: version 0.8.8", false) end }) - --show description of faction factions.register_command("info", { format = {"faction"}, @@ -364,7 +330,6 @@ factions.register_command("info", { return true end }) - factions.register_command("leave", { description = "Leave your faction", description_arg = ":", @@ -374,7 +339,6 @@ factions.register_command("leave", { return true end }) - factions.register_command("kick", { faction_permissions = {"kick"}, format = {"player"}, @@ -383,24 +347,20 @@ factions.register_command("kick", { global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) local name = args.players[1] - local victim_faction, facname = factions.get_player_faction(name) - local kicker_faction, kicker_facname = factions.get_player_faction(player) - if victim_faction and kicker_facname == facname and name ~= victim_faction.leader then -- can't kick da king factions.remove_player(facname, name) return true elseif not victim_faction or kicker_facname ~= facname then - send_error(player, name .. " is not in your faction") + minetest.chat_send_player(player, name .. " is not in your faction") return false else - send_error(player, name .. " cannot be kicked from your faction") + minetest.chat_send_player(player, name .. " cannot be kicked from your faction") return false end end }) - --create new faction factions.register_command("create", { format = {"string"}, @@ -410,12 +370,10 @@ factions.register_command("create", { global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) if faction then - send_error(player, "You are already in a faction") + minetest.chat_send_player(player, "You are already in a faction") return false end - local factionname = args.strings[1] - if factions.can_create_faction(factionname) then local new_faction = factions.new_faction(factionname) factions.add_player(factionname, player, new_faction.default_leader_rank) @@ -423,12 +381,11 @@ factions.register_command("create", { factions.start_diplomacy(factionname, new_faction) return true else - send_error(player, "Faction cannot be created.") + minetest.chat_send_player(player, "Faction cannot be created.") return false end end }) - factions.register_command("join", { format = {"faction"}, description = "Join a faction", @@ -437,26 +394,22 @@ factions.register_command("join", { global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) if faction ~= nil or faction then - send_error(player, "You need to leave your current faction in order to join this one.") + minetest.chat_send_player(player, "You need to leave your current faction in order to join this one.") return false end - local new_faction = args.factions[1] - if new_faction and factions.can_join(new_faction.name, player) then factions.add_player(new_faction.name, player) elseif new_faction then - send_error(player, "You cannot join this faction") + minetest.chat_send_player(player, "You cannot join this faction") return false else - send_error(player, "Enter the right faction name.") + minetest.chat_send_player(player, "Enter the right faction name.") return false end - return true end }) - factions.register_command("disband", { faction_permissions = {"disband"}, description = "Disband your faction", @@ -467,7 +420,6 @@ factions.register_command("disband", { return true end }) - factions.register_command("flag", { faction_permissions = {"flags"}, description = "Manage the faction's flags.", @@ -476,15 +428,14 @@ factions.register_command("flag", { format = {"string"}, ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) - --"Make your faction invite-only." - --"Allow any player to join your " - --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 + local msg = "" for i, k in pairs(factions.flags) do - minetest.chat_send_player(player, k..": ".. factions.flags_desc[i] .. "\n") + msg = msg .. i ..": ".. k .. "\n" end + minetest.chat_send_player(player, msg) return true end if flag_name and bool then @@ -494,7 +445,7 @@ factions.register_command("flag", { elseif bool == "no" then yes = false else - send_error(player, "Set the flags only to yes or no.") + minetest.chat_send_player(player, "Set the flags only to yes or no.") return false end if flag_name == "open" then @@ -503,13 +454,12 @@ factions.register_command("flag", { elseif flag_name == "tax_kick" then elseif flag_name == "animals" then else - send_error(player, flag_name.." is not an flag.") + minetest.chat_send_player(player, flag_name.." is not an flag.") end end return true end }) - factions.register_command("desc", { format = {"string"}, faction_permissions = {"description"}, @@ -522,7 +472,6 @@ factions.register_command("desc", { return true end }) - factions.register_command("invite", { format = {"player"}, faction_permissions = {"invite"}, @@ -532,7 +481,7 @@ factions.register_command("invite", { on_success = function(player, faction, pos, parcelpos, args) if args.players and args.players[1] then if player == args.players[1] then - send_error(player, "You can not invite yourself.") + minetest.chat_send_player(player, "You can not invite yourself.") return end factions.invite_player(faction.name, args.players[1]) @@ -541,7 +490,6 @@ factions.register_command("invite", { return true end }) - factions.register_command("invites", { description = "List invited players.", description_arg = ":", @@ -550,17 +498,19 @@ factions.register_command("invites", { on_success = function(player, faction, pos, parcelpos, args) minetest.chat_send_player(player, "Invited players:") local foundplayer = false + local msg = "" for p, _ in pairs(faction.invited_players) do - minetest.chat_send_player(player, p) + msg = msg .. p .. "\n" foundplayer = true end if not foundplayer then minetest.chat_send_player(player, "None:") + return false end + minetest.chat_send_player(player, msg) return true end }) - factions.register_command("uninvite", { format = {"player"}, faction_permissions = {"invite"}, @@ -573,7 +523,6 @@ factions.register_command("uninvite", { return true end }) - factions.register_command("delete", { global_privileges = {"faction_admin"}, format = {"faction"}, @@ -585,33 +534,33 @@ factions.register_command("delete", { return true end }) - factions.register_command("ranks", { description = "List ranks within your faction", description_arg = ":", global_privileges = def_global_privileges, - on_success = function(player, faction, pos, parcelpos, args) - for rank, permissions in pairs(faction.ranks) do - minetest.chat_send_player(player, rank .. ": " .. table.concat(permissions, " ")) - end + on_success = function(player, faction, pos, parcelpos, args) + local msg = "" + for rank, permissions in pairs(faction.ranks) do + msg = msg .. rank .. ": " .. table.concat(permissions, " ") .. "\n" + end + minetest.chat_send_player(player, msg) return true end }) - factions.register_command("rank_privileges", { description = "List available rank privileges", description_arg = ":", global_privileges = def_global_privileges, infaction = false, - on_success = function(player, faction, pos, parcelpos, args) - minetest.chat_send_player(player, "Privileges available:\n") + on_success = function(player, faction, pos, parcelpos, args) + local msg = "Privileges available:\n" for i, k in pairs(factions.permissions) do - minetest.chat_send_player(player, k .. ": " .. factions.permissions_desc[i] .. "\n") - end + msg = msg .. i .. ": " .. k .. "\n" + end + minetest.chat_send_player(player, msg) return true end }) - factions.register_command("motd", { format = {"string"}, faction_permissions = {"motd"}, @@ -628,7 +577,6 @@ factions.register_command("motd", { return true end }) - if factions_config.faction_diplomacy == true then factions.register_command("send_alliance", { description = "Send an alliance request to another faction", @@ -639,43 +587,36 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - if target_faction then if not target_faction.request_inbox[faction.name] then if faction.allies[target_name] then - send_error(player, "You are already allys.") + minetest.chat_send_player(player, "You are already allys.") return false end - if faction.enemies[target_name] then - send_error(player, "You need to be neutral in-order to send an alliance request.") + minetest.chat_send_player(player, "You need to be neutral in-order to send an alliance request.") return false end - if target_name == faction.name then - send_error(player, "You can not send an alliance to your own faction") + minetest.chat_send_player(player, "You can not send an alliance to your own faction") return false end - if faction.request_inbox[target_name] then - send_error(player, "Faction " .. target_name .. "has already sent a request to you.") + minetest.chat_send_player(player, "Faction " .. target_name .. "has already sent a request to you.") return false end - target_faction.request_inbox[faction.name] = "alliance" factions.broadcast(target_faction.name, "An alliance request from faction " .. faction.name .. " has been sent to you.") factions.broadcast(faction.name, "An alliance request was sent to faction " .. target_name) - factions.factions.set(target_name, target_faction) else - send_error(player, "You have already sent a request.") + minetest.chat_send_player(player, "You have already sent a request.") end else - send_error(player, target_name .. " is not a name of a faction") + minetest.chat_send_player(player, target_name .. " is not a name of a faction") end end }) - factions.register_command("send_neutral", { description = "Send neutral to another faction", description_arg = " :", @@ -685,43 +626,36 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - if target_faction then if not target_faction.request_inbox[faction.name] then if faction.allies[target_name] then - send_error(player, "You are already allys.") + minetest.chat_send_player(player, "You are already allys.") return false end - if faction.neutral[target_name] then - send_error(player, "You are already neutral with this faction") + minetest.chat_send_player(player, "You are already neutral with this faction") return false end - if target_name == faction.name then - send_error(player, "You can not send a neutral request to your own faction") + minetest.chat_send_player(player, "You can not send a neutral request to your own faction") return false end - if faction.request_inbox[target_name] then - send_error(player, "Faction " .. target_name .. "has already sent a request to you.") + minetest.chat_send_player(player, "Faction " .. target_name .. "has already sent a request to you.") return false end - target_faction.request_inbox[faction.name] = "neutral" factions.broadcast(target_faction.name, "A neutral request from faction " .. faction.name .. " has been sent to you.") factions.broadcast(faction.name, "A neutral request was sent to faction " .. target_name) - factions.factions.set(target_name, target_faction) else - send_error(player, "You have already sent a request.") + minetest.chat_send_player(player, "You have already sent a request.") end else - send_error(player, target_name .. " is not a name of a faction") + minetest.chat_send_player(player, target_name .. " is not a name of a faction") end end }) - factions.register_command("accept", { description = "accept an request from another faction", description_arg = " :", @@ -731,18 +665,15 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - if not target_faction then - send_error(player, target_name .. " Is not a faction.") + minetest.chat_send_player(player, target_name .. " Is not a faction.") return false end - if faction.request_inbox[target_name] then if target_name == faction.name then - send_error(player, "You can not accept an request from own faction") + minetest.chat_send_player(player, "You can not accept an request from own faction") return false end - if faction.request_inbox[target_name] == "alliance" then factions.new_alliance(faction.name, target_name) factions.new_alliance(target_name, faction.name) @@ -752,17 +683,13 @@ if factions_config.faction_diplomacy == true then factions.new_neutral(target_name, faction.name) end end - faction.request_inbox[target_name] = nil - factions.factions.set(faction.name, faction) - else - send_error(player, "No request was sent to you.") + minetest.chat_send_player(player, "No request was sent to you.") end end }) - factions.register_command("refuse", { description = "refuse an request from another faction", description_arg = " :", @@ -772,29 +699,24 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - if not target_faction then - send_error(player, target_name .. " Is not a faction.") + minetest.chat_send_player(player, target_name .. " Is not a faction.") return false end - if faction.request_inbox[target_name] then if target_name == faction.name then - send_error(player, "You can not refuse an request from your own faction") + minetest.chat_send_player(player, "You can not refuse an request from your own faction") return false end - faction.request_inbox[target_name] = nil factions.broadcast(target_name, "Faction " .. faction.name .. " refuse to be your ally.") factions.broadcast(faction.name, "Refused an request from faction " .. target_name) factions.factions.set(faction.name, faction) - else - send_error(player, "No request was sent to you.") + minetest.chat_send_player(player, "No request was sent to you.") end end }) - factions.register_command("declare_war", { description = "Declare war on a faction", description_arg = " :", @@ -804,37 +726,30 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - if not target_faction then - send_error(player, target_name .. " Is not a faction.") + minetest.chat_send_player(player, target_name .. " Is not a faction.") return false end - if not faction.enemies[target_name] then if target_name == faction.name then - send_error(player, "You can not declare war on your own faction") + minetest.chat_send_player(player, "You can not declare war on your own faction") return false end - if faction.allies[target_name] then factions.end_alliance(faction.name, target_name) factions.end_alliance(target_name, faction.name) end - if faction.neutral[target_name] then factions.end_neutral(faction.name, target_name) factions.end_neutral(target_name, faction.name) end - factions.new_enemy(faction.name, target_name) factions.new_enemy(target_name, faction.name) - else - send_error(player, "You are already at war.") + minetest.chat_send_player(player, "You are already at war.") end end }) - factions.register_command("break", { description = "Break an alliance.", description_arg = " :", @@ -844,29 +759,24 @@ if factions_config.faction_diplomacy == true then on_success = function(player, faction, pos, parcelpos, args) local target_name = args.strings[1] local target_faction = factions.factions.get(target_name) - if not target_faction then - send_error(player, target_name .. " Is not a faction.") + minetest.chat_send_player(player, target_name .. " Is not a faction.") return false end - if faction.allies[target_name] then if target_name == faction.name then - send_error(player, "You can not break an alliance from your own faction") + minetest.chat_send_player(player, "You can not break an alliance from your own faction") return false end - factions.end_alliance(faction.name, target_name) factions.end_alliance(target_name, faction.name) factions.new_neutral(faction.name, target_name) factions.new_neutral(target_name, faction.name) - else - send_error(player, "You where not allies to begin with.") + minetest.chat_send_player(player, "You where not allies to begin with.") end end }) - factions.register_command("inbox", { description = "Check your diplomacy request inbox.", description_arg = ":", @@ -874,80 +784,79 @@ if factions_config.faction_diplomacy == true then faction_permissions = {"diplomacy"}, on_success = function(player, faction, pos, parcelpos, args) local empty = true - + local msg = "Inbox:\n" 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 + msg = msg .. "Alliance request from faction " .. i .. "\n" + else if k == "neutral" then - minetest.chat_send_player(player, "neutral request from faction " .. i .. "\n") + msg = msg .. "neutral request from faction " .. i .. "\n" end end - empty = false end - if empty then minetest.chat_send_player(player, "none:") + else + minetest.chat_send_player(player, msg) end end }) - factions.register_command("allies", { description = "Shows the factions that are allied to you.", description_arg = ":", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) local empty = true - + local msg = "" for i, k in pairs(faction.allies) do - minetest.chat_send_player(player, i .. "\n") + msg = msg .. i .. "\n" empty = false end - if empty then minetest.chat_send_player(player, "none:") + else + minetest.chat_send_player(player, msg) end end }) - factions.register_command("neutral", { description = "Shows the factions that are neutral with you.", description_arg = ":", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) local empty = true - + local msg = "" for i, k in pairs(faction.neutral) do - minetest.chat_send_player(player, i .. "\n") + msg = msg .. i .. "\n" empty = false end - if empty then minetest.chat_send_player(player, "none:") + else + minetest.chat_send_player(player, msg) end end }) - factions.register_command("enemies", { description = "Shows enemies of your faction", description_arg = ":", global_privileges = def_global_privileges, on_success = function(player, faction, pos, parcelpos, args) local empty = true - + local msg = "" for i, k in pairs(faction.enemies) do - minetest.chat_send_player(player, i .. "\n") + msg = msg .. i .. "\n" empty = false end - if empty then minetest.chat_send_player(player, "none:") + else + minetest.chat_send_player(player, msg) end end }) end - factions.register_command("who", { description = "List players in a faction, and their ranks.", description_arg = " (none | ):", @@ -957,7 +866,6 @@ factions.register_command("who", { ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local str = args.strings[1] - if str then local f = factions.get_faction(str) if not f or not f.players then @@ -983,13 +891,10 @@ factions.register_command("who", { return true end end - return true end }) - local parcel_size_center = factions_config.parcel_size / 2 - factions.register_command("show_parcel", { description = "Shows parcel for six seconds.", description_arg = ":", @@ -998,21 +903,17 @@ factions.register_command("show_parcel", { ignore_param_limit = true, on_success = function(player, faction, pos, parcelpos, args) local parcel_faction = factions.get_parcel_faction(parcelpos) - if not parcel_faction then - send_error(player, "There is no claim here") + minetest.chat_send_player(player, "There is no claim here") return false end - local psc = parcel_size_center local fps = factions_config.parcel_size - local ppos = {x = (math.floor(pos.x / fps) * fps) + psc, y = (math.floor(pos.y / fps) * fps) + psc, z = (math.floor(pos.z / fps) * fps) + psc} minetest.add_entity(ppos, "factions:display") return true end }) - factions.register_command("new_rank", { description = "Add a new rank.", description_arg = " :", @@ -1024,7 +925,7 @@ factions.register_command("new_rank", { if args.strings[1] then local rank = args.strings[1] if faction.ranks[rank] then - send_error(player, "Rank already exists") + minetest.chat_send_player(player, "Rank already exists") return false end local success = false @@ -1047,20 +948,19 @@ factions.register_command("new_rank", { end if not success then if args.strings[failindex] then - send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + minetest.chat_send_player(player, "Permission " .. args.strings[failindex] .. " is invalid.") else - send_error(player, "No permission was given.") + minetest.chat_send_player(player, "No permission was given.") end return false end factions.add_rank(faction.name, rank, args.other) return true end - send_error(player, "No rank was given.") + minetest.chat_send_player(player, "No rank was given.") return false end }) - factions.register_command("replace_privs", { description = "Deletes current permissions and replaces them with the ones given.", description_arg = " :", @@ -1072,7 +972,7 @@ factions.register_command("replace_privs", { if args.strings[1] then local rank = args.strings[1] if not faction.ranks[rank] then - send_error(player, "Rank does not exist") + minetest.chat_send_player(player, "Rank does not exist") return false end local success = false @@ -1095,20 +995,19 @@ factions.register_command("replace_privs", { end if not success then if args.strings[failindex] then - send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + minetest.chat_send_player(player, "Permission " .. args.strings[failindex] .. " is invalid.") else - send_error(player, "No permission was given.") + minetest.chat_send_player(player, "No permission was given.") end return false end factions.replace_privs(faction.name, rank, args.other) return true end - send_error(player, "No rank was given.") + minetest.chat_send_player(player, "No rank was given.") return false end }) - factions.register_command("remove_privs", { description = "Remove permissions from a rank.", description_arg = " :", @@ -1120,7 +1019,7 @@ factions.register_command("remove_privs", { if args.strings[1] then local rank = args.strings[1] if not faction.ranks[rank] then - send_error(player, "Rank does not exist") + minetest.chat_send_player(player, "Rank does not exist") return false end local success = false @@ -1143,20 +1042,19 @@ factions.register_command("remove_privs", { end if not success then if args.strings[failindex] then - send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + minetest.chat_send_player(player, "Permission " .. args.strings[failindex] .. " is invalid.") else - send_error(player, "No permission was given.") + minetest.chat_send_player(player, "No permission was given.") end return false end factions.remove_privs(faction.name, rank, args.other) return true end - send_error(player, "No rank was given.") + minetest.chat_send_player(player, "No rank was given.") return false end }) - factions.register_command("add_privs", { description = "add permissions to a rank.", description_arg = " :", @@ -1168,7 +1066,7 @@ factions.register_command("add_privs", { if args.strings[1] then local rank = args.strings[1] if not faction.ranks[rank] then - send_error(player, "Rank does not exist") + minetest.chat_send_player(player, "Rank does not exist") return false end local success = false @@ -1191,20 +1089,19 @@ factions.register_command("add_privs", { end if not success then if args.strings[failindex] then - send_error(player, "Permission " .. args.strings[failindex] .. " is invalid.") + minetest.chat_send_player(player, "Permission " .. args.strings[failindex] .. " is invalid.") else - send_error(player, "No permission was given.") + minetest.chat_send_player(player, "No permission was given.") end return false end factions.add_privs(faction.name, rank, args.other) return true end - send_error(player, "No rank was given.") + minetest.chat_send_player(player, "No rank was given.") return false end }) - factions.register_command("set_rank_name", { description = "Change the name of given rank.", description_arg = " :", @@ -1215,18 +1112,17 @@ factions.register_command("set_rank_name", { local rank = args.strings[1] local newrank = args.strings[2] if not faction.ranks[rank] then - send_error(player, "The rank does not exist.") + minetest.chat_send_player(player, "The rank does not exist.") return false end if faction.ranks[newrank] then - send_error(player, "This rank name was already taken.") + minetest.chat_send_player(player, "This rank name was already taken.") return false end factions.set_rank_name(faction.name, rank, newrank) return true end }) - factions.register_command("del_rank", { description = "Replace and delete a rank.", description_arg = " :", @@ -1237,14 +1133,13 @@ factions.register_command("del_rank", { 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 does not exist.") + minetest.chat_send_player(player, "One of the specified ranks does not exist.") return false end factions.delete_rank(faction.name, rank, newrank) return true end }) - factions.register_command("set_def_rank", { description = "Change the default rank given to new players and also replace rankless players in this faction", description_arg = " :", @@ -1254,14 +1149,13 @@ factions.register_command("set_def_rank", { on_success = function(player, faction, pos, parcelpos, args) local rank = args.strings[1] if not faction.ranks[rank] then - send_error(player, "This rank does not exist.") + minetest.chat_send_player(player, "This rank does not exist.") return false end factions.set_def_rank(faction.name, rank) return true end }) - factions.register_command("reset_ranks", { description = "Reset's all of the factions rankings back to the default ones.", description_arg = ":", @@ -1273,7 +1167,6 @@ factions.register_command("reset_ranks", { return true end }) - factions.register_command("sethome", { description = "Set the faction's spawn", description_arg = ":", @@ -1284,7 +1177,6 @@ factions.register_command("sethome", { return true end }) - factions.register_command("unsethome", { description = "Set the faction's spawn to zero", description_arg = ":", @@ -1295,7 +1187,6 @@ factions.register_command("unsethome", { return true end }) - if factions_config.spawn_teleport == true then factions.register_command("home", { description = "Teleport to the faction's spawn", @@ -1310,7 +1201,6 @@ if factions_config.spawn_teleport == true then end }) end - factions.register_command("where", { description = "See whose parcel you stand on.", description_arg = ":", @@ -1323,7 +1213,6 @@ factions.register_command("where", { return true end }) - factions.register_command("help", { description = "Shows help for commands.", description_arg = ":", @@ -1334,7 +1223,6 @@ factions.register_command("help", { return true end }) - factions.register_command("gethome", { description = "Shows your faction's spawn", description_arg = ":", @@ -1350,7 +1238,6 @@ factions.register_command("gethome", { end end }) - factions.register_command("promote", { description = "Promotes a player to a rank", description_arg = " :", @@ -1361,32 +1248,28 @@ factions.register_command("promote", { local rank = args.strings[1] if faction.ranks[rank] then local name = args.players[1] - local player_faction, facname = factions.get_player_faction(name) - local promoter_faction, promoter_facname = factions.get_player_faction(player) - if player_faction and promoter_facname == facname and player ~= name then factions.promote(faction.name, name, rank) minetest.chat_send_player(player, "Promoted " .. name .. " to " .. rank .. "!") return true elseif not player_faction or promoter_facname ~= facname then - send_error(player, name .. " is not in your faction") + minetest.chat_send_player(player, name .. " is not in your faction") return false elseif player == name then - send_error(player, "You can not promote yourself!") + minetest.chat_send_player(player, "You can not promote yourself!") return false else - send_error(player, name .. " cannot be promoted from your faction") + minetest.chat_send_player(player, name .. " cannot be promoted from your faction") return false end else - send_error(player, "The specified rank does not exist.") + minetest.chat_send_player(player, "The specified rank does not exist.") return false end end }) - factions.register_command("power", { description = "Display your faction's power", description_arg = ":", @@ -1408,7 +1291,6 @@ factions.register_command("power", { return true end }) - factions.register_command("free", { description = "Forcefully frees a parcel", description_arg = ":", @@ -1417,7 +1299,7 @@ factions.register_command("free", { on_success = function(player, faction, pos, parcelpos, args) local parcel_faction = factions.get_parcel_faction(parcelpos) if not parcel_faction then - send_error(player, "No claim at this position") + minetest.chat_send_player(player, "No claim at this position") return false else factions.unclaim_parcel(parcel_faction.name, parcelpos) @@ -1425,7 +1307,6 @@ factions.register_command("free", { end end }) - factions.register_command("chat", { description = "Send a message to your faction's members", description_arg = " :", @@ -1437,7 +1318,6 @@ factions.register_command("chat", { factions.broadcast(faction.name, msg, player) end }) - factions.register_command("force_update", { description = "Forces an update tick.", description_arg = ":", @@ -1447,7 +1327,6 @@ factions.register_command("force_update", { factions.faction_tick() end }) - factions.register_command("player", { description = "Get which faction a player is in", description_arg = " :", @@ -1462,7 +1341,7 @@ factions.register_command("player", { end local faction1, facname = factions.get_player_faction(playername) if not faction1 then - send_error(player, "Player " .. playername .. " does not belong to any faction") + minetest.chat_send_player(player, "Player " .. playername .. " does not belong to any faction") return false else minetest.chat_send_player(player, "player " .. playername .. " belongs to faction " .. faction1.name) @@ -1470,7 +1349,6 @@ factions.register_command("player", { end end }) - factions.register_command("set_leader", { description = "Set a player as a faction's leader", description_arg = " :", @@ -1481,16 +1359,14 @@ factions.register_command("set_leader", { local playername = args.players[1] local playerfaction, facname = factions.get_player_faction(playername) local targetfaction = args.factions[1] - if facname ~= targetfaction.name then - send_error(player, "Player " .. playername .. " is not in faction " .. targetfaction.name .. ".") + minetest.chat_send_player(player, "Player " .. playername .. " is not in faction " .. targetfaction.name .. ".") return false end factions.set_leader(targetfaction.name, playername) return true end }) - factions.register_command("set_admin", { description = "Make a faction an admin faction", description_arg = " :", @@ -1503,15 +1379,11 @@ factions.register_command("set_admin", { else minetest.chat_send_player(player,"faction " .. args.factions[1].name .. " is already an admin ") end - args.factions[1].is_admin = true - factions.factions.set(args.factions[1].name, args.factions[1]) - return true end }) - factions.register_command("remove_admin", { description = "Make a faction not an admin faction", description_arg = " :", @@ -1525,13 +1397,10 @@ factions.register_command("remove_admin", { minetest.chat_send_player(player,"faction " .. args.factions[1].name .. " is not an admin faction to begin with.") end args.factions[1].is_admin = false - factions.factions.set(args.factions[1].name, args.factions[1]) - return true end }) - factions.register_command("reset_power", { description = "Reset a faction's power", description_arg = " :", @@ -1540,14 +1409,10 @@ factions.register_command("reset_power", { format = {"faction"}, on_success = function(player, faction, pos, parcelpos, args) args.factions[1].power = 0 - factions.factions.set(args.factions[1].name, args.factions[1]) - return true end }) - - factions.register_command("obliterate", { description = "Remove all factions", description_arg = ":", @@ -1560,7 +1425,6 @@ factions.register_command("obliterate", { return true end }) - factions.register_command("get_factions_spawn", { description = "Get a faction's spawn", description_arg = " :", @@ -1573,12 +1437,11 @@ factions.register_command("get_factions_spawn", { minetest.chat_send_player(player, spawn.x .. "," .. spawn.y .. "," .. spawn.z) return true else - send_error(player, "Faction has no spawn set.") + minetest.chat_send_player(player, "Faction has no spawn set.") return false end end }) - factions.register_command("stats", { description = "Get stats of a faction", description_arg = " :", @@ -1603,7 +1466,6 @@ factions.register_command("stats", { return true end }) - factions.register_command("seen", { description = "Check the last time a faction had a member logged in", description_arg = " :", @@ -1622,7 +1484,6 @@ factions.register_command("seen", { return true end }) - ------------------------------------------------------------------------------- -- name: cmdhandler(playername, parameter) -- @@ -1647,7 +1508,7 @@ factions_chat.cmdhandler = function (playername,parameter) end local cmd = factions.commands[params[1]] if not cmd then - send_error(playername, "Unknown command.") + minetest.chat_send_player(playername, "Unknown command.") return false end local argv = {} @@ -1665,11 +1526,9 @@ function table_Contains(t, v) end return false end - local premade_help = "" local premade_help_admin = "" local a_z = {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} - function factions.create_help_text() for l, j in pairs(a_z) do for k, v in pairs(factions.commands) do @@ -1684,11 +1543,9 @@ function factions.create_help_text() end end end - minetest.register_on_mods_loaded(function() factions.create_help_text() end) - ------------------------------------------------------------------------------- -- name: show_help(playername, parameter) -- @@ -1699,17 +1556,14 @@ end) --! @param playername name ------------------------------------------------------------------------------- function factions_chat.show_help(playername) - local MSG = function(text) - minetest.chat_send_player(playername, text, false) - end - MSG("factions mod") - MSG("Usage:") + local msg = "factions mod\nUsage:\n" local has, missing = minetest.check_player_privs(playername, {faction_admin = true}) if has then - MSG(premade_help_admin) + msg = msg .. premade_help_admin else - MSG(premade_help) + msg = msg .. premade_help end + minetest.chat_send_player(playername, msg, false) end init_commands() diff --git a/claim_events.lua b/claim_events.lua index 363530e..85c847f 100644 --- a/claim_events.lua +++ b/claim_events.lua @@ -2,16 +2,12 @@ --! @return whether this faction can claim a parcelpos function factions.can_claim_parcel(name, parcelpos) local fn = factions.parcels.get(parcelpos) - if fn == nil then return true end - local faction = factions.factions.get(name) - if fn then local fac = factions.factions.get(fn.faction) - if fac.power < 0. and faction.power >= factions_config.power_per_parcel and not faction.allies[fn] and not faction.neutral[fn] then return true else @@ -20,15 +16,12 @@ function factions.can_claim_parcel(name, parcelpos) elseif faction.power < factions_config.power_per_parcel then return false end - return true end - --! @brief claim a parcel, update power and update global parcels table function factions.claim_parcel(name, parcelpos) -- check if claiming over other faction's territory local otherfac = factions.parcels.get(parcelpos) - if otherfac then local otherfac_name = otherfac.faction factions.unclaim_parcel(otherfac_name, parcelpos) @@ -37,29 +30,20 @@ function factions.claim_parcel(name, parcelpos) local data = factions.create_parcel_table() data.faction = name factions.parcels.set(parcelpos, data) - local faction = factions.factions.get(name) - faction.land[parcelpos] = true - factions.factions.set(name, faction) - factions.decrease_power(name, factions_config.power_per_parcel) factions.increase_usedpower(name, factions_config.power_per_parcel) factions.on_claim_parcel(name, parcelpos) factions.parcelless_check(name) end - --! @brief claim a parcel, update power and update global parcels table function factions.unclaim_parcel(name, parcelpos) factions.remove_key(factions.parcels, parcelpos, nil, "faction", true) - local faction = factions.factions.get(name) - faction.land[parcelpos] = nil - factions.factions.set(name, faction) - factions.increase_power(name, factions_config.power_per_parcel) factions.decrease_usedpower(name, factions_config.power_per_parcel) factions.on_unclaim_parcel(name, parcelpos) @@ -68,7 +52,6 @@ end function factions.parcelless_check(name) local faction = factions.factions.get(name) - if faction.land then local count = 0 for index, value in pairs(faction.land) do @@ -165,15 +148,11 @@ local parcel_size = factions_config.parcel_size function factions.claim_square(player, faction, r) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) - pos.x = math.floor(pos.x / parcel_size) * parcel_size pos.z = math.floor(pos.z / parcel_size) * parcel_size - pos.x = pos.x - (parcel_size * (r - math.floor(r / 2))) pos.z = pos.z - (parcel_size * (r - math.floor(r / 2))) - local timer = 0 - for i = 1, r do for l = 1, r do local p = {x = pos.x + (parcel_size * l), y = pos.y, z = pos.z + (parcel_size * i)} @@ -183,9 +162,7 @@ function factions.claim_square(player, faction, r) end end end - local auto_list = {} - local function _claim_auto(player, faction) if auto_list[player] then local rplayer = minetest.get_player_by_name(player) @@ -194,7 +171,6 @@ local function _claim_auto(player, faction) minetest.after(0.1, _claim_auto, player, faction) end end - function factions.claim_auto(player, faction) if auto_list[player] then auto_list[player] = nil @@ -205,7 +181,6 @@ function factions.claim_auto(player, faction) _claim_auto(player, faction) end end - local function _claim_fill(player, faction, pos) if claim_helper(player, faction, factions.get_parcel_pos(pos), true) then local pos1 = {x = pos.x - parcel_size, y = pos.y, z = pos.z} @@ -218,7 +193,6 @@ local function _claim_fill(player, faction, pos) minetest.after(math.random(0, 11) / 10, _claim_fill, player, faction, pos4) end end - function factions.claim_fill(player, faction) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) @@ -262,16 +236,13 @@ end function factions.claim_all(player, faction) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) - pos.x = math.floor(pos.x / parcel_size) * parcel_size pos.z = math.floor(pos.z / parcel_size) * parcel_size - _claim_all(player, faction, pos) end function factions.claim_help(player, func) local text = "All params for /f claim: , " - if func == "o" or func == "one" then text = "/f claim o\n/f claim one\n Claim one parcel." elseif func == "a" or func == "auto" then @@ -287,22 +258,17 @@ function factions.claim_help(player, func) elseif func == "all" then text = "/f claim all\nClaim all faction land." end - minetest.chat_send_player(player, text) end function factions.unclaim_square(player, faction, r) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) - pos.x = math.floor(pos.x / parcel_size) * parcel_size pos.z = math.floor(pos.z / parcel_size) * parcel_size - pos.x = pos.x - (parcel_size * (r - math.floor(r / 2))) pos.z = pos.z - (parcel_size * (r - math.floor(r / 2))) - local timer = 0 - for i = 1, r do for l = 1, r do local p = {x = pos.x + (parcel_size * l), y = pos.y, z = pos.z + (parcel_size * i)} @@ -349,10 +315,8 @@ end function factions.unclaim_fill(player, faction) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) - pos.x = math.floor(pos.x / parcel_size) * parcel_size pos.z = math.floor(pos.z / parcel_size) * parcel_size - _unclaim_fill(player, faction, pos) end @@ -361,10 +325,8 @@ local parcel_size_center = parcel_size / 2 function factions.unclaim_circle(player, faction, r) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) - pos.x = (math.floor(pos.x / parcel_size) * parcel_size) + parcel_size_center pos.z = (math.floor(pos.z / parcel_size) * parcel_size) + parcel_size_center - for i = 1, 360 do local angle = i * math.pi / 180 local rpos = {x = pos.x + r * math.cos(angle), y = pos.y, z = pos.z + r * math.sin(angle)} @@ -383,16 +345,13 @@ end function factions.unclaim_all(player, faction) local rplayer = minetest.get_player_by_name(player) local pos = vector.round(rplayer:get_pos()) - pos.x = math.floor(pos.x / parcel_size) * parcel_size pos.z = math.floor(pos.z / parcel_size) * parcel_size - _unclaim_all(player, faction, pos) end function factions.unclaim_help(player, func) local text = "All params for /f unclaim: , " - if func == "o" or func == "one" then text = "/f unclaim o\n/f unclaim one\n Unclaim one parcel." elseif func == "a" or func == "auto" then @@ -408,11 +367,9 @@ function factions.unclaim_help(player, func) elseif func == "all" then text = "/f unclaim all\nUnclaim all faction land." end - minetest.chat_send_player(player, text) end minetest.register_on_leaveplayer(function(player) - auto_list[player:get_player_name()] = nil - end -) + auto_list[player:get_player_name()] = nil +end) diff --git a/databases.lua b/databases.lua index 4846106..ca235d8 100644 --- a/databases.lua +++ b/databases.lua @@ -38,7 +38,7 @@ function factions.create_faction_table() --! @brief maximum power of a faction maxpower = factions_config.maxpower, --! @brief power currently in use - usedpower = 0., + usedpower = 0, --! @brief list of player names players = {}, --! @brief table of ranks/permissions @@ -119,29 +119,23 @@ function factions.remove_key(db, db_name, db_data, key, write) if not db_data then db_data = db.get(db_name) end - db_data[key] = nil - if factions.db_is_empty(db_data) then db.remove(db_name) return nil end - if write then db.set(db_name, db_data) end - return db_data end -- faction data check on load local function update_data(db, db_name, db_data, empty_table, write) local needs_update = false - if not db_data then db_data = db.get(db_name) end - for k, v in pairs(empty_table) do if db_data[k] == nil then db_data[k] = v @@ -149,11 +143,9 @@ local function update_data(db, db_name, db_data, empty_table, write) minetest.log("Adding property " .. k .. " to " .. db_name .. " file.") end end - if write and needs_update then db.set(db_name, db_data) end - return db_data end @@ -162,17 +154,14 @@ minetest.register_on_mods_loaded(function() for k, v in factions.factions.iterate() do update_data(factions.factions, k, nil, factions.create_faction_table(), true) end - minetest.log("Checking parcel files.") for k, v in factions.parcels.iterate() do update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) end - minetest.log("Checking player files.") for k, v in factions.players.iterate() do update_data(factions.players, k, nil, factions.create_player_table(), true) end - minetest.log("Checking ip files.") for k, v in factions.player_ips.iterate() do update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) diff --git a/diplomacy_events.lua b/diplomacy_events.lua index c720745..d6cf45d 100644 --- a/diplomacy_events.lua +++ b/diplomacy_events.lua @@ -15,7 +15,6 @@ end function factions.new_alliance(name, faction) local bfaction = factions.factions.get(name) - bfaction.allies[faction] = true factions.on_new_alliance(name, faction) if bfaction.enemies[faction] then @@ -24,24 +23,19 @@ function factions.new_alliance(name, faction) if bfaction.neutral[faction] then factions.end_neutral(name, faction) end - factions.factions.set(name, bfaction) end function factions.end_alliance(name, faction) local bfaction = factions.factions.get(name) - bfaction.allies[faction] = nil factions.on_end_alliance(name, faction) - factions.factions.set(name, bfaction) end function factions.new_neutral(name, faction) local bfaction = factions.factions.get(name) - bfaction.neutral[faction] = true - factions.on_new_neutral(name, faction) if bfaction.allies[faction] then factions.end_alliance(name, faction) @@ -49,41 +43,32 @@ function factions.new_neutral(name, faction) if bfaction.enemies[faction] then factions.end_enemy(name, faction) end - factions.factions.set(name, bfaction) end function factions.end_neutral(name, faction) local bfaction = factions.factions.get(name) - bfaction.neutral[faction] = nil factions.on_end_neutral(name, faction) - factions.factions.set(name, bfaction) end function factions.new_enemy(name, faction) local bfaction = factions.factions.get(name) - bfaction.enemies[faction] = true factions.on_new_enemy(name, faction) - if bfaction.allies[faction] then factions.end_alliance(name, faction) end - if bfaction.neutral[faction] then factions.end_neutral(name, faction) end - factions.factions.set(name, bfaction) end function factions.end_enemy(name, faction) local bfaction = factions.factions.get(name) - bfaction.enemies[faction] = nil factions.on_end_enemy(name, faction) - factions.factions.set(name, bfaction) end \ No newline at end of file diff --git a/eventcallbacks.lua b/eventcallbacks.lua index f41e843..b7b029b 100644 --- a/eventcallbacks.lua +++ b/eventcallbacks.lua @@ -1,36 +1,27 @@ function factions.on_create(name) --! @brief called when the faction is added to the global faction list minetest.chat_send_all("Faction " .. name .. " has been created.") end - function factions.on_set_name(name, oldname) minetest.chat_send_all("Faction " .. oldname .. " has been changed its name to ".. name ..".") end - function factions.on_no_parcel(name) local faction = factions.factions.get(name) - local now = os.time() - faction.no_parcel local l = factions_config.maximum_parcelless_faction_time - factions.broadcast(name, "This faction will disband in " .. l - now .. " seconds, because it has no parcels.") end - function factions.on_player_leave(name, player) factions.broadcast(name, player .. " has left this faction") end - function factions.on_player_join(name, player) factions.broadcast(name, player .. " has joined this faction") end - function factions.on_claim_parcel(name, pos) factions.broadcast(name, "Parcel (" .. pos .. ") has been claimed.") end - function factions.on_unclaim_parcel(name, pos) factions.broadcast(name, "Parcel ("..pos..") has been unclaimed.") end - function factions.on_disband(name, reason) local msg = "Faction " .. name .. " has been disbanded." if reason then @@ -38,22 +29,18 @@ function factions.on_disband(name, reason) end minetest.chat_send_all(msg) end - function factions.on_new_leader(name) local faction = factions.factions.get(name) factions.broadcast(name, faction.leader .. " is now the leader of this faction") end - function factions.on_change_description(name) local faction = factions.factions.get(name) factions.broadcast(name, "Faction description has been modified to: " .. faction.description) end - function factions.on_player_invited(name, player) local faction = factions.factions.get(name) minetest.chat_send_player(player, "You have been invited to faction " .. faction.name) end - function factions.on_toggle_join_free(name, player) local faction = factions.factions.get(name) if faction.join_free then @@ -62,75 +49,58 @@ function factions.on_toggle_join_free(name, player) factions.broadcast(name, "This faction is no longer invite-free.") end end - function factions.on_new_alliance(name, faction) factions.broadcast(name, "This faction is now allied with " .. faction) end - function factions.on_end_alliance(name, faction) factions.broadcast(name, "This faction is no longer allied with " .. faction .. "!") end - function factions.on_new_neutral(name, faction) factions.broadcast(name, "This faction is now neutral with ".. faction) end - function factions.on_end_neutral(name, faction) factions.broadcast(name, "This faction is no longer neutral with " .. faction .. "!") end - function factions.on_new_enemy(name, faction) factions.broadcast(name, "This faction is now at war with " .. faction) end - function factions.on_end_enemy(name, faction) factions.broadcast(name, "This faction is no longer at war with " .. faction .. "!") end - function factions.on_set_spawn(name) local faction = factions.factions.get(name) factions.broadcast(name, "The faction spawn has been set to (" .. util.coords3D_string(faction.spawn) .. ").") end - function factions.on_add_rank(name, rank) local faction = factions.factions.get(name) factions.broadcast(name, "The rank " .. rank .. " has been created with privileges: " .. table.concat(faction.ranks[rank], ", ")) end - function factions.on_replace_privs(name, rank) local faction = factions.factions.get(name) factions.broadcast(name, "The privileges in rank " .. rank .. " have been delete and changed to: " .. table.concat(faction.ranks[rank], ", ")) end - function factions.on_remove_privs(name, rank, privs) factions.broadcast(name, "The privileges in rank " .. rank .. " have been revoked: " .. table.concat(privs, ", ")) end - function factions.on_add_privs(name, rank, privs) factions.broadcast(name, "The privileges in rank " .. rank .. " have been added: " .. table.concat(privs, ", ")) end - function factions.on_set_rank_name(name, rank,newrank) factions.broadcast(name, "The name of rank " .. rank .. " has been changed to " .. newrank) end - function factions.on_delete_rank(name, rank, newrank) factions.broadcast(name, "The rank " .. rank .. " has been deleted and replaced by " .. newrank) end - function factions.on_set_def_rank(name, rank) factions.broadcast(name, "The default rank given to new players has been changed to " .. rank) end - function factions.on_reset_ranks(name) factions.broadcast(name, "All of the faction's ranks have been reset to the default ones.") end - function factions.on_promote(name, member) local faction = factions.factions.get(name) minetest.chat_send_player(member, "You have been promoted to " .. faction.players[member]) end - function factions.on_revoke_invite(name, player) minetest.chat_send_player(player, "You are no longer invited to faction " .. name) end diff --git a/factions.lua b/factions.lua index 30256f5..570eac8 100644 --- a/factions.lua +++ b/factions.lua @@ -45,31 +45,40 @@ starting_ranks = {["leader"] = {"build", "door", "container", "name", "descripti -- ranks: create, edit, and delete ranks -- promote: set a player's rank -- diplomacy: be able to control the faction's diplomacy - -factions.permissions = {"build", "pain_build", "door", "container", "name", "description", "motd", "invite", "kick" - , "spawn", "with_draw", "territory", "claim", "access", "disband", "flags", "ranks", "promote"} -factions.permissions_desc = {"dig and place nodes", "dig and place nodes but take damage doing so", "open/close or dig faction doors", "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 player titles", "set 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, edit, and delete ranks", "set a player's rank"} - +factions.permissions = {} +factions.permissions["build"] = "dig and place nodes" +factions.permissions["pain_build"] = "dig and place nodes but take damage doing so" +factions.permissions["door"] = "open, close, or dig faction doors" +factions.permissions["container"] = "be able to interact with containers on claimed parcels" +factions.permissions["name"] = "set the faction's name" +factions.permissions["description"] = "Set the faction description" +factions.permissions["motd"] = "set the faction's message of the day" +factions.permissions["invite"] = "(un)invite players to join the faction" +factions.permissions["kick"] = "kick players off the faction" +factions.permissions["spawn"] = "set the faction's spawn" +factions.permissions["with_draw"] = "withdraw money from the faction's bank" +factions.permissions["territory"] = "claim or unclaim territory" +factions.permissions["claim"] = "(un)claim parcels of land" +factions.permissions["access"] = "manage access to territory and parcels of land to players or factions" +factions.permissions["disband"] = "disband the faction" +factions.permissions["flags"] = "manage the faction's flags" +factions.permissions["ranks"] = "create, edit, or delete ranks" +factions.permissions["promote"] = "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)"} - +factions.flags = {} +factions.flags["open"] = "can the faction be joined without an invite?" +factions.flags["monsters"] = "can monsters spawn on your land?(unused)" +factions.flags["tax_kick"] = "will players be kicked for not paying tax?(unused)" +factions.flags["animals"] = "can animals spawn on your land?(unused)" if factions_config.faction_diplomacy == true then - table.insert(factions.permissions, "diplomacy") - - table.insert(factions.permissions_desc, "be able to control the faction's diplomacy") - + factions.permissions["diplomacy"] = "be able to control the faction's diplomacy" local lt = starting_ranks["leader"] table.insert(lt, "diplomacy") starting_ranks["leader"] = lt end - --! @brief create a new empty faction function factions.new_faction(name) local faction = factions.create_faction_table() @@ -327,7 +336,6 @@ end --! @return boolean indicating permissions. Players not in faction always receive false function factions.has_permission(name, player, permission) local faction = factions.factions.get(name) - local p = faction.players[player] if not p then return false @@ -346,20 +354,16 @@ end function factions.set_description(name, new) local faction = factions.factions.get(name) - faction.description = new factions.on_change_description(name) - factions.factions.set(name, faction) end --! @brief set faction openness function factions.toggle_join_free(name, bool) local faction = factions.factions.get(name) - faction.join_free = bool factions.on_toggle_join_free(name) - factions.factions.set(name, faction) end diff --git a/hud.lua b/hud.lua index 567b71f..0a18a37 100644 --- a/hud.lua +++ b/hud.lua @@ -4,7 +4,6 @@ function createHudfactionLand(player) if player then local name = player:get_player_name() local id_name = name .. "factionLand" - if not hud_ids[id_name] then hud_ids[id_name] = player:hud_add({ hud_elem_type = "text", @@ -23,7 +22,6 @@ function createHudFactionName(player, factionname) if player and factionname then 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", @@ -43,7 +41,6 @@ function createHudPower(player, faction) if player and faction then 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", diff --git a/init.lua b/init.lua index 79cdb39..cb8bc7a 100644 --- a/init.lua +++ b/init.lua @@ -1,6 +1,5 @@ --!path of mod factions_modpath = minetest.get_modpath("factions") - dofile (factions_modpath .. "/config.lua") dofile (factions_modpath .. "/storagedb.lua") dofile (factions_modpath .. "/databases.lua") @@ -16,6 +15,5 @@ dofile (factions_modpath .. "/claim_events.lua") dofile (factions_modpath .. "/factions.lua") dofile (factions_modpath .. "/chatcommands.lua") dofile (factions_modpath .. "/nodes.lua") - minetest.after(1, hudUpdateClaimInfo) minetest.after(factions_config.tick_time, factionUpdate) diff --git a/invite_events.lua b/invite_events.lua index 94b5d0b..e6f9d88 100644 --- a/invite_events.lua +++ b/invite_events.lua @@ -1,19 +1,15 @@ --! @brief places player in invite list function factions.invite_player(name, player) local faction = factions.factions.get(name) - faction.invited_players[player] = true factions.on_player_invited(name, player) - factions.factions.set(name, faction) end --! @brief removes player from invite list (can no longer join via /f join) function factions.revoke_invite(name, player) local faction = factions.factions.get(name) - faction.invited_players[player] = nil factions.on_revoke_invite(name, player) - factions.factions.set(name, faction) end diff --git a/nodes.lua b/nodes.lua index f0ed8f9..addb16e 100644 --- a/nodes.lua +++ b/nodes.lua @@ -17,7 +17,6 @@ minetest.register_on_mods_loaded(function() if minetest.registered_nodes["default:chest"] then local dc = minetest.registered_nodes["default:chest"] local def_on_rightclick = dc.on_rightclick - local after_place_node = function(pos, placer) local parcel_faction = factions.get_faction_at(pos) if parcel_faction then @@ -28,14 +27,12 @@ minetest.register_on_mods_loaded(function() name .. ")") end end - local 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 - local allow_metadata_inventory_move local def_allow_metadata_inventory_move = dc.allow_metadata_inventory_move if def_allow_metadata_inventory_move then @@ -55,7 +52,6 @@ minetest.register_on_mods_loaded(function() return count end end - local allow_metadata_inventory_put local def_allow_metadata_inventory_put = dc.allow_metadata_inventory_put if def_allow_metadata_inventory_put then @@ -73,7 +69,6 @@ minetest.register_on_mods_loaded(function() return stack:get_count() end end - local allow_metadata_inventory_take local def_allow_metadata_inventory_take = dc.allow_metadata_inventory_take if def_allow_metadata_inventory_take then @@ -91,14 +86,12 @@ minetest.register_on_mods_loaded(function() return stack:get_count() end end - local on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) if not factions.can_use_node(pos, clicker:get_player_name(), "container") and not minetest.check_player_privs(clicker, "protection_bypass") then return itemstack end return def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) end - minetest.override_item("default:chest", {after_place_node = after_place_node, can_dig = can_dig, allow_metadata_inventory_move = allow_metadata_inventory_move, @@ -123,11 +116,8 @@ minetest.register_on_mods_loaded(function() -- Edit default doors and trapdoors to make them require the door permission. local doors = {} - local all_items = {} - local item_count = 1 - local old_i = 0 for i, l in ipairs(door_items) do diff --git a/player_events.lua b/player_events.lua index 2453aca..2aa12f6 100644 --- a/player_events.lua +++ b/player_events.lua @@ -5,7 +5,6 @@ minetest.register_on_prejoinplayer(function(name, ip) data.ip = ip factions.player_ips.set(name, data) end) - minetest.register_on_joinplayer(function(player) local name = player:get_player_name() minetest.after(5, createHudfactionLand, player) @@ -14,15 +13,11 @@ minetest.register_on_joinplayer(function(player) if factions.onlineplayers[facname] == nil then factions.onlineplayers[facname] = {} end - factions.onlineplayers[facname][name] = true faction.last_logon = os.time() - factions.factions.set(facname, faction) - minetest.after(5, createHudFactionName, player, facname) minetest.after(5, createHudPower, player, faction) - if faction.no_parcel ~= -1 then local now = os.time() - faction.no_parcel local l = factions_config.maximum_parcelless_faction_time @@ -37,38 +32,30 @@ minetest.register_on_joinplayer(function(player) minetest.chat_send_player(name, faction.message_of_the_day) end end - -end -) - +end) minetest.register_on_leaveplayer(function(player) - local name = player:get_player_name() - local faction, facname = factions.get_player_faction(name) - local id_name1 = name .. "factionLand" - - if hud_ids[id_name1] then - hud_ids[id_name1] = nil - end - - if faction then - faction.last_logon = os.time() - factions.factions.set(facname, faction) - factions.onlineplayers[facname][name] = nil - - hud_ids[name .. "factionName"] = nil - hud_ids[name .. "powerWatch"] = nil - else - factions.remove_key(factions.player_ips, name, nil, "ip", true) - end - - on_death[name] = nil + local name = player:get_player_name() + local faction, facname = factions.get_player_faction(name) + local id_name1 = name .. "factionLand" + if hud_ids[id_name1] then + hud_ids[id_name1] = nil end -) + if faction then + faction.last_logon = os.time() + factions.factions.set(facname, faction) + factions.onlineplayers[facname][name] = nil + + hud_ids[name .. "factionName"] = nil + hud_ids[name .. "powerWatch"] = nil + else + factions.remove_key(factions.player_ips, name, nil, "ip", true) + end + on_death[name] = nil +end) minetest.register_on_respawnplayer(function(player) local name = player:get_player_name() local faction, facname = factions.get_player_faction(name) - if not faction then return false else diff --git a/power_events.lua b/power_events.lua index d1c0aec..e6db2db 100644 --- a/power_events.lua +++ b/power_events.lua @@ -1,81 +1,62 @@ function factions.increase_power(name, power) local faction = factions.factions.get(name) - faction.power = faction.power + power - if faction.power > faction.maxpower - faction.usedpower then faction.power = faction.maxpower - faction.usedpower end - for i in pairs(factions.onlineplayers[name]) do updateHudPower(minetest.get_player_by_name(i), faction) end - factions.factions.set(name, faction) end function factions.decrease_power(name, power) local faction = factions.factions.get(name) - faction.power = faction.power - power - for i in pairs(factions.onlineplayers[name]) do updateHudPower(minetest.get_player_by_name(i), faction) end - factions.factions.set(name, faction) end function factions.increase_maxpower(name, power) local faction = factions.factions.get(name) - faction.maxpower = faction.maxpower + power - for i in pairs(factions.onlineplayers[name]) do updateHudPower(minetest.get_player_by_name(i), faction) end - factions.factions.set(name, faction) end function factions.decrease_maxpower(name, power) local faction = factions.factions.get(name) - faction.maxpower = faction.maxpower - power - - if faction.maxpower < 0. then -- should not happen - faction.maxpower = 0. + if faction.maxpower < 0 then -- should not happen + faction.maxpower = 0 end - for i in pairs(factions.onlineplayers[name]) do updateHudPower(minetest.get_player_by_name(i), faction) end - factions.factions.set(name, faction) end function factions.increase_usedpower(name, power) local faction = factions.factions.get(name) - faction.usedpower = faction.usedpower + power - for i in pairs(factions.onlineplayers[name]) do updateHudPower(minetest.get_player_by_name(i), faction) end - factions.factions.set(name, faction) end function factions.decrease_usedpower(name, power) local faction = factions.factions.get(name) - faction.usedpower = faction.usedpower - power - if faction.usedpower < 0. then - faction.usedpower = 0. + if faction.usedpower < 0 then + faction.usedpower = 0 end for i in pairs(factions.onlineplayers[name]) do updateHudPower(minetest.get_player_by_name(i), faction) end - factions.factions.set(name, faction) end diff --git a/protection_override.lua b/protection_override.lua index 8ae54e1..0877689 100644 --- a/protection_override.lua +++ b/protection_override.lua @@ -4,22 +4,17 @@ minetest.is_protected = function(pos, player) if minetest.check_player_privs(player, "protection_bypass") then return default_is_protected(pos, player) end - local y = pos.y - if factions_config.protection_depth_height_limit and (pos.y < factions_config.protection_max_depth or pos.y > factions_config.protection_max_height) then return default_is_protected(pos, player) end - local parcelpos = factions.get_parcel_pos(pos) local parcel_faction, parcel_fac_name = factions.get_parcel_faction(parcelpos) local player_faction local player_fac_name - if player then player_faction, player_fac_name = factions.get_player_faction(player) end - -- no faction if not parcel_faction then return default_is_protected(pos, player) diff --git a/rank_events.lua b/rank_events.lua index e404b59..ef59f65 100644 --- a/rank_events.lua +++ b/rank_events.lua @@ -3,10 +3,8 @@ --! @param rank a list with the permissions of the new rank function factions.add_rank(name, rank, perms) local faction = factions.factions.get(name) - faction.ranks[rank] = perms factions.on_add_rank(name, rank) - factions.factions.set(name, faction) end @@ -15,108 +13,85 @@ end --! @param add or remove permissions to the rank function factions.replace_privs(name, rank, perms) local faction = factions.factions.get(name) - faction.ranks[rank] = perms factions.on_replace_privs(name, rank) - factions.factions.set(name, faction) end function factions.remove_privs(name, rank, perms) local faction = factions.factions.get(name) - local revoked = false local p = faction.ranks[rank] - for index, perm in pairs(p) do if table_Contains(perms, perm) then revoked = true table.remove(p, index) end end - faction.ranks[rank] = p - if revoked then factions.on_remove_privs(name, rank, perms) else factions.broadcast(name, "No privilege was revoked from rank " .. rank .. ".") end - factions.factions.set(name, faction) end function factions.add_privs(name, rank, perms) local faction = factions.factions.get(name) - local added = false local p = faction.ranks[rank] - for index, perm in pairs(perms) do if not table_Contains(p, perm) then added = true table.insert(p, perm) end end - faction.ranks[rank] = p - if added then factions.on_add_privs(name, rank, perms) else factions.broadcast(name, "The rank " .. rank .. " already has these privileges.") end - factions.factions.set(name, faction) end function factions.set_rank_name(name, oldrank, newrank) local faction = factions.factions.get(name) - local copyrank = faction.ranks[oldrank] - faction.ranks[newrank] = copyrank faction.ranks[oldrank] = nil - for player, r in pairs(faction.players) do if r == oldrank then faction.players[player] = newrank end end - if oldrank == faction.default_leader_rank then faction.default_leader_rank = newrank factions.broadcast(name, "The default leader rank has been set to " .. newrank) end - if oldrank == faction.default_rank then faction.default_rank = newrank factions.broadcast(name, "The default rank given to new players is set to " .. newrank) end - factions.on_set_rank_name(name, oldrank, newrank) - factions.factions.set(name, faction) end function factions.set_def_rank(name, rank) local faction = factions.factions.get(name) - for player, r in pairs(faction.players) do if r == rank or r == nil or not faction.ranks[r] then faction.players[player] = rank end end - faction.default_rank = rank factions.on_set_def_rank(name, rank) - factions.factions.set(name, faction) end function factions.reset_ranks(name) local faction = factions.factions.get(name) - faction.ranks = starting_ranks faction.default_rank = "member" faction.default_leader_rank_rank = "leader" @@ -128,7 +103,6 @@ function factions.reset_ranks(name) end end factions.on_reset_ranks(name) - factions.factions.set(name, faction) end @@ -137,7 +111,6 @@ end --! @param newrank the rank given to players who were previously "rank" function factions.delete_rank(name, rank, newrank) local faction = factions.factions.get(name) - for player, r in pairs(faction.players) do if r == rank then faction.players[player] = newrank @@ -153,16 +126,13 @@ function factions.delete_rank(name, rank, newrank) faction.default_rank = newrank factions.broadcast(name, "The default rank given to new players is set to "..newrank) end - factions.factions.set(name, faction) end --! @brief set a player's rank function factions.promote(name, member, rank) local faction = factions.factions.get(name) - faction.players[member] = rank factions.on_promote(name, member) - factions.factions.set(name, faction) end diff --git a/settingtypes.txt b/settingtypes.txt index 369e23a..2d74866 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -47,6 +47,8 @@ factions.protection_depth_height_limit (Enable protection depth height limit) bo factions.spawn_teleport (Enable spawn teleport) bool false # Enable or disabled the need for faction_user priv factions.faction_user_priv (Enable faction user priv) bool false +# Enable or disabled Store player ips to prevent players from gaining more max power from alts +factions.store_ip bool true [StringSettings] # Set the way that the parcel protection works (2d, 3d). From ee5763b027cd61ea54bc02a354e076bd56114226 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Sat, 14 Sep 2019 15:44:19 -0500 Subject: [PATCH 30/32] shorten: rank_privileges --- chatcommands.lua | 2 +- diplomacy_events.lua | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/chatcommands.lua b/chatcommands.lua index c8f4fbd..6a0cc8c 100644 --- a/chatcommands.lua +++ b/chatcommands.lua @@ -547,7 +547,7 @@ factions.register_command("ranks", { return true end }) -factions.register_command("rank_privileges", { +factions.register_command("privs", { description = "List available rank privileges", description_arg = ":", global_privileges = def_global_privileges, diff --git a/diplomacy_events.lua b/diplomacy_events.lua index d6cf45d..6bec25c 100644 --- a/diplomacy_events.lua +++ b/diplomacy_events.lua @@ -71,4 +71,4 @@ function factions.end_enemy(name, faction) bfaction.enemies[faction] = nil factions.on_end_enemy(name, faction) factions.factions.set(name, bfaction) -end \ No newline at end of file +end From 54389cda26e1cba4ded485ca149cde8315681f90 Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Thu, 10 Oct 2019 22:01:56 -0500 Subject: [PATCH 31/32] Fix: error message --- settingtypes.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/settingtypes.txt b/settingtypes.txt index 2d74866..e46562a 100644 --- a/settingtypes.txt +++ b/settingtypes.txt @@ -48,7 +48,7 @@ factions.spawn_teleport (Enable spawn teleport) bool false # Enable or disabled the need for faction_user priv factions.faction_user_priv (Enable faction user priv) bool false # Enable or disabled Store player ips to prevent players from gaining more max power from alts -factions.store_ip bool true +factions.store_ip (store player ip) bool true [StringSettings] # Set the way that the parcel protection works (2d, 3d). From b0301130dceacfd6c697ee05a231d1ecad1295ec Mon Sep 17 00:00:00 2001 From: Coder12a <38924418+Coder12a@users.noreply.github.com> Date: Mon, 16 Dec 2019 18:23:32 -0600 Subject: [PATCH 32/32] Make: mod into modpack --- LICENSE | 2 +- README.md | 4 +-- factions.lua => fac/init.lua | 2 ++ fac/mod.conf | 2 ++ chatcommands.lua => fac_chat/init.lua | 2 +- fac_chat/mod.conf | 1 + config.lua => fac_config/init.lua | 0 fac_config/mod.conf | 1 + .../settingtypes.txt | 0 databases.lua => fac_database/init.lua | 1 + fac_database/mod.conf | 3 ++ storagedb.lua => fac_database/storagedb.lua | 0 .../claim_events.lua | 0 .../diplomacy_events.lua | 0 .../eventcallbacks.lua | 0 fac_events/init.lua | 8 +++++ .../invite_events.lua | 0 fac_events/mod.conf | 2 ++ .../player_events.lua | 29 +++++++++--------- .../power_events.lua | 0 rank_events.lua => fac_events/rank_events.lua | 0 hud.lua => fac_hud/init.lua | 2 ++ fac_hud/mod.conf | 1 + nodes.lua => fac_objects/init.lua | 6 ++-- fac_objects/mod.conf | 2 ++ .../textures}/factions_display.png | Bin .../textures}/license.txt | 0 .../init.lua | 0 fac_protect/mod.conf | 1 + init.lua | 19 ------------ mod.conf | 3 -- modpack.conf | 1 + 32 files changed, 48 insertions(+), 44 deletions(-) rename factions.lua => fac/init.lua (99%) create mode 100644 fac/mod.conf rename chatcommands.lua => fac_chat/init.lua (99%) create mode 100644 fac_chat/mod.conf rename config.lua => fac_config/init.lua (100%) create mode 100644 fac_config/mod.conf rename settingtypes.txt => fac_config/settingtypes.txt (100%) rename databases.lua => fac_database/init.lua (98%) create mode 100644 fac_database/mod.conf rename storagedb.lua => fac_database/storagedb.lua (100%) rename claim_events.lua => fac_events/claim_events.lua (100%) rename diplomacy_events.lua => fac_events/diplomacy_events.lua (100%) rename eventcallbacks.lua => fac_events/eventcallbacks.lua (100%) create mode 100644 fac_events/init.lua rename invite_events.lua => fac_events/invite_events.lua (100%) create mode 100644 fac_events/mod.conf rename player_events.lua => fac_events/player_events.lua (85%) rename power_events.lua => fac_events/power_events.lua (100%) rename rank_events.lua => fac_events/rank_events.lua (100%) rename hud.lua => fac_hud/init.lua (99%) create mode 100644 fac_hud/mod.conf rename nodes.lua => fac_objects/init.lua (98%) create mode 100644 fac_objects/mod.conf rename {textures => fac_objects/textures}/factions_display.png (100%) rename {textures => fac_objects/textures}/license.txt (100%) rename protection_override.lua => fac_protect/init.lua (100%) create mode 100644 fac_protect/mod.conf delete mode 100644 init.lua delete mode 100644 mod.conf create mode 100644 modpack.conf diff --git a/LICENSE b/LICENSE index 315f675..c93f886 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2019 Coder12a +Copyright (c) 2019 Coder12 Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/README.md b/README.md index 4ab2c76..d4f7466 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ # factions -mod for minetest +modpack for minetest -Mod for handling in game factions. +Mods for handling in game factions. diff --git a/factions.lua b/fac/init.lua similarity index 99% rename from factions.lua rename to fac/init.lua index 570eac8..70734e5 100644 --- a/factions.lua +++ b/fac/init.lua @@ -488,3 +488,5 @@ function factionUpdate() factions.faction_tick() minetest.after(factions_config.tick_time, factionUpdate) end + +minetest.after(factions_config.tick_time, factionUpdate) diff --git a/fac/mod.conf b/fac/mod.conf new file mode 100644 index 0000000..4bec018 --- /dev/null +++ b/fac/mod.conf @@ -0,0 +1,2 @@ +name = fac +depends = fac_config \ No newline at end of file diff --git a/chatcommands.lua b/fac_chat/init.lua similarity index 99% rename from chatcommands.lua rename to fac_chat/init.lua index 6a0cc8c..369dd57 100644 --- a/chatcommands.lua +++ b/fac_chat/init.lua @@ -910,7 +910,7 @@ factions.register_command("show_parcel", { local psc = parcel_size_center local fps = factions_config.parcel_size local ppos = {x = (math.floor(pos.x / fps) * fps) + psc, y = (math.floor(pos.y / fps) * fps) + psc, z = (math.floor(pos.z / fps) * fps) + psc} - minetest.add_entity(ppos, "factions:display") + minetest.add_entity(ppos, "fac_objects:display") return true end }) diff --git a/fac_chat/mod.conf b/fac_chat/mod.conf new file mode 100644 index 0000000..bf9ecb1 --- /dev/null +++ b/fac_chat/mod.conf @@ -0,0 +1 @@ +name = fac_chat diff --git a/config.lua b/fac_config/init.lua similarity index 100% rename from config.lua rename to fac_config/init.lua diff --git a/fac_config/mod.conf b/fac_config/mod.conf new file mode 100644 index 0000000..c8a9c15 --- /dev/null +++ b/fac_config/mod.conf @@ -0,0 +1 @@ +name = fac_config diff --git a/settingtypes.txt b/fac_config/settingtypes.txt similarity index 100% rename from settingtypes.txt rename to fac_config/settingtypes.txt diff --git a/databases.lua b/fac_database/init.lua similarity index 98% rename from databases.lua rename to fac_database/init.lua index ca235d8..7a5d58c 100644 --- a/databases.lua +++ b/fac_database/init.lua @@ -17,6 +17,7 @@ if factions_config.database == "colddb" then factions.players = factions.root.sub_database("players") factions.player_ips = factions.root.sub_database("ips") elseif factions_config.database == "mod_storage" then + dofile (minetest.get_modpath("fac_database") .. "/storagedb.lua") factions.root = storagedb.Storagedb("factions") factions.factions = factions.root.sub_database("factions") factions.parcels = factions.root.sub_database("parcels") diff --git a/fac_database/mod.conf b/fac_database/mod.conf new file mode 100644 index 0000000..9160640 --- /dev/null +++ b/fac_database/mod.conf @@ -0,0 +1,3 @@ +name = fac_database +depends = fac_config +optional_depends = colddb diff --git a/storagedb.lua b/fac_database/storagedb.lua similarity index 100% rename from storagedb.lua rename to fac_database/storagedb.lua diff --git a/claim_events.lua b/fac_events/claim_events.lua similarity index 100% rename from claim_events.lua rename to fac_events/claim_events.lua diff --git a/diplomacy_events.lua b/fac_events/diplomacy_events.lua similarity index 100% rename from diplomacy_events.lua rename to fac_events/diplomacy_events.lua diff --git a/eventcallbacks.lua b/fac_events/eventcallbacks.lua similarity index 100% rename from eventcallbacks.lua rename to fac_events/eventcallbacks.lua diff --git a/fac_events/init.lua b/fac_events/init.lua new file mode 100644 index 0000000..758a06c --- /dev/null +++ b/fac_events/init.lua @@ -0,0 +1,8 @@ +local path = minetest.get_modpath("fac_events") +dofile (path .. "/claim_events.lua") +dofile (path .. "/diplomacy_events.lua") +dofile (path .. "/eventcallbacks.lua") +dofile (path .. "/invite_events.lua") +dofile (path .. "/player_events.lua") +dofile (path .. "/power_events.lua") +dofile (path .. "/rank_events.lua") diff --git a/invite_events.lua b/fac_events/invite_events.lua similarity index 100% rename from invite_events.lua rename to fac_events/invite_events.lua diff --git a/fac_events/mod.conf b/fac_events/mod.conf new file mode 100644 index 0000000..d7c2f81 --- /dev/null +++ b/fac_events/mod.conf @@ -0,0 +1,2 @@ +name = fac_events +depends = fac diff --git a/player_events.lua b/fac_events/player_events.lua similarity index 85% rename from player_events.lua rename to fac_events/player_events.lua index 2aa12f6..bedd553 100644 --- a/player_events.lua +++ b/fac_events/player_events.lua @@ -54,21 +54,20 @@ minetest.register_on_leaveplayer(function(player) end) minetest.register_on_respawnplayer(function(player) - local name = player:get_player_name() - local faction, facname = factions.get_player_faction(name) - if not faction then - return false - else - on_death[name] = nil - if not faction.spawn then - return false - else - player:set_pos(faction.spawn) - return true - end - end - end -) + local name = player:get_player_name() + local faction, facname = factions.get_player_faction(name) + if not faction then + return false + else + on_death[name] = nil + if not faction.spawn then + return false + else + player:set_pos(faction.spawn) + return true + end + end +end) minetest.register_on_dieplayer(function(player) local pname = player:get_player_name() diff --git a/power_events.lua b/fac_events/power_events.lua similarity index 100% rename from power_events.lua rename to fac_events/power_events.lua diff --git a/rank_events.lua b/fac_events/rank_events.lua similarity index 100% rename from rank_events.lua rename to fac_events/rank_events.lua diff --git a/hud.lua b/fac_hud/init.lua similarity index 99% rename from hud.lua rename to fac_hud/init.lua index 0a18a37..c8c9328 100644 --- a/hud.lua +++ b/fac_hud/init.lua @@ -122,3 +122,5 @@ function hudUpdateClaimInfo() end minetest.after(3, hudUpdateClaimInfo) end + +hudUpdateClaimInfo() diff --git a/fac_hud/mod.conf b/fac_hud/mod.conf new file mode 100644 index 0000000..b03d215 --- /dev/null +++ b/fac_hud/mod.conf @@ -0,0 +1 @@ +name = fac_hud diff --git a/nodes.lua b/fac_objects/init.lua similarity index 98% rename from nodes.lua rename to fac_objects/init.lua index addb16e..5b44c39 100644 --- a/nodes.lua +++ b/fac_objects/init.lua @@ -198,7 +198,7 @@ end) local x = math.floor(factions_config.parcel_size / 2.1) -minetest.register_node("factions:display_node", { +minetest.register_node("fac_objects:display_node", { tiles = {"factions_display.png"}, use_texture_alpha = true, walkable = false, @@ -227,12 +227,12 @@ minetest.register_node("factions:display_node", { drop = "", }) -minetest.register_entity("factions:display", { +minetest.register_entity("fac_objects:display", { physical = false, collisionbox = {0, 0, 0, 0, 0, 0}, visual = "wielditem", visual_size = {x = 1.0 / 1.5, y = 1.0 / 1.5}, - textures = {"factions:display_node"}, + textures = {"fac_objects:display_node"}, timer = 0, on_step = function(self, dtime) diff --git a/fac_objects/mod.conf b/fac_objects/mod.conf new file mode 100644 index 0000000..22e9d5d --- /dev/null +++ b/fac_objects/mod.conf @@ -0,0 +1,2 @@ +name = fac_objects +depends = fac diff --git a/textures/factions_display.png b/fac_objects/textures/factions_display.png similarity index 100% rename from textures/factions_display.png rename to fac_objects/textures/factions_display.png diff --git a/textures/license.txt b/fac_objects/textures/license.txt similarity index 100% rename from textures/license.txt rename to fac_objects/textures/license.txt diff --git a/protection_override.lua b/fac_protect/init.lua similarity index 100% rename from protection_override.lua rename to fac_protect/init.lua diff --git a/fac_protect/mod.conf b/fac_protect/mod.conf new file mode 100644 index 0000000..22d222f --- /dev/null +++ b/fac_protect/mod.conf @@ -0,0 +1 @@ +name = fac_protect diff --git a/init.lua b/init.lua deleted file mode 100644 index cb8bc7a..0000000 --- a/init.lua +++ /dev/null @@ -1,19 +0,0 @@ ---!path of mod -factions_modpath = minetest.get_modpath("factions") -dofile (factions_modpath .. "/config.lua") -dofile (factions_modpath .. "/storagedb.lua") -dofile (factions_modpath .. "/databases.lua") -dofile (factions_modpath .. "/eventcallbacks.lua") -dofile (factions_modpath .. "/diplomacy_events.lua") -dofile (factions_modpath .. "/invite_events.lua") -dofile (factions_modpath .. "/player_events.lua") -dofile (factions_modpath .. "/power_events.lua") -dofile (factions_modpath .. "/protection_override.lua") -dofile (factions_modpath .. "/rank_events.lua") -dofile (factions_modpath .. "/hud.lua") -dofile (factions_modpath .. "/claim_events.lua") -dofile (factions_modpath .. "/factions.lua") -dofile (factions_modpath .. "/chatcommands.lua") -dofile (factions_modpath .. "/nodes.lua") -minetest.after(1, hudUpdateClaimInfo) -minetest.after(factions_config.tick_time, factionUpdate) diff --git a/mod.conf b/mod.conf deleted file mode 100644 index 204cf48..0000000 --- a/mod.conf +++ /dev/null @@ -1,3 +0,0 @@ -name = factions -description = Mc style faction system. -optional_depends = colddb diff --git a/modpack.conf b/modpack.conf new file mode 100644 index 0000000..fc2cf80 --- /dev/null +++ b/modpack.conf @@ -0,0 +1 @@ +name = factions