diff --git a/LICENSE b/LICENSE index 1f0e52b..c93f886 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 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 +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. 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/config.lua b/config.lua deleted file mode 100644 index 4a5aee9..0000000 --- a/config.lua +++ /dev/null @@ -1,24 +0,0 @@ -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 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/databases.lua b/databases.lua deleted file mode 100644 index d721a02..0000000 --- a/databases.lua +++ /dev/null @@ -1,12 +0,0 @@ ---! @class factions ---! @brief main class for factions -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") - --- Memory only storage. -factions.onlineplayers = {} diff --git a/factions.lua b/fac/init.lua similarity index 74% rename from factions.lua rename to fac/init.lua index 2fdf980..70734e5 100644 --- a/factions.lua +++ b/fac/init.lua @@ -45,85 +45,43 @@ 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 - -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) @@ -142,7 +100,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 v, i in factions.factions.iterate() do if v ~= oldname then local fac = factions.factions.get(v) @@ -172,11 +130,15 @@ function factions.set_name(oldname, name) end for parcel in pairs(faction.land) do - factions.parcels.set(parcel, name) + local data = factions.create_parcel_table() + data.faction = name + factions.parcels.set(parcel, data) end for playername in pairs(faction.players) do - factions.players.set(playername, name) + local data = factions.players.get(playername) or factions.create_player_table() + data.faction = name + factions.players.set(playername, data) end for playername in pairs(factions.onlineplayers[oldname]) do @@ -228,11 +190,15 @@ 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 factions.create_player_table() + data.faction = name + factions.players.set(player, data) + 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) @@ -263,7 +229,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 @@ -283,7 +249,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") @@ -301,7 +267,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 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 @@ -324,11 +290,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) @@ -370,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 @@ -389,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 @@ -429,7 +390,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 @@ -474,8 +434,9 @@ function factions.get_parcel_pos(pos) end function factions.get_player_faction(playername) - local facname = factions.players.get(playername) - if facname then + local data = factions.players.get(playername) + if data then + local facname = data.faction local faction = factions.factions.get(facname) return faction, facname end @@ -495,21 +456,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 facname, i in factions.factions.iterate() do local faction = factions.factions.get(facname) if faction ~= nil then @@ -539,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 81% rename from chatcommands.lua rename to fac_chat/init.lua index df56a21..369dd57 100644 --- a/chatcommands.lua +++ b/fac_chat/init.lua @@ -1,20 +1,17 @@ -local send_error = function(player, message) - minetest.chat_send_player(player, message) -end - 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 = {} @@ -23,7 +20,7 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, 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 @@ -35,9 +32,9 @@ 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.") + minetest.chat_send_player(player, "Not enough parameters.") return false end else @@ -52,14 +49,13 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, 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) @@ -69,7 +65,7 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, 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 @@ -83,7 +79,6 @@ factions.register_command = function(cmd_name, cmd, ignore_param_count, or_perm, 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 @@ -94,20 +89,19 @@ 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 - send_error(player, "You do not have the faction permission " .. perm) + if not self.or_perm and not factions.has_permission(facname, player, perm) then + minetest.chat_send_player(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 - send_error(player, "You do not have any of faction permissions required.") + if self.or_perm and one_p == false then + 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) @@ -123,17 +117,8 @@ 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() - if factions_config.faction_user_priv == true then minetest.register_privilege("faction_user", { @@ -142,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", @@ -164,7 +145,6 @@ init_commands = function() func = factions_chat.cmdhandler, } ) - minetest.register_chatcommand("faction", { params = " parameters", @@ -174,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() @@ -192,8 +168,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.", @@ -205,18 +180,18 @@ 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 -},false) - +}) factions.register_command ("claim", { faction_permissions = {"claim"}, description = "Claim the plot of land you're on.", 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] @@ -229,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) @@ -242,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) @@ -255,24 +226,23 @@ 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 end -},true) - +}) factions.register_command("unclaim", { faction_permissions = {"claim"}, description = "Unclaim the plot of land you're on.", 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] @@ -285,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) @@ -298,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) @@ -311,18 +277,16 @@ 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 end -},true) - +}) --list all known factions factions.register_command("list", { description = "List all registered factions.", @@ -330,22 +294,19 @@ 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.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 tosend = tosend .. " " .. v end end - minetest.chat_send_player(player, tosend, false) return true end -},false) - +}) --show factions mod version factions.register_command("version", { description = "Displays mod version.", @@ -354,8 +315,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", { format = {"faction"}, @@ -369,8 +329,7 @@ factions.register_command("info", { args.factions[1].description, false) return true end -},false) - +}) factions.register_command("leave", { description = "Leave your faction", description_arg = ":", @@ -379,8 +338,7 @@ factions.register_command("leave", { factions.remove_player(faction.name, player) return true end -},false) - +}) factions.register_command("kick", { faction_permissions = {"kick"}, format = {"player"}, @@ -389,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 -},false) - +}) --create new faction factions.register_command("create", { format = {"string"}, @@ -416,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) @@ -429,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 -},false) - +}) factions.register_command("join", { format = {"faction"}, description = "Join a faction", @@ -443,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 -},false) - +}) factions.register_command("disband", { faction_permissions = {"disband"}, description = "Disband your faction", @@ -472,24 +419,23 @@ factions.register_command("disband", { factions.disband(faction.name) return true end -},false) - +}) factions.register_command("flag", { faction_permissions = {"flags"}, description = "Manage the faction's flags.", 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 " - --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 @@ -499,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 @@ -508,25 +454,24 @@ 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 -},true) - +}) factions.register_command("desc", { format = {"string"}, faction_permissions = {"description"}, 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"}, faction_permissions = {"invite"}, @@ -536,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]) @@ -544,8 +489,7 @@ factions.register_command("invite", { end return true end -},false) - +}) factions.register_command("invites", { description = "List invited players.", description_arg = ":", @@ -554,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 -},false) - +}) factions.register_command("uninvite", { format = {"player"}, faction_permissions = {"invite"}, @@ -576,8 +522,7 @@ factions.register_command("uninvite", { minetest.chat_send_player(player, "Invite canceled.") return true end -},false) - +}) factions.register_command("delete", { global_privileges = {"faction_admin"}, format = {"faction"}, @@ -588,40 +533,41 @@ factions.register_command("delete", { factions.disband(args.factions[1].name) return true end -},false) - +}) 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 -},false) - -factions.register_command("rank_privileges", { +}) +factions.register_command("privs", { 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 -},false) - +}) factions.register_command("motd", { format = {"string"}, faction_permissions = {"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 @@ -630,8 +576,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", { description = "Send an alliance request to another faction", @@ -642,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 - },false) - + }) factions.register_command("send_neutral", { description = "Send neutral to another faction", description_arg = " :", @@ -688,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 - },false) - + }) factions.register_command("accept", { description = "accept an request from another faction", description_arg = " :", @@ -734,13 +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 + 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) @@ -750,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 - },false) - + }) factions.register_command("refuse", { description = "refuse an request from another faction", description_arg = " :", @@ -770,24 +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 + 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 - },false) - + }) factions.register_command("declare_war", { description = "Declare war on a faction", description_arg = " :", @@ -797,32 +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 + 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 - },false) - + }) factions.register_command("break", { description = "Break an alliance.", description_arg = " :", @@ -832,24 +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 + 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 - },false) - + }) factions.register_command("inbox", { description = "Check your diplomacy request inbox.", description_arg = ":", @@ -857,89 +784,88 @@ 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 - },false) - + }) 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 - },false) - + }) 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 - },false) - + }) 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 - },false) + }) end - factions.register_command("who", { description = "List players in a faction, and their ranks.", 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] - if str then local f = factions.get_faction(str) if not f or not f.players then @@ -965,46 +891,41 @@ factions.register_command("who", { return true end end - return true end -},true) - +}) local parcel_size_center = factions_config.parcel_size / 2 - factions.register_command("show_parcel", { description = "Shows parcel for six seconds.", 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) - 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") + minetest.add_entity(ppos, "fac_objects:display") return true end -},false) - +}) factions.register_command("new_rank", { description = "Add a new rank.", description_arg = " :", 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] 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 @@ -1027,31 +948,31 @@ 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 -},true) - +}) factions.register_command("replace_privs", { description = "Deletes current permissions and replaces them with the ones given.", description_arg = " :", 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] 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 @@ -1074,31 +995,31 @@ 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 -},true) - +}) factions.register_command("remove_privs", { description = "Remove permissions from a rank.", description_arg = " :", 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] 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 @@ -1121,31 +1042,31 @@ 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 -},true) - +}) factions.register_command("add_privs", { description = "add permissions to a rank.", description_arg = " :", 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] 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 @@ -1168,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 -},true) - +}) factions.register_command("set_rank_name", { description = "Change the name of given rank.", description_arg = " :", @@ -1192,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 -},false) - +}) factions.register_command("del_rank", { description = "Replace and delete a rank.", description_arg = " :", @@ -1214,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 -},false) - +}) 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 = " :", @@ -1231,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 -},false) - +}) factions.register_command("reset_ranks", { description = "Reset's all of the factions rankings back to the default ones.", description_arg = ":", @@ -1249,8 +1166,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", description_arg = ":", @@ -1260,8 +1176,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", description_arg = ":", @@ -1271,8 +1186,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", { description = "Teleport to the faction's spawn", @@ -1285,9 +1199,8 @@ if factions_config.spawn_teleport == true then end return false end - },false) + }) end - factions.register_command("where", { description = "See whose parcel you stand on.", description_arg = ":", @@ -1299,8 +1212,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.", description_arg = ":", @@ -1310,8 +1222,7 @@ factions.register_command("help", { factions_chat.show_help(player) return true end -},false) - +}) factions.register_command("gethome", { description = "Shows your faction's spawn", description_arg = ":", @@ -1326,8 +1237,7 @@ factions.register_command("gethome", { return false end end -},false) - +}) factions.register_command("promote", { description = "Promotes a player to a rank", description_arg = " :", @@ -1338,29 +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 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") + minetest.chat_send_player(player, name .. " is not in your faction") + return false + elseif player == name then + 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 -},false) - +}) factions.register_command("power", { description = "Display your faction's power", description_arg = ":", @@ -1381,8 +1290,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", description_arg = ":", @@ -1391,25 +1299,25 @@ 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) 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.", description_arg = ":", @@ -1418,14 +1326,14 @@ 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", description_arg = " :", 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 @@ -1433,15 +1341,14 @@ 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) return true end end -},true) - +}) factions.register_command("set_leader", { description = "Set a player as a faction's leader", description_arg = " :", @@ -1452,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 -},false) - +}) factions.register_command("set_admin", { description = "Make a faction an admin faction", description_arg = " :", @@ -1474,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 -},false) - +}) factions.register_command("remove_admin", { description = "Make a faction not an admin faction", description_arg = " :", @@ -1496,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 -},false) - +}) factions.register_command("reset_power", { description = "Reset a faction's power", description_arg = " :", @@ -1511,27 +1409,22 @@ 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 -},false) - - +}) factions.register_command("obliterate", { description = "Remove all factions", description_arg = ":", 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 facname, i in factions.factions.iterate() do factions.disband(facname, "obliterated") end return true end -},false) - +}) factions.register_command("get_factions_spawn", { description = "Get a faction's spawn", description_arg = " :", @@ -1544,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 -},false) - +}) factions.register_command("stats", { description = "Get stats of a faction", description_arg = " :", @@ -1573,8 +1465,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", description_arg = " :", @@ -1592,8 +1483,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) -- @@ -1605,13 +1495,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 @@ -1619,20 +1506,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.") + minetest.chat_send_player(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) @@ -1643,28 +1526,26 @@ function table_Contains(t, v) end return false end - 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"} - -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" +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 + 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 - +minetest.register_on_mods_loaded(function() + factions.create_help_text() +end) ------------------------------------------------------------------------------- -- name: show_help(playername, parameter) -- @@ -1675,20 +1556,14 @@ a_z = nil --! @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 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/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/fac_config/init.lua b/fac_config/init.lua new file mode 100644 index 0000000..f8565ff --- /dev/null +++ b/fac_config/init.lua @@ -0,0 +1,25 @@ +factions_config = {} +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 +factions_config.database = minetest.settings:get("factions.database") or "mod_storage" 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/fac_config/settingtypes.txt b/fac_config/settingtypes.txt new file mode 100644 index 0000000..e46562a --- /dev/null +++ b/fac_config/settingtypes.txt @@ -0,0 +1,59 @@ +[ValueSettings] + +# The max depth of protection from a parcel. +factions.protection_max_depth (Protection max depth) float 512 +# The max height of protection from a parcel. +factions.protection_max_height (Protection max height) float 10000 +# Cost of power to claim a parcel of land. +factions.power_per_parcel (Power-per-parcel) float 1 +# Power lost on death. +factions.power_per_death (Power-per-death) float 1 +# Power regeneration rate. +factions.power_per_tick (Power-per-tick) float 2 +# Faction timer. This timer regenerates power. +factions.tick_time (Faction timer) float 60 +# Not in use. +factions.power_per_attack (Power-per-attack) float 10 +# Limit how long a faction name can be. +factions.faction_name_max_length (Faction name max) int 50 +# Limit how long a rank name can be. +factions.rank_name_max_length (Rank name max length) int 25 +# The maximum amount of inactivity before disbanning a faction. +factions.maximum_faction_inactivity (Maximum faction inactivity) int 604800 +# The maximum amount of time for a parcelless faction to disban. +factions.maximum_parcelless_faction_time (Maximum parcelless faction time) int 10800 +# Power of a starting faction (needed for parcel claiming). +factions.power (Starting power) float 12 +# Maximum power of a starting faction. +factions.maxpower (Starting Maximum power) float 0 +# How much power the players make. +factions.power_per_player (power-per-player) float 1 +# How much max power is created per new player. +factions.powermax_per_player (powermax-per-player) float 12 +# parcel size +factions.parcel_size (parcel-size) float 16 + +[BoolSettings] + +# Enable or disabled power-per-player. +factions.power_per_playerb (Enable power-per-player) bool true +# Enable or disabled attack_parcel function. +factions.attack_parcel (Enable attack parcel) bool false +# Enable or disabled faction diplomacy. +factions.faction_diplomacy (Enable faction diplomacy) bool true +# Enable or disabled the max depth and height limit for a parcel +factions.protection_depth_height_limit (Enable protection depth height limit) bool true +# Enable or disabled faction spawn teleport +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 (store player ip) bool true + +[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. +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/fac_database/init.lua b/fac_database/init.lua new file mode 100644 index 0000000..7a5d58c --- /dev/null +++ b/fac_database/init.lua @@ -0,0 +1,170 @@ +--! @class factions +--! @brief main class for factions +factions = {} + +-- database +factions.root = {} +factions.factions = {} +factions.parcels = {} +factions.players = {} +factions.player_ips = {} + +if factions_config.database == "colddb" then + -- Create cold databases. + factions.root = colddb.Colddb(minetest.get_worldpath() .. "/factions") + factions.factions = factions.root.sub_database("factions") + factions.parcels = factions.root.sub_database("parcels") + factions.players = factions.root.sub_database("players") + factions.player_ips = factions.root.sub_database("ips") +elseif factions_config.database == "mod_storage" then + dofile (minetest.get_modpath("fac_database") .. "/storagedb.lua") + factions.root = storagedb.Storagedb("factions") + factions.factions = factions.root.sub_database("factions") + factions.parcels = factions.root.sub_database("parcels") + factions.players = factions.root.sub_database("players") + factions.player_ips = factions.root.sub_database("ips") +end + +-- Memory only storage. +factions.onlineplayers = {} + +-- Table creation. + +-- Create a empty faction. +function factions.create_faction_table() + local table = { + name = "", + --! @brief power of a faction (needed for parcel claiming) + power = factions_config.power, + --! @brief maximum power of a faction + maxpower = factions_config.maxpower, + --! @brief power currently in use + usedpower = 0, + --! @brief list of player names + players = {}, + --! @brief table of ranks/permissions + ranks = starting_ranks, + --! @brief name of the leader + leader = nil, + --! @brief spawn of the faction + spawn = {x = 0, y = 0, z = 0}, + --! @brief default joining rank for new members + default_rank = "member", + --! @brief default rank assigned to the leader + default_leader_rank = "leader", + --! @brief faction's description string + description = "Default faction description.", + --! @brief faction's message of the day. + message_of_the_day = "", + --! @brief list of players currently invited (can join with /f join) + invited_players = {}, + --! @brief table of claimed parcels (keys are parcelpos strings) + land = {}, + --! @brief table of allies + allies = {}, + -- + request_inbox = {}, + --! @brief table of enemies + enemies = {}, + --! + neutral = {}, + --! @brief table of parcels/factions that are under attack + attacked_parcels = {}, + --! @brief whether faction is closed or open (boolean) + join_free = false, + --! @brief gives certain privileges + is_admin = false, + --! @brief last time anyone logged on + last_logon = os.time(), + --! @brief how long this has been without parcels + no_parcel = os.time(), + --! @brief access table + access = {players = {}, factions = {}}, + } + return table +end + +-- Create a empty ip table. +function factions.create_ip_table() + local table = { + ip = "" + } + return table +end + +-- Create a empty player table. +function factions.create_player_table() + local table = { + faction = "" + } + return table +end + +-- Create a empty claim table. +function factions.create_parcel_table() + local table = { + faction = "" + } + return table +end + +-- helper functions +function factions.db_is_empty(table) + for k, v in pairs(table) do + return false + end + return true +end + +function factions.remove_key(db, db_name, db_data, key, write) + if not db_data then + db_data = db.get(db_name) + end + db_data[key] = nil + if factions.db_is_empty(db_data) then + db.remove(db_name) + return nil + end + if write then + db.set(db_name, db_data) + end + return db_data +end + +-- faction data check on load +local function update_data(db, db_name, db_data, empty_table, write) + local needs_update = false + if not db_data then + db_data = db.get(db_name) + end + for k, v in pairs(empty_table) do + if db_data[k] == nil then + db_data[k] = v + needs_update = true + minetest.log("Adding property " .. k .. " to " .. db_name .. " file.") + end + end + if write and needs_update then + db.set(db_name, db_data) + end + return db_data +end + +minetest.register_on_mods_loaded(function() + minetest.log("Checking faction files.") + for k, v in factions.factions.iterate() do + update_data(factions.factions, k, nil, factions.create_faction_table(), true) + end + minetest.log("Checking parcel files.") + for k, v in factions.parcels.iterate() do + update_data(factions.parcels, k, nil, factions.create_parcel_table(), true) + end + minetest.log("Checking player files.") + for k, v in factions.players.iterate() do + update_data(factions.players, k, nil, factions.create_player_table(), true) + end + minetest.log("Checking ip files.") + for k, v in factions.player_ips.iterate() do + update_data(factions.player_ips, k, nil, factions.create_ip_table(), true) + end +end) 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/fac_database/storagedb.lua b/fac_database/storagedb.lua new file mode 100644 index 0000000..e7e059f --- /dev/null +++ b/fac_database/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[key] = key + else + list[key] = key + end + storage:set_string(directory, minetest.serialize(list)) + end + local function removekey(key) + local list = minetest.deserialize(storage:get_string(directory)) + if not list then + list = {} + else + list[key] = nil + end + storage:set_string(directory, minetest.serialize(list)) + end + local function getkeys() + local list = minetest.deserialize(storage:get_string(directory)) + if not list then + list = {} + end + return list + end + + self.get_memory_pool = function() + return mem_pool + end + self.set_memory_pool = function(pool) + mem_pool = pool + end + self.add_to_memory_pool = function(value) + if value then + add_to_mem_pool = value + end + return add_to_mem_pool + end + self.get_serializer = function() + return serializer, deserializer + end + self.set_serializer = function(coder, decoder) + serializer = coder + deserializer = decoder + end + local function load_into_mem(name, _table) + if add_to_mem_pool then + mem_pool[name] = {mem = _table} + end + end + local function load_table(name) + local f = storage:get_string(string.format("%s/%s", directory, name)) + if f then + local data = deserializer(f) + return data + end + return nil + end + local function save_table(name, _table) + if save_table == nil or name == nil then + return false + end + storekey(name) + storage:set_string(string.format("%s/%s", directory, name), minetest.serialize(_table)) + end + local function save_key(name) + storage:set_string(string.format("%s/%s", directory, name), "") + end + local function load_key(name) + local f = storage:get_string(string.format("%s/%s", directory, name)) + if f ~= "" then + return true + end + return false + end + self.set_mem = function(name, _table) + load_into_mem(name, _table) + mem_pool_del[name] = nil + end + self.save_mem = function(name) + if mem_pool[name] ~= nil then + save_table(name, mem_pool[name].mem) + end + mem_pool_del[name] = nil + end + + self.clear_mem = function(name) + mem_pool[name] = nil + mem_pool_del[name] = nil + end + + self.set = function(name, _table) + save_table(name, _table) + if add_to_mem_pool then + load_into_mem(name, _table) + end + mem_pool_del[name] = nil + end + + self.set_key = function(name) + save_key(name) + if add_to_mem_pool then + load_into_mem(name, "") + end + mem_pool_del[name] = nil + end + + self.get = function(name, callback) + if mem_pool_del[name] then + if callback then + callback(nil) + end + return nil + end + local pm = mem_pool[name] + if pm then + if callback then + callback(pm.mem) + end + return pm.mem + else + local _table = load_table(name) + if _table then + load_into_mem(name, _table) + if callback then + callback(_table) + end + return _table + end + end + mem_pool_del[name] = true + return nil + end + + self.remove = function(name) + mem_pool[name] = nil + mem_pool_del[name] = true + removekey(name) + storage:set_string(string.format("%s/%s", directory, name), "") + end + + self.sub_database = function(path) + local db = storagedb.Storagedb(dir .. "/" .. path) + return db + end + self.to_array = function() + local entries = {} + + for k, v in pairs(getkeys()) do + entries[#entries + 1] = v + end + + return entries + end + self.to_table = function() + local entries = {} + + for k, v in pairs(getkeys()) do + entries[v] = true + end + + return entries + end + self.iterate = function() + local entries = {} + + for k, v in pairs(getkeys()) do + entries[v] = true + end + + return pairs(entries) + end + + return self +end diff --git a/claim_events.lua b/fac_events/claim_events.lua similarity index 89% rename from claim_events.lua rename to fac_events/claim_events.lua index f9646ba..85c847f 100644 --- a/claim_events.lua +++ b/fac_events/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) - + 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,42 +16,34 @@ 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 - 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_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.parcels.remove(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) @@ -64,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 @@ -85,8 +72,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 @@ -160,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)} @@ -178,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) @@ -189,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 @@ -200,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} @@ -213,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()) @@ -234,15 +213,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 @@ -263,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 = ", " - + 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 @@ -283,25 +253,22 @@ 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 - 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)} @@ -348,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 @@ -360,20 +325,12 @@ 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 - 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 @@ -388,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 = ", " - + 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,15 +362,14 @@ 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 - minetest.chat_send_player(player, text) end -minetest.register_on_leaveplayer( - function(player) - auto_list[player:get_player_name()] = nil - end -) \ No newline at end of file +minetest.register_on_leaveplayer(function(player) + auto_list[player:get_player_name()] = nil +end) diff --git a/diplomacy_events.lua b/fac_events/diplomacy_events.lua similarity index 84% rename from diplomacy_events.lua rename to fac_events/diplomacy_events.lua index 54b510d..6bec25c 100644 --- a/diplomacy_events.lua +++ b/fac_events/diplomacy_events.lua @@ -1,13 +1,13 @@ function factions.start_diplomacy(name, faction) - for l, i in pairs(factions.get_faction_list()) do - local fac = factions.factions.get(i) - if i ~= name and not (faction.neutral[i] or faction.allies[i] or faction.enemies[i]) then + for l, i in factions.factions.iterate() do + 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 @@ -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 +end diff --git a/eventcallbacks.lua b/fac_events/eventcallbacks.lua similarity index 99% rename from eventcallbacks.lua rename to fac_events/eventcallbacks.lua index f41e843..b7b029b 100644 --- a/eventcallbacks.lua +++ b/fac_events/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/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 97% rename from invite_events.lua rename to fac_events/invite_events.lua index 94b5d0b..e6f9d88 100644 --- a/invite_events.lua +++ b/fac_events/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/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 54% rename from player_events.lua rename to fac_events/player_events.lua index c572cff..bedd553 100644 --- a/player_events.lua +++ b/fac_events/player_events.lua @@ -1,11 +1,11 @@ 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) +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) @@ -13,15 +13,11 @@ 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 @@ -36,60 +32,44 @@ 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 +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 - 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 +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) -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 -) - -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/power_events.lua b/fac_events/power_events.lua similarity index 90% rename from power_events.lua rename to fac_events/power_events.lua index d1c0aec..e6db2db 100644 --- a/power_events.lua +++ b/fac_events/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/rank_events.lua b/fac_events/rank_events.lua similarity index 98% rename from rank_events.lua rename to fac_events/rank_events.lua index e404b59..ef59f65 100644 --- a/rank_events.lua +++ b/fac_events/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/hud.lua b/fac_hud/init.lua similarity index 99% rename from hud.lua rename to fac_hud/init.lua index 567b71f..c8c9328 100644 --- a/hud.lua +++ b/fac_hud/init.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", @@ -125,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/fac_objects/init.lua b/fac_objects/init.lua new file mode 100644 index 0000000..5b44c39 --- /dev/null +++ b/fac_objects/init.lua @@ -0,0 +1,248 @@ +function factions.can_use_node(pos, player, permission) + if not player then + return false + end + local parcel_faction = factions.get_faction_at(pos) + if not parcel_faction then + return true + end + local player_faction, facname = factions.get_player_faction(player) + if player_faction and (parcel_faction.name == facname or parcel_faction.allies[facname]) and factions.has_permission(facname, player, permission) then + return true + end +end + +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 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 + 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) + 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 + + 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) + +minetest.register_node("fac_objects:display_node", { + tiles = {"factions_display.png"}, + use_texture_alpha = true, + walkable = false, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- sides + {-(x+.55), -(x+.55), -(x+.55), -(x+.45), (x+.55), (x+.55)}, + {-(x+.55), -(x+.55), (x+.45), (x+.55), (x+.55), (x+.55)}, + {(x+.45), -(x+.55), -(x+.55), (x+.55), (x+.55), (x+.55)}, + {-(x+.55), -(x+.55), -(x+.55), (x+.55), (x+.55), -(x+.45)}, + -- top + {-(x+.55), (x+.45), -(x+.55), (x+.55), (x+.55), (x+.55)}, + -- bottom + {-(x+.55), -(x+.55), -(x+.55), (x+.55), -(x+.45), (x+.55)}, + -- middle (surround parcel) + {-.55,-.55,-.55, .55,.55,.55}, + }, + }, + selection_box = { + type = "regular", + }, + paramtype = "light", + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "", +}) + +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 = {"fac_objects:display_node"}, + timer = 0, + + on_step = function(self, dtime) + + self.timer = self.timer + dtime + + if self.timer > 6 then + self.object:remove() + end + end, +}) + +-- End 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 78% rename from protection_override.lua rename to fac_protect/init.lua index 2c9db80..0877689 100644 --- a/protection_override.lua +++ b/fac_protect/init.lua @@ -1,16 +1,20 @@ local default_is_protected = minetest.is_protected 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 + 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, 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 return default_is_protected(pos, player) @@ -33,4 +37,5 @@ minetest.is_protected = function(pos, player) else return true end + return default_is_protected(pos, player) end 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 0e1cd81..0000000 --- a/init.lua +++ /dev/null @@ -1,23 +0,0 @@ ---!path of mod -factions_modpath = minetest.get_modpath("factions") - -dofile (factions_modpath .. "/config.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") -dofile (factions_modpath .. "/convert.lua") - -minetest.after(1, hudUpdateClaimInfo) -minetest.after(factions_config.tick_time, factionUpdate) - -minetest.log("action", "[factions] loaded.") diff --git a/mod.conf b/mod.conf deleted file mode 100644 index 28d1621..0000000 --- a/mod.conf +++ /dev/null @@ -1,4 +0,0 @@ -name = factions -description = Mod for handling in game factions and reputation. -depends = colddb -optional_depends = default, doors, xdecor, ts_doors 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 diff --git a/nodes.lua b/nodes.lua deleted file mode 100644 index b31ec20..0000000 --- a/nodes.lua +++ /dev/null @@ -1,272 +0,0 @@ -function factions.can_use_node(pos, player, permission) - if not player then - return false - end - local parcel_faction = factions.get_faction_at(pos) - if not parcel_faction then - return true - end - local player_faction, facname = factions.get_player_faction(player) - if player_faction and (parcel_faction.name == facname or parcel_faction.allies[facname]) and factions.has_permission(facname, player, permission) then - return true - end -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 - - 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 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") 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") 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") 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 - 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") 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 - 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") 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") then - def_on_rightclick(pos, node, clicker, itemstack, pointed_thing) - end - return itemstack - 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) - 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 - -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 --- 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) - -minetest.register_node("factions:display_node", { - tiles = {"factions_display.png"}, - use_texture_alpha = true, - walkable = false, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - -- sides - {-(x+.55), -(x+.55), -(x+.55), -(x+.45), (x+.55), (x+.55)}, - {-(x+.55), -(x+.55), (x+.45), (x+.55), (x+.55), (x+.55)}, - {(x+.45), -(x+.55), -(x+.55), (x+.55), (x+.55), (x+.55)}, - {-(x+.55), -(x+.55), -(x+.55), (x+.55), (x+.55), -(x+.45)}, - -- top - {-(x+.55), (x+.45), -(x+.55), (x+.55), (x+.55), (x+.55)}, - -- bottom - {-(x+.55), -(x+.55), -(x+.55), (x+.55), -(x+.45), (x+.55)}, - -- middle (surround parcel) - {-.55,-.55,-.55, .55,.55,.55}, - }, - }, - selection_box = { - type = "regular", - }, - paramtype = "light", - groups = {dig_immediate = 3, not_in_creative_inventory = 1}, - drop = "", -}) - -minetest.register_entity("factions: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"}, - timer = 0, - - on_step = function(self, dtime) - - self.timer = self.timer + dtime - - if self.timer > 6 then - self.object:remove() - end - end, -}) - --- End diff --git a/settingtypes.txt b/settingtypes.txt deleted file mode 100644 index f638a14..0000000 --- a/settingtypes.txt +++ /dev/null @@ -1,55 +0,0 @@ -[ValueSettings] - -# The max depth of protection from a parcel. -protection_max_depth (Protection max depth) float 512 -# The max height of protection from a parcel. -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 -# Power lost on death. -power_per_death (Power-per-death) float 1 -# Power regeneration rate. -power_per_tick (Power-per-tick) float 2 -# Faction timer. This timer regenerates power. -tick_time (Faction timer) float 60 -# Not in use. -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 -# Limit how long a rank name can be. -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 -# The maximum amount of time for a parcelless faction to disban. -maximum_parcelless_faction_time (Maximum parcelless faction time) int 10800 -# Power of a starting faction (needed for parcel claiming). -power (Starting power) float 12 -# Maximum power of a starting faction. -maxpower (Starting Maximum power) float 0 -# How much power the players make. -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 -# parcel size -parcel_size (parcel-size) float 16 - -[BoolSettings] - -# Enable or disabled power-per-player. -power_per_playerb (Enable power-per-player) bool true -# Enable or disabled attack_parcel function. -attack_parcel (Enable attack parcel) bool false -# Enable or disabled faction diplomacy. -faction_diplomacy (Enable faction diplomacy) bool true -# Enable or disabled the max depth and height limit for a parcel -protection_depth_height_limit (Enable protection depth height limit) bool true -# Enable or disabled faction spawn teleport -spawn_teleport (Enable spawn teleport) bool false -# Enable or disabled the need for faction_user priv -faction_user_priv (Enable faction user priv) bool false - -[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