From d5dd382e87e57976cf501a5851eb6dd9986fdfb2 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Wed, 15 Apr 2015 22:38:51 +0200 Subject: [PATCH 01/54] Added solarmana mod (first version) --- mods/solarmana/LICENSE | 505 +++++++++++++++++++++++++++++++++ mods/solarmana/README.txt | 41 +++ mods/solarmana/depends.txt | 1 + mods/solarmana/description.txt | 1 + mods/solarmana/init.lua | 105 +++++++ 5 files changed, 653 insertions(+) create mode 100644 mods/solarmana/LICENSE create mode 100644 mods/solarmana/README.txt create mode 100644 mods/solarmana/depends.txt create mode 100644 mods/solarmana/description.txt create mode 100644 mods/solarmana/init.lua diff --git a/mods/solarmana/LICENSE b/mods/solarmana/LICENSE new file mode 100644 index 00000000..5f2dd7fc --- /dev/null +++ b/mods/solarmana/LICENSE @@ -0,0 +1,505 @@ + 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. + + {description} + Copyright (C) {year} {fullname} + + 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. + + {signature of Ty Coon}, 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! + diff --git a/mods/solarmana/README.txt b/mods/solarmana/README.txt new file mode 100644 index 00000000..e96efbde --- /dev/null +++ b/mods/solarmana/README.txt @@ -0,0 +1,41 @@ +Solar Mana Mod [solarmana] +========================== + +A mana regeneration controller: only regenerate mana in sunlight +or on special nodes. + +Version: 0.1.0 +Licence: LGPL 2.1 or later + +Report bugs or request help on the forum topic. + +Description +----------- + +This is a mod for MineTest. It depends on, and modifies / works +with the Mana mod 'mana' by Wuzzy. Instead of constantly +regenerating mana, this mod requires players to stand in direct +sunlight for regeneration to kick in. + +Since many magic users prefer their homes and offices to actually +have a roof, standing on specific node types (currently wooden +planks and gold blocks) will also regenerate mana. + +Dependencies +------------ +* mana: https://forum.minetest.net/viewtopic.php?f=11&t=11154 + +Installation +------------ + +Unzip the archive, rename the folder to to 'solarmana' and +place it in minetest/mods/ + +( Linux: If you have a linux system-wide installation place + it in ~/.minetest/mods/. ) + +( If you only want this to be used in a single world, place + the folder in worldmods/ in your worlddirectory. ) + +For further information or help see: +http://wiki.minetest.com/wiki/Installing_Mods diff --git a/mods/solarmana/depends.txt b/mods/solarmana/depends.txt new file mode 100644 index 00000000..d06ef53f --- /dev/null +++ b/mods/solarmana/depends.txt @@ -0,0 +1 @@ +mana diff --git a/mods/solarmana/description.txt b/mods/solarmana/description.txt new file mode 100644 index 00000000..28004609 --- /dev/null +++ b/mods/solarmana/description.txt @@ -0,0 +1 @@ +A mana regeneration controller: only regenerate mana in sunlight or on special nodes diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua new file mode 100644 index 00000000..8446812b --- /dev/null +++ b/mods/solarmana/init.lua @@ -0,0 +1,105 @@ +--[[ + +Solar Mana mod [solarmana] +========================== + +A mana regeneration controller: only regenerate mana in sunlight. + +Copyright (C) 2015 Ben Deutsch + +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 + +]] + + +local time_total_regen_check = 0.5 +local time_next_regen_check = time_total_regen_check + +-- TODO: make this globally accessible +local mana_from_node = { + ['default:goldblock'] = 2, + ['default:wood'] = 1, + ['default:junglewood'] = 1, + ['default:pinewood'] = 1, +} + +-- just for debugging: see below +local time_total_mana_reset = 10.0 +local time_next_mana_reset = time_total_mana_reset + +minetest.register_globalstep(function(dtime) + + -- We do not care if this does not run as often as possible, + -- as all it does is change the regeneration to a fixed number + time_next_regen_check = time_next_regen_check - dtime + if time_next_regen_check < 0.0 then + time_next_regen_check = time_total_regen_check + for _,player in ipairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local pos = player:getpos() + local pos_y = pos.y + -- the middle of the block with the player's head + pos.y = math.floor(pos_y) + 1.5 + local node = minetest.get_node(pos) + + -- Currently uses 'get_node_light' to determine whether + -- a node is "in sunlight". + local light_day = minetest.get_node_light(pos, 0.5) + local light_night = minetest.get_node_light(pos, 0.0) + local light_now = minetest.get_node_light(pos) or 0 + local regen_to = 0 + + -- simplest version checks for "full sunlight now" + if light_now >= 15 then + regen_to = 1 + end + + -- we can get a bit more lenience by testing whether + -- * a node is "affected by sunlight" (day > night) + -- * the node is "bright enough now" + -- However: you could deny yourself mana regeneration + -- with torches :-/ + --[[ + if light_day > light_night and light_now > 12 then + regen_to = 1 + end + --]] + + -- next, check the block we're standing on. + pos.y = math.floor(pos_y) - 0.5 + node = minetest.get_node(pos) + if mana_from_node[node.name] then + regen_to = math.max(regen_to, mana_from_node[node.name]) + --print("Regen to "..regen_to.." : "..node.name) + end + + mana.setregen(name, regen_to) + --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) + end + end + + --[[ Comment this in for testing if you have no mana sink + + time_next_mana_reset = time_next_mana_reset - dtime + if time_next_mana_reset < 0.0 then + time_next_mana_reset = time_total_mana_reset + mana.set('singleplayer', 100) + print("Resetting mana") + end + + --]] + +end) From a91fd70060f7c5168df9b72f2cc2d2e6b3a4bb8b Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 18 Apr 2015 12:18:18 +0200 Subject: [PATCH 02/54] Updated world.mt --- worlds/minetestforfun/world.mt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/minetestforfun/world.mt b/worlds/minetestforfun/world.mt index 0146e6c0..d9f50409 100644 --- a/worlds/minetestforfun/world.mt +++ b/worlds/minetestforfun/world.mt @@ -192,3 +192,7 @@ load_mod_chatplus = true load_mod_future_ban = false load_mod_textures = false load_mod_snowdrift = false + +load_mod_metatools = true +load_mod_connected_chests = true +load_mod_solarmana = true From 19374b70571b15df943f09b591adb64e48ec898c Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 19 Apr 2015 14:43:12 +0200 Subject: [PATCH 03/54] Added group support for solarmana --- mods/solarmana/init.lua | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index 8446812b..97d94b48 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -34,6 +34,7 @@ local mana_from_node = { ['default:wood'] = 1, ['default:junglewood'] = 1, ['default:pinewood'] = 1, + ['group:wood'] = 1, } -- just for debugging: see below @@ -86,6 +87,15 @@ minetest.register_globalstep(function(dtime) --print("Regen to "..regen_to.." : "..node.name) end + for key, value in pairs(mana_from_node) do + if key:split(":")[1] == "group" then + groupname = key:split(":")[2] + if minetest.get_node_group(node.name, groupname) > 0 then + regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) + end + end + end + mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) end From af3bb78c3fbb1b0d208259a33932ea1043853bee Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 23 Apr 2015 18:04:58 +0200 Subject: [PATCH 04/54] Added base of runes mod - Added rune API's first implementation - Added basic cubic runes in solarmana --- mods/runes/README.md | 11 ++++ mods/runes/api.lua | 113 ++++++++++++++++++++++++++++++++++++ mods/runes/depends.txt | 2 + mods/runes/handlers.lua | 59 +++++++++++++++++++ mods/runes/init.lua | 15 +++++ mods/runes/registration.lua | 48 +++++++++++++++ mods/solarmana/init.lua | 5 +- 7 files changed, 252 insertions(+), 1 deletion(-) create mode 100644 mods/runes/README.md create mode 100644 mods/runes/api.lua create mode 100644 mods/runes/depends.txt create mode 100644 mods/runes/handlers.lua create mode 100644 mods/runes/init.lua create mode 100644 mods/runes/registration.lua diff --git a/mods/runes/README.md b/mods/runes/README.md new file mode 100644 index 00000000..fb3678b6 --- /dev/null +++ b/mods/runes/README.md @@ -0,0 +1,11 @@ +Rune mod by Mg +############## + +# Purpose +This mod proposes 3 runes used in the balance of solarmana. + +# Authors + - Mg (@LeMagnesium) + +# Medias + diff --git a/mods/runes/api.lua b/mods/runes/api.lua new file mode 100644 index 00000000..2e348e66 --- /dev/null +++ b/mods/runes/api.lua @@ -0,0 +1,113 @@ +-- API of the rune mod -- + +-- Global namespace +runes = {} +runes.datas = {} +runes.datas.handlers = {} +runes.datas.items = {} +runes.functions = {} + +-- Simple rune register function +runes.functions.register_rune = function(parameters) + local runedef = {} + + if not parameters.name then + minetest.log("ERROR","[runes] Cannot register rune : no name") + return + end + + runedef.name = parameters.name + runedef.desc = parameters.description or "" + runedef.img = parameters.img or "default_stone.png" + runedef.type = parameters.type or "craftitem" + runedef.needed_mana = parameters.needed_mana or 0 + + runes.datas.handlers[runedef.name] = {} + + if runedef.type == "cube" then + minetest.register_node("runes:rune_" .. runedef.name, { + description = runedef.desc, + tiles = {runedef.img}, + groups = {oddly_breakable_by_hand = 2, rune = 1}, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if runes.datas.handlers[runedef.name].on_place then + if mana.get(placer:get_player_name()) >= runedef.needed_mana then + runes.datas.handlers[runedef.name].on_place(pos, placer, itemstack, pointed_thing) + mana.subtract(placer:get_player_name(),runedef.needed_mana) + else + minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + end + end + end, + can_dig = function(pos, player) + print(runes.datas.handlers[runedef.name].can_dig) + if runes.datas.handlers[runedef.name].can_dig then + return runes.datas.handlers[runedef.name].can_dig(pos, player) + else + return true + end + end, + --[[after_dig_node = function(pos, oldnode, oldmetadata, digger) + --if runes.datas.handlers[runedef.name].can_dig and runes.datas.handlers[runedef.name].can_dig(pos, digger) then + if runes.datas.handlers[runedef.name].on_dig then + if mana.get(digger:get_player_name()) >= runedef.needed_mana then + runes.datas.handlers[runedef.name].on_dig(pos, oldnode, digger) + mana.subtract(digger:get_player_name(),runedef.needed_mana) + else + minetest.chat_send_player(digger:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + end + end + end + end,]] + }) + + elseif runedef.type == "plate" then + + elseif runedef.type == "craftitem" then + minetest.register_craftitem("runes:rune_" .. runedef.name, { + description = runedef.desc, + inventory_image = runedef.img, + groups = {rune = 1}, + on_use = function(itemstack, user, pointed_thing) + -- Let the handler do its job + if runes.datas.handlers[runedef.name].on_use then + if mana.get(user:get_player_name()) >= runedef.needed_mana then + runes.datas.handlers[runedef.name].on_use(itemstack, user, pointed_thing) + mana.subtract(user:get_player_name(),runedef.needed_mana) + else + minetest.chat_send_player(user:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + end + end + end + }) + end +end + + +-- Handler connector +runes.functions.connect = function(itemname, callback, handler) + --[[ Available callback : + use + place + dig + can_dig + ]] + + if not runes.datas.items[itemname] then + minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to unknown item " .. itemname) + return + end + + if callback == "use" then + runes.datas.handlers[itemname].on_use = handler + elseif callback == "place" then + runes.datas.handlers[itemname].on_place = handler + elseif callback == "dig" then + runes.datas.handlers[itemname].on_dig = handler + elseif callback == "can_dig" then + runes.datas.handlers[itemname].can_dig = handler + else + minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to item's " .. itemname .. " unknown " .. callback .. " callback") + return + end +end diff --git a/mods/runes/depends.txt b/mods/runes/depends.txt new file mode 100644 index 00000000..49bb81b0 --- /dev/null +++ b/mods/runes/depends.txt @@ -0,0 +1,2 @@ +default +mana diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua new file mode 100644 index 00000000..e0c72395 --- /dev/null +++ b/mods/runes/handlers.lua @@ -0,0 +1,59 @@ +-- Use handlers for runes + +-- First, the functions + +projection = function(itemstack, user, pointed_thing) + if pointed_thing.type == "object" then + local dir = vector.direction(user:getpos(),pointed_thing.ref:getpos()) + local ykb = 10 + if v.y ~= 0 then ykb = 0 end + pointed_thing.ref:setvelocity({x=dir.x*50,y=ykb,z=dir.z*50}) + end +end + +damage_around = function(itemstack, user, pointed_thing) + for name,entity in pairs(minetest.get_objects_inside_radius(user:getpos(),10)) do + if true and (entity:is_player() and entity:get_player_name() ~= user:get_player_name()) then + entity:set_hp(1) + end + end +end + +earthquake = function(itemstack, user, pointed_thing) + for name,entity in pairs(minetest.get_objects_inside_radius(user:getpos(),10)) do + local v = entity:getvelocity() or {x=0,y=0,z=0} + entity:setvelocity({x=v.x, y=v.y+50, z=v.z}) + end +end + +add_owner = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + end +end + +is_owner_online = function(pos) + local meta = minetest.get_meta(pos) + print(meta:get_string("owner")) + if meta:get_string("owner") ~= nil then + return minetest.get_player_by_name(meta:get_string("owner")) ~= nil + else + return true + end +end + +go_to_me = function(pos, node, digger) + if digger then + digger:setpos(minetest.get_player_by_name(minetest.get_meta(pos):get_string("owner")):getpos()) + end +end + +-- Then, connect + +runes.functions.connect("project","use",projection) +runes.functions.connect("damager","use",damage_around) +runes.functions.connect("earthquake","use",earthquake) +runes.functions.connect("gotome","place",add_owner) +runes.functions.connect("gotome","dig",go_to_me) +runes.functions.connect("gotome","can_dig",is_owner_online) diff --git a/mods/runes/init.lua b/mods/runes/init.lua new file mode 100644 index 00000000..9ab1219c --- /dev/null +++ b/mods/runes/init.lua @@ -0,0 +1,15 @@ +-- Rune mod by Mg +-- License GPLv3 + +local modpath = minetest.get_modpath("runes") + +-- API first +dofile(modpath.."/api.lua") + +-- Then the rune themselves +dofile(modpath.."/registration.lua") + +-- And the handlers +dofile(modpath.."/handlers.lua") + +minetest.log("action","[runes] Mod loaded") diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua new file mode 100644 index 00000000..4ad771a2 --- /dev/null +++ b/mods/runes/registration.lua @@ -0,0 +1,48 @@ +-- Rune definitions : registration.lua + +runes.datas.items = { + ["project"] = { + description = "Projection rune", + img = "default_dirt.png", + type = "craftitem", + needed_mana = 30 + }, + ["damager"] = { + description = "Damaging rune", + img = "default_lava.png", + type = "craftitem", + needed_mana = 190 + }, + ["earthquake"] = { + description = "Earth Quake rune", + img = "default_apple.png", + type = "craftitem", + needed_mana = 80 + }, + ["simple_heal"] = { + description = "Simple healing rune", + img = "default_water.png", + type = "cube" + }, + ["improved_heal"] = { + description = "Improved healing rune", + img = "default_acid.png", + type = "cube" + }, + ["perfect_heal"] = { + description = "Perfect healing rune", + img = "default_lava.png", + type = "cube" + }, + ["gotome"] = { + description = "Go to me rune", + img = "default_wood.png", + type = "cube" + } +} + +for key, value in pairs(runes.datas.items) do + local runereg = table.copy(value) + runereg.name = key + runes.functions.register_rune(runereg) +end diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index 97d94b48..ecafaf61 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -30,7 +30,10 @@ local time_next_regen_check = time_total_regen_check -- TODO: make this globally accessible local mana_from_node = { - ['default:goldblock'] = 2, + ['default:goldblock'] = 5, + ['runes:rune_simple_heal'] = 1, + ['runes:rune_improved_heal'] = 3, + ['runes:rune_perfect_heal'] = 8, ['default:wood'] = 1, ['default:junglewood'] = 1, ['default:pinewood'] = 1, From c15196fd0ef41e74770ab261ee1638a03f2126e6 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 25 Apr 2015 23:01:27 +0200 Subject: [PATCH 05/54] Added mana max rune - Added mane max rune - Fixed projection rune --- mods/runes/handlers.lua | 8 ++++++++ mods/runes/registration.lua | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index e0c72395..5c5a46a5 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -5,6 +5,7 @@ projection = function(itemstack, user, pointed_thing) if pointed_thing.type == "object" then local dir = vector.direction(user:getpos(),pointed_thing.ref:getpos()) + local v = pointed_thing.ref:getvelocity() or {x=0,y=0,z=0} local ykb = 10 if v.y ~= 0 then ykb = 0 end pointed_thing.ref:setvelocity({x=dir.x*50,y=ykb,z=dir.z*50}) @@ -49,6 +50,12 @@ go_to_me = function(pos, node, digger) end end +set_manamax = function(itemstack, user, pointed_thing) + if user and user:is_player() then + mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) + end +end + -- Then, connect runes.functions.connect("project","use",projection) @@ -57,3 +64,4 @@ runes.functions.connect("earthquake","use",earthquake) runes.functions.connect("gotome","place",add_owner) runes.functions.connect("gotome","dig",go_to_me) runes.functions.connect("gotome","can_dig",is_owner_online) +runes.functions.connect("megamana","use",set_manamax) diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua index 4ad771a2..2aa00cfd 100644 --- a/mods/runes/registration.lua +++ b/mods/runes/registration.lua @@ -38,6 +38,11 @@ runes.datas.items = { description = "Go to me rune", img = "default_wood.png", type = "cube" + }, + ["megamana"] = { + description = "Mega Mana", + img = "default_diamond.png", + type = "craftitem" } } From 22efc57bf187b1cc1579f17ae8b9a95128d583fc Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 26 Apr 2015 15:45:04 +0200 Subject: [PATCH 06/54] Added plate runes - Added plate template for runes - Added on_punch API's handler's function - Added popper rune --- mods/runes/api.lua | 59 +++++++++++++++++++++++++++++++++++-- mods/runes/handlers.lua | 37 ++++++++++++++++++++++- mods/runes/registration.lua | 7 ++++- 3 files changed, 98 insertions(+), 5 deletions(-) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index 2e348e66..c689feb6 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -30,6 +30,10 @@ runes.functions.register_rune = function(parameters) tiles = {runedef.img}, groups = {oddly_breakable_by_hand = 2, rune = 1}, after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + end if runes.datas.handlers[runedef.name].on_place then if mana.get(placer:get_player_name()) >= runedef.needed_mana then runes.datas.handlers[runedef.name].on_place(pos, placer, itemstack, pointed_thing) @@ -40,13 +44,17 @@ runes.functions.register_rune = function(parameters) end end, can_dig = function(pos, player) - print(runes.datas.handlers[runedef.name].can_dig) if runes.datas.handlers[runedef.name].can_dig then return runes.datas.handlers[runedef.name].can_dig(pos, player) else return true end end, + on_punch = function(pos, node, puncher, pointed_thing) + if runes.datas.handlers[runedef.name].on_punch then + runes.datas.handlers[runedef.name].on_punch(pos, node, puncher, pointed_thing) + end + end, --[[after_dig_node = function(pos, oldnode, oldmetadata, digger) --if runes.datas.handlers[runedef.name].can_dig and runes.datas.handlers[runedef.name].can_dig(pos, digger) then if runes.datas.handlers[runedef.name].on_dig then @@ -62,7 +70,48 @@ runes.functions.register_rune = function(parameters) }) elseif runedef.type == "plate" then - + minetest.register_node("runes:rune_" .. runedef.name, { + description = runedef.desc, + paramtype = "light", + inventory_image = runedef.img, + sunlight_propagates = true, + walkable = false, + tiles = {runedef.img}, + groups = {rune = 1, oddly_breakable_by_hand = 2}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.499, 0.5}, + } + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + end + if runes.datas.handlers[runedef.name].on_place then + if mana.get(placer:get_player_name()) >= runedef.needed_mana then + runes.datas.handlers[runedef.name].on_place(pos, placer, itemstack, pointed_thing) + mana.subtract(placer:get_player_name(),runedef.needed_mana) + else + minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + end + end + end, + can_dig = function(pos, player) + if runes.datas.handlers[runedef.name].can_dig then + return runes.datas.handlers[runedef.name].can_dig(pos, player) + else + return true + end + end, + on_punch = function(pos, node, puncher, pointed_thing) + if runes.datas.handlers[runedef.name].on_punch then + runes.datas.handlers[runedef.name].on_punch(pos, node, puncher, pointed_thing) + end + end, + }) elseif runedef.type == "craftitem" then minetest.register_craftitem("runes:rune_" .. runedef.name, { description = runedef.desc, @@ -74,6 +123,7 @@ runes.functions.register_rune = function(parameters) if mana.get(user:get_player_name()) >= runedef.needed_mana then runes.datas.handlers[runedef.name].on_use(itemstack, user, pointed_thing) mana.subtract(user:get_player_name(),runedef.needed_mana) + user:get_inventory():remove_item("main",{name = runedef.name}) else minetest.chat_send_player(user:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") end @@ -91,6 +141,7 @@ runes.functions.connect = function(itemname, callback, handler) place dig can_dig + punch ]] if not runes.datas.items[itemname] then @@ -106,8 +157,10 @@ runes.functions.connect = function(itemname, callback, handler) runes.datas.handlers[itemname].on_dig = handler elseif callback == "can_dig" then runes.datas.handlers[itemname].can_dig = handler + elseif callback == "punch" then + runes.datas.handlers[itemname].on_punch = handler else - minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to item's " .. itemname .. " unknown " .. callback .. " callback") + minetest.log("error","[runes] Cannot connect handler to item's " .. itemname .. " unknown " .. callback .. " callback") return end end diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index 5c5a46a5..aa25c18e 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -36,7 +36,6 @@ end is_owner_online = function(pos) local meta = minetest.get_meta(pos) - print(meta:get_string("owner")) if meta:get_string("owner") ~= nil then return minetest.get_player_by_name(meta:get_string("owner")) ~= nil else @@ -53,6 +52,14 @@ end set_manamax = function(itemstack, user, pointed_thing) if user and user:is_player() then mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) + if not minetest.get_player_privs(user:get_player_name()).server then + -- Violent reaction if not admin + user:set_hp(1) + user:set_breath(1) + local userpos = user:getpos() + local useritem = user:get_wielded_item() + user:setpos({x=userpos.x+math.random(-50,50),y = userpos.y + math.random(1,20),z = userpos.z + math.random(-50,50)}) + end end end @@ -65,3 +72,31 @@ runes.functions.connect("gotome","place",add_owner) runes.functions.connect("gotome","dig",go_to_me) runes.functions.connect("gotome","can_dig",is_owner_online) runes.functions.connect("megamana","use",set_manamax) + +-- And globalsteps + +-- Is in +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local playerpos = player:getpos() + local underpos = {x=playerpos.x,y=playerpos.y,z=playerpos.z} + local undernode = minetest.get_node(underpos) + local meta = minetest.get_meta(underpos) + local inv = meta:get_inventory() + + if undernode.name == "runes:rune_popper" then --and player:get_player_name() ~= meta:get_string("owner") then + if minetest.get_player_by_name(meta:get_string("owner")) and mana.get(meta:get_string("owner")) > 10 then + local thieff = math.random(1,32) + local stolen = player:get_inventory():get_stack("main", thieff) + player:get_inventory():set_stack("main", thieff, nil) + if stolen:get_count() > 0 then + local obj = minetest.add_item({x = underpos.x, y = underpos.y + 2.5, z = underpos.z}, stolen) + if obj then + obj:setvelocity({x = math.random(-5,5), y = math.random(3,5), z = math.random(-5,5)}) + end + mana.set(meta:get_string("owner"), mana.get(meta:get_string("owner"))-10) + end + end + end + end +end) diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua index 2aa00cfd..a7f851c2 100644 --- a/mods/runes/registration.lua +++ b/mods/runes/registration.lua @@ -43,7 +43,12 @@ runes.datas.items = { description = "Mega Mana", img = "default_diamond.png", type = "craftitem" - } + }, + ["popper"] = { + description = "Popper", + img = "default_grass.png", + type = "plate" + }, } for key, value in pairs(runes.datas.items) do From a49580f356ef870914ce3d983343d0330717852b Mon Sep 17 00:00:00 2001 From: Ataron Date: Sun, 26 Apr 2015 16:35:41 +0200 Subject: [PATCH 07/54] Add some textures for runes mod --- mods/runes/textures/runes_damaging.png | Bin 0 -> 7044 bytes mods/runes/textures/runes_earthquake.png | Bin 0 -> 3259 bytes mods/runes/textures/runes_go_to_me.png | Bin 0 -> 3415 bytes mods/runes/textures/runes_improve_heal.png | Bin 0 -> 3002 bytes mods/runes/textures/runes_perfect_heal.png | Bin 0 -> 3471 bytes mods/runes/textures/runes_simple_heal.png | Bin 0 -> 2864 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/runes/textures/runes_damaging.png create mode 100644 mods/runes/textures/runes_earthquake.png create mode 100644 mods/runes/textures/runes_go_to_me.png create mode 100644 mods/runes/textures/runes_improve_heal.png create mode 100644 mods/runes/textures/runes_perfect_heal.png create mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_damaging.png b/mods/runes/textures/runes_damaging.png new file mode 100644 index 0000000000000000000000000000000000000000..ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3 GIT binary patch literal 7044 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improve_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e4766148113c4b67738bd4b19873b0dddd4851f8 GIT binary patch literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d1d2574536dd986f99271a6158c8d1b6189267 GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..25d0c289b20dff156805726fb72b7e5b66e68e56 GIT binary patch literal 2864 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 O0000 Date: Wed, 15 Apr 2015 22:38:51 +0200 Subject: [PATCH 08/54] Added solarmana mod (first version) --- mods/solarmana/init.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index ecafaf61..14bc99b3 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -91,13 +91,13 @@ minetest.register_globalstep(function(dtime) end for key, value in pairs(mana_from_node) do - if key:split(":")[1] == "group" then - groupname = key:split(":")[2] - if minetest.get_node_group(node.name, groupname) > 0 then - regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) - end - end - end + if key:split(":")[1] == "group" then + groupname = key:split(":")[2] + if minetest.get_node_group(node.name, groupname) > 0 then + regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) + end + end + end mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) From d2b3e73e0b161c39956e0763174a8bbb516596e1 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 19 Apr 2015 14:43:12 +0200 Subject: [PATCH 09/54] Added group support for solarmana --- mods/solarmana/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index 14bc99b3..df935751 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -99,6 +99,7 @@ minetest.register_globalstep(function(dtime) end end + mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) end From 3ea4880eb8f7fec8d31f132f1d121e093deadf7e Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 23 Apr 2015 18:04:58 +0200 Subject: [PATCH 10/54] Added base of runes mod - Added rune API's first implementation - Added basic cubic runes in solarmana --- mods/runes/api.lua | 2 ++ mods/runes/handlers.lua | 13 +++++++++++++ mods/runes/registration.lua | 4 ++++ 3 files changed, 19 insertions(+) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index c689feb6..4b9e5284 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -161,6 +161,8 @@ runes.functions.connect = function(itemname, callback, handler) runes.datas.handlers[itemname].on_punch = handler else minetest.log("error","[runes] Cannot connect handler to item's " .. itemname .. " unknown " .. callback .. " callback") + else + minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to item's " .. itemname .. " unknown " .. callback .. " callback") return end end diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index aa25c18e..541285b0 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -5,7 +5,10 @@ projection = function(itemstack, user, pointed_thing) if pointed_thing.type == "object" then local dir = vector.direction(user:getpos(),pointed_thing.ref:getpos()) +<<<<<<< HEAD local v = pointed_thing.ref:getvelocity() or {x=0,y=0,z=0} +======= +>>>>>>> Added base of runes mod local ykb = 10 if v.y ~= 0 then ykb = 0 end pointed_thing.ref:setvelocity({x=dir.x*50,y=ykb,z=dir.z*50}) @@ -36,6 +39,10 @@ end is_owner_online = function(pos) local meta = minetest.get_meta(pos) +<<<<<<< HEAD +======= + print(meta:get_string("owner")) +>>>>>>> Added base of runes mod if meta:get_string("owner") ~= nil then return minetest.get_player_by_name(meta:get_string("owner")) ~= nil else @@ -49,6 +56,7 @@ go_to_me = function(pos, node, digger) end end +<<<<<<< HEAD set_manamax = function(itemstack, user, pointed_thing) if user and user:is_player() then mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) @@ -63,6 +71,8 @@ set_manamax = function(itemstack, user, pointed_thing) end end +======= +>>>>>>> Added base of runes mod -- Then, connect runes.functions.connect("project","use",projection) @@ -71,6 +81,7 @@ runes.functions.connect("earthquake","use",earthquake) runes.functions.connect("gotome","place",add_owner) runes.functions.connect("gotome","dig",go_to_me) runes.functions.connect("gotome","can_dig",is_owner_online) +<<<<<<< HEAD runes.functions.connect("megamana","use",set_manamax) -- And globalsteps @@ -100,3 +111,5 @@ minetest.register_globalstep(function(dtime) end end end) +======= +>>>>>>> Added base of runes mod diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua index a7f851c2..5d40c03b 100644 --- a/mods/runes/registration.lua +++ b/mods/runes/registration.lua @@ -38,6 +38,7 @@ runes.datas.items = { description = "Go to me rune", img = "default_wood.png", type = "cube" +<<<<<<< HEAD }, ["megamana"] = { description = "Mega Mana", @@ -49,6 +50,9 @@ runes.datas.items = { img = "default_grass.png", type = "plate" }, +======= + } +>>>>>>> Added base of runes mod } for key, value in pairs(runes.datas.items) do From a074967763025452399c282b4c6af3239ce00e2b Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 25 Apr 2015 23:01:27 +0200 Subject: [PATCH 11/54] Added mana max rune - Added mane max rune - Fixed projection rune --- mods/runes/handlers.lua | 21 ++++++++------------- mods/runes/registration.lua | 4 ---- 2 files changed, 8 insertions(+), 17 deletions(-) diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index 541285b0..efae5219 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -5,12 +5,9 @@ projection = function(itemstack, user, pointed_thing) if pointed_thing.type == "object" then local dir = vector.direction(user:getpos(),pointed_thing.ref:getpos()) -<<<<<<< HEAD local v = pointed_thing.ref:getvelocity() or {x=0,y=0,z=0} -======= ->>>>>>> Added base of runes mod local ykb = 10 - if v.y ~= 0 then ykb = 0 end + if v.y ~= 0 then ykb = 0 end pointed_thing.ref:setvelocity({x=dir.x*50,y=ykb,z=dir.z*50}) end end @@ -39,10 +36,7 @@ end is_owner_online = function(pos) local meta = minetest.get_meta(pos) -<<<<<<< HEAD -======= print(meta:get_string("owner")) ->>>>>>> Added base of runes mod if meta:get_string("owner") ~= nil then return minetest.get_player_by_name(meta:get_string("owner")) ~= nil else @@ -56,7 +50,6 @@ go_to_me = function(pos, node, digger) end end -<<<<<<< HEAD set_manamax = function(itemstack, user, pointed_thing) if user and user:is_player() then mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) @@ -71,8 +64,13 @@ set_manamax = function(itemstack, user, pointed_thing) end end -======= ->>>>>>> Added base of runes mod + +set_manamax = function(itemstack, user, pointed_thing) + if user and user:is_player() then + mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) + end +end + -- Then, connect runes.functions.connect("project","use",projection) @@ -81,7 +79,6 @@ runes.functions.connect("earthquake","use",earthquake) runes.functions.connect("gotome","place",add_owner) runes.functions.connect("gotome","dig",go_to_me) runes.functions.connect("gotome","can_dig",is_owner_online) -<<<<<<< HEAD runes.functions.connect("megamana","use",set_manamax) -- And globalsteps @@ -111,5 +108,3 @@ minetest.register_globalstep(function(dtime) end end end) -======= ->>>>>>> Added base of runes mod diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua index 5d40c03b..a7f851c2 100644 --- a/mods/runes/registration.lua +++ b/mods/runes/registration.lua @@ -38,7 +38,6 @@ runes.datas.items = { description = "Go to me rune", img = "default_wood.png", type = "cube" -<<<<<<< HEAD }, ["megamana"] = { description = "Mega Mana", @@ -50,9 +49,6 @@ runes.datas.items = { img = "default_grass.png", type = "plate" }, -======= - } ->>>>>>> Added base of runes mod } for key, value in pairs(runes.datas.items) do From 274c874f351c39cc86a4d005755d7c6aaa380751 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 26 Apr 2015 15:45:04 +0200 Subject: [PATCH 12/54] Added plate runes - Added plate template for runes - Added on_punch API's handler's function - Added popper rune --- mods/runes/api.lua | 2 -- mods/runes/handlers.lua | 1 - 2 files changed, 3 deletions(-) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index 4b9e5284..c689feb6 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -161,8 +161,6 @@ runes.functions.connect = function(itemname, callback, handler) runes.datas.handlers[itemname].on_punch = handler else minetest.log("error","[runes] Cannot connect handler to item's " .. itemname .. " unknown " .. callback .. " callback") - else - minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to item's " .. itemname .. " unknown " .. callback .. " callback") return end end diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index efae5219..2ba6c4c7 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -36,7 +36,6 @@ end is_owner_online = function(pos) local meta = minetest.get_meta(pos) - print(meta:get_string("owner")) if meta:get_string("owner") ~= nil then return minetest.get_player_by_name(meta:get_string("owner")) ~= nil else From eae5700e6ba236d2fb452b312327c25ae7e1b1f2 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 26 Apr 2015 18:02:15 +0200 Subject: [PATCH 13/54] Added work for "go to me" rune - Added mana dicreaser on on_punch calls (cube only :s) - Added is_owner handler - Moved a texture name to the good name - Added values in needed_mana for go_to_me rune --- mods/runes/api.lua | 7 +++++- mods/runes/handlers.lua | 21 +++++++++++++----- mods/runes/registration.lua | 17 +++++++------- ...prove_heal.png => runes_improved_heal.png} | Bin 4 files changed, 31 insertions(+), 14 deletions(-) rename mods/runes/textures/{runes_improve_heal.png => runes_improved_heal.png} (100%) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index c689feb6..dca9e604 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -52,7 +52,12 @@ runes.functions.register_rune = function(parameters) end, on_punch = function(pos, node, puncher, pointed_thing) if runes.datas.handlers[runedef.name].on_punch then - runes.datas.handlers[runedef.name].on_punch(pos, node, puncher, pointed_thing) + if mana.get(puncher:get_player_name()) >= runedef.needed_mana then + runes.datas.handlers[runedef.name].on_punch(pos, node, puncher, pointed_thing) + mana.subtract(puncher:get_player_name(),runedef.needed_mana) + else + minetest.chat_send_player(puncher:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + end end end, --[[after_dig_node = function(pos, oldnode, oldmetadata, digger) diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index 2ba6c4c7..9477f9db 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -39,13 +39,25 @@ is_owner_online = function(pos) if meta:get_string("owner") ~= nil then return minetest.get_player_by_name(meta:get_string("owner")) ~= nil else - return true + return false + end +end + +is_owner = function(pos, player) + local meta = minetest.get_meta(pos) + if meta:get_string("owner") ~= nil and player:get_player_name() then + return meta:get_string("owner") == player:get_player_name() + else + return false end end go_to_me = function(pos, node, digger) - if digger then + if digger and is_owner_online(pos) and not (minetest.get_meta(pos):get_string("owner") == digger:get_player_name()) then digger:setpos(minetest.get_player_by_name(minetest.get_meta(pos):get_string("owner")):getpos()) + mana.subtract(minetest.get_meta(pos):get_string("owner"), 5) + else + mana.add(digger:get_player_name(),50) end end @@ -75,9 +87,8 @@ end runes.functions.connect("project","use",projection) runes.functions.connect("damager","use",damage_around) runes.functions.connect("earthquake","use",earthquake) -runes.functions.connect("gotome","place",add_owner) -runes.functions.connect("gotome","dig",go_to_me) -runes.functions.connect("gotome","can_dig",is_owner_online) +runes.functions.connect("gotome","punch",go_to_me) +runes.functions.connect("gotome","can_dig",is_owner) runes.functions.connect("megamana","use",set_manamax) -- And globalsteps diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua index a7f851c2..60c8c5d0 100644 --- a/mods/runes/registration.lua +++ b/mods/runes/registration.lua @@ -3,41 +3,42 @@ runes.datas.items = { ["project"] = { description = "Projection rune", - img = "default_dirt.png", + img = "runes_projection.png", type = "craftitem", needed_mana = 30 }, ["damager"] = { description = "Damaging rune", - img = "default_lava.png", + img = "runes_damaging.png", type = "craftitem", needed_mana = 190 }, ["earthquake"] = { description = "Earth Quake rune", - img = "default_apple.png", + img = "runes_earthquake.png", type = "craftitem", needed_mana = 80 }, ["simple_heal"] = { description = "Simple healing rune", - img = "default_water.png", + img = "runes_simple_heal.png", type = "cube" }, ["improved_heal"] = { description = "Improved healing rune", - img = "default_acid.png", + img = "runes_improved_heal.png", type = "cube" }, ["perfect_heal"] = { description = "Perfect healing rune", - img = "default_lava.png", + img = "runes_perfect_heal.png", type = "cube" }, ["gotome"] = { description = "Go to me rune", - img = "default_wood.png", - type = "cube" + img = "runes_go_to_me.png", + type = "cube", + needed_mana = 50 }, ["megamana"] = { description = "Mega Mana", diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improved_heal.png similarity index 100% rename from mods/runes/textures/runes_improve_heal.png rename to mods/runes/textures/runes_improved_heal.png From ef6f0d31278acaa4fe522a7f2cf8f9b655fcdf52 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Mon, 27 Apr 2015 13:57:15 +0200 Subject: [PATCH 14/54] Added triple registrering of runes - Runes are registered three times with tree levels : minor, medium, major --- mods/runes/api.lua | 240 ++++++++++-------- mods/runes/handlers.lua | 22 +- mods/runes/registration.lua | 60 +++-- mods/runes/textures/runes_damaging_major.png | Bin 0 -> 7044 bytes mods/runes/textures/runes_damaging_medium.png | Bin 0 -> 7044 bytes mods/runes/textures/runes_damaging_minor.png | Bin 0 -> 7044 bytes .../runes/textures/runes_earthquake_major.png | Bin 0 -> 3259 bytes .../textures/runes_earthquake_medium.png | Bin 0 -> 3259 bytes .../runes/textures/runes_earthquake_minor.png | Bin 0 -> 3259 bytes mods/runes/textures/runes_go_to_me_major.png | Bin 0 -> 3415 bytes mods/runes/textures/runes_go_to_me_medium.png | Bin 0 -> 3415 bytes mods/runes/textures/runes_go_to_me_minor.png | Bin 0 -> 3415 bytes ..._perfect_heal.png => runes_heal_major.png} | Bin ...mproved_heal.png => runes_heal_medium.png} | Bin ...s_simple_heal.png => runes_heal_minor.png} | Bin mods/solarmana/init.lua | 9 +- 16 files changed, 189 insertions(+), 142 deletions(-) create mode 100644 mods/runes/textures/runes_damaging_major.png create mode 100644 mods/runes/textures/runes_damaging_medium.png create mode 100644 mods/runes/textures/runes_damaging_minor.png create mode 100644 mods/runes/textures/runes_earthquake_major.png create mode 100644 mods/runes/textures/runes_earthquake_medium.png create mode 100644 mods/runes/textures/runes_earthquake_minor.png create mode 100644 mods/runes/textures/runes_go_to_me_major.png create mode 100644 mods/runes/textures/runes_go_to_me_medium.png create mode 100644 mods/runes/textures/runes_go_to_me_minor.png rename mods/runes/textures/{runes_perfect_heal.png => runes_heal_major.png} (100%) rename mods/runes/textures/{runes_improved_heal.png => runes_heal_medium.png} (100%) rename mods/runes/textures/{runes_simple_heal.png => runes_heal_minor.png} (100%) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index dca9e604..21b4e018 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -19,122 +19,150 @@ runes.functions.register_rune = function(parameters) runedef.name = parameters.name runedef.desc = parameters.description or "" runedef.img = parameters.img or "default_stone.png" + if type(runedef.img) ~= "table" then + runedef.img = { + ["minor"] = runedef.img .. "_minor.png", + ["medium"] = runedef.img .. "_medium.png", + ["major"] = runedef.img .. "_major.png", + } + end runedef.type = parameters.type or "craftitem" - runedef.needed_mana = parameters.needed_mana or 0 + runedef.needed_mana = parameters.needed_mana or {["minor"] = 0, ["medium"] = 5, ["major"] = 10} runes.datas.handlers[runedef.name] = {} if runedef.type == "cube" then - minetest.register_node("runes:rune_" .. runedef.name, { - description = runedef.desc, - tiles = {runedef.img}, - groups = {oddly_breakable_by_hand = 2, rune = 1}, - after_place_node = function(pos, placer, itemstack, pointed_thing) - if placer and placer:is_player() then - local meta = minetest.get_meta(pos) - meta:set_string("owner",placer:get_player_name()) - end - if runes.datas.handlers[runedef.name].on_place then - if mana.get(placer:get_player_name()) >= runedef.needed_mana then - runes.datas.handlers[runedef.name].on_place(pos, placer, itemstack, pointed_thing) - mana.subtract(placer:get_player_name(),runedef.needed_mana) - else - minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + for _, level in pairs({"minor", "medium", "major"}) do + minetest.register_node("runes:rune_" .. runedef.name .. "_" .. level, { + description = runedef.desc .. " ("..level..")", + tiles = {runedef.img[level]}, + groups = {oddly_breakable_by_hand = 2, rune = 1}, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) end - end - end, - can_dig = function(pos, player) - if runes.datas.handlers[runedef.name].can_dig then - return runes.datas.handlers[runedef.name].can_dig(pos, player) - else - return true - end - end, - on_punch = function(pos, node, puncher, pointed_thing) - if runes.datas.handlers[runedef.name].on_punch then - if mana.get(puncher:get_player_name()) >= runedef.needed_mana then - runes.datas.handlers[runedef.name].on_punch(pos, node, puncher, pointed_thing) - mana.subtract(puncher:get_player_name(),runedef.needed_mana) - else - minetest.chat_send_player(puncher:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") - end - end - end, - --[[after_dig_node = function(pos, oldnode, oldmetadata, digger) - --if runes.datas.handlers[runedef.name].can_dig and runes.datas.handlers[runedef.name].can_dig(pos, digger) then - if runes.datas.handlers[runedef.name].on_dig then - if mana.get(digger:get_player_name()) >= runedef.needed_mana then - runes.datas.handlers[runedef.name].on_dig(pos, oldnode, digger) - mana.subtract(digger:get_player_name(),runedef.needed_mana) + if runes.datas.handlers[runedef.name].on_place then + if mana.get(placer:get_player_name()) >= runedef.needed_mana[level] then + local answer = runes.datas.handlers[runedef.name].on_place(level, pos, placer, itemstack, pointed_thing) + -- True answer leads to no dicrease (generally because the handler did it itself) + if not answer then + mana.subtract(placer:get_player_name(),runedef.needed_mana[level]) + end else - minetest.chat_send_player(digger:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") + minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana[level] ..")") + end + end + end, + can_dig = function(pos, player) + if runes.datas.handlers[runedef.name].can_dig then + return runes.datas.handlers[runedef.name].can_dig(level, pos, player) + else + return true + end + end, + on_punch = function(pos, node, puncher, pointed_thing) + if runes.datas.handlers[runedef.name].on_punch then + if mana.get(puncher:get_player_name()) >= runedef.needed_mana[level] then + runes.datas.handlers[runedef.name].on_punch(level, pos, node, puncher, pointed_thing) + mana.subtract(puncher:get_player_name(),runedef.needed_mana[level]) + else + minetest.chat_send_player(puncher:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana[level] ..")") + end + end + end, + --[[after_dig_node = function(pos, oldnode, oldmetadata, digger) + --if runes.datas.handlers[runedef.name].can_dig and runes.datas.handlers[runedef.name].can_dig(pos, digger) then + if runes.datas.handlers[runedef.name].on_dig then + if mana.get(digger:get_player_name()) >= runedef.needed_mana[level] then + runes.datas.handlers[runedef.name].on_dig(pos, oldnode, digger) + mana.subtract(digger:get_player_name(),runedef.needed_mana) + else + minetest.chat_send_player(digger:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana[level] ..")") + end + end + end + end,]] + }) + end + + elseif runedef.type == "plate" then + for _, level in pairs({"minor", "medium", "major"}) do + minetest.register_node("runes:rune_" .. runedef.name .. "_" .. level, { + description = runedef.desc .. " (" .. level .. ")", + paramtype = "light", + inventory_image = runedef.img[level], + sunlight_propagates = true, + walkable = false, + tiles = {runedef.img[level]}, + groups = {rune = 1, oddly_breakable_by_hand = 2}, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.499, 0.5}, + } + }, + after_place_node = function(pos, placer, itemstack, pointed_thing) + if placer and placer:is_player() then + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + end + if runes.datas.handlers[runedef.name].on_place then + if mana.get(placer:get_player_name()) >= runedef.needed_mana[level] then + local answer = runes.datas.handlers[runedef.name].on_place(level, pos, placer, itemstack, pointed_thing) + if not answer then + mana.subtract(placer:get_player_name(),runedef.needed_mana[level]) + end + else + minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana[level] ..")") + end + end + end, + can_dig = function(pos, player) + if runes.datas.handlers[runedef.name].can_dig then + return runes.datas.handlers[runedef.name].can_dig(level, pos, player) + else + return true + end + end, + on_punch = function(pos, node, puncher, pointed_thing) + if runes.datas.handlers[runedef.name].on_punch then + if mana.get(placer:get_player_name()) >= runedef.needed_mana[level] then + local answer = runes.datas.handlers[runedef.name].on_punch(level, pos, node, puncher, pointed_thing) + if not answer then + mana.subtract(placer:get_player_name(),runedef.needed_mana[level]) + end + else + minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana[level] ..")") + end + end + end, + }) + end + + elseif runedef.type == "craftitem" then + for _, level in pairs({"minor", "medium", "major"}) do + minetest.register_craftitem("runes:rune_" .. runedef.name .. "_" .. level, { + description = runedef.desc .. " (" .. level ..")", + inventory_image = runedef.img[level], + groups = {rune = 1}, + on_use = function(itemstack, user, pointed_thing) + -- Let the handler do its job + if runes.datas.handlers[runedef.name].on_use then + if mana.get(user:get_player_name()) >= runedef.needed_mana[level] then + local answer = runes.datas.handlers[runedef.name].on_use(level, itemstack, user, pointed_thing) + if not answer then + mana.subtract(user:get_player_name(),runedef.needed_mana[level]) + user:get_inventory():remove_item("main",{name = runedef.name .. "_" .. level}) + end + else + minetest.chat_send_player(user:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana[level] ..")") end end end - end,]] - }) - - elseif runedef.type == "plate" then - minetest.register_node("runes:rune_" .. runedef.name, { - description = runedef.desc, - paramtype = "light", - inventory_image = runedef.img, - sunlight_propagates = true, - walkable = false, - tiles = {runedef.img}, - groups = {rune = 1, oddly_breakable_by_hand = 2}, - drawtype = "nodebox", - node_box = { - type = "fixed", - fixed = { - {-0.5, -0.5, -0.5, 0.5, -0.499, 0.5}, - } - }, - after_place_node = function(pos, placer, itemstack, pointed_thing) - if placer and placer:is_player() then - local meta = minetest.get_meta(pos) - meta:set_string("owner",placer:get_player_name()) - end - if runes.datas.handlers[runedef.name].on_place then - if mana.get(placer:get_player_name()) >= runedef.needed_mana then - runes.datas.handlers[runedef.name].on_place(pos, placer, itemstack, pointed_thing) - mana.subtract(placer:get_player_name(),runedef.needed_mana) - else - minetest.chat_send_player(placer:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") - end - end - end, - can_dig = function(pos, player) - if runes.datas.handlers[runedef.name].can_dig then - return runes.datas.handlers[runedef.name].can_dig(pos, player) - else - return true - end - end, - on_punch = function(pos, node, puncher, pointed_thing) - if runes.datas.handlers[runedef.name].on_punch then - runes.datas.handlers[runedef.name].on_punch(pos, node, puncher, pointed_thing) - end - end, - }) - elseif runedef.type == "craftitem" then - minetest.register_craftitem("runes:rune_" .. runedef.name, { - description = runedef.desc, - inventory_image = runedef.img, - groups = {rune = 1}, - on_use = function(itemstack, user, pointed_thing) - -- Let the handler do its job - if runes.datas.handlers[runedef.name].on_use then - if mana.get(user:get_player_name()) >= runedef.needed_mana then - runes.datas.handlers[runedef.name].on_use(itemstack, user, pointed_thing) - mana.subtract(user:get_player_name(),runedef.needed_mana) - user:get_inventory():remove_item("main",{name = runedef.name}) - else - minetest.chat_send_player(user:get_player_name(),"Not enough mana (needed : " .. runedef.needed_mana ..")") - end - end - end - }) + }) + end end end diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index 9477f9db..777ec6ff 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -1,8 +1,14 @@ -- Use handlers for runes +-- Every handler must receive as arguments the default callback arguments and +-- as first argument the power level of the rune as a string which can be : +-- `minor` : Low level +-- `medium` : Medium level +-- `major` : High level + -- First, the functions -projection = function(itemstack, user, pointed_thing) +projection = function(runelevel, itemstack, user, pointed_thing) if pointed_thing.type == "object" then local dir = vector.direction(user:getpos(),pointed_thing.ref:getpos()) local v = pointed_thing.ref:getvelocity() or {x=0,y=0,z=0} @@ -12,7 +18,7 @@ projection = function(itemstack, user, pointed_thing) end end -damage_around = function(itemstack, user, pointed_thing) +damage_around = function(runelevel, itemstack, user, pointed_thing) for name,entity in pairs(minetest.get_objects_inside_radius(user:getpos(),10)) do if true and (entity:is_player() and entity:get_player_name() ~= user:get_player_name()) then entity:set_hp(1) @@ -20,21 +26,21 @@ damage_around = function(itemstack, user, pointed_thing) end end -earthquake = function(itemstack, user, pointed_thing) +earthquake = function(runelevel, itemstack, user, pointed_thing) for name,entity in pairs(minetest.get_objects_inside_radius(user:getpos(),10)) do local v = entity:getvelocity() or {x=0,y=0,z=0} entity:setvelocity({x=v.x, y=v.y+50, z=v.z}) end end -add_owner = function(pos, placer, itemstack, pointed_thing) +add_owner = function(runelevel, pos, placer, itemstack, pointed_thing) if placer and placer:is_player() then local meta = minetest.get_meta(pos) meta:set_string("owner",placer:get_player_name()) end end -is_owner_online = function(pos) +is_owner_online = function(runelevel, pos) local meta = minetest.get_meta(pos) if meta:get_string("owner") ~= nil then return minetest.get_player_by_name(meta:get_string("owner")) ~= nil @@ -43,7 +49,7 @@ is_owner_online = function(pos) end end -is_owner = function(pos, player) +is_owner = function(runelevel, pos, player) local meta = minetest.get_meta(pos) if meta:get_string("owner") ~= nil and player:get_player_name() then return meta:get_string("owner") == player:get_player_name() @@ -52,7 +58,7 @@ is_owner = function(pos, player) end end -go_to_me = function(pos, node, digger) +go_to_me = function(runelevel, pos, node, digger) if digger and is_owner_online(pos) and not (minetest.get_meta(pos):get_string("owner") == digger:get_player_name()) then digger:setpos(minetest.get_player_by_name(minetest.get_meta(pos):get_string("owner")):getpos()) mana.subtract(minetest.get_meta(pos):get_string("owner"), 5) @@ -61,7 +67,7 @@ go_to_me = function(pos, node, digger) end end -set_manamax = function(itemstack, user, pointed_thing) +set_manamax = function(runelevel, itemstack, user, pointed_thing) if user and user:is_player() then mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) if not minetest.get_player_privs(user:get_player_name()).server then diff --git a/mods/runes/registration.lua b/mods/runes/registration.lua index 60c8c5d0..c8898b8f 100644 --- a/mods/runes/registration.lua +++ b/mods/runes/registration.lua @@ -3,51 +3,65 @@ runes.datas.items = { ["project"] = { description = "Projection rune", - img = "runes_projection.png", + img = "runes_projection", type = "craftitem", - needed_mana = 30 + needed_mana = { + ["minor"] = 15, + ["medium"] = 30, + ["major"] = 45, + }, }, ["damager"] = { description = "Damaging rune", - img = "runes_damaging.png", + img = "runes_damaging", type = "craftitem", - needed_mana = 190 + needed_mana = { + ["minor"] = 180, + ["medium"] = 190, + ["major"] = 230 + } }, ["earthquake"] = { description = "Earth Quake rune", - img = "runes_earthquake.png", + img = "runes_earthquake", type = "craftitem", - needed_mana = 80 + needed_mana = { + ["minor"] = 70, + ["medium"] = 80, + ["major"] = 90 + } }, - ["simple_heal"] = { - description = "Simple healing rune", - img = "runes_simple_heal.png", - type = "cube" - }, - ["improved_heal"] = { - description = "Improved healing rune", - img = "runes_improved_heal.png", - type = "cube" - }, - ["perfect_heal"] = { - description = "Perfect healing rune", - img = "runes_perfect_heal.png", + ["heal"] = { + description = "Healing rune", + img = "runes_heal", type = "cube" }, ["gotome"] = { description = "Go to me rune", - img = "runes_go_to_me.png", + img = "runes_go_to_me", type = "cube", - needed_mana = 50 + needed_mana = { + ["minor"] = 40, + ["medium"] = 50, + ["major"] = 75 + } }, ["megamana"] = { description = "Mega Mana", - img = "default_diamond.png", + img = { + ["minor"] = "default_diamond.png", + ["medium"] = "default_diamond.png", + ["major"] = "default_diamond.png" + }, type = "craftitem" }, ["popper"] = { description = "Popper", - img = "default_grass.png", + img = { + ["minor"] = "default_grass.png", + ["medium"] = "default_grass.png", + ["major"] = "default_grass.png" + }, type = "plate" }, } diff --git a/mods/runes/textures/runes_damaging_major.png b/mods/runes/textures/runes_damaging_major.png new file mode 100644 index 0000000000000000000000000000000000000000..ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3 GIT binary patch literal 7044 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_go_to_me_medium.png b/mods/runes/textures/runes_go_to_me_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab6558e8d01202900d7127e9a3720f1af616b8c GIT binary patch literal 3415 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_go_to_me_minor.png b/mods/runes/textures/runes_go_to_me_minor.png new file mode 100644 index 0000000000000000000000000000000000000000..8ab6558e8d01202900d7127e9a3720f1af616b8c GIT binary patch literal 3415 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_heal_major.png similarity index 100% rename from mods/runes/textures/runes_perfect_heal.png rename to mods/runes/textures/runes_heal_major.png diff --git a/mods/runes/textures/runes_improved_heal.png b/mods/runes/textures/runes_heal_medium.png similarity index 100% rename from mods/runes/textures/runes_improved_heal.png rename to mods/runes/textures/runes_heal_medium.png diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_heal_minor.png similarity index 100% rename from mods/runes/textures/runes_simple_heal.png rename to mods/runes/textures/runes_heal_minor.png diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index df935751..eef0caf0 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -31,9 +31,9 @@ local time_next_regen_check = time_total_regen_check -- TODO: make this globally accessible local mana_from_node = { ['default:goldblock'] = 5, - ['runes:rune_simple_heal'] = 1, - ['runes:rune_improved_heal'] = 3, - ['runes:rune_perfect_heal'] = 8, + ['runes:rune_heal_minor'] = 1, + ['runes:rune_heal_medium'] = 3, + ['runes:rune_heal_major'] = 8, ['default:wood'] = 1, ['default:junglewood'] = 1, ['default:pinewood'] = 1, @@ -92,14 +92,13 @@ minetest.register_globalstep(function(dtime) for key, value in pairs(mana_from_node) do if key:split(":")[1] == "group" then - groupname = key:split(":")[2] + local groupname = key:split(":")[2] if minetest.get_node_group(node.name, groupname) > 0 then regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) end end end - mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) end From 01c6adb6609d0ca460734ec466300d7a44eb9112 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Mon, 27 Apr 2015 15:29:47 +0200 Subject: [PATCH 15/54] Added amulets - Added amulets' API - Added some amulets --- mods/runes/amulets.lua | 31 +++++++++++++++++++++++++++++++ mods/runes/api.lua | 13 +++++++++++++ mods/runes/init.lua | 5 ++++- 3 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 mods/runes/amulets.lua diff --git a/mods/runes/amulets.lua b/mods/runes/amulets.lua new file mode 100644 index 00000000..191f8e7a --- /dev/null +++ b/mods/runes/amulets.lua @@ -0,0 +1,31 @@ +-- Amulets + +runes.functions.register_amulet("snake", "Snake Amulet", 10, 5 ) +runes.functions.register_amulet("scorpion", "Scorpion Amulet", 5, 7 ) +runes.functions.register_amulet("cactus", "Cactus Amulet", 5, 10 ) +runes.functions.register_amulet("eye", "Eye Amulet", 3, 20 ) +runes.functions.register_amulet("anubis", "Anubis' Amulet", 3, 25 ) +runes.functions.register_amulet("horus", "Horus' Amulet", 2, 40 ) +runes.functions.register_amulet("thot", "Thot's Amulet", 2, 45 ) +runes.functions.register_amulet("osiris", "Osiris' Amulet", 2, 50 ) +runes.functions.register_amulet("ra", "Ra's Amulet", 1, 100) + +-- Globalstep checking for the amulets +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local inv = player:get_inventory() + local basemana = mana.settings.default_max + for index, item in pairs(inv:get_list("main")) do + local itemname = item:get_name() + local itemcount = item:get_count() + for name, manadiff in pairs(runes.datas.amulets) do + if itemname == "runes:" .. name .. "_amulet" then + basemana = basemana + (manadiff * itemcount) + end + end + end + if basemana ~= mana.settings.default_max then + mana.setmax(player:get_player_name(), basemana) + end + end +end) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index 21b4e018..6ef36bdf 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -5,6 +5,7 @@ runes = {} runes.datas = {} runes.datas.handlers = {} runes.datas.items = {} +runes.datas.amulets = {} runes.functions = {} -- Simple rune register function @@ -197,3 +198,15 @@ runes.functions.connect = function(itemname, callback, handler) return end end + +-- Amulets + +runes.functions.register_amulet = function(name, desc, maxcount, manadiff) + minetest.register_craftitem("runes:" .. name .. "_amulet", { + description = desc, + inventory_image = "runes_" .. name .. "_amulet.png", + groups = {amulet = 1}, + stack_max = maxcount, + }) + runes.datas.amulets[name] = manadiff +end diff --git a/mods/runes/init.lua b/mods/runes/init.lua index 9ab1219c..087fe911 100644 --- a/mods/runes/init.lua +++ b/mods/runes/init.lua @@ -9,7 +9,10 @@ dofile(modpath.."/api.lua") -- Then the rune themselves dofile(modpath.."/registration.lua") --- And the handlers +-- The handlers dofile(modpath.."/handlers.lua") +-- The amulets +dofile(modpath.."/amulets.lua") + minetest.log("action","[runes] Mod loaded") From 275fbd4e09e84aa0466d14309ae65215c7a96618 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 26 Apr 2015 15:45:04 +0200 Subject: [PATCH 16/54] Added plate runes - Added plate template for runes - Added on_punch API's handler's function - Added popper rune --- mods/runes/handlers.lua | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/mods/runes/handlers.lua b/mods/runes/handlers.lua index 777ec6ff..b774115e 100644 --- a/mods/runes/handlers.lua +++ b/mods/runes/handlers.lua @@ -85,6 +85,14 @@ end set_manamax = function(itemstack, user, pointed_thing) if user and user:is_player() then mana.set(user:get_player_name(),mana.getmax(user:get_player_name())) + if not minetest.get_player_privs(user:get_player_name()).server then + -- Violent reaction if not admin + user:set_hp(1) + user:set_breath(1) + local userpos = user:getpos() + local useritem = user:get_wielded_item() + user:setpos({x=userpos.x+math.random(-50,50),y = userpos.y + math.random(1,20),z = userpos.z + math.random(-50,50)}) + end end end From 360deb8067591fe6dfd577f3f365b89819c3bf1d Mon Sep 17 00:00:00 2001 From: Ataron Date: Sun, 26 Apr 2015 16:35:41 +0200 Subject: [PATCH 17/54] Add some textures for runes mod --- mods/runes/textures/runes_improve_heal.png | Bin 0 -> 3002 bytes mods/runes/textures/runes_perfect_heal.png | Bin 0 -> 3471 bytes mods/runes/textures/runes_simple_heal.png | Bin 0 -> 2864 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/runes/textures/runes_improve_heal.png create mode 100644 mods/runes/textures/runes_perfect_heal.png create mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improve_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e4766148113c4b67738bd4b19873b0dddd4851f8 GIT binary patch literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d1d2574536dd986f99271a6158c8d1b6189267 GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..25d0c289b20dff156805726fb72b7e5b66e68e56 GIT binary patch literal 2864 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 O0000 Date: Sun, 26 Apr 2015 18:02:15 +0200 Subject: [PATCH 18/54] Added work for "go to me" rune - Added mana dicreaser on on_punch calls (cube only :s) - Added is_owner handler - Moved a texture name to the good name - Added values in needed_mana for go_to_me rune --- ...nes_improve_heal.png => runes_improved_heal.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename mods/runes/textures/{runes_improve_heal.png => runes_improved_heal.png} (100%) diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improved_heal.png similarity index 100% rename from mods/runes/textures/runes_improve_heal.png rename to mods/runes/textures/runes_improved_heal.png From 1413d905d22e87808de62f13e160f31a6b165419 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Mon, 27 Apr 2015 13:57:15 +0200 Subject: [PATCH 19/54] Added triple registrering of runes - Runes are registered three times with tree levels : minor, medium, major --- mods/runes/textures/runes_improved_heal.png | Bin 3002 -> 0 bytes mods/runes/textures/runes_perfect_heal.png | Bin 3471 -> 0 bytes mods/runes/textures/runes_simple_heal.png | Bin 2864 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/runes/textures/runes_improved_heal.png delete mode 100644 mods/runes/textures/runes_perfect_heal.png delete mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_improved_heal.png b/mods/runes/textures/runes_improved_heal.png deleted file mode 100644 index e4766148113c4b67738bd4b19873b0dddd4851f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png deleted file mode 100644 index e7d1d2574536dd986f99271a6158c8d1b6189267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3471 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 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png deleted file mode 100644 index 25d0c289b20dff156805726fb72b7e5b66e68e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 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 O0000 Date: Wed, 29 Apr 2015 12:01:16 +0200 Subject: [PATCH 20/54] Amulets/runes' inventory created with load and save features - Added texture for the inventory's background to be customized later, adding copies of our textures in each slot - Added unified_inventory as a dependency for runes - Added inventory for runes and amulets and its handler --- mods/runes/api.lua | 85 ++++++++++++++++++- mods/runes/depends.txt | 1 + mods/runes/textures/runes_rune_inventory.png | Bin 0 -> 7490 bytes 3 files changed, 85 insertions(+), 1 deletion(-) create mode 100755 mods/runes/textures/runes_rune_inventory.png diff --git a/mods/runes/api.lua b/mods/runes/api.lua index 6ef36bdf..2c7470b7 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -205,8 +205,91 @@ runes.functions.register_amulet = function(name, desc, maxcount, manadiff) minetest.register_craftitem("runes:" .. name .. "_amulet", { description = desc, inventory_image = "runes_" .. name .. "_amulet.png", - groups = {amulet = 1}, + groups = {amulet = 1, rune = 1}, stack_max = maxcount, }) runes.datas.amulets[name] = manadiff end + +-- Inventory + +unified_inventory.register_button("runes", { + type = "image", + image = "runes_heal_major.png", +}) +unified_inventory.register_page("runes", { + get_formspec = function(player) + local name = player:get_player_name() + local formspec = "background[0,0.2;8,4;runes_rune_inventory.png]".. + "background[0,4.5;8,4;ui_wooden_chest_inventory.png]".. + "size[8,10]".. + "list[detached:"..name.."_runes;runes;0,0.2;8,4;]" + return {formspec=formspec} + end, +}) + +runes.functions.register_detached_inventory = function(player) + local name = player:get_player_name() + local player_inv = player:get_inventory() + local datafile = io.open(minetest.get_worldpath().."/runes/"..name.."_rune.inv", "r") + local rune_inv_data = {} + if datafile then + local line = datafile:read() + if line then + rune_inv_data = minetest.deserialize(line) + end + io.close(datafile) + end + local rune_inv = minetest.create_detached_inventory(name.."_runes",{ + on_put = function(inv, listname, index, stack, player) + player:get_inventory():set_stack(listname, index, stack) + armor:set_player_armor(player) + armor:update_inventory(player) + end, + on_take = function(inv, listname, index, stack, player) + player:get_inventory():set_stack(listname, index, nil) + armor:set_player_armor(player) + armor:update_inventory(player) + end, + allow_put = function(inv, listname, index, stack, player) + if minetest.get_item_group(stack:get_name(), "rune") > 0 then + return stack:get_count() + end + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + return stack:get_count() + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return count + end, + }) + rune_inv:set_size("runes", 8*4) + rune_inv:set_list("runes",rune_inv_data) + minetest.log("action","[runes] Rune inventory loaded for player " .. name) +end + +minetest.register_on_joinplayer(runes.functions.register_detached_inventory) + +runes.functions.save_detached_inventory = function(player) + local name = player:get_player_name() + local player_inv = player:get_inventory() + local datafile = io.open(minetest.get_worldpath().."/runes/"..name.."_rune.inv", "w") + local rune_inv_data = minetest.get_inventory({type = "detached", name=name.."_runes"}) + local translated_rune_data = {} + for index, data in pairs(rune_inv_data:get_list("runes")) do + translated_rune_data[index] = data:get_name() .. " " .. data:get_count() + end + if datafile then + datafile:write(minetest.serialize(translated_rune_data)) + end + io.close(datafile) + minetest.log("action", "[runes] Rune inventory saved for player " .. name) +end + +minetest.register_on_leaveplayer(runes.functions.save_detached_inventory) +minetest.register_on_shutdown(function() + for index, player in pairs(minetest.get_connected_players()) do + runes.functions.save_detached_inventory(player) + end +end) diff --git a/mods/runes/depends.txt b/mods/runes/depends.txt index 49bb81b0..66340fe7 100644 --- a/mods/runes/depends.txt +++ b/mods/runes/depends.txt @@ -1,2 +1,3 @@ default +unified_inventory mana diff --git a/mods/runes/textures/runes_rune_inventory.png b/mods/runes/textures/runes_rune_inventory.png new file mode 100755 index 0000000000000000000000000000000000000000..145d9d2230834dc48b93bdfd708fad790ac5e82c GIT binary patch literal 7490 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 literal 0 HcmV?d00001 From 5072b85fb5ebdaf2d9a325b086b804260aaf75f8 Mon Sep 17 00:00:00 2001 From: Ombridride Date: Wed, 29 Apr 2015 23:45:14 +0200 Subject: [PATCH 21/54] Update amulets mod - Renamed amulets (delete some of them) - Add Recipes - Add a node (needed by a recipe) - Add a texture for the node --- mods/runes/amulets.lua | 68 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 59 insertions(+), 9 deletions(-) diff --git a/mods/runes/amulets.lua b/mods/runes/amulets.lua index 191f8e7a..b023f100 100644 --- a/mods/runes/amulets.lua +++ b/mods/runes/amulets.lua @@ -1,14 +1,64 @@ -- Amulets +runes.functions.register_amulet("silver_cross", "Silver Cross", 1, 25 ) +runes.functions.register_amulet("minotaur_eye", "Minotaur Eye", 1, 50 ) +runes.functions.register_amulet("hellfire_amulet", "Hellfire Amulet", 1, 75 ) +runes.functions.register_amulet("Grim_Reaper_Amulet", "Grim Reaper's Amulet", 1, 100) -runes.functions.register_amulet("snake", "Snake Amulet", 10, 5 ) -runes.functions.register_amulet("scorpion", "Scorpion Amulet", 5, 7 ) -runes.functions.register_amulet("cactus", "Cactus Amulet", 5, 10 ) -runes.functions.register_amulet("eye", "Eye Amulet", 3, 20 ) -runes.functions.register_amulet("anubis", "Anubis' Amulet", 3, 25 ) -runes.functions.register_amulet("horus", "Horus' Amulet", 2, 40 ) -runes.functions.register_amulet("thot", "Thot's Amulet", 2, 45 ) -runes.functions.register_amulet("osiris", "Osiris' Amulet", 2, 50 ) -runes.functions.register_amulet("ra", "Ra's Amulet", 1, 100) +-- Recipes +minetest.register_craft({ + output = "amulets:silver_cross", + recipe = { + {"", "farming:cotton", ""}, + {"moreores:silver_ingot", "moreores:silver_ingot", "moreores:silver_ingot"}, + {"", "moreores:silver_ingot", ""}, + } +}) + +mminetest.register_craft({ + output = "amulets:minotaur_eye", + recipe = { + {"", "darkage:chain", ""}, + {"technic:brass_ingot", "mobs:minotaur_eye", "technic:brass_ingot"}, + {"", "mesecons_materials:glue", ""}, + } +}) + +minetest.register_craft({ + output = "amulets:hellfire_amulet", + recipe = { + {"", "darkage:chain", ""}, + {"mobs:lava_orb", "default:diamondblock", "mobs:lava_orb"}, + {"default:obsidian", "bucket:bucket_lava", "default:obsidian"}, + } +}) + +minetest.register_craft({ + output = "amulets:Grim_Reaper_Amulet", + recipe = { + {"", "amulets:hellfire_amulet", ""}, + {"nether:white", "amulets:black_magic_block", "nether:white"}, + {"", "moreores:mithril_block", ""}, + } +}) + +minetest.register_craft({ + output = "amulets:black_magic_block", + recipe = { + {"nether:white", "amulets:hellfire_amulet", "default:obsidian"}, + {"default:nyancat", "nether:tree", "default:mese"}, + {"default:obsidian", "moreores:mithril_block", "nether:white"}, + } +}) + +-- Nodes +minetest.register_node("amulets:black_magic_block", { + description = "Black Magic Block", + tiles = {"black_magic_block.png"}, + is_ground_content = true, + paramtype2 = "facedir", + groups = {crumbly=3}, + sounds = default.node_sound_sand_defaults(), +}) -- Globalstep checking for the amulets minetest.register_globalstep(function(dtime) From a651f88919bafaa6abe746c077ed9b06c49c2d47 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 30 Apr 2015 00:13:49 +0200 Subject: [PATCH 22/54] Fixed names, added textures - Fixed amulets' itemstring - Fixed modname prefixes for amulets - Added black magic block's texture --- mods/runes/amulets.lua | 24 +++++++++--------- .../textures/runes_black_magic_block.png | Bin 0 -> 6099 bytes 2 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 mods/runes/textures/runes_black_magic_block.png diff --git a/mods/runes/amulets.lua b/mods/runes/amulets.lua index b023f100..9af93b79 100644 --- a/mods/runes/amulets.lua +++ b/mods/runes/amulets.lua @@ -2,11 +2,11 @@ runes.functions.register_amulet("silver_cross", "Silver Cross", 1, 25 ) runes.functions.register_amulet("minotaur_eye", "Minotaur Eye", 1, 50 ) runes.functions.register_amulet("hellfire_amulet", "Hellfire Amulet", 1, 75 ) -runes.functions.register_amulet("Grim_Reaper_Amulet", "Grim Reaper's Amulet", 1, 100) +runes.functions.register_amulet("grim_reaper_amulet", "Grim Reaper's Amulet", 1, 100) -- Recipes minetest.register_craft({ - output = "amulets:silver_cross", + output = "runes:silver_cross_amulet", recipe = { {"", "farming:cotton", ""}, {"moreores:silver_ingot", "moreores:silver_ingot", "moreores:silver_ingot"}, @@ -14,8 +14,8 @@ minetest.register_craft({ } }) -mminetest.register_craft({ - output = "amulets:minotaur_eye", +minetest.register_craft({ + output = "runes:minotaur_eye_amulet", recipe = { {"", "darkage:chain", ""}, {"technic:brass_ingot", "mobs:minotaur_eye", "technic:brass_ingot"}, @@ -24,7 +24,7 @@ mminetest.register_craft({ }) minetest.register_craft({ - output = "amulets:hellfire_amulet", + output = "runes:hellfire_amulet", recipe = { {"", "darkage:chain", ""}, {"mobs:lava_orb", "default:diamondblock", "mobs:lava_orb"}, @@ -33,27 +33,27 @@ minetest.register_craft({ }) minetest.register_craft({ - output = "amulets:Grim_Reaper_Amulet", + output = "runes:grim_reaper_amulet", recipe = { - {"", "amulets:hellfire_amulet", ""}, - {"nether:white", "amulets:black_magic_block", "nether:white"}, + {"", "runes:hellfire_amulet_amulet", ""}, + {"nether:white", "runes:black_magic_block", "nether:white"}, {"", "moreores:mithril_block", ""}, } }) minetest.register_craft({ - output = "amulets:black_magic_block", + output = "runes:black_magic_block", recipe = { - {"nether:white", "amulets:hellfire_amulet", "default:obsidian"}, + {"nether:white", "runes:hellfire_amulet_amulet", "default:obsidian"}, {"default:nyancat", "nether:tree", "default:mese"}, {"default:obsidian", "moreores:mithril_block", "nether:white"}, } }) -- Nodes -minetest.register_node("amulets:black_magic_block", { +minetest.register_node("runes:black_magic_block", { description = "Black Magic Block", - tiles = {"black_magic_block.png"}, + tiles = {"runes_black_magic_block.png"}, is_ground_content = true, paramtype2 = "facedir", groups = {crumbly=3}, diff --git a/mods/runes/textures/runes_black_magic_block.png b/mods/runes/textures/runes_black_magic_block.png new file mode 100644 index 0000000000000000000000000000000000000000..8b3d5171e120e0af9881622e5c7ca820661dfea0 GIT binary patch literal 6099 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 Yl@z)22PR=2aMzANNh?VeOBnh74?vdcQvd(} literal 0 HcmV?d00001 From 2715d3dcdcfa97d8ca248424fe4bc94981e7b7b5 Mon Sep 17 00:00:00 2001 From: Ombridride Date: Sun, 3 May 2015 13:06:07 +0200 Subject: [PATCH 23/54] Fix conflicts and update world.mt --- worlds/minetestforfun/world.mt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/worlds/minetestforfun/world.mt b/worlds/minetestforfun/world.mt index d9f50409..5bc55857 100644 --- a/worlds/minetestforfun/world.mt +++ b/worlds/minetestforfun/world.mt @@ -143,6 +143,8 @@ load_mod_hud = true load_mod_gauges = true load_mod_sprint = true load_mod_mana = true +load_mod_solarmana = true +load_mod_runes = true load_mod_awards = true load_mod_fail = true @@ -192,7 +194,3 @@ load_mod_chatplus = true load_mod_future_ban = false load_mod_textures = false load_mod_snowdrift = false - -load_mod_metatools = true -load_mod_connected_chests = true -load_mod_solarmana = true From d211627e05f436c3296d368ca3b5100e8f4d6453 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 14 May 2015 23:22:07 +0200 Subject: [PATCH 24/54] Added minotaur's eye - Added minotaur eye craftitem (drop chances : 1/10 when killing a minotaur) - Fixed some amulets' name --- mods/runes/amulets.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/mods/runes/amulets.lua b/mods/runes/amulets.lua index 9af93b79..f7243c79 100644 --- a/mods/runes/amulets.lua +++ b/mods/runes/amulets.lua @@ -1,8 +1,8 @@ -- Amulets runes.functions.register_amulet("silver_cross", "Silver Cross", 1, 25 ) runes.functions.register_amulet("minotaur_eye", "Minotaur Eye", 1, 50 ) -runes.functions.register_amulet("hellfire_amulet", "Hellfire Amulet", 1, 75 ) -runes.functions.register_amulet("grim_reaper_amulet", "Grim Reaper's Amulet", 1, 100) +runes.functions.register_amulet("hellfire", "Hellfire Amulet", 1, 75 ) +runes.functions.register_amulet("grim_reaper", "Grim Reaper's Amulet", 1, 100) -- Recipes minetest.register_craft({ @@ -58,7 +58,7 @@ minetest.register_node("runes:black_magic_block", { paramtype2 = "facedir", groups = {crumbly=3}, sounds = default.node_sound_sand_defaults(), -}) +}) -- Globalstep checking for the amulets minetest.register_globalstep(function(dtime) From 4c40b51b9bc5be8621ee4c9cdce99b305d195952 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Fri, 15 May 2015 14:13:52 +0200 Subject: [PATCH 25/54] Updated solarmana_add - Updated solarmana_add/README.txt - Fixed indentation for groups handler --- mods/solarmana/README.txt | 6 +++++- mods/solarmana/init.lua | 14 +++++++------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/mods/solarmana/README.txt b/mods/solarmana/README.txt index e96efbde..fe06b05e 100644 --- a/mods/solarmana/README.txt +++ b/mods/solarmana/README.txt @@ -4,7 +4,7 @@ Solar Mana Mod [solarmana] A mana regeneration controller: only regenerate mana in sunlight or on special nodes. -Version: 0.1.0 +Version: 0.3.0 Licence: LGPL 2.1 or later Report bugs or request help on the forum topic. @@ -25,6 +25,10 @@ Dependencies ------------ * mana: https://forum.minetest.net/viewtopic.php?f=11&t=11154 +Contributors +------------ +Mg (LeMagnesium) - node group handling + Installation ------------ diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index eef0caf0..caa38c21 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -91,13 +91,13 @@ minetest.register_globalstep(function(dtime) end for key, value in pairs(mana_from_node) do - if key:split(":")[1] == "group" then - local groupname = key:split(":")[2] - if minetest.get_node_group(node.name, groupname) > 0 then - regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) - end - end - end + if key:split(":")[1] == "group" then + local groupname = key:split(":")[2] + if minetest.get_node_group(node.name, groupname) > 0 then + regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) + end + end + end mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) From 238558eed29135a00bb63f2cd175876b3b27162a Mon Sep 17 00:00:00 2001 From: Ataron Date: Fri, 15 May 2015 15:14:19 +0200 Subject: [PATCH 26/54] Megamana's and Gotome's Textures --- mods/runes/textures/runes_damaging.png | Bin 7044 -> 0 bytes mods/runes/textures/runes_earthquake.png | Bin 3259 -> 0 bytes mods/runes/textures/runes_go_to_me.png | Bin 3415 -> 0 bytes mods/runes/textures/runes_go_to_me_medium.png | Bin 3415 -> 3259 bytes mods/runes/textures/runes_go_to_me_minor.png | Bin 3415 -> 3102 bytes .../textures/runes_megamana_majorsang.png | Bin 0 -> 2509 bytes mods/runes/textures/runes_megamana_medium.png | Bin 0 -> 2506 bytes mods/runes/textures/runes_megamana_minor.png | Bin 0 -> 2541 bytes 8 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/runes/textures/runes_damaging.png delete mode 100644 mods/runes/textures/runes_earthquake.png delete mode 100644 mods/runes/textures/runes_go_to_me.png create mode 100644 mods/runes/textures/runes_megamana_majorsang.png create mode 100644 mods/runes/textures/runes_megamana_medium.png create mode 100644 mods/runes/textures/runes_megamana_minor.png diff --git a/mods/runes/textures/runes_damaging.png b/mods/runes/textures/runes_damaging.png deleted file mode 100644 index ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7044 zcmV-~8++u5P)B010qNS#tmY3ljhU3ljkVnw%H_000McNliru-vk*A6#&RU&&U7(03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*02=5?L_t(|+I5?Ia9q`$ z=RfD(R==N;(c8vPB+CqJNML7X!#_)Q6Q*irGRY8j7;rKPunx8{U;_4TrYcpi*g(L+ zHV_CfyBV0wI1Je$wKbKQB{j8`>{jh25HOJ#ED>Y9Y+07N)em(`eec;n&bjBFD><%e zOX}`>&-uN+zwhsNephUK;i7ah3H*8suiip7mhl?PB!7`ZNRUDx1>rvtyaZAT5E6v- z1qY<{Whp=qy@wQ#efKo>zv?HhRri(FJ%s*G1lI}B%bCxGzQ_?ssos;;H8|>v&fqLg zI*pS_;-(V>GRORSQ(d1)fCL|PzvicwNd3P&AQ6)AhM)wOQf)+{es=^CkiiXvKnjWQ z^|e}AnbYqB5RVlsrAl(|yc;UQ*K!GU??5o2w22HqQvV6Sli=v@AoY4`KhCCE+;j>j zoy4((_ml#b)qbVK%_I?026txpQ%j_Nky9ECG%i6Pk-)`|k0B&%*!%$aY9qnMC4|Bw z$-Ey3p4UG!p(I*ofTf6Qz*ip{i{onn)%#1Qj{uOr=CE2jSkG8Y;%qvPn@WemrxWq*J)*6wOaAA&^=znAiNr$8eHeh*THzXP?rZqP@je zn+f)kIsI!Av7CCj84_+5Az{_4vf8d9BqZFddd2c2VtMlKycZfn>ihZH+kDB=dynBH zyKs_SRNp;f?M-`~?<>m(!l#m<@b#vC)p2`b2fww_(=f3n04JRc3%;+Yow)j42x8OcSn2CU*byiMmG_V0q&DEBN{EgW0zqr)CnS15ZE(Zcd>$v0)`m>r zW|GKy6Ti{IZ!F{2m+_|haZ6X;`>ptNoR#i|Sw;wO(g{T9d#rA#(=n4^Zt56LaszI< zWL#IoQXmBNd94KfL3(VIcq~smmZif@v+6ZiY1i=l6;|3y)PLt{R(rc~XD0!H=da-T zD0YPi(A4&Gyh}d#L37<;hW|BDRBz~ib z*U*-4H1MYS5K`daD;LZBpA3GzfvhiU_h{jy6S(Q529OjNrj_tcs)Um$D$rbBRA8Gd z;UrZ!2q{U8jgpAvh{v+T-4t!F!D_q4YI}*5c7?{(S1aZEP`~;A9dA1ead=wsyNBPO^yKEaNXP;xAuPcIZeVI#Pf`ef}-F#dXBp zEb&;H)%G$gUX_*h5{;c#v)bLGV$}+})$VRqdU|lrpVM}A=!m5dI0ykV3ojbwgA(3v z&VzK+K9fc5B@WAP|1;SeZ^G4R@7J5iA3GVKR2Sp!DHS^Hh7o>wc$WdoAWRInqB2qacdlV&b%_

1iMk%)j)cUc56Zd~=@Of%^~wGWp-9w(u562N6ptOh7Q#{y7EjDppr3 zED!BcmJN855bXZ!Ij-Hd#Jl5pledwu+S5yH_8bVo7_TVHr!C7b&r{ra2mz$7xRK@A zf6~_r6`DF9*M9a7q=v4;Z#0l+L(5xC4YB>-d|()j6d?#AVEX(C4LF@R$pU_}qP2gC zzJUWe-#dogU6?#(zOO8$LZo~1!6>ssa{J9wtgNmgB_!e7|j}kpS>Hk5}MKMF!%8>V}mpb6FL@r-qp!;40 zVA}QZ1KO*Urrs0A8+r%sM_Qhsl+elTH&5|<*KG}%oeqiLy>1J4eD)l!_PoID)e=%DPuO_~xjc`zyZ{6S*g*Nc$HFj>Ra8`4^=BZYw9=SK zUwSisG^O=yyia37poEeYE>>l2Y9^^--g5g5+rFW_%@Wpj0gWvNU$i#_`?B{V2r(lF zU&rwSfz)fTYaf17=XI%BRcm}h1sK!;7IKbwp-ceRSHl_n7;T-C`167zOUUf zP=;IslF&PFKq*y+LlBq7a@fKz;5X;#-tu7RS=NTJ_9%j0h4l4HviL6nT`uAz3dY+a zE-i&w-?5uLK~24>bFW771&yW!gXYt7$E{6R%Ci18iu9%NlHPt54q`3vSsN6RkT+=M zNg4H+(3OKU8vY#-KHvgP1)`MKa<+Yw<|fj_OM;efT&|Qn6JxSx|!O)ZICJ zNblDV!Bk)D*i8l#&${m4*tu7E!SaI1t8TJ{lk8-A?u3pZX)=P)vYXB0n@!*LhcoON z9$0V5AT#OrM}`Nup#7@d^*mqp#ko= z`CPPc30X(@o{tgU)r{3^mhl>k_{~dn?RePm1gvhA4XREAxg{Z>d8(}xn>oXfcZ)?X zDnX>4HDEUO8BAnE#yxBO4T@*Wv&(zM6Sst`sJRVP#qmN%O~A^c+GhY zj1^USCW~4L&sf|*8V&#X=Vuui8Zg42nV4NeGi-CHA7?(AWyV&*=gvjaXJD+0A3bSE z(^}!LbN3NZsp4UT~1wm&(~$nXI9Oi~L!!;WozYnWRQ|KT2XZ0+OB#7wA!;Q@AkZZc$^ z66SvMB(4TLCz;o1zkt`g#E^H3?kJ^oLncrD^gEHPBP`Ez5Ec;%2+4&B5^jOGt9yCv zx@uy!D{SiAr`cT@zg1BMN1}+E=wkZfagd?#xoncz^A*mF&#+@_Km9$0FjX3`jb?=Y zo&r0z_H$-@hS~EKa@iy!!vpNTc@m^#?(CDe2~{X5%PYY1mM?L|)(2T>S6FFRS#8&e zyJ-?`mbhCWfBGF$?5QlEwC@-X^t1xzl<)~RqZ^rZR=g^$b{W~b9U&!~I`1)<;5Eyd zYpWFbXJ5R)$j~6UY=YU@3gZ*gT(zyA{@w!BYI7a(g(bLpRjW<nT9dw>JUh1bF+MTP>};7_Hp#A`K_2+ZO}L37UO;l1^K@^1$fD+w`p$o)m7qMK z!%c_e39FP=An1p5^5SoZyLl3^9IIZPR=cW&-)hQVoA+-j?Zt1YitpafZ)4Z+AlYn! z+4B{~CuWrJy#;Eu7NZ|b@q;&d)~7xhJ$8KU$NgFfE&6&3Y~R|?_{0pe=gVZX3K;i) zewzWj?kgW$Pj{uHzVlig4mH|dorIfFc<}x^A;*vqQw@<2ykLDnD12Qv`V#2~YeB)L z;$Ck3(nUsw2gzpRoIhV?d}5aE+xqG2%~Pv286BJA2S4hu$cx=iu<5DV*sE{$b30Rv z3=h)RtIiO|CuRUiUvH6J!vh@r@@M$|KWtQIk(z-CM}&u|GUOI(y(~D|Q@v-K&v$KM zwOwJws}gt9B;6c|SRQe40_k6di%V&Q&t>Au?Z;=>zO|43o;{OT_SX&#YePzaerHx*YpH!QetuZKpC&T+0W<)lT>Rh`g;pn2^ttP2}Xto*{ykkO>wgyyh|chAmQeS zyJ^~9!|FL$`;dOn5DDExbZ%i~b%~ZvB^^#$bAdc!Zo+KxOSjH5vQsfUW%&T`3RJ6> z@G|TZIG1a($TjZ;JqBH{y!Pe*qhpg)t4;cP3T)rj&-nN>v$GX)*#sjyH?sS4=M1yV zeE1&mSb>C-rNd1rEYsGn4qMjO3W*6_A4{Y;(4_N9Ru(=s8|rW~faH(v5g;!CXtz&l zz?){rwgGy33sh@O#>S>N^?JANf@^mds=5#s>0wQK3Ja<2iHg^LJiwpJDMoe<($`Z! zNH{YwjR1Ok3+x&mWH*y)ozE8d$%_GhX(-{nC8|T$h9~hdynoD8NWl<;1_-BgC425V zWHvFoe2AUHgW);8mFIVC8=$W@Pqo@)?1L#zy?%uSK9vVc!fYX>abtx z%Jj7#4=P~XIY?ixnlU&tF^vTJd-IG84~B4h_Y?!EZ<@c4{P*Wo9pTs$Cdv&=Q#7dN z%u$E-hGO2On0M(*9x<_&%O#kdU1EG<+Ms>4+GK2Ol2d zKWu?%#wPH2^~VE@jZIOlw&?54vt#Q36IM6`*9@eNQq0FF=3|ky*8Wsf*s9CzhM|zY zX+-AIF-rLu<+J;YHE-HiXPB06RalZe+;9ut3%{ICc3-I36QBVVWba zzS+-MfC;^Mwr}fKz^Ii_{&*k7yh|?aMmtq9+}9c+#JUuuJi_7G?;T;W+@@AIsIuJXMYgD<#WFc&u$d3#(CTGJ>#s|5%>T zq_4NYwr%~4PfRoU{+*O^F>c)V4z)&`a;44VZ#)-ClcvM0J=BT35g{oaAUOHbQOcDz zub$paF5^ah5;stKFe!IRddZJXTwz%Q??flsv&zd$^ zq$URtGA zZ}rYHK^z!M~}~cT&v9$Yoq= z^)}_Dw&_xtYy7Zdty*hg3jl#{xrT3C*^!cccO9aXQF&UWCROp)fWHyhV9(;C$m;z7BbNAL`w3S#)9(M zeU$PsK7H@o)M_5(r8cFU0`7;uxL5Zm^;*6R9NT!TZi-@JOl?|e{hm7yQ_982Wnv~r zmzUbS_TH7`GBHZI82!nk5tLsy_#ngI#o8J}UZ(c2@hC`}(vP0+>9h8})KN+~mux!5 z&!71O<)u|~vs^kxDd%$N3-?$`h#uYu2{E(rV7f{xeed0eDHdYn(lM&_HkC@7XJ0yk z6tM4Wha<#An9@R8q*5SMrNx0Se**+ez89uffXxNUl&mi0ilhZyA8`J$pj( zP|z_|t$S3K+MImpNW^;k?hKW1{FTS8;RlP|3b^kp>PWj#P@B2`;v*c}@R!jVSYL4e z{39H@LVZ@Qs5t)i5005JS)n&7HK%^?)&u4?PyX<@9;{GV=ixuyuW=zpRcC}?siQx7 zHoWKcTYoMAzW(*Uq>y*b4RaZ7`6ZA0U-%?m>k>n$yTh)4&Mh{yN#Pg-3o`tHzt9S> z?)||0qddLgn-PWHKmRDl%zJ{$QX7D8|IM-JoNh3u4AHS!Yp!@|_84xWlVkt!mlX1@ zmc=vFv$E9Yh*pBQe#_4!Lh$uH-=v_KQ!X2$T2sP5_}^{v`dEOHobM)(U)<0iUr6Gf%Kue@a`K`FJe z$Zdo66xxDg^8lnzE~)PWw87ruj==+u)Ts#PAO z*9DV&+Gi~iSGCW~@;rT}+Z7)Fe-dgH_)J+y~5}kb5c=0k^UPfEb>-fH>fn5I9 zmY89H=u>Bt5v&;iUq(voVC~5Z$F%U_If2()T(`jEub(t2P@2P0Yxv-W=O3X`QKfE zKupekN4b5xh?B_Ux5{d+sdb4bP93MRq^$qM4^KqSVgwTLyI20Nkgh~PC5-8@*2_2v z>-?=%!D}tzw-&f6d6#kf@IeJ(o*6I?I@mf8f_uO65Je4)l_ihweE&)FnMtFVqkQvz z&{qgn`S{W^YHx}4d)wIafEhpZC8it>_9%rUW>}ICrZ@@WDmazinfNMWtyhed6u?N0 z3EyKVbyqlO9Sm3LHhUPbDyGM4&#$4i>hq7vDlWI?_p0Vwea2d8;_D2H`Fr?!i1tCLP#~?sR2ublmCWtD?u`@S;c226 zNo2Mn0y_Pne$P#GDpXGtA|PlU?FllCj`81=PXMr`xL@tdhmZ7o_PyLh0l%ey+G{P+ z{e^ur8Wl2c7a~TLQkWV*>S;2BK>YsTKTAWAMEFdOeIkGUGZHtQ#m%Jg>J8?8bOJZt zsk1^6zg0FF0|8!Z!CdVoI@M5evS{9WYWGhm6kM{Js@CdlDix1|-~YGfJ6==YbLF?+ z%baqx%6P2>y1%d=C!JQ$1Jvte-!4R0X^=355Qbi>5KsXd;UU5Z53zIxCzHmn*YO*5 zMq*!OwDmF|@tTX;eKF+2PIYd)xPIhrZCmUz&CyU{Au)2}#gIA+@Qso#vAJ}BYQ3ry zlu3hx+I1DOzs!e~iU??x3{(+-pnA)ZA^u7vv!4Kv_T)z7U2dULP%9S?zPj1%M?gSBlt*#n%sQH25 zrTt+IU`2fG`YLW(@4ZpStJlfAU5Grl7=(9BTH`8GBc^0+pWg1;NNY-1wXk<~d<`L3 z=Mez@iaJLaPVUh+`A=bgK*Vrju}D{VM{W;D!FcVtb>)Mv@nCCVZ`d-IVT=26=M3Q> zh8=IZBo-iU?0-wz2~Z-L`FAdECX1WN;MMDRjT-&`Gkl&PxQQ<;l?n+$P27yFe9x>u ztc$0RC<*p`?J&iB6a>o^j}!m(sPU{ohVkli=3d*h;MQoc&X2*vg<+nrUSErPaJ^3U z?OfD@O+!SRTId_tv%A7-DG4)arUZ7Zb5@B^v{k^)_+60)A`NZT-1ym-9%Jv`wIGHKj&mf4#`WHwI~6Ttz7ADP{A>;`M3-x$v7J^S(z$`#e9IQhzv@RS%LU0-M2 zWEYV`7FB=vnjNazq57#RF`c&kS{=V$CG*Q{Btr#ziG>qlPBiG{`eEkq>Es}>V5Lvr zs*Qc!T(d_B!nPT{Ksu6>uRLZw!eX5Vits$ZloUa>(me?KnPT%?aq!rWw6Q=RwFS>Z zXo_y;1MIf8dNx;0cn!~v7r|pT z!g`cO*XPnI*Mid58mDp0P$p}Ryw!V4*Vl9gNaNRPc=Z~&Uu2bs+mq~((_t$=NU{D5 z&qh>Vu5aWxk&~S$1(0i=D+nIDcZ9?jo;Im(#&Zz@Cx|E^BfxHuJ9w(xV)ZgoIz~It iB7FSZjPnNR{{I6WFU8GbZ8()Nlj2>E@cM*01O{VL_t(|+QnOKj9gV2 ze$LsM>{fR+wa&81LM&-4O0AOGIzymQtO$u8w3}+IV)$rD)IWkIk`QB%#ILA8>JO{2 z22luLFawH-n%EdE)Y)t>@uO@lA_luyxG8mK-Rv@R&+*5;XZqfE-g9QQ7Cgz#+fIjx%sb&S6 z>MhkatbhPi#tf}|krA8~S_?wQ1P6dCcP#YPcLU(@0a;M;Y?Xb41yU6}dxj%_DbX?j zv04TMp*6wZLt}d}KdpHHm(^PXse*Zy#Q`?q{tSTQ%?jQ`18N>Z8q6bt5u6pe3Y<9) zg1?(q+$f-%0bqTiSpk435at=h4QdwunPvrVB3k^-R{yfrJhoGo5K1rVVXM;_wWDu0(NCXlO!VXV;FJDJcvqH+d6z254A z5K}aWxnIs0z{fVn$qjl%1q|JLwpqc2^_JStuaA+6*a3nmZDqAMBSv*2n2=I~RKIoP z27^1~hBBy_I}k3gi+L_W&-bx9|t13P><5 zc8vj^EjeK}a@OZ$+AI9J^eR@FyiFLlZNw_0cpyYVGNai5O$B@( zhByFk5OyMF5HG5?Fq<%NUI9!RNGPfpGmIJwApW-GB0e2TlBBJY_Kb$U7dAt>Kqs#M zNC}rugu6yCRrcFNT4rQ6sHp&t1rT}B(+%efx4ff(;^%uu3_VEwYY6vbl;s6A(9 zsL!y~!g$@w;Joz9@u3N3(NvXz%@4!|{}4yI3rDOsjfo$eDX1ArUZ_yF(;nl}KPoL?y` z9i;ik*irBTxzMMHu`<3+Opu2ZevVBH#Dt#`6ZqIJ5(&y!fwSU1@vccaI2)vmm>4T# zVyujt1RG)zt2s>f0t@yFG(R_;A@mpRJCTlfq{U z?E(-F3E@9RK;B0lhxgsUK=@RxitiARu>x)n2*06%h>f_uaD7-zY6t0|9QaFYwYlJ> zAw5~`y>8)O~cJ0Q5Ls~@JGZ8-z9{%0KPha;KQY2K)c*= zDj1v*v9@dGQ~`jLTTE^J6>@vI$)9ApCI2c8}FI{hbmD(S3!x)5*xwcmu1YSen9_?mYtZz+cu&J7$R`8Go4QUIc z&i}ug46|>h$Z%q;j88KaK}-cw>7*7_b#jl=kSSR1R~rcK9r{&)eWVa$bA?HMiXiPnEI~4Tf}&C`%2i&_ zXU}v72Vkut{9+@+UN-2#S{2zsy9>f{$DI=pv{etx<2(zMsfVq_Zs)q5%SJX?yIvp{ z#f#lUpAVDpK4E$Jv6t!ExmE?f>OuHBh~BBW`N+0jH|O~g$!8U+gx_&x_5a<-x``5h z_8t)^#bSj)m?3G;Q{_~lWM?8h?kVx*!q>|F4FJ?g zcwQpo!he9M?*`a+^wJG-YndxsTAW^aVn_LU27){WRS)UvvV}Ho+hDQhy7Rg#A1cy8 z`1h0XO9?OMS_(oNRt#}Se|hP|PLNaT2Q_j{VRDcDrydeY%s{65#naC+IH)%K{A4b~1@j8C1ZxaI&Jpg19b zGb`NECPvFtAf?^Q7TWmibcP(jD9z=?CD&!b9DuDm*YyNBx05YO?SA{<24&IECidLA z6Q#Ze#S9PDs`!XfiIrPaH&SBqeNjTwTpR%0LY_#=r=A z<`h5(-h%IFdtMO9BgGI0V7+1l|JhiXRD%Uf6JupOL`>MgY6p|V2x({bPG{IBY=ta} z)@Dxi%nbv?`*M%q_QW26h2ke&A0y}ohz%|jARMF3j9iHw_6g4sD#F`Hb$E<2%+w&X z@ezx)!xk@1tt`N86vu=;0wfHf+0UxNvNZl?W%d6~Gz-r>CN?B?i!HThg*~{4j3HOK zqspGc7Us(h8P{@h?h^mJ zR>d`JLqhidLx8Z6+|`gUn4$k|Y?oQ4*LlgcO z>Am*l$ot4p#X``nJJ%J|;kdOpZmlZ(W)aAQ`F)%0ixnymgdb^S=vUy?cDxH;iFF1D zeq7?{uz|z*c?9OJYsU*9Xi?n7#n~)C}EXDGVRA8p5Mqrn3WNNe*Gmehe1M&e>AvH1ik`DD9 zSHQf0bTwBdnn%WzzzkBMa*={>Asu!~T6=}!37QmTd8Ky9$1o^<@n!p@)crndGh%KQ zz^I@<`lP>B)B`P>W49>k(fh@g99-KfGvXyq6j`-!`WY6nS+??WvLQm{g2m{+#KK^0 zKT!MN(;)Ky0>4&hdl|CaWFU8GbZ8()Nlj2>E@cM*01UfHL_t(|+O=DIj9o<; z|IOKRcklL*ZMKO>{lhF6OiVPi+e)P<;v>p4NLwB?R{<$Vam%(rNm@$J?slUkg9vn3JjCe;*+)LTs;$F;}a+HcgO&6;|$~P zoQI$J5}zSzmVl=Y6@1eNx180#nen%kfSG_~`35<7lK|f_+an*5;5Y6(q0i{YA$>e! z5}7IiAjHWKsq&s7?fu>xO1Vgq;EM$s&BmQ4>;vWhAC*-5_O%O~ez5%X5YX9)`t&sX zLIL&Z>6j2J5lUYYd|QFJ2gI73*^hw~U+u8GHv)BCDVB)x-UK{=_$;r*L|k984yrcI ztrFlARR^&0?xEDR-c=?2y&R-^@yyGQcXkTU5%~JtxiM(JP>9dFwr)*`m^)WU2>~q2 z$PL~+-!A?{EAJjcdG`?JbakP1!2<0Zlfn%H>1dug;QI8m02G0@9jn%_r)M)vI^X!X z?%JgLlSgbEL*-rBjKP=p457Ry0X{W32>{x;b-@Bb0?!7XNI<9zAevqO)G73?D8WB< zN}G9A4dgY9kBjG5mNf9@hiV4+Vu5ArI!|nn1TK%(wl?xSr>je-rK;Kyc~t*t6&N2! z@A4ABk&rMxu8F@1ymw_Ot;^i52Bt9_yk$N~nzT!D##`Ik@bHEWXl-kYf0O403xrBW zk~62P%i*lfsGnp2ql1F-bA}sSQA#^*iwhmRHHicz0h7~Qj|3m1Bf;{%p?Kyqfk$Wg z?CH_b_}!_oF=41#$_uavM?`asdoc<7z_!T(hi9KZ7|9j;aQKpL;uwb*{m&&NcYYS$D)zVzb)4*OqX4 zbQDu#V{spp5mar#>CsX2URT1@*jRjxB7@<>Nak5a*h~4;talX32Y)yp)93U60Ork` zr#)V&Q~&_M-9hFAmY*Gpjh!h0r$rlFj1Vzw>F5&dOn~dB4QoWI}C{ggKhn8 zOjNO0OaV6uAQL7L38}5LM)`bzdaI(2%#Wnvl0&n!2CSX=XLYdpcTW(pvM8AWzeW+9_n3$MAtyaV2 z> zTwdSGMGFlH2@UWc>Ef?Tz>gSET#_c?K~6I+?>W}qL61&Co)&}e?b8W1B~7;b6wx*% z^F9K6aS3pDq8bdxBRBZV#Xv`^Xdk>rv(^(ClpV@Ps{qzAw^#W2=2Y}&J1Uh5g0+2i z&!hgn-x$YT(ami|3y3x|V0qcFXO z=|+*|PmXFw=t!C0$r8g%jYCz{^(?cx#qbZ0GX3QC7{-IGL6x_3KE1}dXRWzvI3 zbJ~F0`?6zrW=Mi*1A2{@AF)XJ8kY@FnU|sPYEPV1iKqg&%@eT#Q$tVbmlH9_@&uJi z#UAaM2DXO@y92`;spHKdX(B7U>Ttq}swYo&)4_%M(bb;fd)2HE(?iqfXm4*Pn={a{ z<@bA7GV8W=!=skjzin74jD#6d&@h4!3H}z3j?<0$K=9bT@#?TxENV?#^{wtt$Mr5E z8XQ=oh<-=}Od0t>Kl7oGFhn=DKAYja_&Rm0K>ap@~K~00-|dUrvnjFJOKo|v%$xDU+Q<~7nvgn%A2R$ z)ol;+xy%X1`99X%t_(veg1t?EU)8VY8BN>b$~D@qGk29PjYlL?ea+wIc!6R&*w+O3 z8~W+A6*I1R4kKq0X4@s^TIWQrHQ68V+eNgvTzLd&uqYT}x=TWn;IAi)9tfk#VK;PU zcBo-_J_PVxi&5Xz9ZP(+5wz{Q;|#&Go1A{$<$h9XWK##*M#!0NsM5YGlcFzKX8+P7 zmb5r?hR@{euk25U)Q+TT%DuYw{Dcn4xxpd@Pj%-Eg*hE!2ES=?_CrHiQ+pC+LBmp& zcI{_mgmiG^+$DCvGW*{;LhDtA!6aw@ngL^#DEnf{3X&T|4tw3fDLqv7*cRsR?uO^o z5lXB=Ab4R0x-Y@Y*dD3@i%fgSj5Pt0>xTFTd+*IonIn6`Jbdj4&Cc%@xjW7~`&SJJ zpeg-lju~dgS@l3H_B#1eQ{F)s6hlgl-N=Q*Zl-|D27xa3Y-g4 z_Jjh11g{=-rsM=e02htuQlOU0UulSFFk}e6v4yPsW~xDGhsJ@*pJ+%OMF9goYQF)+qZuh%hW z&K&r@ucY+EJ>U1S^xX?^@H1}^hEeebYM}L!04|Btz+W*yCrv^Q><{U&pZF)>e+oGF zUrBx;PKc-mvv$Z`dis4G__}X(gKD-nRrENp3Bfl96cW_!EJFN)SMP~y2&%rv;4d4{ zldn*`#0#N&?A1en*P=-o!vUYi%>S{jSA=CpYWeGu1bpzuJ)}#N1lV?cxDIMBVGRD; z1MWl#CrCJ>V38QU(-Obq$5!*rI=v@AEjwN8>q(HpiwG*0XWE2j4r&u+rBXpqc#-x* zp0QEt$`;^-MtbaOad&?MxLQa;3s$uRc#8mkkq`VW6#657tBaF&76KiuIC%CkEIs~7 z%^m*C`3p8!66T#u}%f1x|i1OCdBv0u@W z{GJurggNZru+=?F6&giHV7cxK%0@9lZSB!A0q? zSvJ)ZT;8Hrj4T*^*G+uMPogbZ?HSR*OaGcj9n6fd+!3l3N2Pjwbqnz3LZGUAOP*g} z2z=#8Is`VO-^*Gu%YOEJfMnDxd%+T1EE++8qX^#FX#JiGFaQK!-lFFLE*t^gTBw7M zLtv&PP?dy$lH`ta5ROS^*k9l{GOb5VRRD_%NG+ECay}hbpMO-Fh2T&3q^vp#_`)r8 zI^0ZfyuFbA?y?c%Jt70*Mb{40(-<#pQ6!*hsS4ZjZ*mY{IBH~#7=k5RVi3WhgpA;V zE$O~gDYK=&FBlPa$CQMIQAm;T1S2Gc!Wc3zJXhehon2ZA`aR3+fBtCNEyc@NrD~%F zJWOGksax#0y)bgfA_YrF=-5D2C68Ewdvdt0*xZ&;kstru(R9M35d|cnk^Tx9kz$io tU}8tAxoTW&S*%gZX)5_@F1G68{9le&bNgqZL0bR-002ovPDHLkV1kVfW`O_z diff --git a/mods/runes/textures/runes_go_to_me_medium.png b/mods/runes/textures/runes_go_to_me_medium.png index 8ab6558e8d01202900d7127e9a3720f1af616b8c..350641bf06621a162be37ab293a9769026a3b157 100644 GIT binary patch delta 3208 zcmV;340rR_8oL>gDlz{6{{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j2w`4G1AKSCV;=TP%McNkl7xZ zAG_Qup?jCTcaDF|oSAdZeCN#ErA~4(d*^ZH{J!)19_Rbc5*mLHa2v&d1AbHhXg8RB;AfY}Js@gwW z_-cnk2Vzj)?o1dlbRY!}AUVrxi6Cz6v<|8^EvyW1Qk7;vcQj`dy=3NPC++PK=oox` z{`>^AUn(W%{X2K2f|x%)VhJ;-JR>)_exaTIT(b#4Sbl#Cck|2v*Qci=KrwjRv2N>D zejs7mdC%jzYm@Fz9*J=bm3L*c4PJdlGzXRwq^ETj&#r&&9J*I`!asLTn|W0Y9?Ay3h(S#lV7@ppf$mkEfIupQi3yGVCh+bxoje6CYG4|} z!3_)TfJJ|k>HtP44tqj4uXaTM@jVZ{WVpfAomt0iaiN2Eq>-Q$z|^$RBf-b`NRUE; z@I<~rENU<*;{_wsFn|C;g<-%ENx)Xk zJ7koS<&DmjTt`v?CaXa;|Z0j{tsXtQ2D* z4BpcYU{A3k%9eKY?4GbEKt*hW+AQM$Bb4$oM^f|&X7;NWfZIl*(LXG*9nXJdgaQD2 z86lYIubiWLKGglaS^0U$0MCs>W$ac0Xav~1G#-e8bZM^)jh2?*nTsABL>0iDUKA^k8hT2O3F)PM!|gu0wBEOrJwqhB_O)xWHt~n=?NfsCLe!%qW7JB?))M-f}o;# z%KaVoFki@=V3O~ne4TNyA~?_l_;r1Hp3$@|u3V$-I=QQKSv*lP)z|!OffqPw2hTSF zer+G0wj$%2=P+`nz-+t3T`=q7NdW@zawFMz7e$TyAy=q#qCZ%@2uOKYGhLf+eXNlZm80}E0dzHSZ4p4 zQA=8!oZ&M&`)m5LA+;l^nsKkLZ7`vOIcqH}c)FutC@lC8Gx$xDvmYADn%R>m3mTTH zv}->jG3*d1xJ&GaW%j=@%Ij5*!DMIumVRTEDElI11u1`wB8R>1;A9V%J+_7U&vd|Z z>Ig@x5C{&8GyIB;KcJIAaH_{u0Ro!>2ScU*M#Z|skN zX7ryNGfc)=^+1$(9!&@)Xw^%+UV8hmURXkHGp!az3LU(> zUC%73wLpJa=_eG6ijvCERTdWfVM$g6nmsr@Z8&_mxx8+qtdQWf3{pc1N3}0fodoc* zJG}Rz2bn2qn+4Q{fma*F_U0+2@N&6~*4EaDriZtufErA|!_k&2xE^G{LouX^pddsf zlxM>Tg9NW0by9MIA%H8#bQY-P^4A(sG#C4Z!R5+&utR7QDKh^(IbthREBf9!CRzV}G_k z`S*(reeCbQ!GcFfXu)^AK$GI>OMvQI+0s)BfOkXSQV&Nzc^oU=`#gN#2N8jYP_Nf9 zZ{B}A_`a{C^rCyd?_UNfh{=w_pk{W`l?+N&8 z`}O226fbcobdS9{40tUX%Lqq&kx2fJb-jNgEIU%mUstE#gX7y+mna2b+x6i(xV?l4 z_;2>R6D5KX!g&RY#Bg&<@{XTa%@cKgPk>r>y2{s+Af>|yD%a)Ogk}zI6J@1RK~Or( zdm_)+D0M>%aHx?TyIR~m*Z^*dn9zcCEdkzSz+dSDe+wi1k-yc&$=i#8wploO$!UMA zIP)>h9soeSUPrxNhwuA|U6A)nrINL&!0YvT1b)%6=;C`H0X}g?kF2E9so`(2CB-p zrqn`z|s;ji{-yu&d1f4pVDR__|t#3j8$g= zUopU^!_5T8TZ{Sct{gMoV=^FKeC$tRBM_7OWWKV*^Z8l{{t%?#bc0Vsl$YMSlDA~j delta 3365 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 diff --git a/mods/runes/textures/runes_go_to_me_minor.png b/mods/runes/textures/runes_go_to_me_minor.png index 8ab6558e8d01202900d7127e9a3720f1af616b8c..889a60b91aa92bde7fa0a03d57a9229bf408a3b5 100644 GIT binary patch delta 3051 zcmVy{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2j2w`4GI`uWO(zDTPuGHf=NU{RCwC8TWgG6RTci$nRDAaZIfx*L?!+(QiF+!hIU$8 zDT?@r@(iLFsX?K(BGoChK}nnrJ@bl63N5Kk0Es0H4|zz{TA*m8ttkO#I#V?ef{BT- zvHGL-UQL-h?Y(FF-^uwd z3ScfEsoEgNZ%M%SEezOOH2A^2r|lViC$vwMOd^>Y07jjBDy6CmNrSJ~cr=51Ps{IB z{~wby-yK>fR0)4rV(y{x8PMS8*T_F0>T+h^0igsLaK#9MyT%QOYmB{%fRymAZf28v zPIW5)A6Vag9?dCpa^vflR_{+$5Mr57ofe24#zK?4vH4v3eehvBw9Pu2kU7Vg=~EiK zd5`K2EGNi-eOc^zh!ctu2Bl;(sMn~vT6b$cRUB%j0jhrsbyF4X&AINHf$I#%H!PL= zRb83`1oNayK7i!TE%l`QttCES@S%!kAoNQymD|3;oV6)PKx-h1QDaIPY23uj232y9 zUNaB|r~(C2#M^w8NKhgS!hcC+L72*zpC?$89CyaQl{3P6jc{_wChL0bue(`oG2cy! zprDG~mvMgpD!cq2Qr;VV3k|B$smg?K{=xwOz~aS=t=k)o1^^(sE1DY>uS$f-CxC9H zS9VPSAO$Ewv}3ykytlX4x_xG5#umi)hI8Q&`E~m3XaE6(2BQIUrIyZf(Y-wIdcAHl z#a2rYL{yY2QR1tpOTeP#o?$eg+nHz1MfYtNfzN-RKi`fFv$LWgqVEoS{mYy*fXuI_ zNr3?DOgq>@yp5?Y!0$}JOTZ-!-~^Egp^ymCZk+P(h4D~gh9DqTKpVi0^wRf}({?_f zFBQZVvR@c82?lBX?o3p@UM~Q51;8duQX#O!h76?EZ$l3C3przMv2{ zwGe+y>dWzQc+NA23A)v4S&h5LOJoXck!(H!D)N&bq~M+R76q^%6~Znh(_1AhVA9{w z=3z7%4b05Upw((&c6PP^T59^n_osWc4!bS2O?FKKVS#7k`;btt=yPMZKWlRql_ zczc2UNk^m6K(u*Sjy&e?d!2FInO@wX@<}o=Ty#0mJeRcFCsP6ZgB11};DO|Ze;t3b zUjRc8rakGG50IR%2N3PqUP%Daz;HFnd!ORRp~nXY{JYoM_?qW{fk`7PTyWc~faXO0 zA~=q6p>uAx0=`XlC`^Sge&-SZyQ>vZwk*Nm&VT!Jkh=`<3z>Udq10D->H?22v)?=i z+&r0#{sC2d@j^x@0I-JG{N-&cQ_9}AZYm}pARr4uc`3HAo(;kq6vTC)*#^u zWKvIMq|X$a2jC)r$o5f1O{4HH`M!;PuL|Kzlcgq^mbm z?X?Cep(dFQXcPEyxGKRFXcJHXzATu*&-%-2cWyDIlg>N?-dyoz;J-0!&|ONKGG^1s z3ZovtiQ05!%*ONV#IPPE!xL}*9)UFXU-(xZy8Ad5|e+IGoy+Q&1N!$ zE6Q|JVa{rU8sHZNEqJP*u|IifTp9e=N91yxSe#M*GMxUtSD5|vlh*TLHz9*fl{-?6 z9`l2@GCgp#$m9-6uy?a_Wu&|;&8WB!K>>uEdis;EMz^@yz^Ng-<@#Pw&^Cagbc|1unHMHVw zg$FokM^AMD{>BkLZAH$xz~kgxfl0f>eCwPvwC4K*e!YTMmuseg4y9y>?2v>m!GDEu zdSINYZ@+mdZts7Zkz@|iM##BtsIvOi zNzvzo*}q~+NQ;w~KC`ob!$^@*dy=Y!@ao$J6MHo0MnMZ6>#segs|{;naUB2BHIVuzd|)b98G$H^JeCk#&}Ni)S|CJUI-W*>GWu&!)#!z8ZNH>uuLP>? zrq$xaprdDp?97r`3nb-4h!R$mRfaATwBUCuiYCzQ!P$Rl#}mWd<#i|53Ju=MAa%5G zO#h3xvg$V^e+JfJlJJm0Cj9nI8;-rn9sO%D#`fI1A};nbEZxbA1b!*HaA zppxBg3V0$;Flg}R(Iz7&7z4O;+SUTIT>e5QVS_Ot`pg(x`7Jer7{%SDT;Y}B3ehiZ z@R@(PZd88|A^}gw#d5gGZpo#>F@Uv(5X|~uAAlFzrF#HGEqH#2jV5K=a-#!7R>ZNu zUpp#q)qSR8kNwS;Sn!AmJ@{G>SyDWC0nmJNBN{ltbqM7Klamq z2g3IP%l>I?_zVkNyfxu3J^i)~d^!}vpqcG06g>_NA^Pm7Ap~43+h`1k!+X*K5iJ6(1tTh@98@%rC z@QNaB*3FCrSM}HxBLQRRyNHj4Ios0Jo@pDrj;~eB!OaNk9idinRGZf)$ADwYfu?`a zm;OAm9QedkkpjEy_sX8qvY(s}&=PgaUJ%H|ifKeRf#}siu|FSR0Ej+5X6FGenFd~7 zZiCM#u<;)TWh4ZQBzKmB@Jupce@$WPyv>@L09MveSSOlhWU-rxU;9YC^{;q-Z`tjHYlHV*=slH6`urvQp5m3$y>>6UDHUEo04p zq9|s7#yK#yY#tMW7Oa`(xq)d)0kZ@T^l*LLT*|2E&Odabm@w(U`0o*u;fXKZTSmTz{T=LajY_*fm{{jD2{YgW(hi3o)002ovPDHLkV1mzU*o*)G delta 3366 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 diff --git a/mods/runes/textures/runes_megamana_majorsang.png b/mods/runes/textures/runes_megamana_majorsang.png new file mode 100644 index 0000000000000000000000000000000000000000..95b8430a3628321f040b1fe2ece506d4defe10e6 GIT binary patch literal 2509 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 Ud9C?D761SM07*qoM6N<$f*y;cvH$=8 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_megamana_minor.png b/mods/runes/textures/runes_megamana_minor.png new file mode 100644 index 0000000000000000000000000000000000000000..0c27c5461b5ee7f9f81029de33dfdd57711c84bd GIT binary patch literal 2541 zcmV{+P)WFU8GbZ8()Nlj2>E@cM*00~h^L_t(|+U;B2ZXCB2 z{y1JaMk2XUWlN45s}8KdksH^o+oUeAdox8Jp%2gid*vtCCzvPDm4Ng;8e}gr+s0}B z?IZ@O4P>jXBFVpz?8dRQJiVBiU6OMS$yJ0TKulnvU6ONn&d2k|!;xAB2tVPL;3wXm z0`L@o@1eB^^i%^(5ZVJ`L2>(Pzcu}M0ch`$_1F4N#izYT*0?F83lIwe{m3=I6;A4_ z0I9y4K#c{+0hm}2fcBF};$#cf-ldwL?#G&=jlbrn>T@*70+?j83xU(v_ijHSEFV@Q zkjNg(uk;R7Ra?8x8heE0hGKsYzY{YyAS@qJegN8!3Cl+m+K*|7e$_W@8lr9H|LP%o zY2mv|Z7i2x>7jM0X{|ZbAjN~?nxY9x&;;6#9Tl$neDlZ<{vaHdv3~Z_f~-|k-vrk8 zFpf6?fcF2K$=car)Be68uSagZ)w0$yRl)4Tb*>G)8l2B;ODK0L#xQv>#E> z7Ds544HUyj{y`6SCMN37S+rHX&uGW?_RxC08Q72juby#*hs^5APY%E?hosZ!VjHX~cvx&Sqy0fVXJ_h*}i*MK?@*-9YeUHw?r^%G-3zZkx%|@d)1Tq;;@- zK-^7@Oz>2>fJFROT2GMvo7!5#Eq0;{e3kOfFO)x!0i=(&+i4xR+i4L7eL&1~fqN+w z4!=#q1zh6)N%`zdF<$jWLq$zyX$|??hmpMyaWXU=;d&pfKRsdT4NXijd~tL+zfsa^ zSi)DtZ>IH_?uNL5vtR|*sqSczA>te1BP;6{7~wZO8l_Q>9As$8@or5U8kX=k(zu*` zz$87&0HOxMhTr*-aISZS|0BSlghgfLkf z0=t(L+H(Qo^evrLn8Z{8g3sUh=xHbHNxV`RD23JXETG1)cjYOanRS5G95a2Z1vH4xf#wJRUi}!EvX^QskMZp7R-WERpa@g@BrSpx8}b>L*#Cf5uqrc z{^SAxM}5fS4}2;CBE00cddQ~j z-M4Cip68d&DO~=d?iD+C`)Hl^)CiOiUVZbesxW!(1wy5BIO!Ud_j$$JH9WOL*TIn|jpjBEvTsoMoVgnNZJEb^nvQh^m2dTs9bFJl zeoGe=E?*_~Syc*136P!NvF-n}snPfQeY8$B<5OP+;7lpcmt0BAy|%h&R9`N1flrL1 zv5q(cXr}yK#s5$F*IBY(@6`Gh@G=0Pj}>IE?x1sRDqK?Ie8(9>o-)~i?P86tOUJ_PgfCPtv8MsMjJKrooFi(?}*1Zxb z&x%_Tb5Y{@Kd?c_za9x6+Qm@2{Bda8mdrnC}~ElYd)} z_W*|BDaOJ1=K4&<1kuzSvmI^CA-~^?D%gw;Lpo65)%D#EsdG$R5BUl+F>>itnj>nB zj;v^DK;a$cFq8R1E!j`-MeQJr^u7AXX=4a+|&@$ z+iEvsgdZmoNE+k{Z*7+L?7SmaA{IXc+i6h~+xeylg49gs=ga$du{#z(Rs?viS-1TF zAW5*=!w~d=AhlTMH-U+$gHcWRBh7f*H#A-0t>SHQ@sdHhD^x&!h>r^2XWPy<(R!vC ze_`U}2MT}pyd}mtL}ed8^NHRM3P9^{#M`8vTcZL1siMkVFDnBWjq%FVQl=?ft$Cl7 zZkL%#)Nst)yps2Z Date: Wed, 15 Apr 2015 22:38:51 +0200 Subject: [PATCH 27/54] Added solarmana mod (first version) --- mods/mobs/sarangay.lua | 48 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 mods/mobs/sarangay.lua diff --git a/mods/mobs/sarangay.lua b/mods/mobs/sarangay.lua new file mode 100644 index 00000000..63aad544 --- /dev/null +++ b/mods/mobs/sarangay.lua @@ -0,0 +1,48 @@ +mobs:register_mob("mobs:sarangay", { + type = "monster", + passive = false, + damage = 5, + hp_min = 40, + hp_max = 60, + armor = 90, + collisionbox = {-0.9,-0.01,-0.9, 0.9,2.5,0.9}, + attack_type = "dogfight", + visual = "mesh", + mesh = "mobs_sarangay.b3d", + textures = { + {"mobs_sarangay.png"}, + }, + visual_size = {x=1,y=1}, + blood_texture = "mobs_blood.png", + makes_footstep_sound = false, -- to be changed + drops = { + {name = "default:desert_sand", + chance = 1, min = 3, max = 5,}, + {name = "maptools:copper_coin", + chance = 2, min = 2, max = 4,}, + {name = "mobs:minotaur_eye", + chance = 10, min = 1, max = 2,}, + }, + water_damage = 3, + lava_damage = 4, + light_damage = 0, + walk_velocity = 3, + run_velocity = 5, + view_range = 16, + jump = true, + floats = 0, + + animation = { + speed_normal = 15, speed_run = 15, + stand_start = 0, stand_end = 19, + walk_start = 20, walk_end = 39, + run_start = 20, run_end = 39, + punch_start = 40, punch_end = 50, + }, +}) + +minetest.register_craftitem("mobs:minotaur_eye", { + description = "Minotaur eye", + inventory_image = "mobs_minotaur_eye.png", + groups = {magic = 1}, +}) From 948f8c13dfb329891c62602cf5819d15e92bc39b Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sat, 18 Apr 2015 12:18:18 +0200 Subject: [PATCH 28/54] Updated world.mt --- worlds/minetestforfun/world.mt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/worlds/minetestforfun/world.mt b/worlds/minetestforfun/world.mt index 5bc55857..fb46a788 100644 --- a/worlds/minetestforfun/world.mt +++ b/worlds/minetestforfun/world.mt @@ -194,3 +194,7 @@ load_mod_chatplus = true load_mod_future_ban = false load_mod_textures = false load_mod_snowdrift = false + +load_mod_metatools = true +load_mod_connected_chests = true +load_mod_solarmana = true From 21ac2da4ba4f969b38051c6ed4eb991c95d84700 Mon Sep 17 00:00:00 2001 From: Ataron Date: Sun, 26 Apr 2015 16:35:41 +0200 Subject: [PATCH 29/54] Add some textures for runes mod --- mods/runes/textures/runes_damaging.png | Bin 0 -> 7044 bytes mods/runes/textures/runes_earthquake.png | Bin 0 -> 3259 bytes mods/runes/textures/runes_go_to_me.png | Bin 0 -> 3415 bytes mods/runes/textures/runes_improve_heal.png | Bin 0 -> 3002 bytes mods/runes/textures/runes_perfect_heal.png | Bin 0 -> 3471 bytes mods/runes/textures/runes_simple_heal.png | Bin 0 -> 2864 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/runes/textures/runes_damaging.png create mode 100644 mods/runes/textures/runes_earthquake.png create mode 100644 mods/runes/textures/runes_go_to_me.png create mode 100644 mods/runes/textures/runes_improve_heal.png create mode 100644 mods/runes/textures/runes_perfect_heal.png create mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_damaging.png b/mods/runes/textures/runes_damaging.png new file mode 100644 index 0000000000000000000000000000000000000000..ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3 GIT binary patch literal 7044 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improve_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e4766148113c4b67738bd4b19873b0dddd4851f8 GIT binary patch literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d1d2574536dd986f99271a6158c8d1b6189267 GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..25d0c289b20dff156805726fb72b7e5b66e68e56 GIT binary patch literal 2864 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 O0000 Date: Sun, 19 Apr 2015 14:43:12 +0200 Subject: [PATCH 30/54] Added group support for solarmana --- mods/solarmana/init.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index caa38c21..aeeb1709 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -99,6 +99,7 @@ minetest.register_globalstep(function(dtime) end end + mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) end From b5dd375533951ddaae94521509c90c32ae39065c Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 23 Apr 2015 18:04:58 +0200 Subject: [PATCH 31/54] Added base of runes mod - Added rune API's first implementation - Added basic cubic runes in solarmana --- mods/runes/api.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index 2c7470b7..382bc7ba 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -195,6 +195,8 @@ runes.functions.connect = function(itemname, callback, handler) runes.datas.handlers[itemname].on_punch = handler else minetest.log("error","[runes] Cannot connect handler to item's " .. itemname .. " unknown " .. callback .. " callback") + else + minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to item's " .. itemname .. " unknown " .. callback .. " callback") return end end From 276d0c46cd2012d35360849548f5c1dd350f401a Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 26 Apr 2015 15:45:04 +0200 Subject: [PATCH 32/54] Added plate runes - Added plate template for runes - Added on_punch API's handler's function - Added popper rune --- mods/runes/api.lua | 2 -- 1 file changed, 2 deletions(-) diff --git a/mods/runes/api.lua b/mods/runes/api.lua index 382bc7ba..2c7470b7 100644 --- a/mods/runes/api.lua +++ b/mods/runes/api.lua @@ -195,8 +195,6 @@ runes.functions.connect = function(itemname, callback, handler) runes.datas.handlers[itemname].on_punch = handler else minetest.log("error","[runes] Cannot connect handler to item's " .. itemname .. " unknown " .. callback .. " callback") - else - minetest.log("error","[runes] Cannot connect handler at " .. handler .. " to item's " .. itemname .. " unknown " .. callback .. " callback") return end end From 0e2de4f1bef8c30315781c90dcc86f737df11617 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Sun, 26 Apr 2015 18:02:15 +0200 Subject: [PATCH 33/54] Added work for "go to me" rune - Added mana dicreaser on on_punch calls (cube only :s) - Added is_owner handler - Moved a texture name to the good name - Added values in needed_mana for go_to_me rune --- ...nes_improve_heal.png => runes_improved_heal.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename mods/runes/textures/{runes_improve_heal.png => runes_improved_heal.png} (100%) diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improved_heal.png similarity index 100% rename from mods/runes/textures/runes_improve_heal.png rename to mods/runes/textures/runes_improved_heal.png From 39e46b06b4ecaa056125f7c976ca7887d49bd235 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Mon, 27 Apr 2015 13:57:15 +0200 Subject: [PATCH 34/54] Added triple registrering of runes - Runes are registered three times with tree levels : minor, medium, major --- mods/runes/textures/runes_improved_heal.png | Bin 3002 -> 0 bytes mods/runes/textures/runes_perfect_heal.png | Bin 3471 -> 0 bytes mods/runes/textures/runes_simple_heal.png | Bin 2864 -> 0 bytes mods/solarmana/init.lua | 15 +++++++-------- 4 files changed, 7 insertions(+), 8 deletions(-) delete mode 100644 mods/runes/textures/runes_improved_heal.png delete mode 100644 mods/runes/textures/runes_perfect_heal.png delete mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_improved_heal.png b/mods/runes/textures/runes_improved_heal.png deleted file mode 100644 index e4766148113c4b67738bd4b19873b0dddd4851f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png deleted file mode 100644 index e7d1d2574536dd986f99271a6158c8d1b6189267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3471 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 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png deleted file mode 100644 index 25d0c289b20dff156805726fb72b7e5b66e68e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 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 O0000 0 then - regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) - end - end - end - + if key:split(":")[1] == "group" then + local groupname = key:split(":")[2] + if minetest.get_node_group(node.name, groupname) > 0 then + regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) + end + end + end mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) From 33f7ae447eccc8a52839b70f6739e699e8b13021 Mon Sep 17 00:00:00 2001 From: Ataron Date: Sun, 26 Apr 2015 16:35:41 +0200 Subject: [PATCH 35/54] Add some textures for runes mod --- mods/runes/textures/runes_improve_heal.png | Bin 0 -> 3002 bytes mods/runes/textures/runes_perfect_heal.png | Bin 0 -> 3471 bytes mods/runes/textures/runes_simple_heal.png | Bin 0 -> 2864 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/runes/textures/runes_improve_heal.png create mode 100644 mods/runes/textures/runes_perfect_heal.png create mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improve_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e4766148113c4b67738bd4b19873b0dddd4851f8 GIT binary patch literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..e7d1d2574536dd986f99271a6158c8d1b6189267 GIT binary patch literal 3471 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 literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png new file mode 100644 index 0000000000000000000000000000000000000000..25d0c289b20dff156805726fb72b7e5b66e68e56 GIT binary patch literal 2864 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 O0000 Date: Sun, 26 Apr 2015 18:02:15 +0200 Subject: [PATCH 36/54] Added work for "go to me" rune - Added mana dicreaser on on_punch calls (cube only :s) - Added is_owner handler - Moved a texture name to the good name - Added values in needed_mana for go_to_me rune --- ...nes_improve_heal.png => runes_improved_heal.png} | Bin 1 file changed, 0 insertions(+), 0 deletions(-) rename mods/runes/textures/{runes_improve_heal.png => runes_improved_heal.png} (100%) diff --git a/mods/runes/textures/runes_improve_heal.png b/mods/runes/textures/runes_improved_heal.png similarity index 100% rename from mods/runes/textures/runes_improve_heal.png rename to mods/runes/textures/runes_improved_heal.png From 1de0d4d478fc49d3d4828450af94a9ed27660ea9 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Mon, 27 Apr 2015 13:57:15 +0200 Subject: [PATCH 37/54] Added triple registrering of runes - Runes are registered three times with tree levels : minor, medium, major --- mods/runes/textures/runes_improved_heal.png | Bin 3002 -> 0 bytes mods/runes/textures/runes_perfect_heal.png | Bin 3471 -> 0 bytes mods/runes/textures/runes_simple_heal.png | Bin 2864 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/runes/textures/runes_improved_heal.png delete mode 100644 mods/runes/textures/runes_perfect_heal.png delete mode 100644 mods/runes/textures/runes_simple_heal.png diff --git a/mods/runes/textures/runes_improved_heal.png b/mods/runes/textures/runes_improved_heal.png deleted file mode 100644 index e4766148113c4b67738bd4b19873b0dddd4851f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3002 zcmV;r3q|yaP)WFU8GbZ8()Nlj2>E@cM*01F;TL_t(|+O1n{s2)cZ ze$Ku(x%YxK#Mq|Q)*CeSk3U?CC~A07Al$ZE=Fpx6W22=5c1g$h)n zawXK`ZRIDnJJS_1e8_iMr{%eBe*J)2M6R?sAmXn`f zFMON}bS;1vT`ypPb`jxkuj7hqpx+evHvj%>5l<2^j;$NCg_Xw`XYvM5fXhN_%o`1P zp?x>j!hJNL`SzxS*3EmzfA{brri}EXrVEg{YaT3@T*2G1 z+v?*6uNA;w%<6l-8-BSaq1;x>YUPf8!+d9k`}Oh;jjpX+1oB4{4=fX~pu_$eGpgtg zR~zszd3{5<-OE>dNA6FxYM=k2{iZt>;3~tmF@Onx{3N+dQUt_v1Z*)R%o`hVfn+NW zgkZGMocSL1gj#v>pVc;@+@%`r^)XF6vS*||ITxc*$?M_yOn! z;pSQ|%Dd`X^5bNmN>5Y(7#;}Ain9j1AAeH+2@7n|7z)O%_%XHJpkv~t+*`AhpUUcY z{$4f4!JWIgU^L+&a+&TJc?}QLV-tTLE&{_leD|u;qditWT&lr~b?>uXug4G>K>k=( zpZ~?<$y^3gn-TrA>9*J?cN`oJxy|)3taKB%d4ucaDk67^bUEYUn zkkiz=#LRx>*%NM1%c-U>HSn**cwPg;!)fr`05!rM^y>>%c(}g>KaLo(fP~wWJn>@5 zcs4bEyDs5-{~?nwyt^CxtXCe8Ab14{{A{9rhlJaeJf8SdI=q-^LZwM0VmS}sMtMXx z*CCt}eHme`-2i~%;o8Ft57yTbc&VOL)at}6f9?pb)&Zoy361}mg8vvx^k46b69Dfr z!XK>#UFZNm=LIAD9yg8_I3nOv_3#E*wnp*$rdOY14B6v)W&~$z0^F&XSsl`Bw`W84 zCmn+M+r+c#%jSAvh4qM<@QkC|@;1wDfbt$r=+*F4-CFPL0e)b1skQ8T3q8R1sb^wj z+5lkqQAj4)dYy+)Aj88d+x;8f(E6_;o;Iqo>{^JFwXu zcxA!xQklgDfADcSr2k4)}(4MwQG;VQI}@&lAv@c1wTKQ{Av zZ)RGsyJr028j!GB@Xf@?9@hF>jLc)SB;2ILM2#$%O)MmB=HPEMm7L2$ z65guCR1!fuEj2^XnJQ`MybK~^XkG7wK(G<$Kh9|^s|`x&U3LQSkZ8<1LduY51?q!2xQ zOv?bRMrcC_*mc#G7xz*p37z2YC%3OxiFH6}b?Ada9PkH!LInL>Mluanxdzd`TYNE1 zLK6HjiWpszi|Ji}FXqp9)(-RRARHP63>aRlA z*mws)69Vw}klf|0;fra6-}*NT;Li+#db7aVD*(T&NhohJxq7C1O5nw|0p!_d8u(sE6Q&xl;2__y^qx3%WX9VTn6yFK`2iJkiMOb2JKLa zfbs{rnX;My$e%%zg6fnXpfJ-smiof3hYz<25SL6BaS|QClN~5XplH%xzN1`uOiHg! zm~6`LW2v%Kv2^(*bDFghmM68dGCLOL@OgQDC%K@tkOL(ARx>gyI%+PPm?nO+{%o<;)jbl$>Hy9HcPda`ODCUsTsu&PrN4(ZDn$ z%*CQAE_~(9F#GPu|4U7b*hnUZ;)Ha{sY4CR0wV(;-{`^2!H*uUa-g@h40KnFz)2`Yj zW|Zo_PI5c}VC(*2eLOe}V-bWTIC9=Kkb|@4kCEL}H@zkxqp-seP(J3l#Jv>uOT;Hm zlv+#CTgnjD-E)SD3!~vJtC~j(;Cf!t9_Zs%@Zc; zb#(Y=S0=;-k}HgjUU}RBp%Fbo>l_MQmy$wl2TTU12DO?1<|@e>on=fQ{v(40sNiLs wdqIctVhA5-=FM4TvQPKN2+ln%5JJHJ0nCFWD%;H(oB#j-07*qoM6N<$g4iOis{jB1 diff --git a/mods/runes/textures/runes_perfect_heal.png b/mods/runes/textures/runes_perfect_heal.png deleted file mode 100644 index e7d1d2574536dd986f99271a6158c8d1b6189267..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3471 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 diff --git a/mods/runes/textures/runes_simple_heal.png b/mods/runes/textures/runes_simple_heal.png deleted file mode 100644 index 25d0c289b20dff156805726fb72b7e5b66e68e56..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2864 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 O0000 Date: Sun, 3 May 2015 13:06:07 +0200 Subject: [PATCH 38/54] Fix conflicts and update world.mt --- worlds/minetestforfun/world.mt | 4 ---- 1 file changed, 4 deletions(-) diff --git a/worlds/minetestforfun/world.mt b/worlds/minetestforfun/world.mt index fb46a788..5bc55857 100644 --- a/worlds/minetestforfun/world.mt +++ b/worlds/minetestforfun/world.mt @@ -194,7 +194,3 @@ load_mod_chatplus = true load_mod_future_ban = false load_mod_textures = false load_mod_snowdrift = false - -load_mod_metatools = true -load_mod_connected_chests = true -load_mod_solarmana = true From 70513faf55bf4069295200b86b22d806679a34b0 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Fri, 15 May 2015 14:13:52 +0200 Subject: [PATCH 39/54] Updated solarmana_add - Updated solarmana_add/README.txt - Fixed indentation for groups handler --- mods/solarmana/init.lua | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/mods/solarmana/init.lua b/mods/solarmana/init.lua index eef0caf0..caa38c21 100644 --- a/mods/solarmana/init.lua +++ b/mods/solarmana/init.lua @@ -91,13 +91,13 @@ minetest.register_globalstep(function(dtime) end for key, value in pairs(mana_from_node) do - if key:split(":")[1] == "group" then - local groupname = key:split(":")[2] - if minetest.get_node_group(node.name, groupname) > 0 then - regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) - end - end - end + if key:split(":")[1] == "group" then + local groupname = key:split(":")[2] + if minetest.get_node_group(node.name, groupname) > 0 then + regen_to = math.max(regen_to, value) -- We get the greater one (if the node is part of 2 or more groups) + end + end + end mana.setregen(name, regen_to) --print("Regen to "..regen_to.." : "..light_day.."/"..light_now.."/"..light_night) From dbef82b0af0de75621878d370b83150e14b5a5e8 Mon Sep 17 00:00:00 2001 From: Ataron Date: Fri, 15 May 2015 15:14:19 +0200 Subject: [PATCH 40/54] Megamana's and Gotome's Textures --- mods/runes/textures/runes_damaging.png | Bin 7044 -> 0 bytes mods/runes/textures/runes_earthquake.png | Bin 3259 -> 0 bytes mods/runes/textures/runes_go_to_me.png | Bin 3415 -> 0 bytes 3 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 mods/runes/textures/runes_damaging.png delete mode 100644 mods/runes/textures/runes_earthquake.png delete mode 100644 mods/runes/textures/runes_go_to_me.png diff --git a/mods/runes/textures/runes_damaging.png b/mods/runes/textures/runes_damaging.png deleted file mode 100644 index ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7044 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 From 8fd91ad8c21f42b11e3473d2ac0cba02cc3e2dcb Mon Sep 17 00:00:00 2001 From: Ataron Date: Sat, 16 May 2015 22:15:30 +0200 Subject: [PATCH 41/54] Damaging and Eye textures --- mods/runes/textures/mobs_minotaur_eye.png | Bin 0 -> 823 bytes mods/runes/textures/runes_damaging_medium.png | Bin 7044 -> 5084 bytes mods/runes/textures/runes_damaging_minor.png | Bin 7044 -> 4828 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/runes/textures/mobs_minotaur_eye.png diff --git a/mods/runes/textures/mobs_minotaur_eye.png b/mods/runes/textures/mobs_minotaur_eye.png new file mode 100644 index 0000000000000000000000000000000000000000..2db15886735eb58bf0b7cc312c97f01a487f1d64 GIT binary patch literal 823 zcmV-71IYY|P)B010qNS#tmY3ljhU3ljkVnw%H_000McNliru-vtj95IDyYP$&QZ03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00NsyL_t(|+U=W5QUWm$ zhP#vC)=PLE7Vg-44Od>nJv$ei$4j_XAugD~kRoH!FG88FqM&$W`v2zdA)Nrgh!G=3 z{Nq52gTxpkDLF*-{DOt({eI6LLkmW*5PditM8}qd5iCSg9bf??a1*H!E#ZKr95@gH zSA30VX$MF`2wd^kb^sSb;EM0T0UQW{E4~*8P$2}a_?{d%BFueERy$9!9 z)%{W#h7i%aTa=70fJp!{KW|US33X^k@|aIZ3isv z0o0^iT>{sDKy`rVkEEtD07Nv0KyknVQ`9ttDU%p~V3d@y%a@)(~nP zKow7#2UtR=aR5g=c_NfUNM?@F!U6eJo+_R-6HFmoN=yRAl4uF>thI`)UpPT2yhrp; zQ#Hpl1E7_d)!1r(OOr@g6R0|Xl91Nx%!m=X@dKM7QxJC9mUI9B002ovPDHLkV1j)x BRD%Ej literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_damaging_medium.png b/mods/runes/textures/runes_damaging_medium.png index ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3..0d0edaed7c8b5a1bde35f2c7148396a46b6c5197 100644 GIT binary patch delta 5008 zcmV;B6L0K6TPuGPKuJVFRCwBzTYHq0<$3=-GsAY7?l22` zfnD~>vWVic0&`kD;&Mvc^U2tZe{_)qgde8>FV{%oH0-kbLRJFu^_i?1^K z5P{WRfVi*sBoG0t?n9i%J`?MEX8%Zi4I*FqjDh7DTb!QXZO_0A{&4i@$%X?-4Ndpdh?-Qn|BV#eqKvMl87s%wj#cxL8v> z4iL+w#G2|87(j@{eR)Q~3PQLcnD|UOg-BL1Adm@5&LXydnj};b#gN1UJ&7L!09spq zprub>eI8_)*W5 zAKHu3N#)`v64%6!XGSod8PNksz`&vPdjG+L>n#>atz$;G zF;S5COge?|#gkWdq-UJ72qb@mqh(T+1OemK!}ycIs5}6n`-CDsj?ko10E9EA-$KQ- ztEBB3M#VqeuL+NqR3V$YV2J;67@6ESK!ixBRM={$RQ#U^CH>tPt7~)wz(g4Mpu@NS zNZ)S6YOmINhnhbvN_?h&4#G{XcXX5vlwzVxIM(}*dUJJonLr>AF{XcfbU+hd5{cnL zCWZ0L2r{|z82@q@$%V@>UR#ez1IGa(WOC<`$(={Eq)O~fgp$5)q-Qp0A2jgcV|n)< z>D!GdHCKaXeKrB&TLBQl&9ncygFqoJS@-g3zQ=4->9L z>~JvgO6tQ4mT9?;*VKPw(%^Aqa^r}EOFs{oP2{HK6~a4G!^Y@5to1@{kzm z+l^_9zgCd=Y~O56XSlibjt-$VghHC|>5ES|#An7vkV%gqlO6^@J|;BNfkYMpxO+ChI8!&00N8WRpaO8_EKH}BhAUI4&zPATee|CR;An~~qEt>H}gb=ai zv=}IVCl0S;?0)*8yu{CK`a5LO!^otCGmAvyh(ycrPGlDVIK-cuzeGDr<>83gadyc? zS77|hVT@-+a3PaINhF4MBD(^KuW#?rduPT*5Sbj;`*%P6P$2OtI;l;=&9jvTC}z5v zP)PD~8y^G+s3?EG5?_4rUp`Gpe7P4jnOTDPw#8c7B$Fxa+~hwh)vz_;clcQ_@$(-A z5fGnoHIf5w25Q0=zyB?!%v&Ic|7?~vXR|4T{`}hiVCAxPwk8jFWN=en;xBG^(9OOG zICjEykQ-K9?u+wV|E<+zjGhb;L|AoAm+zVNufFFH-`Ib)-hGyUe#<#}&pLC_My+Hf z%M{OtzyRe~C8;`=79_s@0UdAEGX&tGrtdlC000**TtH1t4cgk;(9+U^mDly?a7`c) z-(`lk>Y6UJw6vhDtqnCbHMnr$f?h`xf9WH}`^)`_QP3O)-+x3WXxiT8nL{F5CH*%7 z*)xkp=Qg`Op|PSng9Tmm6gFvxc)eh6C19)Hkg0-%F0T~fMGOU^00d_El`vBfq{At z6X2`kjJ6Xq!Y#9I?~tVhhzN&Ibp|?}c{A@XleHH;Gs*hIl-V zl9Cei_V%Krqy+JJ9I;povnr2cQR`4%;?wCglF1~FpSwwCBcx16`!bJXla6s%I!4|jEpGYLI z<=-!|DsAJVlmWPPg8H1F4pXm)^9l{HlI`hbOL21e_df2O9@>NHWy^$&Ww?a(+ZG1M zXu_dm)6i7?X+cfs>gvMK(2$?_H|JOqChLEf(g4z*P3i{p9o`VA#dViGCcncv?1orZ zPnL7AF58hDIk^e;cFOjYC)b*wYjpAd?Qayo%rO5BE-9{M6bw% z@a*Ol9YUqZ2@gt@3p3$uRK=DGm1O&{hLIrPt{Z!uP&YI*gmdT46=y+Kr+6KWlrB2#h z3E|m|D>^`~{eysTf0qx@smXuLDxe8(quR<7?!2YHAn}Pr0^8qc#=&FdXsZ5fVm?7? zSEBo=f|3tHl*VS(+sV7MDnfX+)Bro72n}@Qg|n(=em$>GIGubORb@+Y=U)yKC;nd= zwWdrYL<%NML!#%0d5LencpWAU9uGv6Y)ycLNrY!N-PS=Sy#oy%%S(TJw($}W6Q-9f z$;*TX@2D(F{LduuCSznAI#w|uCj9R3$w1;~U9=7a!dPv60VZ@~thT`lQiO18qwxU* z0#auY36~;TQsoeztH0Qe_)f~Kn6TmY%Zn4gtHDx1E42*)2fK=E!oucq{P*$ybBJ%b zXq{aPVZ62;5f2m2XU=~ilN-nQ%zCGQ3eRr3wL{0nligbS+1v#~eBE5x(=&mD2u_Hc z5b--3JVgT#0*k6ay6TCT!~7Y9|J-*}5I^T36Md{KZ@jk7VS?&4Oj4$xP~p}l=>tH( zsF1#DQV5)W9EeqdLIh8r3XsXtcfVOxl=z?TtatKeA|MiyZ8U!tb*TzX6Jf%_=5l;? z_6ASja!cdVQv-qYjL)n$sIUeUz@VBr8j&rD#B{5Q2D`vHcG_PgQ_$OQ{k$mg-{1V2 zlisQu4u=->-aLI&B;Yqm{gb{F+tSCV2D>a6TU3AJx8HWMDDmrFe#;1jWig`|kpr^X5QuWRMz?d7buYhFoC(+UXaTAk zB(8dqmLm@;3IP_1=fF%e=J;@V&4dAi*sfS{swnXa&4oprXk9Bz51iq{%et2LM+ zTg6N`OvtkE1x$paeNX$I{qfqHi|(neH#bl56TjdqX0SrqKLdzp^&x{}fB~A`ik0`6 zw)6jvuQBCn5g6;$U)JP>qd)+K0OSM{)F1;m6pYHsYug*M@U0sXXlZHDU}uWasW%`ceMW}KIzYGdJqK0wj#)qx~fY%^|@ie{jeOSO29%c24l_Img6eGgws8DBUTnh+wDC_k7bb>&EoN0&szAU@^c?D_#oI(qj^M6+h&N~7lFU5qq zDOAvH>29x3*>k}L1uS4S&v&eZg>3j9!1mXhkVqu7&D(0P&inVbtdTgX zC6ydIt@)5SEF6!?0PelF!{<=E=1^VQsWU^c?Mw|r+pF&NX~9RQJ2evypWK`$XUKo~ zhA1>6K-$~eYVUR258u4T8j7$rN&JLJam54i+r%r*KKH@~JSTlZdMs=82#u36zQl(S z2V|pM!1meG1o3EubzhzDsU4f}!n4jL8BjXCnOI)(7+% zez@ZqnZ=6odfi{$AM6(ZJie>bl=t6Qx{E=;sJ^1Zs=OL3G#^SP-<}jqj zR?TRpJu_^Wz%upwV;CSL77FK(%|*=2Fbo)>r##eftc8el$w`%;uKw6zf^C1skMDX` zc83ETl}-GrZC7Z!Jute}WK}F?3W(k5Ow+YtGukTeUsmb&1zzIYrmv9|BO{j!Tj{Y| zh7-FPyi&I=YfNX=wksTS@O6nm=2-TW0nRXo!DwmO;p&%NpYJHb#{|Q=?ftv2(L#Y{cM$_}uuQu5;Qi6#$EZ%8qB{IVgY&n~KW83m>aCzC??n@NpVspM1ALQpl zXJ0@hTCQh++NkCtZ$IhLt~3E`^L8C z-Dt670$Xi0+bgq$TpoW+zNkIFYic4Qv{&6H-cs?-9eBbkfpFyW!gGxF+bU!;!HQOb z0iJ`ZVF}GKxoIIL0KnqdO0%iwRhEOpTO7i@&QIB^T5EpwY6s!f=V8W?Q=Lxu44z}O zp>qH0J?eb4e9^CkWrhq);z&>8Nd14oh(u%P{ds3zXQK{(d2D~B-tfJ1TLTIAdTBM% z=3T3;dbREeessFix0bIZ{>?SWq*Iu(Z<>fERwEQX;gDp2-GldyumXKIK+oT2)2Tov z1RcJR#EV^j%vv__>WrCm3h}+ugrnAyw_m}L9W4P*lX)3Q^$1zK7u0tHImBnuDJ(6$ z3;WXB_2yct0YrZW-SZL`MA$^uve%hcdq0Nd=WsLz02o;|geiNcnuLkiXoH#*yK&(T zb{wEY2^fst@eV1De*TmXqu(o%}5Tz`pdh0BI@5__x|A z=>$i;h9@(o1yk?QJ;Fn0U&y=G{OPORp)n7zn-5kqw2^+Lk8WD9gB9mg*gJ7^*vG-f z*V)Yz;BtQw#9$JM<^J?f^}ZrUfD>KpH&K~LH!18yM`_sy79-lL?sFMTlanUuwOH z8WP%ZS;cpZ%`(i8JeiR>l|E|$<%8nnIY@S)Kx}_CMl3+Id1qF?Yop%2>RldkAZ-2G zDyvsj4Z>rCjtn+gtc@4S0*Rb)Tf69C-^3bh4ABE|+e4MftIqkQ|8BWE;4NthnS+tr zWknG;!0v1?Su?}VTNxf~RN(P$QDeRc2b&ChF97U$L)47BP!SN;u3QzA6LN5DEdj=? z*D`#8TA(p@3;499!fem=+meB2+*P*9Z48mw8n$*{hH%D`gK$E5Yv`*fpY*5xPu%Sd zSXf3xdqb(tTtxao{+2A*m8^kmx1up`p|gCm)ceW{m^>qk>$K+njLTPuGW=t)FDRCwBTn|p9v)t%=*=iXMopOVqr z#!n>63~WeXXJ*4cOLh~cYGyLY5Ox@FG6}E_wlQD=_HL#sRj}AVz`-^U2r#=Dn9Mi~ z*&?+ym6;_qwUz8v?IsW~kr*ryW4&xymb%psbxVEk*+0&?=bkG$u4+r_?t9Pqy}p0H z@9%ehS8ROYqI5C|{CW$o-aL;#M_m$Q?g#J$i*9p+ena_p3$Pq}X-jmifIO>be;4Dr$jgv{@rV|7* z$NYLzU7tyS1Rr(3=BJiO{l7dQ5t4uKhM)wOQf)+{es=^CkiiXvKnjWQ^|e}AnbYqB z5RVlsrAl(|yc;UQ*K!GU??5o2w22HqQvV6Sli=v@AoY4`KhCCE+;j>joy4((_ml#b z)qbVK%_I?026txpQ%j_Nky9ECG%i6Pk-)`|k0B&%*!%$aY9qnMC4|Bw$-I9b2%gtJ zGod6}XMm-MYrt0@8jIs=0oD6Ur;h-Tzvi%7J6O+HOyX=hkDE$|!lx7XwHAJ(iEK1+ z{CWewv5ePf;n$m?i=KA`Xy7+tAL&DHZkN%o?N1nKwCD~ELm#YA*cr{j5m+*i576^gs!~t-f zxcXfPV$FY(<5hw(e_mASFHsGX6h>jEjL2K$KBziw>aKqVr9w(F5hD_jQlE``! zztO^PEaTUg@uvE5OIP0et@w1DmF|XFMhI}y2}J07tZt~&F_U0!>KIOP18%xxTvx0YPi(A4&Gyh}d#L37<;hW|BDRBz~ib*U*-4 zH1MYS5K`daD;LZBpA3GzfvhiU_h{jy6S(Q529OjNrj_tcs)T=&C@RogUQ}S4Ea43)mJO!`cS|6YF67zthQCSwY>&$H$@_r zB@xS!d*?lnlFH~&?e-;WZHbdCsy!vUSbFy{Wp!KldK0hS)E>~lKi6l%$?d#y|F;5s z>zMAK)zh$mM&N&B5(osBUi!9nyCP1qh~F&ZFE8RRUs87HNFq8?fJ1%$ExN^Z#N90M zSen)LGAmw{mG%;iomaEk-J@dF3cJ0W%9P8s&o$-fzx> zbkshRMeQXH%WwZP*&A=d)oAb6o5q=pLxUxuVTJ|{J7U-u>f4%&W)i5 zsQ4FjOvQg$>1iMk%)j)cUc56Zd~=@Of%^~wGWp-9w(u562N6ptOh7Q#{y7EjDppr3 zED!BcmJN855bXZ!Ij-Hd#Jl5pledwu+S5yH_8bVo7_TVHr!C7b&r{ra2mz$7xRK@A zf6~_r6`DF9*M9a7q=v4;Z#0l+L(5xC4YB>-d|-bVjT9jWB4GOb2@N=%ILQKjv!b?76A|)i^9en>M8$mcGhf4tqA3m|> zer5dTJe|W2D+7v<@s-DphWNC`P=#y$bA+7+KcoOhm8q0TH z^^m#7(F9INDDFILg~K9FLWe`Li^{wI1>yTz^pMO5z!6gYDl~x*5~eR4$4PeKCQG=< zB3^S5zp1R*-+Qm7npzmm8iSv`8?_Re(d>UP_wg}fgF9}XV$(pEQTmnrUF`n%lNt|v z=Epm~!N_a2|Hyl|Tt~7E;t=(9}Zpb6FL@r-q zp!;40VA}QZ1KO*Urrs0A8+r%sM_Qhsl+elTH&5|<*KG}%oeqiLy>1J4eD)l!_PoID z)e=%DPuPEX2)R6ux4ZxZ2G~IPy~n~ZkXEs1H0rH2i}hz9 zq_onQNnd(1el(@^Y`jlnLZF0_6)sj~ZE7Z|V%~E54coqj+afM4g<0RRn>|5Iy{Uh5uSW6(jiv>I=F@Y>txZ_Uvi>%T^ri8V-hLGhVlD7l z8x)d|H)!Qa8TFXZm4h@I{v8oM-~vqrqNU-(R&<9z>=*#lF)Vc^*w}fG&ie~^t%_EH z0tS#}8m@0Z7C5-)OP9?6g7CeAdu}zf9BW@|@krQ?>PvqvefT&|Qn6Jx zSx|!O)ZICJNblDV!Bk)D*i8l#&${m4*tu7E!SaI1t8TJ{lk8-A?u3pZX)=P)vYXB0 zn@!*LhcoON9$0V5AT#OrM}`NuJ4b zMbc+rtcxE#X-I$5TH&vA_Yrqh4>EuHS0To+Cfi9g2IvnQRCOc(=fVUDH&4RJ5_dDK zw(AUeU&1rlK^Gj!0&cR4sf))Aj)3I0KRM6H@BsNtQVT!Bj%|Hwm|GD4;U0Eu?c>bE zOsIt60d{|GGGv|-=6>@et_D0Onb&B)fY-dlkavsjD5ZaOLncrD^gEHPBP`Ez5Ec;% z2+4&B5^jOGt9yCvx@uy!D{SiAr`cT@zg1BMN1}+E=wkZfagd?#xoncz^A*mF&#+@_ zKm9$0FjX3`jb?=Yo&r0z_H$-@hS~EKa@iy!!vpNTc@m^#?(CDe2~{X5%PYY1mM?L| z)(2T>S6F{(S6OY>iMweMZkD)PAbz0?nBXj*$U$m(_FQ!pZ?wg)oODc@`WY1dR41U z`g;mowXL5s6P6N&2H1VGsui4MQI+V;vgr|YZ~1=)!WYzrucg&4v*OisM=4Z7?$>XJ z=~GvQjzMiMIxB5udD*?)5D$FVRN8AOv$w2LuAxC5_{vSVi6UM=a+>pW zZ+?HsqUMtN&VQwqpgf_&O^4(OtCUtC=!bOj;%|t%c@nW4t6rT}yQ+oXYRX@m_irlg z#c!#K@7~XEW7qH?*=&N@^A*M?W|Z)~1!}bxqaRH1gExBCr#=}yc6{x}{aOhv`g#j& z-`dak#0<0N%Ve_(825jEn*qG;D<51>ccp)%zVlig4mH|dorIfFc<}x^A;*vqQw@<2 zykLDnD12Qv`V#2~YeB)L;$Ck3(nUsw2gzpRoIhV?d}5aE+xqG2%~Pv286BJA2S4hu z$cx=iu<5DV*sE{$b30Rv3=h)RtIiO|CuRUiUvH6J!vh@r@@M$|KWtQIk(z-CM}&We zsWRjiYrQNu+Ecw}o6mP`VYOXh#j6r`(LwYKzgaDgO429*fzjd&mguv<#qK^VK)|86BIXR&CPXlV|(ZJ|-q+RXAi4jOnKe zmhjr`Cnjdt9spjg#pu{1fA@N~#qHPh1Z`4car{6TufEyO=m(QjYc2YF3t9;p7&8e* zh6mZLd4f%Gvmd-mB32;b=7_s#+FrxzIavFUe$WsJ-9&V5VP$oRmQE!dPFjC+fjnYv z!ff(Ox6U)NQ!zYc`2g?=RI8ToGVBvLmus@fHSYyI23@ec_T~ViW0O>?P5OEYY~R+; z`1mxlvlVjL1S2~)vio!A471F9_#W|CfrOK#!%ZnH)7GyJTh`YKi3wdFOQbo_r1MHv z7Ctr`>TolFS>N^?JANf@^mds=5#s>0wQK z3Ja<2iHg^LJiwpJDMoe<($`Z!NH{YwjR1Ok3+x&mWH*y)ozE8d$%_GhX(-{nC8|T$ zh9~hdynoD8NWl<;1_-BgC425VWHvFoe2AUHgW);8mFIVC8=$W@PqlyAWbA_}PQ8AG z1wNM0x;hj#FbTVx6nKR|IO?!p>dN%B9}g;E+&M^JubMG9Gck<>`g`+?3=f8IdiN9q zsc)LUkNo%NRUP5j6DGf=OCB+?mdhoWon2ylV%ng6wc2EC zY?4!dcLjJF-25o8trdS>*nK;j6$(FWfoaAj@Okye1B{JLQLVP<>&>%c>i`p0I0V-W zq>fU|$0+7wk+s(TR8-ii%k74tkiKa|=F%}r`55K1`;6r$CZ-~(ZftCdQ>QkB%q{>s zKeTRS$ilEd)-*VE`ARq*BRpZ6Bd@;M&scy7y?M58>sP?2l~8~Fcpt^QOD^q3J5@5= z*BTah5 z;stKFe!IRddZJXTwz%Q??flsv&zd$^q$URtGAZ(=d7Tn9R+G=Y%*1^B2(|1zL$H-+|YV|hdrMBr(nQQ#8W35_iVG96(Z@GqVT-lM5 zeRmzAlv9>pTxwIRwYmM8vy^f!<+FPk9h>Cuf6%2AW)(|f4d~r^%SCRuL0R7rDr5u; zYSkA1`i6h)-1aB4R$&%0(C|b`@|wni^4Wcq@-aSr@7vUB9_6JrrJMrphrhU2_bByR zz6>1Oc&u)UVq#2fT50{BI}cOJ#mHr1CP$Z-+PwDOmEyhR`2>IErB!pYTslT6=W^%^_gG4Z9^MEE zF|+Ytx=Jg3@7;$f7GmVmF{<@8l}ejuUpj&mu0|ZRI z7p7N$%?0(hcM;0-`kWu=Pr$+3;HkekX3l;QQV&P!c|=R0f!jZE>I722!?&nI+`w>$ zzi@vKkH7IOLP~rg%;^>mi0ilhZyA8`J$pj(P|z_|t$S3K+MImpNW^;k?hKW1{FTS8 z;RlP|3b^kp>PWj#P@B2`;v*c}@R!jVSYL4e{39H@LVZ@Qs5t)i5005JS)n&7HK%^? z)&u4?PyX<@9;{GV=ixuyuW=zpRcC}?siS{CdN#c0^;>@~0lxnAzod|N%?)!IZTTgS z`(OAZUh5J=sk_6jfX*#8v`OI@1Pe0!fxplSuP$% zpqW!H8>3oN!aw-mZUVq-E#kEn7)su47B+*>M2DK~&p~kDFCM-udPf8^EHIp(efqVh z!}=lOVZkhN7;Z-R3s2)Fx^NRkrNFPeWhp@^wX)=K^zToqVa%Wf_TA?nWzW~Y$>mx$ zj=mWZK3sm0tI~Hx2P1@4WSBoxijjXvp82bz2wcEN3WozwEo{)Z5h5Iv4n}L#fgY0=zJr_S)RQ5qRUV|-U=0Kuef?Q8ZS6QRJYjv|`9~vd zFF^I)TIzt*O%`zyoqX7M@iJUqMqAJ8_`ausT>jRUm|=kEQ)iPAtQi1bMoNF|VC~5Z z$F%U_If2()T(`jEub(t2P@2P0Yxv-W=O3X`QKfEKupekN4b5xh?B_Ux5{d+sdb4b zP93MRq^$qM4^KqSVgwTLyH|hyuaK@pKqZXnvDV8t3G4i=Rl#d5;p zVV)T<4?5U75Q2NZ@(@K0jFlyi?|lDB^O;Gbn4^62e$ZD4R{8kSGiq;%^?Tdc^MDyY z^d+Vo4)!R8BxYEW5T-Z@;wm_m-kJC+W35+=l@!28jS1glD0NpjXdQnHSLrr;7_cg) z$7|28p|$GskIE`8x90b%^dziV18a^^%7D2F&Mq9siL015!Z)?>-S-=hk{UPEGY!Io zq9Q^_HQ}iNON5jLM}$?}&iGduYrSmT)lC#l;qx!cF9I->y4xa1j_C%0;7t8FK;R}i zwGn<}bRz&aQ33=XRZf2bf-S{;Ax+Tw3#!Yrizm#zoJ0{fUeH*zh~HXdWA}X_DH9@8 zwg}e?0xza&Z(nOkYTWg;?}ZQO%-tmE&g^IIjT7PFX`&cOWVRv#I{l%3&rNhHR8JHl zAZQ-#2{Mh2@!ynB0I;RFU+v3>kMw)?z1&0rzomfMYc10Kg?)cC8Wl2c7a~TLQkWV* z>S;2BK>YsTKTAWAMEFdOeIkGUGZHtQ#m%Jg>J8?8bOJZtsk1^6zg0FF0|8!Z!CdVo zI@M5evS{9WYWGhm6kM{Js@CdlDix1|-~YGfJ6==YbLF?+%baqx%6P2>y1%d=C!JQ$ z1Jvte-!4R0X^?*~g%E~bs}N8D8{r|s2oJGz1}Brouh;P#bw*-eWwiA&An}@u+I=zP z!%lT>ytsbkZf#raGR@IYVIeVch8=IZBo-iU?0-wz z2~Z-L`FAdECX1WN;MMDRjT-&`Gkl&PxQQ<;l?n+$P27yFe9x>utc$0RC<*p`?J&iB z6a>o^j}!m(sPU{ohVkli=3d*h;MQoc&X2*vg<+nrUSErPaJ^3U?OfD@O+!SRTId_t zv%7!7YAFdbX{H2rtaDb0P_$LR&iGxC2OL_(u<~Uc;}~aWZM#be7qh zL}WHk6%)Y$h98;TbL<9dq~93M>OK4N5z2oR)u=f6%8~Gt7$RL?XWe8MkwX?$fB2dm zs@kFYsVXs@w*6Wizg{Kt%WNb=1$&8w6Jky@=;iuh=J4s{AhBSjPv5GIecfEMM+w5V z8NNU|l9R7IWY30^IUQ8*pIZaKp(XQ&qHX6Zsr5*wzhwI zHdjq}4*rveSF7XKR4lpa46`>mO5^4zI;{8{dt^O$0>zA{tvUY}!DBYUdXz@j=h7H{2zVQV9hQ6&4}&BVTTjTPuGOKuJVFRCwB*TWfGt*LD8Zxku`i20cJE zMj#0U=mA*b{V>pW>_1_WNuA&yozBE@YieS5fRNY(f)g2V?8L^70W$@Io!XQ9$u#zK z+RixBnYfdV!GL%eS%8ob4?VyR!IHT0)iqq5)gSwP?>R@JXGWuY&pl`F^{u`3dT)PP z_3L&{6i>itdKlSs3Zv;1vgs5`S}OnsmK_p7_$7ndMWTq6Gq%zieV0sth6CpZM9mfk|i zi3%|s8)5(kGl9SY6w4_k(aZ!e%gKLP{H~rOVB%>3JXuig%vaI+kzmBK)nFFm$-%{# z;&p&n4kgA^-@pJo7WXBMf)#{BO*r^$It71JG9Z)*%Wk3M#3Tt+f?`PUKv(xG0D!t# zTlMM_Skprcy#f=@eCz;E`eg{aDozMS{CU}G$k8p#;10GPID7npwt6hKRZ zWCId4mm~2u^&wjBT+oTc_Fpz3pJ)*1qRT0c{lvxa`?sN=<0r15+{X_#h-ew z{LC>V3(CcxU#7ulvO~yZhcrWyewlvmFHd}=Py;Nakd(AB(08Uq&)|9qkdS{Uo*+d@0LV-p#9#CmO9BX;R~7g&cm+uSgg<}&2UJX2 zE%&ZrRN2`R8hCNxeHaby81Q!okqt5c5qvKx_Ntc@pNUY|+li5?>COT$5&AyakvIQP z&j%=(`jDR6tGzrX_-t=I5;N+)yCd0`#CVx-@!G3;a&_f0fj}T)l(v7hYVd`A3GQT5 z$Yh6*4ZcF=?jQyhtw3gKH46GJ0Yu0KUm+WOh2p~d#N0$E?CC^$T8-90eP?$@&Og-i z0ZJ<$0?oWK4)ApV2#MO+kL@53lD$c!E905a{m0k!DF=Y(X|Xh-_LYGrzbDesMXD`tJjP1O9gNGOa9?h9hQ2*$pgSiOk(W zWU@oJlTD$}FTqj&{ZR1L^LOaEvm-R1+T1=nlw>6TSRHb^TU5UN$9?N43*iL0({d_z1k$5si)R-V#(}VIN4pH9UK6TB>WHF2?yW& zJcxj@DGyg}w-fKalJmY#_ z1YErOYACUFv$r~4AporZdKd285f-7aun-4--(Z|45SV`mSI_?}biCJM^FWsdmuxewQ?R!doT%8-dY&eQzZAxm7=q^h)ng?PnH)Hr9sg z1m!gXjP-wC??Po|r3O-2S&65<)+vZ&#^nnyhJv3l?yKZU1avC;{`PZ3b9^l`F3ZVC{c?l6F-aBCNxc-?)UPrlvgTO-)Vs z-kOV{bJxy!PH!Iyj9aW-@0`ot4))yrr&?Th8GxrF7eI(e)Mbe~X>l>zSBbCEbi|B? z+I&eE>&gW`vvIp6A4W&14dBKJ>U%T}vK9_X0tm(#Xuf}ADEH1?->WCGZK;_U);Q+3 zTt9zdJeLOF@MCvhYDU9Ifwd*n{hqd+p^{X!V5gK~*71dB#Me>|_KH}Fr2WPoO9vQ5 zq6i^}38W>aF-Iqi2mI{%ADc04uu}AGQ8tbhqvz9Ijsg!6Wg(^V70(HCNeniB^2SJQ z+J1eH0d7f-tv$(FDW#m0VjPY`M9Pf)dPXtbJxo2GrGUH5y*N=ja?VT(QmB)%F)6 z!PhiDFRc|j3Y>_ABcziVjwlnFVItw?{gYCpvmP2A7xFSX@sh9y z2<%upFe!5Y;2_@7a?1|ZD&@Go0J<;!Ja*+(9>Fl-Bbh2Ui^Fm}&uCTS4|spQ9g*p* zIGu3rhSUknVs}|unw->T3kg%qJ1@Nw34T_?cH=iNV=#mXc06Iz=4k>M z!1arI^&Rk4jj$B5))md;@)(Un;}#jCl^|J~8UQ-GW5CyMv#gI9V{p+5hY3mwCbb@M z+>mq=fH+3_J#%TsYxOi>1 zj7FotZ_N+Pz`B4^cIIP8m)*|viDJy+l|ss7!O@4b*I;rywcNdv>F+>L)hHYs$zac_ z1~*UMh_*k4GXa1wlK_8!M`Q7KTzgFe*Wq{$__|qJt++s~rIF6EPmbp)@=#?%3_mZ; zG^HMy&pI7tsF~2$0j_E^=1PAM1lUZ-riYNMsKLEnHgLtr%&i_BDb~;2BJ8*+1HO$7*OsNIsYTZ~3$5XwG15e-T)*|Vb;luR5I*b@^Hpne~0T1IJ1(5Tn@a5daG9yenhXDYkG2q)O zP9xj#A!ar{XBK};V)a!M1IY%6*4uAt#dE&68*_VSg)^bQ0|X$bnj@mB-V3?`LJ{$B zRuFzP{r){Lz$8spX4mSm^mYCe0AP6D5&%F+du!gjHu&?^-S8o#>T<`6f(Z;TDJ!6@ zd$^fut2iAg2|^k!gm!*7?(?*bR%NI^mI0#fKwyuMxp;rZ`OWDnId?K|-msNd;B&N} z{^#jbH-OgE;m~9vO{oiaFRhLayYs_ofS5inB+eYe50K_CQ@=pZYcnBgUZ)V-v@|ri zd%5E!=?yX{V0a=37$cPoX&odnw=;ct1UbM}>`*gT#N0CWe(dl1(bUw0bUK|kM>?HG zQ&STjf3$zcNrR2lFVypfF(Pc<)B{Un;|?3Dr!qDtzI-cm^_P^aHxZqZgb;#k0y1|8 zFD#hJHKESE^0EECWVI1=+-2fKNTcJ{L@g?mw`r{@@b)rqF1A`o20RS?0h4Kod zbuht$FtOkH`|FXbpC<+Q6z~472C6v?#K<%(5TAcLKM9@p%ejjkXOPFa)qLdH&gwoq1}5qfC{{OiotgUZjAvlSOP4^+>}4@mVU! z^qfV4CgTNbN2$vSqTHIpHtqHLI(HZ6sIy8KB;3asf)O4Z*Hj0c62K3h5aq4UyWC-` zO2vQw(E%VeAbS%5Oilt@9s_p&X18g`w3DI47-?82&9^L-NvD9NMvu)vt8M9#N{frT z%Zt|OJ!408t;2^v@JuWn$Z!n-$jfS?;PexU@0-^N@Ff!xD4CGJb9Z;@&$)m0Zve36 zJ6oL0kew>mEd^F##7@(9Udf3f)#}%6bFzQVo|AXaDT_NyNF6eq1L;Nv4iav0(oQ^v zY{Y#NcVW{&OWyrW11;D$aaY7@xs@QNDx^wdRx-8o%I>@<($QyD%8kCc>^&B?K#3aR z_{iIlVd&Bc>$M-jG9Xb+%XYIftY+r#KlvQ~Ki8|je#L3Z2HbI(td`IuYn^m%Ybs_qQ16SR4~do^+qry*I2ow1sC)hEe2cCU0K19VHVIC@vDBo*o%R zYIqdCeCK70xh|nPbEmu2#WPy*0l3if%Sf8*Xa2}^vs-j~WQmkrH(y@#L}aF?HFemr z)ouyf6fm7MHwWWL3R!i(z|K;cijaTPhs>sc8VkO5i!(7ti)O z^a&8t=)f=?U+S&CZ!)GAZ^E^A_eCZ?TT_Ps082{N>#O z>9L6>EeTP?P07yXu*bIt=2aP`~y;A{TF3UjPykB__^DWbW= zzO%Joi~m!9_ys@-9DI0--Uk2h^0aY})ih<3b#_pl6C(_+8p?m8z4Z7*lb;~t68R?7 zmgfNpWAyUmJ3GsZ)&W4CMA*bGDfym!*R-pVR{+m1aGqaS@iYJmHI-_t=KD9gO=E5g zNksD%ENrBY^wHXdzh%Wa<#S(sG?B-_>Hp47f4RU|C5txH~9kb-u?r-u;FPF5~qeovG2_nwB-dD*C<)y1Yd%<8DBX`ZlsZe2NY z&Ibu5q=v=Hzj1Jvag}qtHYeb6yi1t$w%r5BjDgj+^H=}la<{=-V)1R~ATo;)-pS^k z4vb4|HTBR%Pi&)hl28RVr`w zCmty?bhEq8rZ$ND9)Xy}ch8LE<^-+1nHL@tX;(D&$P4UK;x?7+2!sxU9k+&JB5lt9 cqLMZL2Uh7SY7+geWB>pF07*qoM6N<$f$K+njLTPuGW=t)FDRCwBTn|p9v)t%=*=iXMopOVqr z#!n>63~WeXXJ*4cOLh~cYGyLY5Ox@FG6}E_wlQD=_HL#sRj}AVz`-^U2r#=Dn9Mi~ z*&?+ym6;_qwUz8v?IsW~kr*ryW4&xymb%psbxVEk*+0&?=bkG$u4+r_?t9Pqy}p0H z@9%ehS8ROYqI5C|{CW$o-aL;#M_m$Q?g#J$i*9p+ena_p3$Pq}X-jmifIO>be;4Dr$jgv{@rV|7* z$NYLzU7tyS1Rr(3=BJiO{l7dQ5t4uKhM)wOQf)+{es=^CkiiXvKnjWQ^|e}AnbYqB z5RVlsrAl(|yc;UQ*K!GU??5o2w22HqQvV6Sli=v@AoY4`KhCCE+;j>joy4((_ml#b z)qbVK%_I?026txpQ%j_Nky9ECG%i6Pk-)`|k0B&%*!%$aY9qnMC4|Bw$-I9b2%gtJ zGod6}XMm-MYrt0@8jIs=0oD6Ur;h-Tzvi%7J6O+HOyX=hkDE$|!lx7XwHAJ(iEK1+ z{CWewv5ePf;n$m?i=KA`Xy7+tAL&DHZkN%o?N1nKwCD~ELm#YA*cr{j5m+*i576^gs!~t-f zxcXfPV$FY(<5hw(e_mASFHsGX6h>jEjL2K$KBziw>aKqVr9w(F5hD_jQlE``! zztO^PEaTUg@uvE5OIP0et@w1DmF|XFMhI}y2}J07tZt~&F_U0!>KIOP18%xxTvx0YPi(A4&Gyh}d#L37<;hW|BDRBz~ib*U*-4 zH1MYS5K`daD;LZBpA3GzfvhiU_h{jy6S(Q529OjNrj_tcs)T=&C@RogUQ}S4Ea43)mJO!`cS|6YF67zthQCSwY>&$H$@_r zB@xS!d*?lnlFH~&?e-;WZHbdCsy!vUSbFy{Wp!KldK0hS)E>~lKi6l%$?d#y|F;5s z>zMAK)zh$mM&N&B5(osBUi!9nyCP1qh~F&ZFE8RRUs87HNFq8?fJ1%$ExN^Z#N90M zSen)LGAmw{mG%;iomaEk-J@dF3cJ0W%9P8s&o$-fzx> zbkshRMeQXH%WwZP*&A=d)oAb6o5q=pLxUxuVTJ|{J7U-u>f4%&W)i5 zsQ4FjOvQg$>1iMk%)j)cUc56Zd~=@Of%^~wGWp-9w(u562N6ptOh7Q#{y7EjDppr3 zED!BcmJN855bXZ!Ij-Hd#Jl5pledwu+S5yH_8bVo7_TVHr!C7b&r{ra2mz$7xRK@A zf6~_r6`DF9*M9a7q=v4;Z#0l+L(5xC4YB>-d|-bVjT9jWB4GOb2@N=%ILQKjv!b?76A|)i^9en>M8$mcGhf4tqA3m|> zer5dTJe|W2D+7v<@s-DphWNC`P=#y$bA+7+KcoOhm8q0TH z^^m#7(F9INDDFILg~K9FLWe`Li^{wI1>yTz^pMO5z!6gYDl~x*5~eR4$4PeKCQG=< zB3^S5zp1R*-+Qm7npzmm8iSv`8?_Re(d>UP_wg}fgF9}XV$(pEQTmnrUF`n%lNt|v z=Epm~!N_a2|Hyl|Tt~7E;t=(9}Zpb6FL@r-q zp!;40VA}QZ1KO*Urrs0A8+r%sM_Qhsl+elTH&5|<*KG}%oeqiLy>1J4eD)l!_PoID z)e=%DPuPEX2)R6ux4ZxZ2G~IPy~n~ZkXEs1H0rH2i}hz9 zq_onQNnd(1el(@^Y`jlnLZF0_6)sj~ZE7Z|V%~E54coqj+afM4g<0RRn>|5Iy{Uh5uSW6(jiv>I=F@Y>txZ_Uvi>%T^ri8V-hLGhVlD7l z8x)d|H)!Qa8TFXZm4h@I{v8oM-~vqrqNU-(R&<9z>=*#lF)Vc^*w}fG&ie~^t%_EH z0tS#}8m@0Z7C5-)OP9?6g7CeAdu}zf9BW@|@krQ?>PvqvefT&|Qn6Jx zSx|!O)ZICJNblDV!Bk)D*i8l#&${m4*tu7E!SaI1t8TJ{lk8-A?u3pZX)=P)vYXB0 zn@!*LhcoON9$0V5AT#OrM}`NuJ4b zMbc+rtcxE#X-I$5TH&vA_Yrqh4>EuHS0To+Cfi9g2IvnQRCOc(=fVUDH&4RJ5_dDK zw(AUeU&1rlK^Gj!0&cR4sf))Aj)3I0KRM6H@BsNtQVT!Bj%|Hwm|GD4;U0Eu?c>bE zOsIt60d{|GGGv|-=6>@et_D0Onb&B)fY-dlkavsjD5ZaOLncrD^gEHPBP`Ez5Ec;% z2+4&B5^jOGt9yCvx@uy!D{SiAr`cT@zg1BMN1}+E=wkZfagd?#xoncz^A*mF&#+@_ zKm9$0FjX3`jb?=Yo&r0z_H$-@hS~EKa@iy!!vpNTc@m^#?(CDe2~{X5%PYY1mM?L| z)(2T>S6F{(S6OY>iMweMZkD)PAbz0?nBXj*$U$m(_FQ!pZ?wg)oODc@`WY1dR41U z`g;mowXL5s6P6N&2H1VGsui4MQI+V;vgr|YZ~1=)!WYzrucg&4v*OisM=4Z7?$>XJ z=~GvQjzMiMIxB5udD*?)5D$FVRN8AOv$w2LuAxC5_{vSVi6UM=a+>pW zZ+?HsqUMtN&VQwqpgf_&O^4(OtCUtC=!bOj;%|t%c@nW4t6rT}yQ+oXYRX@m_irlg z#c!#K@7~XEW7qH?*=&N@^A*M?W|Z)~1!}bxqaRH1gExBCr#=}yc6{x}{aOhv`g#j& z-`dak#0<0N%Ve_(825jEn*qG;D<51>ccp)%zVlig4mH|dorIfFc<}x^A;*vqQw@<2 zykLDnD12Qv`V#2~YeB)L;$Ck3(nUsw2gzpRoIhV?d}5aE+xqG2%~Pv286BJA2S4hu z$cx=iu<5DV*sE{$b30Rv3=h)RtIiO|CuRUiUvH6J!vh@r@@M$|KWtQIk(z-CM}&We zsWRjiYrQNu+Ecw}o6mP`VYOXh#j6r`(LwYKzgaDgO429*fzjd&mguv<#qK^VK)|86BIXR&CPXlV|(ZJ|-q+RXAi4jOnKe zmhjr`Cnjdt9spjg#pu{1fA@N~#qHPh1Z`4car{6TufEyO=m(QjYc2YF3t9;p7&8e* zh6mZLd4f%Gvmd-mB32;b=7_s#+FrxzIavFUe$WsJ-9&V5VP$oRmQE!dPFjC+fjnYv z!ff(Ox6U)NQ!zYc`2g?=RI8ToGVBvLmus@fHSYyI23@ec_T~ViW0O>?P5OEYY~R+; z`1mxlvlVjL1S2~)vio!A471F9_#W|CfrOK#!%ZnH)7GyJTh`YKi3wdFOQbo_r1MHv z7Ctr`>TolFS>N^?JANf@^mds=5#s>0wQK z3Ja<2iHg^LJiwpJDMoe<($`Z!NH{YwjR1Ok3+x&mWH*y)ozE8d$%_GhX(-{nC8|T$ zh9~hdynoD8NWl<;1_-BgC425VWHvFoe2AUHgW);8mFIVC8=$W@PqlyAWbA_}PQ8AG z1wNM0x;hj#FbTVx6nKR|IO?!p>dN%B9}g;E+&M^JubMG9Gck<>`g`+?3=f8IdiN9q zsc)LUkNo%NRUP5j6DGf=OCB+?mdhoWon2ylV%ng6wc2EC zY?4!dcLjJF-25o8trdS>*nK;j6$(FWfoaAj@Okye1B{JLQLVP<>&>%c>i`p0I0V-W zq>fU|$0+7wk+s(TR8-ii%k74tkiKa|=F%}r`55K1`;6r$CZ-~(ZftCdQ>QkB%q{>s zKeTRS$ilEd)-*VE`ARq*BRpZ6Bd@;M&scy7y?M58>sP?2l~8~Fcpt^QOD^q3J5@5= z*BTah5 z;stKFe!IRddZJXTwz%Q??flsv&zd$^q$URtGAZ(=d7Tn9R+G=Y%*1^B2(|1zL$H-+|YV|hdrMBr(nQQ#8W35_iVG96(Z@GqVT-lM5 zeRmzAlv9>pTxwIRwYmM8vy^f!<+FPk9h>Cuf6%2AW)(|f4d~r^%SCRuL0R7rDr5u; zYSkA1`i6h)-1aB4R$&%0(C|b`@|wni^4Wcq@-aSr@7vUB9_6JrrJMrphrhU2_bByR zz6>1Oc&u)UVq#2fT50{BI}cOJ#mHr1CP$Z-+PwDOmEyhR`2>IErB!pYTslT6=W^%^_gG4Z9^MEE zF|+Ytx=Jg3@7;$f7GmVmF{<@8l}ejuUpj&mu0|ZRI z7p7N$%?0(hcM;0-`kWu=Pr$+3;HkekX3l;QQV&P!c|=R0f!jZE>I722!?&nI+`w>$ zzi@vKkH7IOLP~rg%;^>mi0ilhZyA8`J$pj(P|z_|t$S3K+MImpNW^;k?hKW1{FTS8 z;RlP|3b^kp>PWj#P@B2`;v*c}@R!jVSYL4e{39H@LVZ@Qs5t)i5005JS)n&7HK%^? z)&u4?PyX<@9;{GV=ixuyuW=zpRcC}?siS{CdN#c0^;>@~0lxnAzod|N%?)!IZTTgS z`(OAZUh5J=sk_6jfX*#8v`OI@1Pe0!fxplSuP$% zpqW!H8>3oN!aw-mZUVq-E#kEn7)su47B+*>M2DK~&p~kDFCM-udPf8^EHIp(efqVh z!}=lOVZkhN7;Z-R3s2)Fx^NRkrNFPeWhp@^wX)=K^zToqVa%Wf_TA?nWzW~Y$>mx$ zj=mWZK3sm0tI~Hx2P1@4WSBoxijjXvp82bz2wcEN3WozwEo{)Z5h5Iv4n}L#fgY0=zJr_S)RQ5qRUV|-U=0Kuef?Q8ZS6QRJYjv|`9~vd zFF^I)TIzt*O%`zyoqX7M@iJUqMqAJ8_`ausT>jRUm|=kEQ)iPAtQi1bMoNF|VC~5Z z$F%U_If2()T(`jEub(t2P@2P0Yxv-W=O3X`QKfEKupekN4b5xh?B_Ux5{d+sdb4b zP93MRq^$qM4^KqSVgwTLyH|hyuaK@pKqZXnvDV8t3G4i=Rl#d5;p zVV)T<4?5U75Q2NZ@(@K0jFlyi?|lDB^O;Gbn4^62e$ZD4R{8kSGiq;%^?Tdc^MDyY z^d+Vo4)!R8BxYEW5T-Z@;wm_m-kJC+W35+=l@!28jS1glD0NpjXdQnHSLrr;7_cg) z$7|28p|$GskIE`8x90b%^dziV18a^^%7D2F&Mq9siL015!Z)?>-S-=hk{UPEGY!Io zq9Q^_HQ}iNON5jLM}$?}&iGduYrSmT)lC#l;qx!cF9I->y4xa1j_C%0;7t8FK;R}i zwGn<}bRz&aQ33=XRZf2bf-S{;Ax+Tw3#!Yrizm#zoJ0{fUeH*zh~HXdWA}X_DH9@8 zwg}e?0xza&Z(nOkYTWg;?}ZQO%-tmE&g^IIjT7PFX`&cOWVRv#I{l%3&rNhHR8JHl zAZQ-#2{Mh2@!ynB0I;RFU+v3>kMw)?z1&0rzomfMYc10Kg?)cC8Wl2c7a~TLQkWV* z>S;2BK>YsTKTAWAMEFdOeIkGUGZHtQ#m%Jg>J8?8bOJZtsk1^6zg0FF0|8!Z!CdVo zI@M5evS{9WYWGhm6kM{Js@CdlDix1|-~YGfJ6==YbLF?+%baqx%6P2>y1%d=C!JQ$ z1Jvte-!4R0X^?*~g%E~bs}N8D8{r|s2oJGz1}Brouh;P#bw*-eWwiA&An}@u+I=zP z!%lT>ytsbkZf#raGR@IYVIeVch8=IZBo-iU?0-wz z2~Z-L`FAdECX1WN;MMDRjT-&`Gkl&PxQQ<;l?n+$P27yFe9x>utc$0RC<*p`?J&iB z6a>o^j}!m(sPU{ohVkli=3d*h;MQoc&X2*vg<+nrUSErPaJ^3U?OfD@O+!SRTId_t zv%7!7YAFdbX{H2rtaDb0P_$LR&iGxC2OL_(u<~Uc;}~aWZM#be7qh zL}WHk6%)Y$h98;TbL<9dq~93M>OK4N5z2oR)u=f6%8~Gt7$RL?XWe8MkwX?$fB2dm zs@kFYsVXs@w*6Wizg{Kt%WNb=1$&8w6Jky@=;iuh=J4s{AhBSjPv5GIecfEMM+w5V z8NNU|l9R7IWY30^IUQ8*pIZaKp(XQ&qHX6Zsr5*wzhwI zHdjq}4*rveSF7XKR4lpa46`>mO5^4zI;{8{dt^O$0>zA{tvUY}!DBYUdXz@j=h7 Date: Mon, 18 May 2015 18:49:26 +0200 Subject: [PATCH 42/54] Added cow dung - O_o? --- mods/mobs/api.lua | 87 +++++++++++++++++-------------- mods/mobs/chicken.lua | 10 ++-- mods/mobs/cow.lua | 42 +++++++++++++-- mods/mobs/textures/mobs_dung.png | Bin 0 -> 635 bytes 4 files changed, 94 insertions(+), 45 deletions(-) create mode 100644 mods/mobs/textures/mobs_dung.png diff --git a/mods/mobs/api.lua b/mods/mobs/api.lua index 821efacb..fb0aaae6 100644 --- a/mods/mobs/api.lua +++ b/mods/mobs/api.lua @@ -61,10 +61,7 @@ lifetimer = def.lifetimer or 600, blood_texture = def.blood_texture or "mobs_blood.png", shoot_offset = def.shoot_offset or 0, floats = def.floats or 1, -- floats in water by default - replace_rate = def.replace_rate, - replace_what = def.replace_what, - replace_with = def.replace_with, - replace_offset = def.replace_offset or 0, + replacements = def.replacements or {}, timer = 0, env_damage_timer = 0, -- only if state = "attack" attack = {player=nil, dist=nil}, @@ -86,7 +83,7 @@ lifetimer = def.lifetimer or 600, self.attack.dist = dist end end, - + set_velocity = function(self, v) if not v then v = 0 end if def.drawtype and def.drawtype == "side" then self.rotate = 1.5 end @@ -95,7 +92,7 @@ lifetimer = def.lifetimer or 600, local z = math.cos(yaw) * v self.object:setvelocity({x=x, y=self.object:getvelocity().y, z=z}) end, - + get_velocity = function(self) local v = self.object:getvelocity() return (v.x^2 + v.z^2)^(0.5) @@ -110,11 +107,11 @@ lifetimer = def.lifetimer or 600, local ps = math.sqrt(pos.x^2 + pos.z^2) local d = { x = vx / ds, z = vz / ds } local p = { x = pos.x / ps, z = pos.z / ps } - + local an = ( d.x * p.x ) + ( d.z * p.z ) - + a = math.deg( math.acos( an ) ) - + if a > ( self.fov / 2 ) then return false else @@ -155,7 +152,7 @@ lifetimer = def.lifetimer or 600, end end end, - + on_step = function(self, dtime) local yaw = 0 @@ -180,16 +177,28 @@ lifetimer = def.lifetimer or 600, end -- check for mob drop/replace (used for chicken egg and sheep eating grass/wheat) - if self.replace_rate - and math.random(1,self.replace_rate) == 1 - and self.child == false then - local pos = self.object:getpos() - pos.y = pos.y + self.replace_offset - if #minetest.find_nodes_in_area(pos,pos,self.replace_what) > 0 - and self.object:getvelocity().y == 0 - and self.replace_what then - --and self.state == "stand" then - minetest.set_node(pos, {name = self.replace_with}) + --[[ + old fields : + replace_rate = def.replace_rate, + replace_what = def.replace_what, + replace_with = def.replace_with, + replace_offset = def.replace_offset or 0, + ]]-- + for _, fields in pairs(self.replacements) do + + if fields.replace_rate + and math.random(1,fields.replace_rate) == 1 + and self.child == false then + + fields.replace_offset = fields.replace_offset or 0 + + local pos = self.object:getpos() + pos.y = pos.y + fields.replace_offset + if #minetest.find_nodes_in_area(pos,pos,fields.replace_what) > 0 + and self.object:getvelocity().y == 0 + and fields.replace_what then + minetest.set_node(pos, {name = fields.replace_with}) + end end end @@ -221,7 +230,7 @@ lifetimer = def.lifetimer or 600, end self.old_y = self.object:getpos().y end - + -- knockback timer if self.pause_timer > 0 then self.pause_timer = self.pause_timer - dtime @@ -230,7 +239,7 @@ lifetimer = def.lifetimer or 600, end return end - + -- attack timer self.timer = self.timer + dtime if self.state ~= "attack" then @@ -243,7 +252,7 @@ lifetimer = def.lifetimer or 600, if self.sounds.random and math.random(1, 100) <= 1 then minetest.sound_play(self.sounds.random, {object = self.object}) end - + local do_env_damage = function(self) local pos = self.object:getpos() @@ -264,7 +273,7 @@ lifetimer = def.lifetimer or 600, self.object:set_hp(self.object:get_hp()-self.water_damage) effect(pos, 5, "bubble.png") end - + if self.lava_damage and self.lava_damage ~= 0 and minetest.get_item_group(n.name, "lava") ~= 0 then self.object:set_hp(self.object:get_hp()-self.lava_damage) @@ -273,7 +282,7 @@ lifetimer = def.lifetimer or 600, check_for_death(self) end - + local do_jump = function(self) local pos = self.object:getpos() pos.y = pos.y - (-self.collisionbox[2] + self.collisionbox[5]) @@ -298,7 +307,7 @@ lifetimer = def.lifetimer or 600, end end end - + -- environmental damage timer self.env_damage_timer = self.env_damage_timer + dtime if self.state == "attack" and self.env_damage_timer > 1 then @@ -307,7 +316,7 @@ lifetimer = def.lifetimer or 600, elseif self.state ~= "attack" then do_env_damage(self) end - + -- find someone to attack if self.type == "monster" and damage_enabled and self.state ~= "attack" then @@ -331,7 +340,7 @@ lifetimer = def.lifetimer or 600, type = obj.type end end - + if type == "player" or type == "npc" then local s = self.object:getpos() local p = player:getpos() @@ -354,7 +363,7 @@ lifetimer = def.lifetimer or 600, self.do_attack(self, min_player, min_dist) end end - + -- npc, find closest monster to attack local min_dist = self.view_range + 1 local min_player = nil @@ -517,7 +526,7 @@ lifetimer = def.lifetimer or 600, if self.type == "npc" then local o = minetest.get_objects_inside_radius(self.object:getpos(), 3) - + local yaw = 0 for _,o in ipairs(o) do if o:is_player() then @@ -533,7 +542,7 @@ lifetimer = def.lifetimer or 600, if lp.x > s.x then yaw = yaw+math.pi end - else + else yaw = self.object:getyaw()+((math.random(0,360)-180)/180*math.pi) end self.object:setyaw(yaw) @@ -567,7 +576,7 @@ lifetimer = def.lifetimer or 600, local s = self.object:getpos() -- if there is water nearby, try to avoid it local lp = minetest.find_node_near(s, 2, {"group:water"}) - + if lp ~= nil then local vec = {x=lp.x-s.x, y=lp.y-s.y, z=lp.z-s.z} yaw = math.atan(vec.z/vec.x) + 3*math.pi / 2 + self.rotate @@ -594,7 +603,7 @@ lifetimer = def.lifetimer or 600, end -- exploding mobs - elseif self.state == "attack" and self.attack_type == "explode" then + elseif self.state == "attack" and self.attack_type == "explode" then if not self.attack.player or not self.attack.player:is_player() then self.state = "stand" self:set_animation("stand") @@ -618,7 +627,7 @@ lifetimer = def.lifetimer or 600, self:set_animation("walk") self.attack.dist = dist end - + local vec = {x = p.x -s.x, y = p.y -s.y, z = p.z -s.z} local yaw = math.atan(vec.z/vec.x)+math.pi/2 + self.rotate if p.x > s.x then @@ -694,7 +703,7 @@ lifetimer = def.lifetimer or 600, else self.attack.dist = dist end - + local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate if p.x > s.x then @@ -759,7 +768,7 @@ lifetimer = def.lifetimer or 600, else self.attack.dist = dist end - + local vec = {x=p.x-s.x, y=p.y-s.y, z=p.z-s.z} local yaw = (math.atan(vec.z/vec.x)+math.pi/2) + self.rotate if p.x > s.x then @@ -767,7 +776,7 @@ lifetimer = def.lifetimer or 600, end self.object:setyaw(yaw) self.set_velocity(self, 0) - + if self.shoot_interval and self.timer > self.shoot_interval and math.random(1, 100) <= 60 then self.timer = 0 @@ -913,7 +922,7 @@ lifetimer = def.lifetimer or 600, kb = kb * ( tflp / tool_capabilities.full_punch_interval ) r = r * ( tflp / tool_capabilities.full_punch_interval ) end - if v.y ~= 0 then ykb = 0 end + if v.y ~= 0 then ykb = 0 end self.object:setvelocity({x=dir.x*kb,y=ykb,z=dir.z*kb}) self.pause_timer = r @@ -949,7 +958,7 @@ function mobs:spawn_specific(name, nodes, neighbors, min_light, max_light, inter action = function(pos, node, _, active_object_count_wider) -- do not spawn if too many active in area if active_object_count_wider > active_object_count - or not mobs.spawning_mobs[name] + or not mobs.spawning_mobs[name] or not pos then return end diff --git a/mods/mobs/chicken.lua b/mods/mobs/chicken.lua index 400813a3..ed66240f 100755 --- a/mods/mobs/chicken.lua +++ b/mods/mobs/chicken.lua @@ -56,9 +56,13 @@ mobs:register_mob("mobs:chicken", { follow = "farming:seed_wheat", view_range = 8, -- replace air with egg (lay) - replace_rate = 2000, - replace_what = {"air"}, - replace_with = "mobs:egg", + replacements = { + { + replace_rate = 2000, + replace_what = {"air"}, + replace_with = "mobs:egg", + } + }, -- right click to pick up chicken on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() diff --git a/mods/mobs/cow.lua b/mods/mobs/cow.lua index 148fec6e..f1f27ade 100755 --- a/mods/mobs/cow.lua +++ b/mods/mobs/cow.lua @@ -53,9 +53,19 @@ mobs:register_mob("mobs:cow", { -- follows wheat follow = "farming:wheat", view_range = 8, -- replace grass/wheat with air (eat) - replace_rate = 50, - replace_what = {"default:grass_3", "default:grass_4", "default:grass_5", "farming:wheat_8"}, - replace_with = "air", + replacements = { + { + replace_rate = 50, + replace_what = {"default:grass_3", "default:grass_4", + "default:grass_5", "farming:wheat_8"}, + replace_with = "air", + }, + { + replace_rate = 2000, + replace_what = {"air"}, + replace_with = "mobs:dung", + } + }, -- right-click cow with empty bucket to get milk, then feed 8 wheat to replenish milk on_rightclick = function(self, clicker) local tool = clicker:get_wielded_item() @@ -169,3 +179,29 @@ minetest.register_craft({ {'mobs:cheeseblock'}, } }) + +-- Dung +-- O_o? + +minetest.register_node("mobs:dung", { + description = "Cow dung", + tiles = {"mobs_dung.png"}, + inventory_image = "mobs_dung.png", + visual_scale = 0.7, + drawtype = "plantlike", + wield_image = "mobs_dung.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {snappy=2, dig_immediate=3}, + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="mobs:dung", param2=1}) + end + end +}) diff --git a/mods/mobs/textures/mobs_dung.png b/mods/mobs/textures/mobs_dung.png new file mode 100644 index 0000000000000000000000000000000000000000..b090cfd71211038ef0fb8cf958cf76db2a03a9bb GIT binary patch literal 635 zcmV->0)+jEP)r2b0n^X+zUCeChXHhubvxM|JWn_vgItd)|9E7yfsMjR4*4 zgq#4|Y)33+##Hg=yxd428g;HWZ8md`r856)??@ZBpWW+Fh4F+M>_?qC#QWbmNG6l( z7Z-Z;vrcw06p3)-<*T>cAI=a7gIdF6zmj&SakcQaBFJ|OO*v?XXmN9ASJF+Jk7i&QRl2H zo!HOt)hnkjHn+6Mm4#1uZi$Z*IdWf%1Os518dr7kC#HD#WQuCSzZu$ZW+t6$$nnu!(^GNtBIgjw+8t+5Rew<;;7v*Fbxe@s)Fb1y<@|4 z38o5-d_C%C6GhgCn1{CcC9j(%*D6W@0sD``niT+NyT}2}3VbR5;)m&pERBq^<2#N| Vv;v%{l^y^9002ovPDHLkV1ia44(I>? literal 0 HcmV?d00001 From 3f4373262afa43982567b17301e3c4a235d6f387 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 11:36:42 +0200 Subject: [PATCH 43/54] Added worldedge mod (with little tweak) - Added worldedge mod by @DonBatman - Solves #50 --- mods/worldedge/README.md | 13 ++++ mods/worldedge/depends.txt | 0 mods/worldedge/init.lua | 145 +++++++++++++++++++++++++++++++++++++ 3 files changed, 158 insertions(+) create mode 100644 mods/worldedge/README.md create mode 100644 mods/worldedge/depends.txt create mode 100644 mods/worldedge/init.lua diff --git a/mods/worldedge/README.md b/mods/worldedge/README.md new file mode 100644 index 00000000..abdaef14 --- /dev/null +++ b/mods/worldedge/README.md @@ -0,0 +1,13 @@ +worldedge +========= + +A Minetest Mod that teleports you to the other side of the map when you reach its edge. +This gives the illusion that that world is round and you can walk all the way around. + +You can change the worlds edge by changing the first variable in init.lua + local edge = 30000 + +License of code: WTFPL + +Written by Amaz +Modified by Don \ No newline at end of file diff --git a/mods/worldedge/depends.txt b/mods/worldedge/depends.txt new file mode 100644 index 00000000..e69de29b diff --git a/mods/worldedge/init.lua b/mods/worldedge/init.lua new file mode 100644 index 00000000..5e672dd7 --- /dev/null +++ b/mods/worldedge/init.lua @@ -0,0 +1,145 @@ +-------------- +-- TODO: Check for terrain height + +-- Defines the edge of a world +local edge = 30000 +-- Radius which should be checked for a good teleportation place +local radius = 2 +-------------- + +local count = 0 +local waiting_list = {} +--[[ Explanation of waiting_list table + Index = Player name + Value = { + player = Player to teleport + pos = Destination + obj = Attacked entity + notified = When the player must wait longer... + } +]] + +minetest.register_globalstep(function(dtime) + count = count + dtime + if count < 3 then + return + end + count = 0 + + for k, v in pairs(waiting_list) do + if v.player and v.player:is_player() then + local pos = get_surface_pos(v.pos) + if pos then + v.obj:setpos(pos) + minetest.after(0.2, function(p, o) + p:set_detach() + o:remove() + end, v.player, v.obj) + waiting_list[k] = nil + elseif not v.notified then + v.notified = true + minetest.chat_send_player(k, "Sorry, we have not found a free place yet. Please be patient.") + end + else + v.obj:remove() + waiting_list[k] = nil + end + end + + local newedge = edge - 5 + -- Check if the players are near the edge and teleport them + local players = minetest.get_connected_players() + for i, player in ipairs(players) do + local name = player:get_player_name() + if not waiting_list[name] then + local pos = vector.round(player:getpos()) + local newpos = nil + if pos.x >= edge then + newpos = {x = -newedge, y = 10, z = pos.z} + elseif pos.x <= -edge then + newpos = {x = newedge, y = 10, z = pos.z} + end + + if pos.z >= edge then + newpos = {x = pos.x, y = 10, z = -newedge} + newpos.y = get_surface_pos(newpos).y + elseif pos.z <= -edge then + newpos = {x = pos.x, y = 10, z = newedge} + newpos.y = get_surface_pos(newpos).y + end + + -- Teleport the player + if newpos then + minetest.chat_send_player(name, "Please wait a few seconds. We will teleport you soon.") + local obj = minetest.add_entity(newpos, "worldedge:lock") + player:set_attach(obj, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + waiting_list[name] = { + player = player, + pos = newpos, + obj = obj + } + obj:setpos(newpos) + end + end + end +end) + +function get_surface_pos(pos) + local minp = { + x = pos.x - radius - 1, + y = -10, + z = pos.z - radius - 1 + } + local maxp = { + x = pos.x + radius - 1, + y = 50, + z = pos.z + radius - 1 + } + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(minp, maxp) + local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax} + local data = vm:get_data() + + local seen_air = false + local deepest_place = vector.new(pos) + deepest_place.y = 50 + + for x = minp.x, maxp.x do + for z = minp.z, maxp.z do + local solid = 0 + for y = deepest_place.y, -10, -1 do + local node = data[area:index(x, y, z)] + if y < deepest_place.y and node == c_air then + deepest_place = vector.new(x, y, z) + seen_air = true + end + if solid > 5 then + -- Do not find caves! + break + end + if node ~= c_air and node ~= c_ignore then + solid = solid + 1 + end + end + end + end + + if seen_air then + return deepest_place + else + return false + end +end + +minetest.register_entity("worldedge:lock", { + initial_properties = { + is_visible = false + }, + on_activate = function(staticdata, dtime_s) + --self.object:set_armor_groups({immortal = 1}) + end +}) From a5dc4b16114bf335e936c1ab806689bea7fe1425 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 12:02:05 +0200 Subject: [PATCH 44/54] Added compassgps mod - Added compassgps mod (solves #53) - Added /MFF flags on modified lines of worldedge/init.lua, and used `y+1` instead of `y` for `setpos()` --- mods/compassgps/README.md | 158 ++ mods/compassgps/README.txt | 157 ++ mods/compassgps/cgpsmap.lua | 350 +++++ mods/compassgps/depends.txt | 2 + mods/compassgps/init.lua | 1298 +++++++++++++++++ mods/compassgps/locale/de.txt | 63 + mods/compassgps/locale/template.txt | 63 + mods/compassgps/textures/cgpsmap-blank.png | Bin 0 -> 359 bytes mods/compassgps/textures/cgpsmap-marked.png | Bin 0 -> 399 bytes mods/compassgps/textures/compass_0.png | Bin 0 -> 485 bytes mods/compassgps/textures/compass_1.png | Bin 0 -> 492 bytes mods/compassgps/textures/compass_10.png | Bin 0 -> 499 bytes mods/compassgps/textures/compass_11.png | Bin 0 -> 499 bytes mods/compassgps/textures/compass_2.png | Bin 0 -> 490 bytes mods/compassgps/textures/compass_3.png | Bin 0 -> 487 bytes mods/compassgps/textures/compass_4.png | Bin 0 -> 499 bytes mods/compassgps/textures/compass_5.png | Bin 0 -> 492 bytes mods/compassgps/textures/compass_6.png | Bin 0 -> 484 bytes mods/compassgps/textures/compass_7.png | Bin 0 -> 492 bytes mods/compassgps/textures/compass_8.png | Bin 0 -> 495 bytes mods/compassgps/textures/compass_9.png | Bin 0 -> 487 bytes mods/compassgps/textures/compass_b0.png | Bin 0 -> 584 bytes mods/compassgps/textures/compass_b1.png | Bin 0 -> 587 bytes mods/compassgps/textures/compass_b10.png | Bin 0 -> 539 bytes mods/compassgps/textures/compass_b11.png | Bin 0 -> 526 bytes mods/compassgps/textures/compass_b2.png | Bin 0 -> 571 bytes mods/compassgps/textures/compass_b3.png | Bin 0 -> 575 bytes mods/compassgps/textures/compass_b4.png | Bin 0 -> 541 bytes mods/compassgps/textures/compass_b5.png | Bin 0 -> 525 bytes mods/compassgps/textures/compass_b6.png | Bin 0 -> 537 bytes mods/compassgps/textures/compass_b7.png | Bin 0 -> 527 bytes mods/compassgps/textures/compass_b8.png | Bin 0 -> 522 bytes mods/compassgps/textures/compass_b9.png | Bin 0 -> 552 bytes mods/compassgps/textures/compass_c0.png | Bin 0 -> 2523 bytes mods/compassgps/textures/compass_c1.png | Bin 0 -> 2551 bytes mods/compassgps/textures/compass_c10.png | Bin 0 -> 2573 bytes mods/compassgps/textures/compass_c11.png | Bin 0 -> 2575 bytes mods/compassgps/textures/compass_c2.png | Bin 0 -> 2551 bytes mods/compassgps/textures/compass_c3.png | Bin 0 -> 2536 bytes mods/compassgps/textures/compass_c4.png | Bin 0 -> 2574 bytes mods/compassgps/textures/compass_c5.png | Bin 0 -> 2565 bytes mods/compassgps/textures/compass_c6.png | Bin 0 -> 2543 bytes mods/compassgps/textures/compass_c7.png | Bin 0 -> 2567 bytes mods/compassgps/textures/compass_c8.png | Bin 0 -> 2565 bytes mods/compassgps/textures/compass_c9.png | Bin 0 -> 2530 bytes mods/compassgps/textures/compassgps_blank.png | Bin 0 -> 103 bytes mods/worldedge/init.lua | 4 +- 47 files changed, 2093 insertions(+), 2 deletions(-) create mode 100644 mods/compassgps/README.md create mode 100644 mods/compassgps/README.txt create mode 100644 mods/compassgps/cgpsmap.lua create mode 100644 mods/compassgps/depends.txt create mode 100644 mods/compassgps/init.lua create mode 100644 mods/compassgps/locale/de.txt create mode 100644 mods/compassgps/locale/template.txt create mode 100644 mods/compassgps/textures/cgpsmap-blank.png create mode 100644 mods/compassgps/textures/cgpsmap-marked.png create mode 100644 mods/compassgps/textures/compass_0.png create mode 100644 mods/compassgps/textures/compass_1.png create mode 100644 mods/compassgps/textures/compass_10.png create mode 100644 mods/compassgps/textures/compass_11.png create mode 100644 mods/compassgps/textures/compass_2.png create mode 100644 mods/compassgps/textures/compass_3.png create mode 100644 mods/compassgps/textures/compass_4.png create mode 100644 mods/compassgps/textures/compass_5.png create mode 100644 mods/compassgps/textures/compass_6.png create mode 100644 mods/compassgps/textures/compass_7.png create mode 100644 mods/compassgps/textures/compass_8.png create mode 100644 mods/compassgps/textures/compass_9.png create mode 100644 mods/compassgps/textures/compass_b0.png create mode 100644 mods/compassgps/textures/compass_b1.png create mode 100644 mods/compassgps/textures/compass_b10.png create mode 100644 mods/compassgps/textures/compass_b11.png create mode 100644 mods/compassgps/textures/compass_b2.png create mode 100644 mods/compassgps/textures/compass_b3.png create mode 100644 mods/compassgps/textures/compass_b4.png create mode 100644 mods/compassgps/textures/compass_b5.png create mode 100644 mods/compassgps/textures/compass_b6.png create mode 100644 mods/compassgps/textures/compass_b7.png create mode 100644 mods/compassgps/textures/compass_b8.png create mode 100644 mods/compassgps/textures/compass_b9.png create mode 100644 mods/compassgps/textures/compass_c0.png create mode 100644 mods/compassgps/textures/compass_c1.png create mode 100644 mods/compassgps/textures/compass_c10.png create mode 100644 mods/compassgps/textures/compass_c11.png create mode 100644 mods/compassgps/textures/compass_c2.png create mode 100644 mods/compassgps/textures/compass_c3.png create mode 100644 mods/compassgps/textures/compass_c4.png create mode 100644 mods/compassgps/textures/compass_c5.png create mode 100644 mods/compassgps/textures/compass_c6.png create mode 100644 mods/compassgps/textures/compass_c7.png create mode 100644 mods/compassgps/textures/compass_c8.png create mode 100644 mods/compassgps/textures/compass_c9.png create mode 100755 mods/compassgps/textures/compassgps_blank.png diff --git a/mods/compassgps/README.md b/mods/compassgps/README.md new file mode 100644 index 00000000..7b2bc3ad --- /dev/null +++ b/mods/compassgps/README.md @@ -0,0 +1,158 @@ +This mod creates a customizable compass with user settable bookmarks and shared and admin bookmarks in multiplayer. + +**Compass GPS version 2.6** + +Echo created a compass mod back in 2012: [https://forum.minetest.net/viewtopic.php?id=3785](https://forum.minetest.net/viewtopic.php?id=3785)

+PilzAdams made a modification of it, which I can not find the source to, I don't know how much of PilzAdams changes made it into the later versions of Echo's mod.

+Then in 2013 TeTpaAka made a fork of the compass mod that he called compass+ [https://forum.minetest.net/viewtopic.php?id=8117](https://forum.minetest.net/viewtopic.php?id=8117)

+This fork added the ability to "bookmark" specific places, and a gui so you could choose what point the compass should point to. + +This is my fork of TeTpaAka's fork of Echo's mod. :) + +The compass mod as it was is REALLY cool I love the way Echo managed to make the compass in your inventory actually change it's image to point in the direction of it's target + +![alt text](http://i59.tinypic.com/a15ls0.png "image") + +And TeTpaAka's gui, file io, and coding for multiplayer games was simply amazing. But as I was learning from their awesome code, I saw some changes I'd like to make using these new ideas, as well as some things I learned while looking at other mods. So, with complete and total respect for the original awesome mods, and hopefully in the same spirit as theirs, I present my own fork of the fork. CompassGPS + +The crafting recipe for a compass is unchanged:

+``` + , steel , +steel, mese fragment, steel + , steel , +``` +![alt text](http://i59.tinypic.com/14ad2qw.png "image") + +Compass GPS introduces several other changes though. First of all, this mod adds a heads up display that indicates your current position, and the name of the bookmark the compass is pointing at, that bookmarks pos, as well as the distance to that bookmark. + +![alt text](http://i60.tinypic.com/facwea.png "image") + +The hud updates constantly as long as the compass is in one of your active inventory slots, so you can always know where you are in relation to the target node, and how far away it is. + +There is a GUI that pops up whenever you wield the compass and left click. I never played with a GUI in minetest before, so this was a new experience for me, I learned a lot and made quite a few changes: + +![alt text](http://i61.tinypic.com/29zzgy1.png "image") + +To create a new bookmark, type the name into the "bookmark:" field and click "Create Bookmark" (or just hit enter). To remove a bookmark, select it from the list and click "Remove Bookmark." A confirmation dialog will appear and the bookmark will only be removed if you click "YES". + +The bookmark list has been expanded from a dropdown into a textlist to improve visibility. Select any bookmark in the list by clicking on it, and then click "Find Selected Bookmark" to make the compass (and hud) point at that location. "default" is always at the top of the list and will point to (0,0,0) or your bed from PilzAdams bed-mod, or home location as defined in the sethome-mod. (Setting default to your bed or sethome is old code, I modified it to make it work with my new version, but I cant take credit for the idea or basic structure.) The rest of the list are bookmarked locations that you have set and named + +Just click in the "Sort by" box to change whether the bookmarks are sorted by name, or by distance from your current location. ("default" will still always be the first item in the list no matter which way you sort it) + +Click in the "Dist" box to change whether the distance is calculated in 3d (including your distance in the vertical direction) or in 2d (x and z coords only, ignore vertical distance) + +Down at the lower right of the screen, I'm certain you noticed the "Teleport to bookmark" button. *That button appears if, and ONLY IF the player has teleport privileges.* If they do, then they can select any bookmark out of the list, click on teleport, and be instantly transported to the location of that bookmark. Since the user already had teleport privileges, this just saved them some typing, it's not adding any new abilities. + +If you click the "Settings" button in the upper right hand corner it brings up a screen where you can customize the appearance of your compass gps: + +![alt text](http://i59.tinypic.com/aahqa8.png "image")

+(The two awesome new compass images are by Bas080 and Spootonium) + +I figured the position of the hud text was likely to be something that people would want to customize, so here in the settings gui are the x and y coords for the hud text. Just enter the new coords where you want the hud text to appear and click "Change Hud"

+The cords must be between 0 and 1 and represent a percentage of the screen, so x=0 would put the text at the far left of the screen, and y=0.98 would put the text almost at the bottom of the screen. The default is x=0.4 and y=0.01, and that is displayed right over the input boxes so the user can easily set them back to the default if they are having trouble placing the hud. If you change either the x or y coord to a number that is out of range (less than 0 or greater than 1) then the hud will not be displayed. That makes it easy to turn the hud off if you wish.

+You can also change the color of the hud text by changing the value in the "Color" field here. Again, click "Change Hud" to make the update appear. + +AND, there are three buttons here that allow you to select from 3 different styles of compass images. The basic compass image by Echo. A nice wooden compass image by Bas080. And a high resolution compass image by spootonium. + +In Multiplayer, there are now shared and admin bookmarks!

+![alt text](http://i61.tinypic.com/a5b7li.png "image")

+If a player has the new "shared_bookmarks" privilege, then they will get the "Create Shared Bookmark" button and be able to create bookmarks that all players on the server can see and use. Shared bookmarks are preceded by *shared* and the name of the player that created them. There is a variable near the top of the init.lua called max_shared. This controls the maximum number of shared bookmarks that an individual player can create. It is set to 10 by default, but the server admin can change it to whatever they want. A player can delete their own shared bookmarks, but they can not delete anyone else's (unless they are an admin, then they can delete anyone's shared bookmarks) + +If a player has the "privs" privilege, then they will get the "Create Admin Bookmark" button. Admin bookmarks are intended to allow the admins to mark important places in their world that they want everyone to be able to find. There are no limits on how many admin bookmarks can be created. Only Admins can delete admin bookmarks. + +In a multiplayer game, all players get the "Show: Private, Shared, Admin" checkboxes. You can use these checkboxes to toggle which type of bookmarks show in your list. If you uncheck all three the system will automatically recheck "Private" for you. + +The bookmark list is saved any time a user changes it. All of your other settings, the currently selected bookmark, sort order, distance function, and hud position and color, and compass type, are saved whenever a user leaves the game, and on game shutdown. So if you move the hud down to the lower right hand corner of the screen, and then quit, the hud will still be in the place you put it when you restart the game later. + +The Chat Commands from the orignal compass mod still work, but only on private bookmarks. Chat commands available are:

+list_bookmarks

+set_bookmark

+find_bookmark

+remove_bookmark + +I also fixed a few bugs while I was working on this. There was a problem in the mod that caused compass to jump around in inventory if there were empty slots above it, that is fixed now. And there was also a problem with the bookmark list not being saved after you removed a bookmark if you didn't add a new bookmark afterwards. Now the bookmark list is saved whenever you change it, either adding or removing. + +I tried to follow Echo and TeTpaAka's examples of how to properly code for multiplayer games, and all of the new settings should work just fine in a multiplayer game. + +----** MAPS! **---- + +Thanks to a great idea and initial code from TeTpaAka CompassGPS now includes MAPS!

+Maps allow you to store a bookmark that you can then give to another player and they can use the map to put that bookmark into their own list. They also enhance role playing/story possibilities since you can hide maps for players to find that will give them bookmarks they need to find their next goal. + +Craft a blank map by putting 5 papers in an X pattern:

+``` +paper, ,paper + ,paper, +paper, ,paper +``` +![alt text](http://i57.tinypic.com/20z5wmr.png "image") + +To place a bookmark into a map, just right click while wielding the map, select any bookmark from your list, and click the "write to cgpsmap" button. You can also put your current position into the map (without having to first create a bookmark in your compassGPS) + +The map icon now changes to have a red X on it, so you can tell it is a marked map. This map can be given to another player. To transfer the bookmark to their own compassgps, they right click while wielding the marked map and a formspec like this pops up:

+![alt text](http://i61.tinypic.com/jakj9v.png "image")

+You can change the name of the bookmark to whatever you wish, click the "copy bookmark to your compassgps" button and the new bookmark is now available in your compassgps list. + +To turn a marked map back into a blank map, just put it into the crafting grid. + +Thanks to some nice code by Miner59 you can now mount a map on a wall! If you can dig on the position where the map is placed, you can take the map, otherwise you can add the bookmark saved in the map in your compassgps. This will make it possible on a multiplayer server to mount maps that everyone can use. + +--------------------- + +The code is kinda a mess, because I was learning a lot of new things while working on it. I hope to do a clean up on it sometime in the near future, but I wanted to release it now so some people could start testing it. Please do not hesitate to offer critiques, criticism, or coding advice. I'm new to lua and minetest and could use the help. + +And above all, if you run into a bug, please let me know! + +**Credits:**

+Original mod is by Echo and TeTpaAka, and probably PilzAdam. Cactuz_pl clockmod showed me how to write the hud to the screen. My son offered a lot of advice and suggested several changes. I got an example of how to sort lists in lua from Michal Kottman on StackOverflow. Big thanks to Bas080 and spootonium for providing some very nice alternate images for the compass gps mod! Also thanks to Topywo for the shared bookmarks idea, and to my son for several ideas, corrections, and testing help.

+Map idea, image, and initial code by TeTpaAka. Store current position in map code contributed by Miner95

+intllib support by TeTpaAka

+Wall mounted maps by Miner59 + +**License:**

+Original code by Echo, PilzAdam, and TeTpaAka is WTFPL. My changes are CC0 (No rights reserved)

+textures: original compass textures: CC BY-SA by Echo

+ compass b textures: CC BY-SA by Bas080 (slight modifications by Kilarin)

+ compass c textures: CC BY-SA by Andre Goble mailto:spootonium@gmail.com

+ (slight modifications by Kilarin)

+ map texture: CC BY-SA by TeTpaAka (slight modifications by Kilarin for blank map) + +**Dependencies:**

+default is the only requirement.

+PilzAdams Beds mod and the sethome-mod are supported if you have them. + +**Incompatibilities:**

+This mod will clash with both the original compass and compass+ mods. They should not be installed and enabled at the same time as compassgps. HOWEVER, compassgps is 100% compatible with the bookmarks file from the compass+ mod. So if you were using compass+ and switch to compassgps you will NOT lose your previous bookmarks. + +**github source:**

+[https://github.com/Kilarin/compassgps](https://github.com/Kilarin/compassgps) + +**Download:**

+[https://github.com/Kilarin/compassgps/archive/master.zip](https://github.com/Kilarin/compassgps/archive/master.zip) + +**To install:**

+Simply unzip the file into your mods folder, then rename the resulting folder from compassgps-master to compassgps

+OR, simply install it directly from minetest using the online mod repository. + +**Mod Database:**

+If you use this mod, please consider reviewing it on the MineTest Mod Database.

+[https://forum.minetest.net/mmdb/mod/compassgps/](https://forum.minetest.net/mmdb/mod/compassgps/) + +**Changelog:**

+2.6 bug fix from myoung008, type causing crashes when entering bad color.

+2.5 bug fix from TeTpaAka fix bug when static_spawnpoint is invalid

+2.4 wall mounted maps by Miner59

+2.3 intllib support by TeTpaTka so CompassGPS will work with different languages now!

+2.2 current position option in bookmark list when writing to map (Miner95 contribution)

+2.1 cgpsmap_marked notincreative and defaults to default on /giveme

+2.0 maps so you can exchange bookmarks between players (TeTpaAka initial contribution)

+1.9 corrected undeclared global variables to avoid warnings.

+1.8 changed register_craft to compassgps:0 for unified inventory compatibility

+1.7 fixed bug causing crash on first load of formspec in multiplayer

+1.6 fixed compass point_to not saving

+1.5 shared/admin bookmarks. confirm dialog for remove.

+1.4 corrected teleport button priv

+1.3 multiple compass types

+1.2 rounding of position corrected

+1.1 switched core to minetest

+1.0 Initial release

diff --git a/mods/compassgps/README.txt b/mods/compassgps/README.txt new file mode 100644 index 00000000..781c9898 --- /dev/null +++ b/mods/compassgps/README.txt @@ -0,0 +1,157 @@ +[b]Compass GPS version 2.6[/b] +This mod creates a customizable compass with user settable bookmarks and shared and admin bookmarks in multiplayer. + +Echo created a compass mod back in 2012: [url]https://forum.minetest.net/viewtopic.php?id=3785[/url] +PilzAdams made a modification of it, which I can not find the source to, I don't know how much of PilzAdams changes made it into the later versions of Echo's mod. +Then in 2013 TeTpaAka made a fork of the compass mod that he called compass+ [url]https://forum.minetest.net/viewtopic.php?id=8117[/url] +This fork added the ability to "bookmark" specific places, and a gui so you could choose what point the compass should point to. + +This is my fork of TeTpaAka's fork of Echo's mod. :) + +The compass mod as it was is REALLY cool I love the way Echo managed to make the compass in your inventory actually change it's image to point in the direction of it's target + +[img]http://i59.tinypic.com/a15ls0.png[/img] + +And TeTpaAka's gui, file io, and coding for multiplayer games was simply amazing. But as I was learning from their awesome code, I saw some changes I'd like to make using these new ideas, as well as some things I learned while looking at other mods. So, with complete and total respect for the original awesome mods, and hopefully in the same spirit as theirs, I present my own fork of the fork. CompassGPS + +The crafting recipe for a compass is unchanged: +[code] + , steel , +steel, mese fragment, steel + , steel , +[/code] +[img]http://i59.tinypic.com/14ad2qw.png[/img] + +Compass GPS introduces several other changes though. First of all, this mod adds a heads up display that indicates your current position, and the name of the bookmark the compass is pointing at, that bookmarks pos, as well as the distance to that bookmark. + +[img]http://i60.tinypic.com/facwea.png[/img] + +The hud updates constantly as long as the compass is in one of your active inventory slots, so you can always know where you are in relation to the target node, and how far away it is. + +There is a GUI that pops up whenever you wield the compass and left click. I never played with a GUI in minetest before, so this was a new experience for me, I learned a lot and made quite a few changes: + +[IMG]http://i61.tinypic.com/29zzgy1.png[/IMG] + +To create a new bookmark, type the name into the "bookmark:" field and click "Create Bookmark" (or just hit enter). To remove a bookmark, select it from the list and click "Remove Bookmark." A confirmation dialog will appear and the bookmark will only be removed if you click "YES". + +The bookmark list has been expanded from a dropdown into a textlist to improve visibility. Select any bookmark in the list by clicking on it, and then click "Find Selected Bookmark" to make the compass (and hud) point at that location. "default" is always at the top of the list and will point to (0,0,0) or your bed from PilzAdams bed-mod, or home location as defined in the sethome-mod. (Setting default to your bed or sethome is old code, I modified it to make it work with my new version, but I cant take credit for the idea or basic structure.) The rest of the list are bookmarked locations that you have set and named + +Just click in the "Sort by" box to change whether the bookmarks are sorted by name, or by distance from your current location. ("default" will still always be the first item in the list no matter which way you sort it) + +Click in the "Dist" box to change whether the distance is calculated in 3d (including your distance in the vertical direction) or in 2d (x and z coords only, ignore vertical distance) + +Down at the lower right of the screen, I'm certain you noticed the "Teleport to bookmark" button. [i]That button appears if, and ONLY IF the player has teleport privileges.[/i] If they do, then they can select any bookmark out of the list, click on teleport, and be instantly transported to the location of that bookmark. Since the user already had teleport privileges, this just saved them some typing, it's not adding any new abilities. + +If you click the "Settings" button in the upper right hand corner it brings up a screen where you can customize the appearance of your compass gps: + +[IMG]http://i59.tinypic.com/aahqa8.png[/IMG] +(The two awesome new compass images are by Bas080 and Spootonium) + +I figured the position of the hud text was likely to be something that people would want to customize, so here in the settings gui are the x and y coords for the hud text. Just enter the new coords where you want the hud text to appear and click "Change Hud" +The cords must be between 0 and 1 and represent a percentage of the screen, so x=0 would put the text at the far left of the screen, and y=0.98 would put the text almost at the bottom of the screen. The default is x=0.4 and y=0.01, and that is displayed right over the input boxes so the user can easily set them back to the default if they are having trouble placing the hud. If you change either the x or y coord to a number that is out of range (less than 0 or greater than 1) then the hud will not be displayed. That makes it easy to turn the hud off if you wish. +You can also change the color of the hud text by changing the value in the "Color" field here. Again, click "Change Hud" to make the update appear. + +AND, there are three buttons here that allow you to select from 3 different styles of compass images. The basic compass image by Echo. A nice wooden compass image by Bas080. And a high resolution compass image by spootonium. + +In Multiplayer, there are now shared and admin bookmarks! +[IMG]http://i61.tinypic.com/a5b7li.png[/IMG] +If a player has the new "shared_bookmarks" privilege, then they will get the "Create Shared Bookmark" button and be able to create bookmarks that all players on the server can see and use. Shared bookmarks are preceded by *shared* and the name of the player that created them. There is a variable near the top of the init.lua called max_shared. This controls the maximum number of shared bookmarks that an individual player can create. It is set to 10 by default, but the server admin can change it to whatever they want. A player can delete their own shared bookmarks, but they can not delete anyone else's (unless they are an admin, then they can delete anyone's shared bookmarks) + +If a player has the "privs" privilege, then they will get the "Create Admin Bookmark" button. Admin bookmarks are intended to allow the admins to mark important places in their world that they want everyone to be able to find. There are no limits on how many admin bookmarks can be created. Only Admins can delete admin bookmarks. + +In a multiplayer game, all players get the "Show: Private, Shared, Admin" checkboxes. You can use these checkboxes to toggle which type of bookmarks show in your list. If you uncheck all three the system will automatically recheck "Private" for you. + +The bookmark list is saved any time a user changes it. All of your other settings, the currently selected bookmark, sort order, distance function, and hud position and color, and compass type, are saved whenever a user leaves the game, and on game shutdown. So if you move the hud down to the lower right hand corner of the screen, and then quit, the hud will still be in the place you put it when you restart the game later. + +The Chat Commands from the orignal compass mod still work, but only on private bookmarks. Chat commands available are: +list_bookmarks +set_bookmark +find_bookmark +remove_bookmark + +I also fixed a few bugs while I was working on this. There was a problem in the mod that caused compass to jump around in inventory if there were empty slots above it, that is fixed now. And there was also a problem with the bookmark list not being saved after you removed a bookmark if you didn't add a new bookmark afterwards. Now the bookmark list is saved whenever you change it, either adding or removing. + +I tried to follow Echo and TeTpaAka's examples of how to properly code for multiplayer games, and all of the new settings should work just fine in a multiplayer game. + +----[b] MAPS! [/b]---- + +Thanks to a great idea and initial code from TeTpaAka CompassGPS now includes MAPS! +Maps allow you to store a bookmark that you can then give to another player and they can use the map to put that bookmark into their own list. They also enhance role playing/story possibilities since you can hide maps for players to find that will give them bookmarks they need to find their next goal. + +Craft a blank map by putting 5 papers in an X pattern: +[code] +paper, ,paper + ,paper, +paper, ,paper +[/code] +[img]http://i57.tinypic.com/20z5wmr.png[/img] + +To place a bookmark into a map, just right click while wielding the map, select any bookmark from your list, and click the "write to cgpsmap" button. You can also put your current position into the map (without having to first create a bookmark in your compassGPS) + +The map icon now changes to have a red X on it, so you can tell it is a marked map. This map can be given to another player. To transfer the bookmark to their own compassgps, they right click while wielding the marked map and a formspec like this pops up: +[img]http://i61.tinypic.com/jakj9v.png[/img] +You can change the name of the bookmark to whatever you wish, click the "copy bookmark to your compassgps" button and the new bookmark is now available in your compassgps list. + +To turn a marked map back into a blank map, just put it into the crafting grid. + +Thanks to some nice code by Miner59 you can now mount a map on a wall! If you can dig on the position where the map is placed, you can take the map, otherwise you can add the bookmark saved in the map in your compassgps. This will make it possible on a multiplayer server to mount maps that everyone can use. + +--------------------- + +The code is kinda a mess, because I was learning a lot of new things while working on it. I hope to do a clean up on it sometime in the near future, but I wanted to release it now so some people could start testing it. Please do not hesitate to offer critiques, criticism, or coding advice. I'm new to lua and minetest and could use the help. + +And above all, if you run into a bug, please let me know! + +[b]Credits:[/b] +Original mod is by Echo and TeTpaAka, and probably PilzAdam. Cactuz_pl clockmod showed me how to write the hud to the screen. My son offered a lot of advice and suggested several changes. I got an example of how to sort lists in lua from Michal Kottman on StackOverflow. Big thanks to Bas080 and spootonium for providing some very nice alternate images for the compass gps mod! Also thanks to Topywo for the shared bookmarks idea, and to my son for several ideas, corrections, and testing help. +Map idea, image, and initial code by TeTpaAka. Store current position in map code contributed by Miner95 +intllib support by TeTpaAka +Wall mounted maps by Miner59 + +[b]License:[/b] +Original code by Echo, PilzAdam, and TeTpaAka is WTFPL. My changes are CC0 (No rights reserved) +textures: original compass textures: CC BY-SA by Echo + compass b textures: CC BY-SA by Bas080 (slight modifications by Kilarin) + compass c textures: CC BY-SA by Andre Goble mailto:spootonium@gmail.com + (slight modifications by Kilarin) + map texture: CC BY-SA by TeTpaAka (slight modifications by Kilarin for blank map) + +[b]Dependencies:[/b] +default is the only requirement. +PilzAdams Beds mod and the sethome-mod are supported if you have them. + +[b]Incompatibilities:[/b] +This mod will clash with both the original compass and compass+ mods. They should not be installed and enabled at the same time as compassgps. HOWEVER, compassgps is 100% compatible with the bookmarks file from the compass+ mod. So if you were using compass+ and switch to compassgps you will NOT lose your previous bookmarks. + +[b]github source:[/b] +[url]https://github.com/Kilarin/compassgps[/url] + +[b]Download:[/b] +[url]https://github.com/Kilarin/compassgps/archive/master.zip[/url] + +[b]To install:[/b] +Simply unzip the file into your mods folder, then rename the resulting folder from compassgps-master to compassgps +OR, simply install it directly from minetest using the online mod repository. + +[b]Mod Database:[/b] +If you use this mod, please consider reviewing it on the MineTest Mod Database. +[url]https://forum.minetest.net/mmdb/mod/compassgps/[/url] + +[b]Changelog:[/b] +2.6 bug fix from myoung008, type causing crashes when entering bad color. +2.5 bug fix from TeTpaAka fix bug when static_spawnpoint is invalid +2.4 wall mounted maps by Miner59 +2.3 intllib support by TeTpaTka so CompassGPS will work with different languages now! +2.2 current position option in bookmark list when writing to map (Miner95 contribution) +2.1 cgpsmap_marked notincreative and defaults to default on /giveme +2.0 maps so you can exchange bookmarks between players (TeTpaAka initial contribution) +1.9 corrected undeclared global variables to avoid warnings. +1.8 changed register_craft to compassgps:0 for unified inventory compatibility +1.7 fixed bug causing crash on first load of formspec in multiplayer +1.6 fixed compass point_to not saving +1.5 shared/admin bookmarks. confirm dialog for remove. +1.4 corrected teleport button priv +1.3 multiple compass types +1.2 rounding of position corrected +1.1 switched core to minetest +1.0 Initial release diff --git a/mods/compassgps/cgpsmap.lua b/mods/compassgps/cgpsmap.lua new file mode 100644 index 00000000..cab62ed6 --- /dev/null +++ b/mods/compassgps/cgpsmap.lua @@ -0,0 +1,350 @@ +--original code for storing bookmarks outside of the compass by TeTpaAka +--modifications by Kilarin and Miner59 +--wall mounted maps by Miner59 + +--set growing_wall_maps to true and wall mounted maps will get bigger the further +--away the target is. +local growing_wall_maps=false + + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function ( s ) return s end +end + + +local selected_cgpsmap = {} +local textlist_bookmark = {} +local selected_bookmark = {} + +function write_to_cgpsmap(itemstack, user) + --print("write_to_cgpsmap") + selected_cgpsmap[user:get_player_name()] = itemstack + local list,bkmrkidx=compassgps.bookmark_loop("M", user:get_player_name()) + if list == "" then + return nil + end + textlist_bookmark[user:get_player_name()] = list + local formspec = "size[9,10;]".. + "button_exit[2,2;5,0.5;write;"..S("Write to cgpsmap").."]".. + "textlist[0,3.0;9,6;bookmark_list;"..list..";"..bkmrkidx.."]" + minetest.show_formspec(user:get_player_name(), "compassgps:write", formspec) + --print("write_to_cgpsmap end") +end + + +function read_from_cgpsmap(itemstack, user, meta) + --print("read_from_cgpsmap") + local formspec = "size[9,5]".. + "button_exit[2,3;5,0.5;read;"..S("copy bookmark to your compassgps").."]" + if itemstack~=nil then + formspec=formspec.. "button_exit[3.1,4;2.6,0.8;rename;"..S("rename bookmark").."]" + else + itemstack=ItemStack("compassgps:cgpsmap_marked 1") + if meta then + itemstack:set_metadata(minetest.serialize(meta)) + end + end + if not meta then --marked map from creative or /giveme has no meta! + meta={bkmrkname="default",x=0,y=0,z=0} + itemstack:set_metadata(minetest.serialize(meta)) + end + selected_cgpsmap[user:get_player_name()] = itemstack + + formspec=formspec.."label[2,0.5;"..S("bookmark pos:").." ("..meta["x"]..","..meta["y"]..","..meta["z"]..")]".. + "field[2,2;5,0.5;name;"..S("bookmark name:")..";"..meta["bkmrkname"].."]" + minetest.show_formspec(user:get_player_name(), "compassgps:read", formspec) + --print("read_from_cgpsmap end") +end + + + +minetest.register_craft({ + output = 'compassgps:cgpsmap', + recipe = { + {'default:paper', '', 'default:paper'}, + {'', 'default:paper', ''}, + {'default:paper', '', 'default:paper'} + } +}) + +minetest.register_craft({ + output = 'compassgps:cgpsmap', + recipe = { + {'compassgps:cgpsmap_marked'}, + } +}) + +minetest.register_craftitem("compassgps:cgpsmap", { + description = S("CompassGPS Map (blank)"), + inventory_image = "cgpsmap-blank.png", + --groups = {book = 1}, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + write_to_cgpsmap(itemstack, user) + return + end +}) + +minetest.register_craftitem("compassgps:cgpsmap_marked", { + description = "CompassGPS Map (marked)", + inventory_image = "cgpsmap-marked.png", + groups = {not_in_creative_inventory = 1}, + stack_max = 1, + + on_use = function(itemstack, user, pointed_thing) + local meta = minetest.deserialize(itemstack:get_metadata()) + read_from_cgpsmap(itemstack, user, meta) + return nil + end, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type=="node" and pointed_thing.above then + local pos=pointed_thing.above + local ppos=placer:getpos() + local facedir=minetest.dir_to_facedir(vector.direction(ppos,pointed_thing.under)) + local x=pos.x + local y=pos.y + local z=pos.z + if facedir~=nil and itemstack:get_name()=="compassgps:cgpsmap_marked" + and (not minetest.is_protected(pos,placer:get_player_name())) then + minetest.set_node(pos,{name="compassgps:cgpsmap_wall",param2=facedir}) + local mapdata = itemstack:get_metadata() + local meta=minetest.get_meta(pos) + meta:set_string("mapdata",mapdata) + if mapdata~=nil then + local data=minetest.deserialize(mapdata) + if data~=nil then + meta:set_string("infotext", data["bkmrkname"]) + x=data["x"] + y=data["y"] + z=data["z"] + end + end + if facedir==1 then + pos={x=pos.x+0.3,y=pos.y,z=pos.z} + elseif facedir==3 then + pos={x=pos.x-0.3,y=pos.y,z=pos.z} + elseif facedir==0 then + pos={x=pos.x,y=pos.y,z=pos.z+0.3} + elseif facedir==2 then + pos={x=pos.x,y=pos.y,z=pos.z-0.3} + end + local e = minetest.env:add_entity(pos,"compassgps:cgpsmap_item") + local yaw = math.pi*2 - facedir * math.pi/2 + e:setyaw(yaw) + local dist=math.abs(pos.x-x)+math.abs(pos.y-y)+math.abs(pos.z-z) + if growing_wall_maps == false then + e:set_properties({visual_size={x=0.85,y=0.85}}) + elseif dist>30000 then + e:set_properties({visual_size={x=3.45,y=3.45}}) + elseif dist>15000 then + e:set_properties({visual_size={x=2.95,y=2.95}}) + elseif dist>5000 then + e:set_properties({visual_size={x=2.45,y=2.45}}) + elseif dist>3000 then + e:set_properties({visual_size={x=1.45,y=1.45}}) + elseif dist>2000 then + e:set_properties({visual_size={x=1.2,y=1.2}}) + elseif dist>1000 then + e:set_properties({visual_size={x=1,y=1}}) + elseif dist>500 then + e:set_properties({visual_size={x=0.85,y=0.85}}) + end--else default (0.7) + + itemstack:take_item() + end + end + return itemstack + end, +}) + +minetest.register_node("compassgps:cgpsmap_wall",{ + description = "CompassGPS Map (wallmounted)", + drawtype = "nodebox", + node_box = { type = "fixed", fixed = {-0.5, -0.5, 7/16, 0.5, 0.5, 0.5} }, + selection_box = { type = "fixed", fixed = {-0.7, -0.7, 7/16, 0.7, 0.7, 0.7} }, + tiles = {"compassgps_blank.png"}, + inventory_image = "cgpsmap_marked.png", + wield_image = "cgpsmap_marked.png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = { choppy=2,dig_immediate=2,not_in_creative_inventory=1,not_in_craft_guide=1 }, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + on_punch = function(pos,node,puncher) + local meta = minetest.env:get_meta(pos) + local mapdata=meta:get_string("mapdata") + + if minetest.is_protected(pos,puncher:get_player_name()) then + --don't take map, instead open formspec to add coordinates in compassgps + if mapdata~=nil then + read_from_cgpsmap(nil, puncher, minetest.deserialize(mapdata)) + end + return + end + local inv = puncher:get_inventory() + + local objs = nil + objs = minetest.env:get_objects_inside_radius(pos, .5) + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "compassgps:cgpsmap_item" then + obj:remove() + end + end + end + local itemstack=ItemStack("compassgps:cgpsmap_marked 1") + itemstack:set_metadata(mapdata) + if inv:room_for_item("main",itemstack) then + inv:add_item("main",itemstack) + else + minetest.env:add_item(pos, itemstack) + end + minetest.remove_node(pos) + end, +}) + +minetest.register_entity("compassgps:cgpsmap_item",{ + hp_max = 1, + visual="wielditem", + visual_size={x=0.7,y=0.7}, + collisionbox = {0,0,0,0,0,0}, + physical=false, + textures={"compassgps:cgpsmap_marked"}, +}) + +minetest.register_abm({ + nodenames = { "compassgps:cgpsmap_wall" }, + interval = 600, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + if #minetest.get_objects_inside_radius(pos, 0.5) > 0 then return end + local meta=minetest.get_meta(pos) + local x=pos.x + local y=pos.y + local z=pos.z + local mapdata=meta:get_string("mapdata",mapdata) + if mapdata~=nil then + local data=minetest.deserialize(mapdata) + if data~=nil then + x=data["x"] + y=data["y"] + z=data["z"] + end + end + local facedir=node.param2 + if facedir==1 then + pos={x=pos.x+0.3,y=pos.y,z=pos.z} + elseif facedir==3 then + pos={x=pos.x-0.3,y=pos.y,z=pos.z} + elseif facedir==0 then + pos={x=pos.x,y=pos.y,z=pos.z+0.3} + elseif facedir==2 then + pos={x=pos.x,y=pos.y,z=pos.z-0.3} + end + local e = minetest.env:add_entity(pos,"compassgps:cgpsmap_item") + local yaw = math.pi*2 - facedir * math.pi/2 + e:setyaw(yaw) + local dist=math.abs(pos.x-x)+math.abs(pos.y-y)+math.abs(pos.z-z) + if dist>30000 then + e:set_properties({visual_size={x=3.45,y=3.45}}) + elseif dist>15000 then + e:set_properties({visual_size={x=2.95,y=2.95}}) + elseif dist>5000 then + e:set_properties({visual_size={x=2.45,y=2.45}}) + elseif dist>3000 then + e:set_properties({visual_size={x=1.45,y=1.45}}) + elseif dist>2000 then + e:set_properties({visual_size={x=1.2,y=1.2}}) + elseif dist>1000 then + e:set_properties({visual_size={x=1,y=1}}) + elseif dist>500 then + e:set_properties({visual_size={x=0.85,y=0.85}}) + end--else default (0.7) + + end +}) + + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if (formname == "compassgps:write") then + if not player then + return + end + local playername = player:get_player_name(); + if (playername ~= "") then + if (selected_cgpsmap[playername] == nil) then + return + end + if fields["bookmark_list"] then + -- to get the currently selected + local id = minetest.explode_textlist_event(fields["bookmark_list"]) + selected_bookmark[playername] = id.index + end + if fields["write"] then + --print("***cgpsmap fields=write***") + if selected_bookmark[playername] == nil then + return nil + end + local bkmrk=textlist_bkmrks[playername][selected_bookmark[playername]] + local write = { ["bkmrkname"] = bkmrk.bkmrkname, + x = bkmrk.x, + y = bkmrk.y, + z = bkmrk.z} + --print("dump(write)="..dump(write)) + selected_cgpsmap[playername]:set_name("compassgps:cgpsmap_marked") + selected_cgpsmap[playername]:set_metadata(minetest.serialize(write)) + player:set_wielded_item(selected_cgpsmap[playername]) + end + end + end + if (formname == "compassgps:read") then + if not player then + return + end + if (fields["read"]) then + --print("***cgpsmap fields=read***") + local meta = minetest.deserialize(selected_cgpsmap[player:get_player_name()]:get_metadata()) + --print("dump(meta)="..dump(meta)) + local bkmrkname = fields["name"] + --print("bkmrkname from fields[name]="..bkmrkname) + local pos = { x = meta["x"] + 0, + y = meta["y"] + 0, + z = meta["z"] + 0 } + local playername = player:get_player_name() + --print(bkmrkname) + compassgps.set_bookmark(playername, bkmrkname, "P", pos) + end + end + + if (selected_cgpsmap == nil) then + return + end + local playername = player:get_player_name() + if (playername == nil) then + return + end + if (selected_cgpsmap[playername] == nil) then + return + end + if fields["rename"] then + local bkmrkname = fields["name"] + local meta = minetest.deserialize(selected_cgpsmap[player:get_player_name()]:get_metadata()) + if meta~=nil and bkmrkname~=nil then + local pos = { x = meta["x"] + 0, + y = meta["y"] + 0, + z = meta["z"] + 0 } + selected_cgpsmap[playername]:set_metadata(minetest.serialize({ ["bkmrkname"] = bkmrkname, + x = pos.x, + y = pos.y, + z = pos.z})) + player:set_wielded_item(selected_cgpsmap[playername]) --new name is saved in marked cpgsmap + end + end + end) diff --git a/mods/compassgps/depends.txt b/mods/compassgps/depends.txt new file mode 100644 index 00000000..9207dab8 --- /dev/null +++ b/mods/compassgps/depends.txt @@ -0,0 +1,2 @@ +default +intllib? diff --git a/mods/compassgps/init.lua b/mods/compassgps/init.lua new file mode 100644 index 00000000..09e2525b --- /dev/null +++ b/mods/compassgps/init.lua @@ -0,0 +1,1298 @@ +--compassgps 2.1 + +--This fork was written by Kilarin (Donald Hines) +--Original code by Echo, PilzAdam, and TeTpaAka is WTFPL. +--My changes are CC0 (No rights reserved) +--textures: original compass textures: CC BY-SA by Echo +-- compass b textures: CC BY-SA by Bas080 (slight modifications by Kilarin) +-- compass c textures: CC BY-SA by Andre Goble mailto:spootonium@gmail.com +-- (slight modifications by Kilarin) + +--fixed bug that caused compass to jump around in inventory +--fixed bug causing removed bookmarks not to be saved +--expanded bookmark list from dropdown to textlist +--added pos and distance to display list +--added hud showing current pos -> target pos : distance + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if (minetest.get_modpath("intllib")) then + S = intllib.Getter() +else + S = function ( s ) return s end +end + +local hud_default_x=0.4 +local hud_default_y=0.01 +local hud_default_color="FFFF00" +local compass_default_type="a" +local compass_valid_types={"a","b","c"} +local activewidth=8 --until I can find some way to get it from minetest +local max_shared=10 --how many shared bookmarks a user with shared_bookmarks priv can make. +local show_shared_on_singleplayer=false --show shared and admin checkboxes on singleplayer +--the ONLY reason to change this variable to true is for testing. shared and admin bookmarks +--make no sense in a single player game. + +minetest.register_privilege("shared_bookmarks", + S("Can create shared bookmarks for use by anyone with a compassgps")) +--minetest.register_privilege("shared_bookmarks", { +-- description = "Can create shared bookmarks for use by anyone with a compassgps", +-- give_to_singleplayer = false,}) + +compassgps = { } +local player_hud = { }; +local bookmarks = { } +local point_to = {} +local sort_function = {} +local distance_function ={} +local hud_pos = {} +local hud_color = {} +local compass_type = {} +local view_type_P = {} +local view_type_S = {} +local view_type_A = {} +local textlist_clicked = {} +textlist_bkmrks = {} +local singleplayer = false +local target = {} +local pos = {} +local dir = 90 +local default_bookmark = {} +local backwardscompatsave = "NO" + + +print(S("compassgps reading bookmarks")) +local file = io.open(minetest.get_worldpath().."/bookmarks", "r") +if file then + bookmarks = minetest.deserialize(file:read("*all")) + file:close() +end + +--local remove + + +--the sort functions and distance functions have to be defined ABOVE the +--"main" block or will be nil + +function compassgps.sort_by_distance(table,a,b,player) + --print("sort_by_distance a="..compassgps.pos_to_string(table[a]).." b="..pos_to_string(table[b])) + local playerpos = player:getpos() + local name=player:get_player_name() + --return compassgps.distance3d(playerpos,table[a]) < compassgps.distance3d(playerpos,table[b]) + if distance_function[name] then + return distance_function[name](playerpos,table[a]) < + distance_function[name](playerpos,table[b]) + else + return false --this should NEVER happen + end +end --sort_by_distance + +function compassgps.sort_by_name(table,a,b,player) + local atype="P" --default to P + if table[a].type then atype=table[a].type end + local btype="P" + if table[b].type then btype=table[b].type end + if atype == btype then + local aplayer="" + if table[a].player then aplayer=table[a].player end + local bplayer="" + if table[b].player then bplayer=table[b].player end + if aplayer == bplayer then + return a < b --compare on bookmark name + else + return aplayer < bplayer --compare on player name + end --compare player name + else + return atype < btype --compare on bookmark type + end -- compare type +end --sort_by_name + + +function compassgps.distance2d(pos1in,pos2in) +local pos1=compassgps.round_digits_vector(pos1in,0) +local pos2=compassgps.round_digits_vector(pos2in,0) +return math.sqrt((pos2.x-pos1.x)^2+(pos2.z-pos1.z)^2) +end --distance2d + + +--calculate distance between two points +function compassgps.distance3d(pos1in,pos2in) +--round to nearest node +--print(" pos1in="..compassgps.pos_to_string(pos1in).." pos2in="..compassgps.pos_to_string(pos2in)) +local pos1=compassgps.round_digits_vector(pos1in,0) +local pos2=compassgps.round_digits_vector(pos2in,0) +return math.sqrt((pos2.x-pos1.x)^2+(pos2.z-pos1.z)^2+(pos2.y-pos1.y)^2) +end --distance3d + + + +-- ********************************************************** +print(S("compassgps reading settings")) +if minetest.is_singleplayer() and show_shared_on_singleplayer==false then + singleplayer=true +else + singleplayer=false +end + +local settings = { } +local file = io.open(minetest.get_worldpath().."/compassgps_settings", "r") +if file then + settings = minetest.deserialize(file:read("*all")) + file:close() +end +--now transfer these to the correct variables +for name,stng in pairs(settings) do + --if settings[name].point_name then + -- point_name[name]=settings[name].point_name + --end + if settings[name].point_to and settings[name].point_to.bkmrkname then + point_to[name]=settings[name].point_to + else + point_to[name]=nil + end + if settings[name].sort_function then + if settings[name].sort_function == "name" then + sort_function[name]=compassgps.sort_by_name + else + sort_function[name]=compassgps.sort_by_distance + end + end + if settings[name].distance_function then + if settings[name].distance_function == "2d" then + distance_function[name]=compassgps.distance2d + else + distance_function[name]=compassgps.distance3d + end + end + if settings[name].hud_pos then + hud_pos[name]=settings[name].hud_pos + end + if settings[name].hud_color then + hud_color[name]=settings[name].hud_color + end + if settings[name].compass_type then + compass_type[name]=settings[name].compass_type + end + --saved as strings so its easier to check for nil + if settings[name].view_type_P then + view_type_P[name]=settings[name].view_type_P + else + view_type_P[name]="true" + end --view_type_P + if settings[name].view_type_S then + view_type_S[name]=settings[name].view_type_S + else + view_type_S[name]="false" + end --view_type_S + if settings[name].view_type_A then + view_type_A[name]=settings[name].view_type_A + else + view_type_A[name]="false" + end --view_type_A + + if singleplayer then + view_type_P[name]="true" + view_type_A[name]="false" + view_type_S[name]="false" + end--override view types + +end --for + + +function compassgps.bookmark_to_string(bkmrk) + if not bkmrk then return "{nil}" end + local str="{" + if bkmrk.player then str=str..bkmrk.player + else str=str.."player=nil" end + str=str.." : " + if bkmrk.bkmrkname then str=str..bkmrk.bkmrkname + else str=str.."bkmrkname=nil" end + str=str.." : "..compassgps.pos_to_string(bkmrk).." : " + if bkmrk.type then str=str..bkmrk.type + else str=str.."type=nil" end + str=str.."}" + return str + end -- bookmark_to_string + + +function compassgps.bookmark_name_string(bkmrk) + --print("bookmark_name_string: "..compassgps.bookmark_to_string(bkmrk)) + if bkmrk.type=="A" then + return "*admin*:"..bkmrk.player.."> "..bkmrk.bkmrkname + elseif bkmrk.type=="S" then + return "*shared*:"..bkmrk.player.."> "..bkmrk.bkmrkname + else + return bkmrk.bkmrkname + end +end --bookmark_name_string + + +function compassgps.bookmark_name_pos_dist(bkmrk,playername,playerpos) + if distance_function[playername] == nil then + return "" + end + return compassgps.bookmark_name_string(bkmrk).." : "..compassgps.pos_to_string(bkmrk).. + " : "..compassgps.round_digits(distance_function[playername](playerpos,bkmrk),2) +end --gookmark_name_pos_dist + + +function compassgps.count_shared(playername) + local c=0 + for k,v in pairs(bookmarks) do + if v.player and v.player==playername and v.type and v.type=="S" then + c=c+1 + end --if + end --for + return c +end--count_shared + + + +--********************************************************* +--mode "L" create list for displaying bookmarks in gui +--mode "C" display private bookmarks only in chat +--mode "M" similar to "L" but with current position (for maps) +function compassgps.bookmark_loop(mode,playername,findidx) + --print("bookmark_loop top") + local player = minetest.get_player_by_name(playername) + local playerpos = player:getpos() + local list="" + local bkmrkidx=1 + local i=1 + if mode=="L" or mode=="M" then + local spawnbkmrk=compassgps.get_default_bookmark(playername,1) + textlist_bkmrks[playername]={} + if mode=="M" then + local cpos=compassgps.round_pos(playerpos) + list = S("current position : ")..compassgps.pos_to_string({x=cpos.x,y=cpos.y,z=cpos.z,player=playername,type="P",bkmrkname=playername.."'s map"})..",".. + compassgps.bookmark_name_pos_dist(spawnbkmrk,playername,playerpos) + textlist_bkmrks[playername][1]={x=cpos.x,y=cpos.y,z=cpos.z,player=playername,type="P",bkmrkname=S("%s's map"):format(playername)} + textlist_bkmrks[playername][2]=spawnbkmrk + i=2 + mode="L" + else + list = compassgps.bookmark_name_pos_dist(spawnbkmrk,playername,playerpos) + textlist_bkmrks[playername][1]=spawnbkmrk + end --initialize list + + --add all spawn position from beds mod, sethome mod and the default spawn point + spawnbkmrk=compassgps.get_default_bookmark(playername,2) + if spawnbkmrk~=nil then + i=i+1 + list = list..","..compassgps.bookmark_name_pos_dist(spawnbkmrk,playername,playerpos) + textlist_bkmrks[playername][i]=spawnbkmrk + end + spawnbkmrk=compassgps.get_default_bookmark(playername,3) + if spawnbkmrk~=nil then + i=i+1 + list = list..","..compassgps.bookmark_name_pos_dist(spawnbkmrk,playername,playerpos) + textlist_bkmrks[playername][i]=spawnbkmrk + end + textlist_clicked[playername]=1 + end + + --bkmrkidx will be used to highlight the currently selected item in the list + backwardscompatsave="NO" + + for k,v in spairs(bookmarks,sort_function[playername],player) do + --backwards compatibility + --since version 1.5, all bookmarks will have a player and type, but + --bookmarks from the old compass mods and previous versions of this + --mod will not. Because the original mod did not put a seperator between + --the playername and the bookmark name, the only way to seperate them + --is when you have the player name. this if says that if v.player is + --not defined and the begining of the bookmark matches the playername + --then set v.player and v.type and set a flag to save the bookmarks + --print("bookmark_loop unmod "..compassgps.bookmark_to_string(v)) + if not v.player then --if playername is not set, fix it + local pos1, pos2 = string.find(k, playername, 0) + if pos1==1 and pos2 then --add playername and type to bookmark + v.player=playername + v.type="P" + v.bkmrkname=string.sub(k,string.len(v.player)+1) + backwardscompatsave="YES" + end --if pos1==1 + end --if not v.player backwards compatibility + + --even though we set v.player above, that was for bookmarks that match + --this playername, so there could still be other players bookmarks that + --do not have v.player defined, thats why we have to check it again. + local vplayernm="" + if v.player then vplayernm=v.player end + local vtype="P" + if v.type then vtype=v.type end + local vbkmrkname=k + if v.bkmrkname then vbkmrkname=v.bkmrkname end + --now vplayernm,vtype,vbkmrkname are guaranteed to be defined + + --admin and shared bookmarks + if (mode=="L") and + ( (vtype=="A" and view_type_A[playername]=="true") or + (vtype=="S" and view_type_S[playername]=="true") ) then + i=i+1 + list = list..","..compassgps.bookmark_name_pos_dist(v,playername,playerpos) + textlist_bkmrks[playername][i]=v + --print("bookmark_loop AS "..i.." "..compassgps.bookmark_to_string(textlist_bkmrks[playername][i])) + --private bookmarks + elseif vtype=="P" and vplayernm==playername and view_type_P[playername]=="true" then + i=i+1 + if mode=="L" then + list = list..","..compassgps.bookmark_name_pos_dist(v,playername,playerpos) + --list = list..","..vbkmrkname.." : "..compassgps.pos_to_string(v).. + -- " : "..compassgps.round_digits(distance_function[playername](playerpos,v),2) + textlist_bkmrks[playername][i]=v + --print("bookmark_loop P "..i.." "..compassgps.bookmark_to_string(textlist_bkmrks[playername][i])) + elseif mode=="C" then + --minetest.chat_send_player(playername, vbkmrkname..": "..compassgps.pos_to_string(v)) + minetest.chat_send_player(playername, compassgps.bookmark_name_pos_dist(v,playername,playerpos)) + end + end --if vtype + + --print("bookmark_loop mode="..mode.." bkmrkidx="..bkmrkidx.." vbkmkrname="..vbkmrkname.." point_to="..point_to[playername].bkmrkname.." vplayer="..vplayer.." point_to="..point_to[playername].player) + --set testlist_clicked to the currently selected item in the list + if point_to[playername]~=nil then -- don't crash when point_to[playername] is nil + if mode=="L" and bkmrkidx==1 and vbkmrkname==point_to[playername].bkmrkname + and vplayernm==point_to[playername].player then + bkmrkidx=i + textlist_clicked[playername]=i + --point_to is the bookmark this player's compass is already pointing to + --when we open the list, if we found a bookmark that matches that item, we want + --to highlight it (by setting bkmrkidx to the index to highlight) and we want + --to set textlist_clicked to match that item. We need textlist_clicked because + --textlist does not return the currently selected item when you click a button, + --so we must keep the currently selected item in memory + --elseif mode=="I" and i==findidx then + -- return bkmrkname --found the item we were looking for, we are done. + end --if mode=L + end --for spairs + end --point_to[playername]~=nil + + if backwardscompatsave=="YES" then compassgps.write_bookmarks() end + + if mode=="L" then + return list,bkmrkidx + --elseif mode=="I" then + -- return "default" --didn't find it, so return default. + end --if mode=="L" + +end --bookmark_loop + + + + + + +function compassgps.get_confirm_formspec(playername,bkmrkidx) + --print("get_confirm_remove_formspec") + local player = minetest.get_player_by_name(playername) + if not compassgps.verify_bookmark_parms("remove_bookmark",player,playername,bkmrkidx) + then return end + local bkmrk=textlist_bkmrks[playername][bkmrkidx] + + return "compassgps:confirm_remove", "size[8,2;]".. + "label[0,0.2;"..S("Remove bookmark: ")..compassgps.bookmark_name_string(bkmrk).." ?]".. + "button[0,0.7;4,1;confirm_remove_yes;"..S("Yes").."]".. + "button[4,0.7;4,1;confirm_remove_no;"..S("No").."]" +end + + +function compassgps.check_view_type_all_blank(playername) + --view_type values are not all set when you first bring up the form + --so we check to ensure that view_type_A and S are default false for sp and true for mp + --and that if all values are false we set view_type_P to true + local defaultvalue="true" + if singleplayer then + defaultvalue="false" + end + if (not view_type_A[playername]) then + view_type_A[playername]=defaultvalue + end + if (not view_type_S[playername]) then + view_type_S[playername]=defaultvalue + end + if (not view_type_P[playername]) + or (view_type_P[playername]=="false" and view_type_S[playername]=="false" + and view_type_A[playername]=="false") then + view_type_P[playername]="true" + end +end --check_view_type_all_blank + + + +minetest.register_on_player_receive_fields(function(player,formname,fields) + if (not player) then + return false; + end + + local playername = player:get_player_name(); + if (playername ~= "" and formname == "compassgps:bookmarks") then + --"bookmark" field is set EVERY time. I would like to detect someone hitting + --enter in that field, but the problem is, if someone types something into + --the bookmark field, and then clicks on a bookmark in the textlist, + --I would get back bookmark as set. So, the only way to detect that + --enter has been hit in the bookmark field is to check bookmark, and ensure + --every other field is NOT set. + --this leaves open the possibility of someone typing in the hudx or hudy + --field and hitting enter after typing in the bookmark field. Not likely + if (fields["new_bookmark"] and fields["bookmark"]) --hit the bookmark button + or ( (fields["bookmark"]) and (fields["bookmark"]~="") --bookmark field not blank + and (not fields["remove_bookmark"]) and (not fields["find_bookmark"]) + and (not fields["bookmark_list"]) and (not fields["sort_type"]) + and (not fields["distance_type"]) and (not fields["settings"]) + and (not fields["teleport"]) and (not fields["show_private"]) + and (not fields["show_shared"]) and (not fields["show_admin"]) + ) + then + local type="P" + if fields["new_shared_bookmark"] then + type="S" + elseif fields["new_admin_bookmark"] then + type="A" + end --shared or admin + compassgps.set_bookmark(playername, fields["bookmark"],type) + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["remove_bookmark"] and textlist_clicked[playername] then + local bkmrkidx=textlist_clicked[playername] + if textlist_bkmrks[playername][bkmrkidx].player ~= playername then + --only admins can delete someone elses shared bookmark + --check to see if the player has "privs" privliges + local player_privs + player_privs = minetest.get_player_privs(playername) + if not player_privs["privs"] then + minetest.chat_send_player(playername,S("you can not remove someone elses bookmark:").. + compassgps.bookmark_name_string(textlist_bkmrks[playername][bkmrkidx])) + return + end --if not player_privs + end -- if player~=playername + + -- you can't remove default bookmarks (bed, home, spawnpoint) + if textlist_bkmrks[playername][bkmrkidx].bkmrkname==nil or textlist_bkmrks[playername][bkmrkidx].player==nil then + return + end + if bookmarks[textlist_bkmrks[playername][bkmrkidx].player..textlist_bkmrks[playername][bkmrkidx].bkmrkname]==nil then + return + end + + --if they got here, they have authority to del the bookmark, show confirm dialog + minetest.show_formspec(playername, compassgps.get_confirm_formspec(playername, bkmrkidx)) + elseif fields["find_bookmark"] and textlist_clicked[playername] then + --print("compassgps.fields find_bookmark triggered, playername="..playername.." textlist_clicked="..textlist_clicked[playername]) + compassgps.find_bookmark(playername,textlist_clicked[playername]) + elseif fields["bookmark_list"] then + local idx=tonumber(string.sub(fields["bookmark_list"],5)) + --textlist_clicked[playername]=compassgps.bookmark_from_idx(playername,idx) + --textlist_clicked[playername]=compassgps.bookmark_loop("I",playername,idx) + textlist_clicked[playername]=idx + --print("bookmark_list triggered textlist idx="..idx.." tlc="..textlist_clicked[playername]) + elseif fields["sort_type"] then + local idx=tonumber(string.sub(fields["sort_type"],5)) + if idx==1 then + sort_function[playername]=compassgps.sort_by_name + else + sort_function[playername]=compassgps.sort_by_distance + end --if name else distance + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["distance_type"] then + local idx=tonumber(string.sub(fields["distance_type"],5)) + if idx==1 then + distance_function[playername]=compassgps.distance3d + else + distance_function[playername]=compassgps.distance2d + end --if 2d else 3d + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["show_private"] then + view_type_P[playername]=tostring(fields["show_private"]) + compassgps.check_view_type_all_blank(playername) + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["show_shared"] then + view_type_S[playername]=tostring(fields["show_shared"]) + compassgps.check_view_type_all_blank(playername) + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["show_admin"] then + view_type_A[playername]=tostring(fields["show_admin"]) + compassgps.check_view_type_all_blank(playername) + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["teleport"] then + -- Teleport player. + compassgps.teleport_bookmark(playername, textlist_clicked[playername]) + elseif fields["settings"] then + --bring up settings screen + minetest.show_formspec(playername, compassgps.get_settings_formspec(playername)) + end --compassgps formspec + elseif (playername ~= "" and formname == "compassgps:settings") then + if fields["hud_pos"] then --and fields["hudx"] and fields["hudy"] then + --minetest.chat_send_all("hud_pos triggered") + if tonumber(fields["hudx"]) and tonumber(fields["hudy"]) then + hud_pos[playername].x=fields["hudx"] + hud_pos[playername].y=fields["hudy"] + if tonumber(hud_pos[playername].x)<0 or tonumber(hud_pos[playername].x)>1 + or tonumber(hud_pos[playername].y)<0 or tonumber(hud_pos[playername].y)>1 then + minetest.chat_send_player(playername,S("compassgps: hud coords out of range, hud will not be displayed. Change to between 0 and 1 to restore")) + --compassgps.write_settings() --no need to save until you quit + end + else --not numbers + minetest.chat_send_player(playername,S("compassgps: hud coords are not numeric. Change to between 0 and 1")) + end --if x,y valid + if tonumber(fields["hudcolor"],16) then + hud_color[playername]=fields["hudcolor"] + else + minetest.chat_send_player(playername,S("compassgps: hud color not valid hex number")) + end --if color valid + elseif fields["compass_type_a"] then + compass_type[playername]="a" + elseif fields["compass_type_b"] then + compass_type[playername]="b" + elseif fields["compass_type_c"] then + compass_type[playername]="c" + end --if fields["hud_pos"] + elseif (playername ~= "" and formname == "compassgps:confirm_remove") then + if fields["confirm_remove_yes"] then + compassgps.remove_bookmark(playername, textlist_clicked[playername]) + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + elseif fields["confirm_remove_no"] then + minetest.show_formspec(playername, compassgps.get_compassgps_formspec(playername)) + end -- if fields["confirm_remove_yes"] + end -- form if +end) + + +--saves the bookmark list in minetest/words//bookmarks +function compassgps.write_bookmarks() + local file = io.open(minetest.get_worldpath().."/bookmarks", "w") + if file then + file:write(minetest.serialize(bookmarks)) + file:close() + end +end --write_bookmarks + + +--saves the settings in minetest/words//compassgps_settings +function compassgps.write_settings() + --loop through players and set settings + --(less error prone than trying to keep settings in sync all the time + print(S("compassgps writing settings")) + local players = minetest.get_connected_players() + for i,player in ipairs(players) do + local name = player:get_player_name(); + local sort_short="name" + --if you save the actual sort_function or distance_function, it saves the + --whole function in the serialized file! not what I wanted, and doesn't work right. + if sort_function[name] and sort_function[name]==compassgps.sort_by_distance then + sort_short="distance" + end + local dist_short="2d" + if distance_function[name] and distance_function[name]==compassgps.distance3d then + dist_short="3d" + end + settings[name]={point_to=point_to[name], + hud_pos=hud_pos[name], + sort_function=sort_short, + distance_function=dist_short, + hud_color=hud_color[name], + compass_type=compass_type[name], + view_type_P=view_type_P[name], + view_type_S=view_type_S[name], + view_type_A=view_type_A[name]} + end + --now write to file + local file = io.open(minetest.get_worldpath().."/compassgps_settings", "w") + if file then + file:write(minetest.serialize(settings)) + file:close() + end +end --write_settings + + +minetest.register_on_leaveplayer(function(player) + compassgps.write_settings() + end) + +minetest.register_on_shutdown(compassgps.write_settings) + + +function compassgps.clean_string(str) + --remove dangerous characters that will mess up the list of bookmarks + --the file can handle these fine, but the LIST for the textlist + --will interpret these as seperators + str=string.gsub(str,",",".") + str=string.gsub(str,";",".") + str=string.gsub(str,"%[","(") + str=string.gsub(str,"%]",")") + return str +end --clean_string + + + +function compassgps.set_bookmark(playername, bkmrkname, type, predefinedpos) + local player = minetest.get_player_by_name(playername) + if not player then + return + end + + local pos = player:getpos() + if predefinedpos ~= nil then + pos = predefinedpos + end + --we are marking a NODE, no need to keep all those fractions + pos=compassgps.round_pos(pos) + + bkmrkname=compassgps.clean_string(bkmrkname) + + if bkmrkname == "" then + minetest.chat_send_player(playername, S("Give the bookmark a name.")) + return + end + if bkmrkname == "default" or bkmrkname == "bed" or bkmrkname == "sethome" + or string.sub(bkmrkname,1,8) == "*shared*" + or string.sub(bkmrkname,1,7)=="*admin*" then + minetest.chat_send_player(playername, S("A bookmark with the name '%s' can't be created."):format(bkmrkname)) + return + end + if bookmarks[playername..bkmrkname] then + minetest.chat_send_player(playername, S("You already have a bookmark with that name.")) + return + end + + pos.type=type or "P" --Private Shared Admin + + if pos.type=="S" and compassgps.count_shared(playername) >= max_shared then + minetest.chat_send_player(playername, S("The maximum number of shared bookmarks any user can create is %d."):format(max_shared)) + return + end + + pos.bkmrkname=bkmrkname + pos.player=playername + + bookmarks[playername..bkmrkname] = pos + + compassgps.write_bookmarks() + minetest.chat_send_player(playername, S("Bookmark '%s' added at %s type=%s"):format(bkmrkname, compassgps.pos_to_string(pos), pos.type)) +end + + +minetest.register_chatcommand("set_bookmark", { + params = "", + description = S("set_bookmark: Sets a location bookmark for the player"), + func = function (playername, bkmrkname) + compassgps.set_bookmark(playername, bkmrkname, "P") + end, +}) + + + +--returns a pos that is rounded special case. round 0 digits for X and Z, +--round 1 digit for Y +function compassgps.round_pos(pos) + pos.x=compassgps.round_digits(pos.x,0) + pos.y=compassgps.round_digits(pos.y,1) + pos.z=compassgps.round_digits(pos.z,0) + return pos +end --round_pos + + + +function compassgps.round_digits(num,digits) + if num >= 0 then return math.floor(num*(10^digits)+0.5)/(10^digits) + else return math.ceil(num*(10^digits)-0.5)/(10^digits) + end +end --round_digits + +function compassgps.round_digits_vector(vec,digits) + return {x=compassgps.round_digits(vec.x,digits),y=compassgps.round_digits(vec.y,digits), + z=compassgps.round_digits(vec.z,digits)} +end --round_digits_vector + + +--because built in pos_to_string doesn't handle nil, and commas mess up textlist +--this rounds same rules as for setting bookmark or teleporting +--that way what you see in the hud matches where you teleport or bookmark +function compassgps.pos_to_string(pos) + if pos==nil then return "(nil)" + else + pos=compassgps.round_pos(pos) + return "("..pos.x.." "..pos.y.." "..pos.z..")" + end --pos==nill +end --pos_to_string + + + +minetest.register_chatcommand("list_bookmarks", { + params = "", + description = S("list_bookmarks: Lists all bookmarks of a player"), + func = function(name, param) + compassgps.bookmark_loop("C",name) + end, +}) + + +function compassgps.verify_bookmark_parms(from_function,player,playername,bkmrkidx) + --just being paranoid, probably none of these checks are necessary + if not player then + print(S("compassgps.%s player not found"):format(from_function)) + if not playername then print(S(" playername=nil")) + else print(S(" playername=%s"):format(playername)) + end --if not playername + return false + end --if not player + if not tonumber(bkmrkidx) then + print(S("compassgps.%s invalid bkrmkidx"):format(from_funtion)) + if not bkmrkidx then print(S(" bkmrkidx=nil")) + else print(" bkmrkidx="..bkmrkidx) + end --if not bkmrkidx + return false + end --if not tonumber(bkmrkidx) + if not textlist_bkmrks[playername][bkmrkidx] then + print(S("compassgps.%s invalid bookmark playername=%s bkmrkid=%s"):format(from_function, playername, bkmrkidx)) + minetest.chat_send_player(playername,S("compassgps:%s invalid bookmark"):format(from_function)) + return false + end --if not textlist_bkmrks + return true --if you got here it is all good +end --verify_bookmark_parms + + + +function compassgps.remove_bookmark(playername, bkmrkidx) + local player = minetest.get_player_by_name(playername) + if not compassgps.verify_bookmark_parms("remove_bookmark",player,playername,bkmrkidx) + then return end + + + + print(S("remove bookmark playername=%s bkmrkidx=%s"):format(playername, bkmrkidx)) + minetest.chat_send_player(playername, S("removed %s"):format( + compassgps.bookmark_name_string(textlist_bkmrks[playername][bkmrkidx]))) + bookmarks[textlist_bkmrks[playername][bkmrkidx].player.. + textlist_bkmrks[playername][bkmrkidx].bkmrkname] = nil + compassgps.write_bookmarks() +end --remove_bookmarks + + + +function compassgps.remove_bookmark_byname(playername, bkmrkname) + local player = minetest.get_player_by_name(playername) + if not player then + return + end + if bkmrkname == "" then + minetest.chat_send_player(name, S("No bookmark was specified.")) + return + end + if not bookmarks[playername..bkmrkname] then + minetest.chat_send_player(playername, S("You have no bookmark with this name.")) + return + end + bookmarks[playername..bkmrkname] = nil + compassgps.write_bookmarks() + minetest.chat_send_player(playername, S("The bookmark "..bkmrkname.." has been successfully removed.")) +end + + + +minetest.register_chatcommand("remove_bookmark", { + params = "", + description = S("Removes the bookmark specified by "), + func = function(name, bkmrkname) + compassgps.remove_bookmark_byname(name,bkmrkname) + end, +}) + + +function compassgps.teleport_bookmark(playername, bkmrkidx) + local player = minetest.get_player_by_name(playername) + if not compassgps.verify_bookmark_parms("teleport_bookmark",player,playername,bkmrkidx) + then return end + print(S("compassgps teleporting player %s to %s"):format(playername, + compassgps.bookmark_name_string(textlist_bkmrks[playername][bkmrkidx]))) + minetest.chat_send_player(playername, S("Teleporting to %s"):format( + compassgps.bookmark_name_string(textlist_bkmrks[playername][bkmrkidx]))) + player:setpos(textlist_bkmrks[playername][bkmrkidx]) +end --teleport_bookmark + + + +function compassgps.find_bookmark_byname(playername, bkmrkname) + local player = minetest.get_player_by_name(playername) + if not player then + return + end + if not bkmrkname or bkmrkname == "" then + minetest.chat_send_player(playername, S("No bookmark was specified.")) + return + end + if bkmrkname == "default" then + minetest.chat_send_player(playername, S("Pointing at default location.")) + point_to[playername] = compassgps.get_default_bookmark(playername,1) + return + end + if not bookmarks[playername..bkmrkname] then + minetest.chat_send_player(playername, S("You have no bookmark with this name.")) + return + end + point_to[playername] = bookmarks[playername..bkmrkname] + minetest.chat_send_player(playername, S("Pointing at %s."):format(bkmrkname)) +end + + + +function compassgps.find_bookmark(playername, bkmrkidx) + local player = minetest.get_player_by_name(playername) + if not compassgps.verify_bookmark_parms("find_bookmark",player,playername,bkmrkidx) + then return end + point_to[playername] = textlist_bkmrks[playername][bkmrkidx] + minetest.chat_send_player(playername, S("Pointing at %s."):format(point_to[playername].bkmrkname)) +end + + +minetest.register_chatcommand("find_bookmark", { + params = "", + description = S("Lets the compassgps point to the bookmark"), + func = function(playername, bkmrkname) + compassgps.find_bookmark_byname(playername,bkmrkname) + end, +}) + + + + + +-- compassgps mod + + + + +-- default to static spawnpoint +local static_spawnpoint = minetest.setting_get_pos("static_spawnpoint") +-- default to 0/0/0 if spawnpoint is not present or invalid +local default_spawn = static_spawnpoint or {x=0, y=0, z=0} + +local last_time_spawns_read = "default" +local beds_spawns = {} +local sethome_spawns = {} +function read_spawns() + -- read BlockMen beds-mod positions (added to default minetest game) + local beds_file = io.open(minetest.get_worldpath().."/beds_spawns", "r") + if beds_file then + while true do + local x = beds_file:read("*n") + if x == nil then + break + end + local y = beds_file:read("*n") + local z = beds_file:read("*n") + local name = beds_file:read("*l") + beds_spawns[name:sub(2)] = {x = x, y = y, z = z} + end + io.close(beds_file) + else + -- read PilzAdams beds-mod positions + beds_file = io.open(minetest.get_worldpath().."/beds_player_spawns", "r") + if beds_file then + beds_spawns = minetest.deserialize(beds_file:read("*all")) + beds_file:close() + end + end + + -- read sethome-mod positions + if minetest.get_modpath('sethome') then + local sethome_file = io.open(minetest.get_modpath('sethome')..'/homes', "r") + if sethome_file then + while true do + local x = sethome_file:read("*n") + if x == nil then + break + end + local y = sethome_file:read("*n") + local z = sethome_file:read("*n") + local name = sethome_file:read("*l") + sethome_spawns[name:sub(2)] = {x = x, y = y, z = z} + end + io.close(sethome_file) + end + end +end + + +function compassgps.compass_type_name(playername,imagenum,ctypein) + local ctype="a" + if ctypein then + ctype=ctypein + end + if playername~="" and compass_type[playername] then + ctype=compass_type[playername] + end + if ctype=="a" then + ctype="" + end + --print("compass type name return "..ctype..imagenum) + return ctype..imagenum +end + + +function compassgps.get_default_bookmark(name,num) + -- try to get position from beds-mod spawn + local pos = beds_spawns[name] + local posname="bed" + if pos~=nil and num==1 then + default_bookmark={x=pos.x,y=pos.y,z=pos.z,player=name,type="P",bkmrkname=posname} + return default_bookmark + elseif pos~=nil then + num=num-1 + end + -- fallback to sethome position + pos = sethome_spawns[name] + posname="home" + if pos~=nil and num==1 then + default_bookmark={x=pos.x,y=pos.y,z=pos.z,player=name,type="P",bkmrkname=posname} + return default_bookmark + elseif pos~=nil then + num=num-1 + end + if num>1 then + return + end + + -- fallback to default + pos = default_spawn; + posname="spawn" + default_bookmark={x=pos.x,y=pos.y,z=pos.z,player=name,type="P",bkmrkname=posname} + return default_bookmark +end --get_default_bookmark + +function compassgps.get_default_pos_and_name(name) + -- try to get position from PilzAdams bed-mod spawn + local pos = beds_spawns[name] + local posname="bed" + -- fallback to sethome position + if pos == nil then + pos = sethome_spawns[name] + posname="sethome" + end + -- fallback to default + if pos == nil then + pos = default_spawn; + posname="default" + end +default_bookmark={x=pos.x,y=pos.y,z=pos.z,player=name,type="P"} +return pos,posname +end --get_compassgps_target_pos + + + + +minetest.register_globalstep(function(dtime) + if last_time_spawns_read ~= os.date("%M") then + last_time_spawns_read = os.date("%M") + read_spawns() + end + local players = minetest.get_connected_players() + for i,player in ipairs(players) do + local playername = player:get_player_name(); + + local gotacompass=false + local wielded=false + local activeinv=nil + local stackidx=0 + --first check to see if the user has a compass, because if they don't + --there is no reason to waste time calculating bookmarks or spawnpoints. + local wielded_item = player:get_wielded_item():get_name() + if string.sub(wielded_item, 0, 11) == "compassgps:" and string.sub(wielded_item, 0, 18) ~= "compassgps:cgpsmap" then + --if the player is wielding a compass, change the wielded image + wielded=true + stackidx=player:get_wield_index() + gotacompass=true + else + --check to see if compass is in active inventory + if player:get_inventory() then + --is there a way to only check the activewidth items instead of entire list? + --problem being that arrays are not sorted in lua + for i,stack in ipairs(player:get_inventory():get_list("main")) do + if i<=activewidth and string.sub(stack:get_name(), 0, 11) == "compassgps:" and string.sub(stack:get_name(),0,18) ~= "compassgps:cgpsmap" then + activeinv=stack --store the stack so we can update it later with new image + stackidx=i --store the index so we can add image at correct location + gotacompass=true + break + end --if i<=activewidth + end --for loop + end -- get_inventory + end --if wielded else + + + --dont mess with the rest of this if they don't have a compass + if gotacompass then + --if they don't have a bookmark set, use the default + point_to[playername]=point_to[playername] or compassgps.get_default_bookmark(playername,1) + target=point_to[playername] --just to take up less space + pos = player:getpos() + dir = player:get_look_yaw() + local angle_north = math.deg(math.atan2(target.x - pos.x, target.z - pos.z)) + if angle_north < 0 then angle_north = angle_north + 360 end + local angle_dir = 90 - math.deg(dir) + local angle_relative = (angle_north - angle_dir) % 360 + local compass_image = math.floor((angle_relative/30) + 0.5)%12 + + + --update compass image to point at target + if wielded then + player:set_wielded_item("compassgps:".. + compassgps.compass_type_name(playername,compass_image)) + elseif activeinv then + --player:get_inventory():remove_item("main", activeinv:get_name()) + player:get_inventory():set_stack("main",stackidx,"compassgps:".. + compassgps.compass_type_name(playername,compass_image)) + end --if wielded elsif activin + + + --update the hud with playerpos -> target pos : distance to target + distance_function[playername]=distance_function[playername] or compassgps.distance3d + --if distance_function[playername]==nil then + -- distance_function[playername]=compassgps.distance3d + --end + + + local hudx=tonumber(hud_default_x) + local hudy=tonumber(hud_default_y) + if hud_pos[playername] then + hudx=tonumber(hud_pos[playername].x) + hudy=tonumber(hud_pos[playername].y) + else + hud_pos[playername]={x=hud_default_x, y=hud_default_y} + end + + local hudcolor=tonumber(hud_default_color, 16) + if hud_color[playername] then + hudcolor=tonumber(hud_color[playername], 16) + else + hud_color[playername]=hud_default_color + end + + local compasstype=compass_default_type + if compass_type[playername] and + (compass_type[playername]=="a" or compass_type[playername]=="b" or compass_type[playername]=="c") then + compasstype=compass_type[playername] + else + compass_type[playername]=compass_default_type + end + + local h=nil + if hudx>=0 and hudx<=1 and hudy>=0 and hudy<=1 then + h = player:hud_add({ + hud_elem_type = "text"; + position = {x=hudx, y=hudy}; + text = compassgps.pos_to_string(pos).." -> ".. + compassgps.bookmark_name_pos_dist(target,playername,pos); + --text = compassgps.pos_to_string(pos).." -> "..target.bkmrkname.. + -- " "..compassgps.pos_to_string(target).." : ".. + -- compassgps.round_digits(distance_function[playername](pos,target),2); + number = hudcolor; + scale = 20; + }); + end --if x and y in range + if (player_hud[playername]) then + --remove the previous element + player:hud_remove(player_hud[playername]); + end + player_hud[playername] = h; --store this element for removal next time + --this elseif is triggered if gotacompass=false + elseif (player_hud[playername]) then --remove the hud if player no longer has compass + player:hud_remove(player_hud[playername]); + player_hud[playername]=nil + end --if gotacompass + end --for i,player in ipairs(players) +end) -- register_globalstep + + + + + + + + + +function compassgps.sort_by_coords(table,a,b) + if table[a].x==table[b].x then + if table[a].z==table[b].z then + return table[a].y = Entfernt den Wegpunkt der mit angegeben ist. +Settings = Einstellungen +Shared = Geteilt +Show: = Zeige: +Sort by: = Sortiere nach: +Teleporting to %s = Teleportiere zu %s +The bookmark = Der Wegpunkt +The maximum number of shared bookmarks any user can create is %d. = Jeder Nutzer kann nur %d geteilte Wegpunkte erstellen. +Yes = Ja +You already have a bookmark with that name. = Sie haben bereits einen Wegpunkt mit diesem Namen. +You have no bookmark with this name. = Sie haben keinen Wegpunkt mit diesem Namen. +bookmark = Wegpunkt +compassgps reading bookmarks = compassgps liest die Wegpunkte. +compassgps reading settings = compassgps liest die Einstellungen. +compassgps = Kompass +compassgps teleporting player %s to %s = compassgps teleportiert Spieler %s nach %s. +compassgps writing settings = compassgps schreibt die Einstellungen. +compassgps.%s invalid bkrmkidx = compassgps.%s ungültige bkmrkidx. +compassgps.%s invalid bookmark playername\=%s bkmrkid\=%s = compassgps.%s ungültiger Wegpunkt Spielername\=%s bkmrkidx\=%s. +compassgps.%s player not found = compassgps.%s Spieler nicht gefunden. +compassgps: hud color not valid hex number = compassgps: HUD Farbe ist keine zulässige Hexadezimalzahl. +compassgps: hud coords are not numeric. Change to between 0 and 1 = compassgps: HUD Koordinaten sind keine Zahlen. Ändern sie diese zu Werten zwischen 0 und 1. +compassgps: hud coords out of range, hud will not be displayed. Change to between 0 and 1 to restore = compassgps: HUD Koordinaten sind außerhalb des zulässigen Bereichs. Ändern sie diese zu Werten zwischen 0 und 1 um das HUD wiederherzustellen. +compassgps:%s invalid bookmark = compassgps.%s ungültiger Wegpunkt +create admin = Erstelle Administratorwegpunkt +create bookmark = Erstelle Wegpunkt +create shared = Erstelle geteilten Wegpunkt +current position : = Momentane Position : +distance = Entfernung +find selected bookmark = Finde den ausgewählten Wegpunkt +list_bookmarks: Lists all bookmarks of a player = list_bookmarks: Zeigt alle Wegpunkte eines Spielers. +name = Name +remove bookmark = Entferne den Wegpunkt +remove bookmark playername\=%s bkmrkidx\=%s = Entferne den Wegpunkt Spielername\=%s bkmrkidx\=%s +removed %s = %s entfernt. +set_bookmark: Sets a location bookmark for the player = set_bookmark: Setzt einen Wegpunkt für den Spieler. +teleport to bookmark = Teleportiere zu dem Wegpunkt. +you can not remove someone elses bookmark: = Sie können den Wegpunkt eines anderen Spielers nicht entfernen: +CompassGPS Map (blank) = CompassGPS Karte (leer) +CompassGPS Map (marked) = CompassGPS Karte (markiert) +Write to cgpsmap = Schreibe auf die Karte +copy bookmark to your compassgps = Kopiere den Wegpunkt in ihren Kompass. +bookmark name: = Name des Wegpunkts: +bookmark pos: = Position des Wegpunkts: diff --git a/mods/compassgps/locale/template.txt b/mods/compassgps/locale/template.txt new file mode 100644 index 00000000..20af3180 --- /dev/null +++ b/mods/compassgps/locale/template.txt @@ -0,0 +1,63 @@ + bkmrkidx\=nil = + playername\=%s = + playername\=nil = +%s's map = +A bookmark with the name '%s' can't be created. = +Admin = +Bookmark '%s' added at %s type\=%s = +Change hud: = +Color: = +Dist: = +Compass Type: = +Give the bookmark a name. = +Lets the compassgps point to the bookmark = +No = +No bookmark was specified. = +Pointing at %s. = +Pointing at default location. = +Private = +Remove bookmark: = +Removes the bookmark specified by = +Settings = +Shared = +Show: = +Sort by: = +Teleporting to %s = +The bookmark = +The maximum number of shared bookmarks any user can create is %d. = +Yes = +You already have a bookmark with that name. = +You have no bookmark with this name. = +bookmark = +compassgps reading bookmarks = +compassgps reading settings = +compassgps = +compassgps teleporting player %s to %s = +compassgps writing settings = +compassgps.%s invalid bkrmkidx = +compassgps.%s invalid bookmark playername\=%s bkmrkid\=%s = +compassgps.%s player not found = +compassgps: hud color not valid hex number = +compassgps: hud coords are not numeric. Change to between 0 and 1 = +compassgps: hud coords out of range, hud will not be displayed. Change to between 0 and 1 to restore = +compassgps:%s invalid bookmark = +create admin = +create bookmark = +create shared = +current position : = +distance = +find selected bookmark = +list_bookmarks: Lists all bookmarks of a player = +name = +remove bookmark = +remove bookmark playername\=%s bkmrkidx\=%s = +removed %s = +set_bookmark: Sets a location bookmark for the player = +teleport to bookmark = +you can not remove someone elses bookmark: = +CompassGPS Map (blank) = +CompassGPS Map (marked) = +Write to cgpsmap = +copy bookmark to your compassgps = +bookmark name: = +bookmark pos: = diff --git a/mods/compassgps/textures/cgpsmap-blank.png b/mods/compassgps/textures/cgpsmap-blank.png new file mode 100644 index 0000000000000000000000000000000000000000..f3289f346b9c912268c9c1c766d7b51977d3988d GIT binary patch literal 359 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHj>wqkxnu*ZIAhfkIzAT^vI!PA{Ek$aTm;!1X^r+s5re zIW`@wbJY!6GX#DXXoX+ zIR14;Svqbiaurm}WmR!KSFOOg$z}8GyPgyFuC_ zYWn#{m4}DnCx?n_S@suqV}=81hJlIO_BOHieLLBfdw|Wgg_YlAhnGcs_}1uf{Ri!W ze++`s^`6%Uec%h*9`J76GdZ@pkc5QIVZ7%=XT1A*PT=L&Wm3=E1*@7hFPSWTz003J x=jHUbpO&sR{8nJY$dF_4edVjp#}Z0G7Uk=@X6r`jEd_-fgQu&X%Q~loCIDUDiq!xB literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/cgpsmap-marked.png b/mods/compassgps/textures/cgpsmap-marked.png new file mode 100644 index 0000000000000000000000000000000000000000..a4bfd7c7a7647e8e691d69357e8783914617fcfd GIT binary patch literal 399 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b zKpodXn9)gNb_Gz7y~NYkmHj>=E4KhomU50W0|TRsr;B5V#p$J!484vxh_wB$H$3qz zj62ij;5>&2YyX6Qt7NMw^>>o1h^f04sG_hm!c+V`k-0y zaPq$Tf8YHzlz#Zj_DHLwYj<(Hv{KOg^pD3R^16l9%YDAr-p;j~uFY^DiD~!M6y`4_ zx94^X7wkOr`0i4D14bXlBc9v)g%dV!J1)Y;V9n$?QS0cBwL5IPM1Jg7c&Pw$NpE%KY=rYfpSLxqen4faa*wb>-`~UtI>2lxymo4}l z_Ok!Od&w7j7T%k~BXTXB_u#e0dvz6iTz~%*gTe~DWM4fLpY>T literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_0.png b/mods/compassgps/textures/compass_0.png new file mode 100644 index 0000000000000000000000000000000000000000..bb33a804229d0197d74b962f8efee1213b0febf0 GIT binary patch literal 485 zcmVr~{@v~s~_wPT$x353`A3Jjj>>VbME%pw21U18e zUw|cpuD&8TtiT3<0xY*MfGEu{keTDhz{buBW;2P32`~r?^O0nLrj{IogoGf(0AXQX zk~D(=8ygFQpddsa)4TUya4I~1bp}@PU%&n^ynFW`=i1_gS3u9H; zJcbj;uH)6bWzz|U$rCm(z!DJ%z!~UyK}AK1fr*(39AGzZJO<~5t5+T}pyvgQ+(l|` bq!<7IXXUb)Yh6?j00000NkvXXu0mjfcXH4U literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_1.png b/mods/compassgps/textures/compass_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f7646828721c46921521d5c31f2ac05156959112 GIT binary patch literal 492 zcmVf;>OWEYum2 zQ#~2f)Mdcp|Nj1CxO(*=!?ekp7<^Hn(*pF&G)EV%2DI?=SKMRI`|Nb+4`}*Vmu`{Q@ zhA@HrZ112)P%{kp1z0lZ>MMf73Tyxkq@bcb_2!yn6AT;qBW` zB)Q=FwMPsuU%rRB0BF+W{tYA{Ai&7000SaNLh0L01m_e01m_fl`9S#00004XF*Lt006O%3;baP0004kNkl1OJ7Dcp3NvxEc6(IT=2D_{#7Rgg<@-$uS};ym0Lz0}HZ%fFRF*GYfTw z@1VzEWUR_S4DbuE zWYE=D1cw#a08oJC76yPN4Yf0fG9)v{kAaPy72*O>F#!f)VLmYD{M8v?LkJn9sU^oC zAt4B6vj_|GqDX=aL3Ry{j||w@SQrEaA^KR}z5jyM7Hk?};McD|4Da53hIrxCi}ws~ z-+m&>?=W!v+9QUSFW*B90GTwoe*;MdOrNre;n&aK5Cedi@!)|=4Cl_?CQ9?B4aXTS zU%U@uGQtdC`0)MK{003bvnjqWy_0a$T002ovPDHLkV1lV~%eVjl literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_11.png b/mods/compassgps/textures/compass_11.png new file mode 100644 index 0000000000000000000000000000000000000000..2cf7fc039966e911ecc3dd8d0e56861f6918fbac GIT binary patch literal 499 zcmVH?J47k9S zO(z&8_N`~wbMO!&iVHwCw{;~k7#XXA1r4<`7|vgvfnk7;p9RCefBzZ2ef{zO*qKvc zLzqB*ws+8jYX$+3W{@G+fM0+mgRZ_JIIO@1fC4PHFo1y+keTDhz{buBW;2P32`~r? z^I<5$=L$_NIR*&{L5Kmu!n`Ee4gzd!EDVBz5PeMV-haWV5L-Zkz^`9_7~Z}63^Cx< zi}ws~-+m&=1=p`VVtD!TJ=6t2lP33XAjyE~Q#LXD`uQ7T04RALJaCEO+}YbiY2LKq zIK$1OJ7Dcp3NvxEc6(IT=2D_{#7Rgg<@-$uS};ym0Lz0}HZ%fFRF*GYfTw z@1VzEWUR_S4DbuE zWYE=D1cw#a08oJC76uTd*-$$JOlRi!F|e_-g4ryhVgd}p!hA$&Jb!ftnAX&iV~~&# zgcu+!%uBRJ7+_;#VGtCA=wo^J{tHe6&^5xquU~%{-o5(_3B*?~-ZQ*?`-!M9fPw4R z9x=Rp`5s~b$fU{r8%Q!>`jkx!zkdFP7y!hK2M=6gICu6oQJObxIL>hS;(ZX45oQ3x zhxcC?tIFmvoH%wJuVzq6oIGIz!?$lg;mMg1IWr;W1r-%31}0`EaDd&s@femD7?AS< gC@C{inj0ww01f1qBI31NB>(^b07*qoM6N<$g7k;QQ2+n{ literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_3.png b/mods/compassgps/textures/compass_3.png new file mode 100644 index 0000000000000000000000000000000000000000..3b07e41f54a6b70521f294aa48e7be775f2c8ee4 GIT binary patch literal 487 zcmVH?J47k9S zO(z&8_N`~wbMO!&iVHwCw{;~k7#XWF-~&E>77YLX{b%_0^~e8XXHJ0)VFLNt-a(I` zW*G1buw>BHR|JO@*Z@#~27nY|1HXR#VR-lMGsFw8Uc6^``}Pw_Ubuek z5yQ)u?;!?&Oq$%kfg}T_Puaxq>*sHX0ifi0@W3U8b7yZ8rFqka;|!NC-iIe^CJ^!A z{TIfnvUvH?J47k9S zO(z&8_N`~wbMO!&iVHwCw{;~k7#XWF-~&E>77YLX{b%_0^~e8XXHJ0)VFLNt-a(I` zW*G1buw>BHR|JO@*Z@#~Y zEX<2jp`msL7^4F=HWmg!L5Mzsr)*;Q_47Bx08sKgc;FJlxwE&4GGx<+ z;|!NC-iIe^CJ^!A{TIfnvUvH?J47k9S zO(z&8_N`~wbMO!&iVHwCw{;~k7#XWF-~&E>77YLX{b%_0^~e8XXHJ0)VFLNt-a(I` zW*G1buw>BHR|JO@*Z@#~Y zEX<2jp`msLR&h2q76w5K|tP0Oxoq^RA z*RMTdc=_@@)CEA3Ciib3$pzD=Y-0HJ^Ebo*Q1U!@;1a{Rv$u(I#ik9%87^PE4^P%i zAmYROFN{@X^B7JXyN=Tk5CEmb$rCm(z!DJ%z!~UyK}AK1fr*(39AGzZJO<~5t5+T} iV9g82fYjVbF#rHq`k@k3d;rh@0000|_`K!-000SaNLh0L01m_e01m_fl`9S#00004XF*Lt006O%3;baP0004VNklH?J47k9S zO(z&8_N`~wbMO!&iVHwCw{;~k7#XWF-~&E>77YLX{b%_0^~e8XXHJ0)VFLNt-a(I` zW*G1buw>BHR|JO@*Z@#~Y zEX<2jp`msLR&h2q76w5K|k_@S-~hXM<1sidT)py;0c&1B2BhXj aiU9x$MVQu+7Y7jl0000H?J47k9S zO(z&8_N`~wbMO!&iVHwCw{;~k7#XWF-~&E>77YLX{b%_0^~e8XXHJ0)VFLNt-a(I` zW*G1buw>BHR|JO@*Z@#~Y zEX<2jp`msLR&h2q76w5K|thS%OIs>Z# z*RMTdc=_@@)CEA3Ciib3$pzD=Y-0HJ^Ebo*Q1U!@;1a{Rv$u(|eba{H43{t7hbL<$ z5b@#t7sjfxc?>6xT?Z?|r5ThGCr{YG082z50B4}*1r-%31}0`EaDd&s@fe&Ju3mY_ ifHf~515$G%#Q*@H`k@kY8vc0z00001OJ7Dcp3NvxEc6(IT=2D_{#7Rgg<@-$uS};ym0Lz0}HZ%fFRF*GYfTw z@1VzEWUR_S4DbuE zWYE=D1cw#a08oJC76uTd83r^yeAqD_3M9xgec|k=*ih+rl2^?TIZ#;(O l1qS5207}Y?l;%c?0RSM(m>7t^7@7b8002ovPDHLkV1mx^$b0|* literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_9.png b/mods/compassgps/textures/compass_9.png new file mode 100644 index 0000000000000000000000000000000000000000..5243b798e648e91d35f31fa34832dbe00a0e8764 GIT binary patch literal 487 zcmV1OJ7Dcp3NvxEc6(IT=2D_{#7Rgg<@-$uS};ym0Lz0}HZ%fFRF*GYfTw z@1VzEWUR_S4DbuE zWYE=D1cw#a08oJC76uTd83r0}2 z)Xu=F`25uw7-DQ}EDVBz5PdA~-haWV5EuCM>kq@bcb_3%c=h5v!`ru?Nb_^MZPx#24YJ`L;x@VMgX!28XzkG000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^r9 z7bP~L=7^{O000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004_NkljvT=E48ijmc(do7^tL8j&)uhvHFZ?PD zd_=2Wk;KdZt{!eI7{{^SJz(v(9hLC3Rv-*~m0f>su?&r-g?F4P!88i$ORmvd8o)Jr zl=Qqhnq*eqq4N@|{|``d-eNl+qdBmhae}(*vKOs-B{2urk4)7C zfZcb$IQsBd5eSgI{27tBY2*_Fa&#K8-Dp}s4*Q$Upg&YLTV-9fQoMijOmZ+=AS^ay zB|X2OE9rTmNdjGODr6Z6(rz7HZ_3H}SnWj^_`-Jlc^6`t1owbx6cFikUWW9l1Ka?S W%bZrJ50p9p0000Px#24YJ`L;x@VMgX!28XzkG000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^r9 z7bh3ox%zYf000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004|Nkll7)!B8VPPY3$Q6Rs{RKy~ zkZ{KpfpqqQC>DB~3&LGUII@+J-M9;CxD@Bi?yNu1FAOtp-@NbJ_nr5|hp7>wIKTJ@ zz(b==vnAwr2_yZaGio=jR8qU}dFva~6GH&lwMNt>0K}KImns;b?zqGe_#OapazGf- zfWY_IJMLBXtJjL0QnAe5aqB$Z`zI_xvR8kel1ZCzd1*Pjq@{YFTVs9j*_FRC4r;Cv zX20sdqi$X-{?>wjyqV?cW`Sj3C7WaCFw{ci7bXaNkM@qPCV)9Mi#2R<6YPqOvt0-^ z2z(DKm5eKVEBehusDV^g?!g@hqRAfEwFY&^RjX7iE9bk9zqG)w!91m6nf8t@wZz-W zA*~P2dRp}#oy@S2@6!lYvN-@c|9%fOc%DjV4YIM@+6Nwg!mj9jAdyL%>M6zQ+^E!` z8Lu_kWKrRyuis1vLkd`TTp`Q2PVu_qvUAu_a}oHSuxnoH6(X4g_kfj3BI4tG8{(r5 Z@E>2VojkGb9+m(A002ovPDHLkV1hI5`KPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^t& z79%g-&(OdC000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004YNkl%;b;3b#W-#5-l*LRlUR&NYqW^a;ZIA6T6{XH49V95Zaj zzwN_ literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b11.png b/mods/compassgps/textures/compass_b11.png new file mode 100644 index 0000000000000000000000000000000000000000..b990fc2a24b07362bcb28ef1501d0576826cf719 GIT binary patch literal 526 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKHbya39l<$je}F=gC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3hti10pX2&;y|l1JzX3_EKVmUED$hIDz-8@`#)RLbFoIm z&gWLnJG#}Ff#C4gYX66iL@)arEt1%<()xuxNbIlpe1n{y|K1vdR50&)Shw`GL}bF8 z-}-ijHUGcOeE7y%a!1pI3knw1XJ3`_q~CYEVP+)%@R5(fv7gfV5*9lv9tstjzc&zP#Zm7sTZ~w=pMj%+YZeg2a;?J5k_KBSuvwTj+8yf(@oL!%$Jp5$a5&kgF z;L3yq5SXyR#UdK0P=wjWQr+l8dt7owq0FP!rPk|}c^WJ`B^GELWKTcL+tB)d?n2Lu4^P)Px#24YJ`L;x@VMgX!28XzkG000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^r9 z7bh(mwIjv=000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004&NklJF0mWC1#${zcWxbtubFxC-uvdwH}8q5p>9;Xy?+2uu9X$p67pO^>u9c0 z?SdW)7X|Dc-!L}V2|(J&sV)H^4%dghWPq$`5rpg500hYap{WV3W0T59JbPr+Bj;d0 zNh<%fk4IkoCrI|p<10NKA@~mJoqtBJ(7nLLE}iA2l^<1UmxkpDbCEHjx{k%A1xjJ^ z_MV;gR?e<`EwsMwFs@@$QCR~(XkfTx^27Kv(cLXZuG5&OfhXv(a8ThNi0*EA`<76x zPau_*tNZPkn0q3z(NvO5y-Z6RIj?+xlk+5Zn>D{CAM7WINBns0(y##K@9XPmYuE;g zg*dV#`KYo#~h57XT9H;@3WqkbU4fwh*f`{ZfNMuw1ptRNe002ov JPDHLkV1j@k@`nHb literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b3.png b/mods/compassgps/textures/compass_b3.png new file mode 100644 index 0000000000000000000000000000000000000000..16f547bbf56c3dd2fbcdb86546e703c60f90d134 GIT binary patch literal 575 zcmV-F0>J%=P)Px#24YJ`L;x@VMgX!28XzkG000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^r9 z7bp%tN=|zK000?uMObu0Z*6U5Zgc=ca%Ew3Wn>_CX>@2HM@dakSAh-}0004+NkldFZ2iLp!dEXA;Ir-&pqdR?m6dvk9e~(PZEFr{sUm#8%x<1 z_TIvKJ~x%L`_j*+0uD|tSzRgt5OlgpmjDnSwkwVd5Jo++Fj@hSO%4bzNibS*ab0kB zwdRs@blB$N`tH0~_~q^&8Lco{@%dZC#N@PdG@2X8vLy6d$g-r-+!(0JXoaXRm+WBr z0Jl$`4Fo5#+1%ps&meALVLp%1%DtX@Sz#2awF=Q`+=6GcLi%|(;dgt}zz_C!W(UYu zuir8W6zhIG#q2Mb;wxlX4y_>g8W4Wmjavvh-PG_towsR>NN{x6X0Z^*i~4dYRl)D4 z()|L!u~}zjqU8n%Fm?0Y@x}YK7givBfckR)Z^?+*X@PTN(3E+cTY|&$U`ChJR-Z!qmW&7fd5eAnoH3#k}3cI N002ovPDHLkV1gk!?KJ=Z literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b4.png b/mods/compassgps/textures/compass_b4.png new file mode 100644 index 0000000000000000000000000000000000000000..812b78462a3f480384cc973e510d5530d73dc88b GIT binary patch literal 541 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKHbyaJhEln=Gl4>qC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3hti10pX2&;y|k^JY5_^EKZ*dHuPW$l=$b@6m%iS+G25$ z(d-t7McZ1;+MPSu*xi@63CJj^NcBX`xwT24(_*J$21k~dYT=6j_4OUy=A3gESj0Bp z`#di_*!%vM|MvHP-}_(xzW#vx!N|!mS~)C#nVfgj=Ox;2;$z4tGl@DM6Kd)9;GvTV zgM;d>x6>T=vop*P>tB|dcg`ndQSycN3-5gmbkfngv_t3QigNdleeY*qTj{XaSAgro zff*%}Y}4|%f3FX;{eEj#QG{o&86!gt@8oTU-{wpY*|IF7;`NIh_Js`m3=g)uu$Z%` z@Yx5R(ZAi2R4BN_NNVAiE3-Ie=+2x`dgF-H`-O(GiZ8@-^rAo38Az_adGW<$t2OHv z2+5{;&ePmb6@I|osCARd;g>}~v{~-Tl#i1t#0zKH9?naXyUm^H_N2@;;Y=FKnOyCC zeV?Y^5%B(~wwe8M+kG1?VMgIj-{xakOA}UB>*(;`jd-U2q+jV+e&1>rci)Q{%P(#@ d^DzDayPtQ1kMQ}{JYYmIc)I$ztaD0e0suUn*gpUO literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b5.png b/mods/compassgps/textures/compass_b5.png new file mode 100644 index 0000000000000000000000000000000000000000..5d46b1bad5b2ccb68699c2e6afd5a8ce05386c69 GIT binary patch literal 525 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKHbyZO>+XaiCQho-U3d7N?UF76=$96xua>q1qF-hv#&~d((gOoFf)>W_{hiL*iUJF35%T-g4>Fg7-VE- zA1sV@<_!xsROFtw|6@}l5G-7`ux;U9rzSyjj4Up!jDl2lIr* zlQ}KL-tGT!WJB6ltG2iIKL?uFbojV*^7`q;RWuxqEqKLsC4{lA?eg43Jo9)tm_??Y zPp=S|d18Y{tfcCOjcQAdrb`qqW0q)G+WhC9ZAS|W^G3D*58wPg{#?29v*OA}&C4UE z>@nDQxSq4g!Q%7+&)FdXZzolqYCmLC`~44$rjF6*2UngEH@ B%&`Cf literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b6.png b/mods/compassgps/textures/compass_b6.png new file mode 100644 index 0000000000000000000000000000000000000000..41027182baf3c0ea47d87316bc5b9135844771b9 GIT binary patch literal 537 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKHbyZGmWk~jyn#ZJC9V-A&iT2y zsd*&~&PAz-C8;S2<(VZJ3hti10pX2&;y|lPJY5_^EKZ-DZ0NxhC~>?#Tu@VVi)3ej zchxo%*9$MiEM}N=2DFDwUIhx_Ljw zmB;Sf@@4+Jz2EoW|Gn>jEqncxM=>(Fx?ir$)SUisS%9)^H^YMKzB~6 z|2%oQL70(Y)*K0-AbW|YuPggKHbyaJsg4?v$3P*;64!_l=ltB< z)VvY~=c3falGGH1^30M91$R&1fbd2>aiCRMo-U3d7N?UF76=$96xua>q1qF-hv#&~d((gOoFf)>W_^5#S-2IA!2`dy29$*L!xgOA* zbbGVvAD*B$pABPE_e#`HGns#m9i+fIMCTe#~$fOAtL z5I7z(>Tv9K=04hRR5&$o&(}v5N4UMqK!@#Gf@H z%zkBD3s}s$7&lzm_JgNoe?Z(U#V4;!r<63vJ>cFJ=P1F@Z#4OT!MDGUKTkaJb3(|+ zgTXppaWf*`e3B3ExL^OV^Wl}L%L}Ienz}AIMM8vu;m7xy)BTZd`oO4R@O1TaS?83{ F1OS<+)y)6^ literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b8.png b/mods/compassgps/textures/compass_b8.png new file mode 100644 index 0000000000000000000000000000000000000000..27dc76649360bde5cb58579f59726d908ef93269 GIT binary patch literal 522 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|*pj^6T^Rm@ z;DWu&Cj&(|3p^r=85p>QL70(Y)*K0-AbW|YuPggKHbya32?LEwoaiCSHo-U3d7N?UF76=$96xua>q1qF-hv#&~d((gOoFf)>W_{hiL*iUJF35%T-4~3RJT`#$1 z%hm@w)-7aPy*gq7>-qZ?2M-)L+`mv_U8izu&VcC;PxqCnlCLh99Mnu60Nh|NztGLtWXVH)43>hA`d5?Z#Mthf06@8eI8M>QU+emu|=Q`Ps; zDf`){r(?E3SONGuGsfMJNEbq0}TcSE48|8f1^MDfw98i>FVdQ&MBb@06%5Y AcmMzZ literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_b9.png b/mods/compassgps/textures/compass_b9.png new file mode 100644 index 0000000000000000000000000000000000000000..970e53f966d3074422711838555f82c1b01ea35f GIT binary patch literal 552 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 literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c1.png b/mods/compassgps/textures/compass_c1.png new file mode 100644 index 0000000000000000000000000000000000000000..74e2c58c753f57cadc52ceb5b758f0d705555702 GIT binary patch literal 2551 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^t& z6CxtNu3y&x010dV6PlqW1^`#7q2dmtNU2dKg#g7LE?!7(MS}Dq);f5&t^$ppXBt5N!APmc<7P4 zC>9%-^`boXMpC@%5qx~CUvA$L;A$$*<)mb6>u&Ddw~y}bPJ*Ejs;1&{X$VEdGEMB3 zO|4ev##D-zj=jLuE2nw%;~!vXAi+<5bd-ZHUlO+s@Zi{h+;vZcSI?!%RAPMkbB{5$ zd5my8hEP>BA#i)WsEPuB-DJ{9eZzh7zCE41KAvHr+Qw%-|9LiU*@WgX2zcCh!y!~vMIb;*kkC-4QH~tNcjP3q zJGSE9zMtKDcjNK8_~}zm;YfJw@%t$+F3I0teDiG(>RUfPvT1|7cW0bp&Efo2i$^~B z2{vrrNFW@fr>_^U&x?>Y!m&X@%eIlaM)_OchNquJq~COwT|0uRWEw0z`rqojoy*pU!gM-hGUW4ik)o>FMi7RRp$e(rnbp z&ZJ1+m_m^b(rgg=;x{Po*+$NQ;+e~6nxLbr15H&}zi~Z#KlC9E9zID&XP89n?H#`b zuz$lkdC!hMF1%4B-rmdT=rI0ZfZqN-gp@c<8zB_Rr4n<~H^8dnH0xm1nXc9N(!oP~ zb?Oq@10SGOt)QwpiOvKbpO=lB$LQ)>!O2&X?79C=_HS4x-vQwFwFt*ToWGJ|`_Aq7 z{XTpFKiTvwO>+r>pw+Mlh61b}T7|HiI7?Mrn&9iZw*hcye3G`uzlkbToR*2<)`+#m zY41p|W$Rs>y_6;r2@(p(w|C&XPkc=d^hLOtS;FfJ(cRre*NR@Mr4oPq^{*)xa2{6KovzGm~B<7H=aG4WVlqtA>Y&$0K;$E-t+C3bjgwHEY(8hz9YvRBq19 z-rD@|-_Kz$)o|=4*DhQnnn=($Jc6#fQ51z}JW6+WH#cSqtXvW0#A_4F9ViqE`a&i{ zBhjeC<_PCFQOlH{!Y}|~3G}T-(R7rX6O5lb$F9Bmh<0~?%MH4Y z<0z<7;5IyX13uh_L9K4#GIT7nu?!%k)T98b*+kk7jwA5~0w7d`&_HS7SS@JU)GIZr zxdj?^lZEsGkxm0?nq+Ry;|_%BT)7flE}9aAs(}!<%(l@maeF;D|2%(Eyu}GUUO)AE z9hU*7Wl}Adacl=v7mD5D%7wEeqEYIlMUvO2*tBgMskt;O2KrHiVCvd+GKC_~{Nf<% zHg9BbbOfOYG?#%;RV>RwQB_K%G6A0l)3Wh+{mTGCh*q?{ja;!n$ghx|y-Cw*vREoF zd%xns@c5a_{XI z$!l!dxf4$;4vNCi+9r-8Y1%eOiK-jK5*_US*mxeh5FBr z{n+<5C#<(T2w~9Q!c>N2n$i6;;s6pc|XEmEyic=`A#2K&8~N@a>w)%y-Be*WZZ;`~I7tsA~4*sL5LrI^oi{DouO z^T2-kSFgruIH0HuZ`zEI5-9{iQ?YHEsfh_daAPXPv7^UWzgi(*sFEwY^#7O#CXzEx zy7l0J?Hd#5Mu3y2&eOZ12d~GVkjvur2k0Fbp!<$KR82z&fubk~p@6C)fnvVE>{OCU zsYEI@!*jnqiqT3kJP_b7uh)6*uc!ZWAOV<2%|Gc!)2p){Y*8?ji-1o+slG5O)$E9vd+<;-}Fv*XkFd;vNV?fCqD z;_)br`Vv;lrjXB*$u5w~&f`~$4E1TCxHrfNy^Q=UzM^-jk=dC?wQJWld9ResX1)Bss8}p2xAX6I^bhGz8@tv$-IM?T N002ovPDHLkV1kR$_6`65 literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c10.png b/mods/compassgps/textures/compass_c10.png new file mode 100644 index 0000000000000000000000000000000000000000..c4b3e13f7e2da2cad58eee24841f78e13fef8e3e GIT binary patch literal 2573 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 literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c2.png b/mods/compassgps/textures/compass_c2.png new file mode 100644 index 0000000000000000000000000000000000000000..431b687a9915060ac2af3394b687910315280704 GIT binary patch literal 2551 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 N002ovPDHLkV1lzF_(uQ$ literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c3.png b/mods/compassgps/textures/compass_c3.png new file mode 100644 index 0000000000000000000000000000000000000000..8ea342f78d606e90a36c7805851c9a0cd8c2ddf7 GIT binary patch literal 2536 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 b?oRMuCND*x)Sj=c00000NkvXXu0mjfY!v~J literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c6.png b/mods/compassgps/textures/compass_c6.png new file mode 100644 index 0000000000000000000000000000000000000000..cffa6c68449c5514cc3eb84435eba055c9cc2d19 GIT binary patch literal 2543 zcmVPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^t& z6DtU{*DXi@010nNL_t(o!_AjjY+ToU#((E7bBD8VwmTedLk%g36c-B;wOCLr%Uj~L zj_qax8WaUm6X^k{?vrW_RUINRG68T=$enUY@PX~Dji#;*0d3dAkwQ5Fkm$4=fM6Xw&TS#rL5My zy!7jH;?D;7*mzRjHrYW_b^hmSfnw9o$mnfM9UjL_B#1_$NF?QQg;GAx()9(-zP7~V zSdhQ`)IlnhHl1cgzItUzeBdj1e0EgcaeI)fD5b7TeJUEq-4?Qr*xyvOsHpBe&=l+(d>2ZSLAj6}h#QPIOO%uc0 z!|DI{IfYDynSJ|+#7&~{I3BNo)!M=|V{9AS&hy7#0#)a+NA^;Dr*Q0QuKe^L1$cD- zUU|=*CY3Fh3s)^Z`I%31;P63$;a-xXqXa^|NY}-+ZJcfwA)q%LqBk1BbsRtt421}U zdTF<|2!%q#VliHR`89@U*m!iEvGEBsO=17-2YBG2hdBPiDf$P( zBx3J%{3gJ|dw0vbj-<80qC#xq}k3el?K*Bt)tsi&Bno+2@t zLQ!;7RYxcaxDG;qu4%*v5)37W$>gf^nSKhn+>KJ~IF8rqw9ynnwbmjUi!q!^u~n^d z{?tjP_w2^!^O3%GonpR7r{3Vwx%1Rk7C8NS3xTAXTj!^*{yR%+8G3qqG5ZrFckG~2 zF0;OpX4js*G#guZ4TG(wg~!mbI_(<{NGUZb!0L99j*II`EXzVy6{PE+sp@Y};^NU1 z!qF(nB*|9y*pok1ue;0U?AP?Tb^av@=*SSL@3s+F zD45A%bia?4#TA550S!$vDCUZI3@`O&n?`+;fw+gobh-J=v(Jh51d^uRgAfLz!#*xt zoMUXqD2k%c8;PQ6D&e@v)c#pC!-FF<6mQSFJ>BcaZZ**Z0VekBCSsbPXtXADf#sDh<{5zEb?-Q)k45`7I9Z9U{H-4p%N;#c^zwu3iI0MQ9p9Gm6(A z1fkGbTfGU;%4BebAP|lc=}&;Bfg(s>Ujpf}y0*dMwae@o5Af!HuXlfZ>WuhbBiUxl zpjvBl-;o`>`Nm0t0Ur~)#?cKA$?c=)iiSiY6c3p%e2IS;KY;9X*!ap<8G8Qv;HW67 zplfwmTVAH!YI6DQOT2pGRrc&uD3u!&YaacN=7IU8)u+9B@3A}fCD4r^r+#^nk!?xZ zwHmG~(L4s4$3WNp1drZ@@`D%YQ8mo(K8GhZfa^F^D^)f!8>}rZQYvrq!ylZ$u$Pz` z3-a?{HF@ccv*Q0uMDr`zr#-51?EWL$@E8GJ`RQAP!V!EvgKDWrd#gpO*}x5lXjoNR zyGC#i-a##wr(7&>{mNw=$6;aNI?o?}0gt`N{^=0ExMcIRkKaaq zvxirH_BP>YggcMkiOOB)^_3a&9h--yftu(T6_}z%-+@n=LHc zper+$GIGmwOJU2#3RD z3LVnxHHxJwxl$7WgabN0uR_r1(Ch19SzYE=p>79x>9se-hw?T1_($)MJ(|VXaFCI~ z5UL81pa<8Lu-q<^>6q)eeKCF%C+T1q;x6fvjCWV{Rp8j zoEqa>-+opA%+1Z|Gcz+?J}l+)c_05@RH;;yTN%3*{RVS?4xF=VwtN5p002ovPDHLk FV1g8dPx#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^t& z6D$@0nTG5D011alL_t(o!_AjlY@AoQhM)ic=lIY0G)bw`)M*?a5}#r_ z_KfG`Id~5LX>nnwS`~>D^@8_qEiJ9}uJ`-C^}S2tW8!Bgzc0q$dJEGqSe%&wAT=<6 zVzV*4Zy(<|`MmUT_Pg!H#|C!_Vb(|{9K_>x>yLSt_RAz9ez;07n$<~-&sL(bPstp54mI(Q6c%6{$@o?`wJs75oXjF(w z&BZJ4T$cW20+03gh+TKKu_<=myPl`e@X(vy#g6^`MB{P7p)dkLsZ^%8zRtqj3}a^& zxHIG93t!qpx!j`ND2v}sEl3|b1fSoX77y(8as6hIYYT$i`wsEQ(W4}jaeRIs5)g=Y zB7}ujuhD9@X=^(3vkSa_dX(#vV?6!&`x(f@`Olw^^3t1ErQ0U(Q2(npka_Hz`RF9Kiyzl~+fNy^5F{+iOcBjS+*QOcVZ z*3U?Gj#WKuxn=wt7<rNhW(a_tpZ3AKT8cks{t4tSAurEy452luHp9k=^q}(=CGrxDt1MttE-E}j$3L-AEOKLNlFS`_ z$U<=W;#JbgIE{LZbYF%6WN9^<~dI>_hdwg{M}>C)OQ zY_de9+9Vu_(49)*a5yjx15?+)5`fIkp*R zQv^FZkXNNDEP?F0t z8$9{!*9pZs`M+Pi%wH~!VF?LIR*${15u(CVQVaK(16} zYHEtBS0>rHdzeCgop2&atI@{g^^#j(ClU9NFVqQl#I_Vr6s48imSVloCgc$miv{dX zC-qt#UDptjOd^xvj=M&XRX>W`!&7@l-ml}Xo^G0&i7rWW^z`t^vCnYVefQC9X`DIr z8ntSjjZ%r5v-4!vvTW<}v$V27a$9Okfp9pi1JctE?-Kh)yu3G;V}5plNGwXFR3X;c zfgJ^>%a5fKc5AO70xBCUFj0ZB%;Oavx|X<~D@@rUgkIdK9c8Jpcft`a88OSy#rZCC>*N-?cH~_#;|8N1# z5Xf#XLa}pWW|nHDhRx+bAh0{#MB<$k^LdsR7CHCEoAjquHa4o1>x%l3r}))#Z%gCT zo9r9uVrgNPsmbdYhR&^}6--md=JjE`cAgh9yZHGtC+PKfz@Z}BRdA>zdQf7 z?FvGIxv42E(_ndJjrkjs4EK9E`#^`uWGA~NYzf;TT-BjEGncG?lL zgf|evK7ASWMi$5HEX~p??jxT=SQdd$7?0nNY`3E*4s^q0X>N{2z0Sn=RbD+c%8uR^ ziYzmAQ&y%ImY@HJhUAq$o|iC3#52buj0|>h`t%vRejkl`9YZrQ`tP7SSHyPw8C=JY zp_l?}c90|l3Z`LDDU`^sXIWjm$!4p~>C=C}!wS9eFt3kQdFAXC>7QD%FF$^d`0^7Y zOw6@8KQ_2B=tw5XXS0N& zQS#XwF0Yq`xkWCVzsStw1nFp;#JBFq--F&cy|_l`^Nakv*m?C zL0(;5wGRyqwVyolkcfJ99@(EF7!0zSZ?kl(N}*UGS8N~wL9ZRvCF66p@vCh#O=o%; zYKD(j&YYD#k+0eDM;{Pwn?|PFM{hEKqCm*!z_J9n;wH^Ti{-T{*`k3ashs-#o6;xx zH~c%k_uO~H%HljiSQOT?07N@FktCV!RE8h^#zXG}6I1;X*m}me1002ovPDHLkV1me}`&s}1 literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c8.png b/mods/compassgps/textures/compass_c8.png new file mode 100644 index 0000000000000000000000000000000000000000..4f9860421e2705e584d3a5e6335e393f414257f8 GIT binary patch literal 2565 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 literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compass_c9.png b/mods/compassgps/textures/compass_c9.png new file mode 100644 index 0000000000000000000000000000000000000000..6fbf03ccd7f9078a58226ba2a5d4954e67fe3be4 GIT binary patch literal 2530 zcmV<82_5!{P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01FcU01FcV0GgZ_00007bV*G`2i^t& z6E6v-yx7_R010AAL_t(o!_AjjY+ThD$A9N8b7!|_@r=hyGIkti!7)h)Ngz8(fRMHj zXbUPxeL$jblnSZpTY(oUwX`CtXjQ3F#RE`E*#l)!Aqh*!>Lezylh{r?&e*ftGpBYk5^MD zRH>B<^6k@O;+nT$*UB!revOYa7jk?)CRw?5E4S>}K{((=#m3+4r94|A6m2D!$>Q|- zC>G~PXQp}otv#GMb%=X+tz%Jllt2A(56^vcQd~8_-7CB0mdybU97~d#4e`K(53zVj z54s|8xm~#3ZrmOxwMvDCW#esbrdqBsozJ5=4Cdx)oH%xp=b!y6+cx#Fb>m|G@Y{d# z-2N*euGoSdOXG6;wit&8Q)Egl{Pe*GS-z?tRTYFI5&TVlG){g0175V0gbC*G=Uw!z&sul8BN?oYWSM`G=)Os(rH>EVFG~w zuf6sz9i0)DUDtwL)E^s8PCfp`He7#-rIwwsYuI4 z5dzz?5w?v(*KoVtD1fvq6u`DD6ePWUeYo5%`d3`f?RVV4bN|>+Ypj`Q=<<$#39xfT zzudeb&hgU)!jVpT7Q}J;{KV$9f!#owb*9rPQi%jApsFf~(NV_Fj-V+Dij-t8UL-kk z4$KD9vS^<_AAc~w%^Pl}t!*Cr4~((x*2U~x(J!w6@On&|Lrn~v%Cce81{N+^N=s`L zT~iT?WUe^F*^?)+=1Qox1*XMJZklX53k@5kQAgCu3>`VlWMTrLfWv7Jjz-Z`g*9te zbM$1AK)_FvPhQ@ECmwx7cEiA7zVDkD0$Q5-><*P!Ub{0hlfcdCTR^e zGjeW}&ELC&U@V3uRBY2kQB@pRC!tOlR$;4SewNLGm+293CHr$3uMKLbB-;7tW5*zvf2D zr8%62!CbkH!_cYMs+T$-rPQQ=dZU4~Y;0Rnuh+313P_N(+BeP$+iW0^*iup|&Qd8? zP*eq7*APM=EenCfY%~Z(TXDKwU;2dE zi_ag%)z*fr&Y?(~3!k6j?KfZI;Ct_rNo6?l>1X`%i6`h=cN5rvqGH(=9>0&?W&LDQ zQ(QcMf$8ZYK97r9-NNPeUIGw8n88R3*+QNsuR?O-BE^{*8nbig-95Cw_$*YaG%96O zX_HD!aQMJsHm=`JOK3jh6G?90aT}+P9U~kL5$Wp25;is<6a`d;O1Xm5>m`*=6N~!D zWJ?4iEtddPRjszokCRSL67WbSa#?i4AeFpGq^%8As-WtWrt>sPCCrA!`dc;F zZsQ7sSaQ=Ef~`>+wHj0B$1s|LG(}plC72D9;`B5Z&W$oPImMQ>EsRg(Xq&(A(isQ_ zgN-M5KO<5(llGXGd^W}CxiJ8W`8=vB5DJ*}24_wUW2*|G&UP$^iY){#zaJ?S!tqX2 zmxFk(tp!Ugj-udN@}$#xlD${*m?Hv z{fOQ!H`CKa3MJKjg%!WC|DYHcnq%#XcE-ofar)F5q_jDEdI(eg^$xZz=~}WBRnxJhWV%pba$FZyD)9J+P^WpY-@%nsNW&>5zKq%Cz6-?72 zF*=IN&)M_(9^7Jr8?S5PlT$W-e|JD!btrvc=W2Q1oy$m1yLjvUlQahdY}~XF zx1kYGd);a-L5<{*>WUgLH*UEb4CJ&=9=v-m$9-rMXcNjtpiwIyjEU3Rg%f1-rwI}yZiRdGVE<|%gu3`o0~~yYK&hjlFiMK%9Rm7 zvscIMRPY%!{O%g{dV`?^%$h!4eRrSuPOfHmZeK55TAl6=AM@IpP*n){9N4xbm7Akd zu9BE6GLH s_4PIQu9Qxv-Tc3(P$(!@^X_W&A5m@_u%7}&e*gdg07*qoM6N<$f{N?P3IG5A literal 0 HcmV?d00001 diff --git a/mods/compassgps/textures/compassgps_blank.png b/mods/compassgps/textures/compassgps_blank.png new file mode 100755 index 0000000000000000000000000000000000000000..1b1e662cd2dc511c2aa331c75f3d039fe9435830 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^j3CUx0wlM}@Gt=>rX+877l!}s{b%+Ad7K3vk;M!Q t+`=Ht$S`Y;1W=IM)5S4_<9c#J0+7SZz^HI_%5flz!PC{xWt~$(699>Q6fyt+ literal 0 HcmV?d00001 diff --git a/mods/worldedge/init.lua b/mods/worldedge/init.lua index 5e672dd7..7a7bf9bd 100644 --- a/mods/worldedge/init.lua +++ b/mods/worldedge/init.lua @@ -62,10 +62,10 @@ minetest.register_globalstep(function(dtime) if pos.z >= edge then newpos = {x = pos.x, y = 10, z = -newedge} - newpos.y = get_surface_pos(newpos).y + newpos.y = get_surface_pos(newpos).y+1 -- /MFF (Mg|19/05//15) elseif pos.z <= -edge then newpos = {x = pos.x, y = 10, z = newedge} - newpos.y = get_surface_pos(newpos).y + newpos.y = get_surface_pos(newpos).y+1 -- /MFF (Mg|19/05/15) end -- Teleport the player From e49e020f0a6dfb00c9a866a6b2f4535fb2e464f5 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 14:51:57 +0200 Subject: [PATCH 45/54] Updated REAME.md with developpers' tips --- README.md | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5366fc03..5c984090 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ Contributors - mgl512 > Helper for debugging, who leaves useful comments. - Ataron - > Occasionnal debogger, texture fixer. + > Occasionnal debogger, texture creater. - Gael-de-Sailly > Kittens carer, and debogger. - davedevils @@ -42,10 +42,61 @@ Contributeurs - mgl512 > Aide au déboggage, laisse aussi des commentaires très utiles. - Ataron - > Déboggueur occasionnel. + > Déboggueur occasionnel, créateur de textures - Gael-de-Sailly > Soigneur et deboggueur de chatons. - davedevils > Jardinier, père des creeper et ami des poulets. - Obani > Roi du bit audio. + +Note to developpers +=================== + +Recently many changes have been made in the repository. New methods have been +adopted for pushing/pulling from the repository. You will find here the most +importants + +### When you are pushing +After committing, you will need to reproduce your changes on parallel branches. +For example, if you commit on master : + + > git format-patch HEAD~ --stdout > patch_for_branch.patch + > # Created a .patch file to apply commits on the other branch + > git checkout + > git am ./patch_for_branch.patch # Apply the patch + > git push origin + +If you want to see which files are being modified, or how many lines are added : + + > git apply --stat < patch_for_branch.patch + another_file.txt | 0 + another_file.txt | 0 + 2 files changed, 0 insertions(+), 0 deletions(-) + > + +If you want to check whether or not you will have to resolve merge conflicts : + + > git apply --check < patch_for_branch.patch + +If you get errors, then git am will require you to solve merge conflicts. + +### When a parallel branch cannot be pulled +WIP works are often put on parallel branch to not disturb simple +updates or fixes for mods (even if they should be reproduced on these +branches as shown above). However, there might be problems, requiring +devs to 'forcepush' on the branches. +__*Note:*__ It will never happen on `master` + +If you cannot pull, then, here is what to do : + + > git checkout master + > git branch -D + > git checkout -b + > git branch --set-upstream-to=origin/ + > git pull origin + +This will delete your copy of the branch, create a new one, and replace +it with the remote content. You can also : + + > git pull --force From 9995e2a681c5ddce06509bf03d9b26d203b2e145 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 17:31:38 +0200 Subject: [PATCH 46/54] Beginned rewritting of whoison - Beginned rewritting of whoison, using second-precise features --- mods/whoison/functions.lua | 74 ++++++++++++++++ mods/whoison/init.lua | 170 ++++++++++++------------------------- mods/whoison/init.lua.old | 129 ++++++++++++++++++++++++++++ 3 files changed, 259 insertions(+), 114 deletions(-) create mode 100644 mods/whoison/functions.lua mode change 100755 => 100644 mods/whoison/init.lua create mode 100755 mods/whoison/init.lua.old diff --git a/mods/whoison/functions.lua b/mods/whoison/functions.lua new file mode 100644 index 00000000..e5189136 --- /dev/null +++ b/mods/whoison/functions.lua @@ -0,0 +1,74 @@ +-- Functions +-- + +function whoison.functions.load(param) + --[[ + Values for param : + * `E` : Everyone + * : name + ]]-- + + if param == "E" then + for line in whoison.presence_file:lines() do + local datas = minetest.deserialize(line) + if not datas then + minetest.log("error", "[whoison] Cannot load line (" .. line .. + ") : invalid line") + return false + end + return {[datas.name] = datas.time} + end + return table + elseif minetest.get_player_by_name(param) then + for line in whoison.presence_file:lines() do + local datas = minetest.deserialize(line) + if datas then + if datas.name == name then + return datas.time + end + end + end + minetest.log("error", "[whoison] Cannot load datas for " .. param .. + " : player not registered") + return false + else + minetest.log("error", "[whoison] Cannot load datas for " .. param .. + " : not a player nor 'Everyone'") + return false + end +end + +function whoison.functions.save(param) + --[[ + Values for param : + * E : Everyone + * : name + ]]-- + + if param == "E" then + -- TODO + else + for line in whoison.presence_file:lines() do + local datas = minetest.deserialize(line) + if datas then + if datas.name == name then + -- Erase line + local i = 0 + whoison.presence_file:seek(string.len(line),"cur") + while i < string.len(line) do + whoison.presence_file:write("\b") + i = i + 1 + end + whoison.presence_file:write(minetest.serialize( + {name = param, time = whoison.datas[param]} + ) .. "\n") + return true + end + end + end + whoison.presence_file:write(minetest.serialize( + {name = param, time = whoison.datas[param]} + ) .. "\n") + return true + end +end diff --git a/mods/whoison/init.lua b/mods/whoison/init.lua old mode 100755 new mode 100644 index 31b8ffb4..263ccace --- a/mods/whoison/init.lua +++ b/mods/whoison/init.lua @@ -1,129 +1,71 @@ +-- Rewrite of whoison mod, LeMagnesium +-- + whoison = {} -whoison.lastrun = os.time() -whoison.lastseen = {} +whoison.datas = {} +whoison.config = {} +whoison.config.save_interval = 10 +whoison.functions = {} -local filename = minetest.get_worldpath().."/online-players" -local seenfile = minetest.get_worldpath().."/last-seen" +dofile(minetest.get_modpath("whoison") .. "/functions.lua") -function whoison.createFile(loopit) - local file = io.open(filename, "w") - file:write(os.time().."\n") - file:write(minetest.get_server_status().."\n") - for _,player in ipairs(minetest.get_connected_players()) do - - local name = player:get_player_name() - whoison.updateStats(name) - local ppos = minetest.pos_to_string(player:getpos()) - local datastring = name.."|"..ppos.."\n" - file:write( datastring ) - end - file:close() - minetest.log("action","Updated online player file") - if ( loopit == true ) then - minetest.after(300,whoison.createFile,true) - end - whoison.lastrun = os.time() +-- Boot, Step 0, open presence file +whoison.presence_file = io.open(minetest.get_worldpath() .. "/whoison.wio","r+") +if not whoison.presence_file then + --minetest.log("error", "[whoison] Cannot open presence file! Mod disabled.") + whoison.presence_file = io.open(minetest.get_worldpath() .. "/whoison.wio","w") + return end -function whoison.saveLastSeen() - local f = io.open(seenfile,"w") - f:write(minetest.serialize(whoison.lastseen)) - f:close() +whoison.datas = whoison.functions.load("E") +if not whoison.datas then + whoison.datas = {} end -function whoison.loadLastSeen() - local f = io.open(seenfile,"r") - if ( f ~= nil ) then - local ls = f:read("*all") - f:close() - if ( ls ~= nil and ls ~= "" ) then - whoison.lastseen = minetest.deserialize(ls) - end - end + +-- Boot, Step 1, define callbacks + +function whoison.functions.on_newplayer(player) + whoison.datas[player:get_player_name()] = 0 end -function whoison.getLastOnline(name) - whoison.updateFormat(name) - return whoison.lastseen[name]['lastonline'] +function whoison.functions.on_joinplayer(player) + local time = whoison.functions.load(player:get_player_name()) + if not time then + minetest.log("error", "[whoison] Reading failed. Player " .. + player:get_player_name()) + whoison.datas[player:get_player_name()] = 0 + + return + end + whoison.datas[player:get_player_name()] = time end -function whoison.getTimeOnline(name) - whoison.updateFormat(name) - return whoison.lastseen[name]['timeonline'] +function whoison.functions.on_leaveplayer(player) + local name = player:get_player_name() + local auth = minetest.get_auth_handler().get_auth(name) + if auth and auth.last_login then + local last_login = auth.last_login + local uptime = os.difftime(os.time(),last_login) + whoison.datas[name] = whoison.datas[name] + uptime + local success = whoison.functions.save(name) + if not success then + minetest.log("error", "[whoison] Something went wrong while saving " .. + name .. "'s file") + end + else + minetest.log("error", "[whoison] Couldn't get " .. name .. "'s uptime") + return + end end -function whoison.updateStats(name) - whoison.updateFormat(name) - whoison.lastseen[name]['timeonline'] = whoison.lastseen[name]['timeonline'] + ( os.time() - whoison.lastrun ) - whoison.lastseen[name]['lastonline'] = os.time() +function whoison.functions.on_shutdown() + for index, player in pairs(minetest.get_connected_players()) do + whoison.functions.on_leaveplayer(player) + end end -function whoison.updateFormat(name) - if ( type(whoison.lastseen[name]) ~= "table" ) then - -- update old data to new format - minetest.log("action",name.." lastseen is not a table... fixing...") - local lo = whoison.lastseen[name] - whoison.lastseen[name] = {timeonline=0,lastonline=lo} - end -end - -minetest.register_on_joinplayer(function (player) - whoison.createFile(false) - whoison.saveLastSeen() -end) - -minetest.register_on_leaveplayer(function (player) - whoison.createFile(false) - whoison.saveLastSeen() -end) - -minetest.register_chatcommand("seen",{ - param = "", - description = "Tells the last time a player was online", - func = function (name, param) - if ( param ~= nil ) then - local t = whoison.getLastOnline(param) - if ( t ~= nil ) then - local diff = (os.time() - t) - minetest.chat_send_player(name,param.." was last online "..breakdowntime(diff).." ago") - else - minetest.chat_send_player(name,"Sorry, I have no record of "..param) - end - else - minetest.chat_send_player(name,"Usage is /seen ") - end - end -}) - -minetest.register_chatcommand("timeonline",{ - param = "", - description = "Shows the cumulative time a player has been online", - func = function (name, param) - if ( param ~= nil ) then - local t = whoison.getTimeOnline(param) - if ( t ~= nil ) then - minetest.chat_send_player(name,param.." has been online for "..breakdowntime(t)) - else - minetest.chat_send_player(name,"Sorry, I have no record of "..param) - end - else - minetest.chat_send_player(name,"Usage is /timeonline ") - end - end -}) - -function breakdowntime(t) - local eng = {"Seconds","Minutes","Hours","Days","Weeks","Months","Years"} - local inc = {60,60,24,7,4,12,1} - for k,v in ipairs(inc) do - if ( t > v ) then - t = math.floor( (t / v) ) - else - return tostring(t).." "..eng[k] - end - end -end - -minetest.after(10,whoison.createFile,true) - -whoison.loadLastSeen() +minetest.register_on_joinplayer(whoison.functions.on_joinplayer) +minetest.register_on_newplayer(whoison.functions.on_newplayer) +minetest.register_on_leaveplayer(whoison.functions.on_leaveplayer) +minetest.register_on_shutdown(whoison.functions.on_shutdown) diff --git a/mods/whoison/init.lua.old b/mods/whoison/init.lua.old new file mode 100755 index 00000000..31b8ffb4 --- /dev/null +++ b/mods/whoison/init.lua.old @@ -0,0 +1,129 @@ +whoison = {} +whoison.lastrun = os.time() +whoison.lastseen = {} + +local filename = minetest.get_worldpath().."/online-players" +local seenfile = minetest.get_worldpath().."/last-seen" + +function whoison.createFile(loopit) + local file = io.open(filename, "w") + file:write(os.time().."\n") + file:write(minetest.get_server_status().."\n") + for _,player in ipairs(minetest.get_connected_players()) do + + local name = player:get_player_name() + whoison.updateStats(name) + local ppos = minetest.pos_to_string(player:getpos()) + local datastring = name.."|"..ppos.."\n" + file:write( datastring ) + end + file:close() + minetest.log("action","Updated online player file") + if ( loopit == true ) then + minetest.after(300,whoison.createFile,true) + end + whoison.lastrun = os.time() +end + +function whoison.saveLastSeen() + local f = io.open(seenfile,"w") + f:write(minetest.serialize(whoison.lastseen)) + f:close() +end + +function whoison.loadLastSeen() + local f = io.open(seenfile,"r") + if ( f ~= nil ) then + local ls = f:read("*all") + f:close() + if ( ls ~= nil and ls ~= "" ) then + whoison.lastseen = minetest.deserialize(ls) + end + end +end + +function whoison.getLastOnline(name) + whoison.updateFormat(name) + return whoison.lastseen[name]['lastonline'] +end + +function whoison.getTimeOnline(name) + whoison.updateFormat(name) + return whoison.lastseen[name]['timeonline'] +end + +function whoison.updateStats(name) + whoison.updateFormat(name) + whoison.lastseen[name]['timeonline'] = whoison.lastseen[name]['timeonline'] + ( os.time() - whoison.lastrun ) + whoison.lastseen[name]['lastonline'] = os.time() +end + +function whoison.updateFormat(name) + if ( type(whoison.lastseen[name]) ~= "table" ) then + -- update old data to new format + minetest.log("action",name.." lastseen is not a table... fixing...") + local lo = whoison.lastseen[name] + whoison.lastseen[name] = {timeonline=0,lastonline=lo} + end +end + +minetest.register_on_joinplayer(function (player) + whoison.createFile(false) + whoison.saveLastSeen() +end) + +minetest.register_on_leaveplayer(function (player) + whoison.createFile(false) + whoison.saveLastSeen() +end) + +minetest.register_chatcommand("seen",{ + param = "", + description = "Tells the last time a player was online", + func = function (name, param) + if ( param ~= nil ) then + local t = whoison.getLastOnline(param) + if ( t ~= nil ) then + local diff = (os.time() - t) + minetest.chat_send_player(name,param.." was last online "..breakdowntime(diff).." ago") + else + minetest.chat_send_player(name,"Sorry, I have no record of "..param) + end + else + minetest.chat_send_player(name,"Usage is /seen ") + end + end +}) + +minetest.register_chatcommand("timeonline",{ + param = "", + description = "Shows the cumulative time a player has been online", + func = function (name, param) + if ( param ~= nil ) then + local t = whoison.getTimeOnline(param) + if ( t ~= nil ) then + minetest.chat_send_player(name,param.." has been online for "..breakdowntime(t)) + else + minetest.chat_send_player(name,"Sorry, I have no record of "..param) + end + else + minetest.chat_send_player(name,"Usage is /timeonline ") + end + end +}) + +function breakdowntime(t) + local eng = {"Seconds","Minutes","Hours","Days","Weeks","Months","Years"} + local inc = {60,60,24,7,4,12,1} + for k,v in ipairs(inc) do + if ( t > v ) then + t = math.floor( (t / v) ) + else + return tostring(t).." "..eng[k] + end + end +end + +minetest.after(10,whoison.createFile,true) + +whoison.loadLastSeen() From fd71214849641867e748cbf2c2bb27b65eaf5b01 Mon Sep 17 00:00:00 2001 From: Ataron Date: Tue, 19 May 2015 18:18:10 +0200 Subject: [PATCH 47/54] Add minotaur horn and correct damaging major --- mods/runes/textures/mobs_minotaur_horn.png | Bin 0 -> 583 bytes mods/runes/textures/runes_damaging_major.png | Bin 7044 -> 4930 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 mods/runes/textures/mobs_minotaur_horn.png diff --git a/mods/runes/textures/mobs_minotaur_horn.png b/mods/runes/textures/mobs_minotaur_horn.png new file mode 100644 index 0000000000000000000000000000000000000000..b021b4d11605e82b9f14951c3feeb714397c4f68 GIT binary patch literal 583 zcmV-N0=WH&P)WFU8GbZ8()Nlj2>E@cM*00FB>L_t(|+U=S_ZiFxl zMU72Q(p~S;)Alai^(e`7(T+4iU?(9l7{2$6^nPCK1cnHOLZMKx>*xFH(fTZ30Y2wP za|nDD3tB_qyKf%^fB-Jg0ATnAF&|?CG3E*}0Q%W%4RsoD$eHcJQQ?%6= zk!}s})CMf!dyl_U2jB&N$^h2jQ@Tk2-tdPsLG2Uv7Q6@(Gk0%*L`1VUxb`l837>N& zW{z#Z5?pI&Yw#mif2aXl;M!^K6+Y}i$O6|5_=8V5)7v}`UwzYnmjB#X;96II!VB~9 z2DE;Bw7^vZ{^33Lz8b)uw=WiWQhw7LzNiV-UO_EzO>b}b;weyLf(5S4b#M5pF<5#e zwZKIz1N`8t&jBSSSm3$=zVJ;4p=5+$fs2T0fG2!Y0M?AQz*%jAzVOunlw3?KaOQ13 zZ}_SJwC1&Lz&iL5kh=q@xspZ!FAhL!T3T3V2OoA9hyq@89d5Y|Mgd2mP$(3N=ohvB Vr+d7LQT_k`002ovPDHLkV1f|%?9BiG literal 0 HcmV?d00001 diff --git a/mods/runes/textures/runes_damaging_major.png b/mods/runes/textures/runes_damaging_major.png index ff85961dfbb41b84d5f8e4356e29ca6cc2d061a3..159c508a718aecc96dc3d47af0ca2f3d1c18c93d 100644 GIT binary patch delta 4893 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 From 9f18e071f374fe1e4c4d1b8c3f1a10e9cc28d8af Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 18:19:14 +0200 Subject: [PATCH 48/54] Loaded compassgps mod in world.mt --- worlds/minetestforfun/world.mt | 2 ++ 1 file changed, 2 insertions(+) diff --git a/worlds/minetestforfun/world.mt b/worlds/minetestforfun/world.mt index 5bc55857..011ec487 100644 --- a/worlds/minetestforfun/world.mt +++ b/worlds/minetestforfun/world.mt @@ -194,3 +194,5 @@ load_mod_chatplus = true load_mod_future_ban = false load_mod_textures = false load_mod_snowdrift = false + +load_mod_compassgps = true From cee9c732163e79d9241977bce2d88f5681643924 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 18:42:22 +0200 Subject: [PATCH 49/54] Updated nether mod (thanks to @HybridDog) - Updated nether mod (fixed mapgen) - Updated .gitignore to ignore patch files --- .gitignore | 1 + mods/nether/nether/init.lua | 10 +++++----- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/.gitignore b/.gitignore index 448d1964..67b69758 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ ~* *~ *.od?# +*.patch diff --git a/mods/nether/nether/init.lua b/mods/nether/nether/init.lua index d6e9b18d..afc92cc7 100644 --- a/mods/nether/nether/init.lua +++ b/mods/nether/nether/init.lua @@ -360,17 +360,17 @@ minetest.register_on_generated(function(minp, maxp, seed) local side_length = maxp.x - minp.x + 1 -- maybe mistake here local map_lengths_xyz = {x=side_length, y=side_length, z=side_length} - local pmap1 = minetest.get_perlin_map(perlins[1], map_lengths_xyz):get2dMap_flat(minp) - local pmap2 = minetest.get_perlin_map(perlins[2], map_lengths_xyz):get2dMap_flat(minp) - local pmap3 = minetest.get_perlin_map(perlins[3], map_lengths_xyz):get2dMap_flat(minp) + local pmap1 = minetest.get_perlin_map(perlins[1], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z}) + local pmap2 = minetest.get_perlin_map(perlins[2], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z}) + local pmap3 = minetest.get_perlin_map(perlins[3], map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z}) local forest_possible = maxp.y > f_h_min and minp.y < f_h_max - --local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom, map_lengths_xyz):get2dMap_flat(minp) + --local pmap_f_bottom = minetest.get_perlin_map(perlins.forest_bottom, map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z}) local perlin_f_bottom, pmap_f_top if forest_possible then perlin_f_bottom = minetest.get_perlin(11, 3, 0.8, tmp2) - pmap_f_top = minetest.get_perlin_map(perlins.forest_top, map_lengths_xyz):get2dMap_flat(minp) + pmap_f_top = minetest.get_perlin_map(perlins.forest_top, map_lengths_xyz):get2dMap_flat({x=minp.x, y=minp.z}) end local num2, tab2 From 0f6e885b4fc2b7a87dd976bb8d9b6d27367c74e6 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Tue, 19 May 2015 20:28:05 +0200 Subject: [PATCH 50/54] Updated WorldEdit --- mods/WorldEdit/worldedit/init.lua | 2 +- mods/WorldEdit/worldedit/manipulations.lua | 4 +- mods/WorldEdit/worldedit_commands/init.lua | 58 +++++++++++++--------- mods/WorldEdit/worldedit_commands/safe.lua | 6 ++- 4 files changed, 42 insertions(+), 28 deletions(-) diff --git a/mods/WorldEdit/worldedit/init.lua b/mods/WorldEdit/worldedit/init.lua index 34c98200..ab7af21e 100755 --- a/mods/WorldEdit/worldedit/init.lua +++ b/mods/WorldEdit/worldedit/init.lua @@ -23,7 +23,7 @@ end local path = minetest.get_modpath(minetest.get_current_modname()) local function load_module(path) - local file = io.open(path) + local file = io.open(path,"r") if not file then return end file:close() return dofile(path) diff --git a/mods/WorldEdit/worldedit/manipulations.lua b/mods/WorldEdit/worldedit/manipulations.lua index e76cf701..e40a8829 100755 --- a/mods/WorldEdit/worldedit/manipulations.lua +++ b/mods/WorldEdit/worldedit/manipulations.lua @@ -503,8 +503,8 @@ function worldedit.orient(pos1, pos2, angle) worldedit.keep_loaded(pos1, pos2) local count = 0 - local get_node, get_meta, swap_node = minetest.get_node, - minetest.get_meta, minetest.swap_node + local set_node, get_node, get_meta, swap_node = minetest.get_node, + minetest.get_node minetest.get_meta, minetest.swap_node local pos = {x=pos1.x, y=0, z=0} while pos.x <= pos2.x do pos.y = pos1.y diff --git a/mods/WorldEdit/worldedit_commands/init.lua b/mods/WorldEdit/worldedit_commands/init.lua index 1522ecd0..0212bf09 100755 --- a/mods/WorldEdit/worldedit_commands/init.lua +++ b/mods/WorldEdit/worldedit_commands/init.lua @@ -11,9 +11,9 @@ if minetest.place_schematic then end dofile(minetest.get_modpath("worldedit_commands") .. "/mark.lua") -dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua"); safe_region = safe_region or function(callback) return callback end +local safe_region, check_region = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua") -local get_position = function(name) --position 1 retrieval function for when not using `safe_region` +local function get_position(name) --position 1 retrieval function for when not using `safe_region` local pos1 = worldedit.pos1[name] if pos1 == nil then worldedit.player_notify(name, "no position 1 selected") @@ -21,7 +21,7 @@ local get_position = function(name) --position 1 retrieval function for when not return pos1 end -local get_node = function(name, nodename) +local function get_node(name, nodename) local node = worldedit.normalize_nodename(nodename) if not node then worldedit.player_notify(name, "invalid node name: " .. nodename) @@ -30,7 +30,7 @@ local get_node = function(name, nodename) return node end -worldedit.player_notify = function(name, message) +function worldedit.player_notify(name, message) minetest.chat_send_player(name, "WorldEdit -!- " .. message, false) end @@ -56,8 +56,8 @@ worldedit.normalize_nodename = function(nodename) return nil end ---determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1) -worldedit.player_axis = function(name) +-- Determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1) +function worldedit.player_axis(name) local dir = minetest.get_player_by_name(name):get_look_dir() local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z) if x > y then @@ -70,6 +70,15 @@ worldedit.player_axis = function(name) return "z", dir.z > 0 and 1 or -1 end +function worldedit.mkdir(path) + if minetest.mkdir then + minetest.mkdir(path) + else + os.execute('mkdir "' .. path .. '"') + end +end + + minetest.register_chatcommand("/about", { params = "", description = "Get information about the mod", @@ -802,10 +811,6 @@ minetest.register_chatcommand("/orient", { worldedit.player_notify(name, count .. " nodes oriented") end, function(name, param) - if param == nil then - minetest.log("error","No parameters given to /orient WE's command!") - return - end local found, _, angle = param:find("^([+-]?%d+)$") if found == nil then worldedit.player_notify(name, "invalid usage: " .. param) @@ -880,20 +885,22 @@ minetest.register_chatcommand("/save", { worldedit.player_notify(name, "invalid usage: " .. param) return end - if not string.find(param, "^[%w \t.,+-_=!@#$%%^&*()%[%]{};'\"]+$") then - worldedit.player_notify(name, "invalid file name: " .. param) + if not param:find("^[a-zA-Z0-9_%-.]+$") then + worldedit.player_notify(name, "Disallowed file name: " .. param) return end - local result, count = worldedit.serialize(worldedit.pos1[name], worldedit.pos2[name]) + local result, count = worldedit.serialize(worldedit.pos1[name], + worldedit.pos2[name]) local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + worldedit.mkdir(path) + local filename = path .. "/" .. param .. ".we" - filename = filename:gsub("\"", "\\\""):gsub("\\", "\\\\") --escape any nasty characters - os.execute("mkdir \"" .. path .. "\"") --create directory if it does not already exist local file, err = io.open(filename, "wb") if err ~= nil then - worldedit.player_notify(name, "could not save file to \"" .. filename .. "\"") + worldedit.player_notify(name, "Could not save file to \"" .. filename .. "\"") return end file:write(result) @@ -1041,24 +1048,29 @@ minetest.register_chatcommand("/luatransform", { minetest.register_chatcommand("/mtschemcreate", { params = "", - description = "Save the current WorldEdit region using the Minetest Schematic format to \"(world folder)/schems/.mts\"", + description = "Save the current WorldEdit region using the Minetest ".. + "Schematic format to \"(world folder)/schems/.mts\"", privs = {worldedit=true}, func = safe_region(function(name, param) if param == nil then worldedit.player_notify(name, "No filename specified") return end + if not param:find("^[a-zA-Z0-9_%-.]+$") then + worldedit.player_notify(name, "Disallowed file name: " .. param) + return + end local path = minetest.get_worldpath() .. "/schems" - local filename = path .. "/" .. param .. ".mts" - filename = filename:gsub("\"", "\\\""):gsub("\\", "\\\\") --escape any nasty characters - os.execute("mkdir \"" .. path .. "\"") --create directory if it does not already exist - local ret = minetest.create_schematic(worldedit.pos1[name], worldedit.pos2[name], worldedit.prob_list[name], filename) + local filename = path .. "/" .. param .. ".mts" + local ret = minetest.create_schematic(worldedit.pos1[name], + worldedit.pos2[name], worldedit.prob_list[name], + filename) if ret == nil then - worldedit.player_notify(name, "failed to create Minetest schematic", false) + worldedit.player_notify(name, "Failed to create Minetest schematic", false) else - worldedit.player_notify(name, "saved Minetest schematic to " .. param, false) + worldedit.player_notify(name, "Saved Minetest schematic to " .. param, false) end worldedit.prob_list[name] = {} end), diff --git a/mods/WorldEdit/worldedit_commands/safe.lua b/mods/WorldEdit/worldedit_commands/safe.lua index c6751c13..909554a9 100755 --- a/mods/WorldEdit/worldedit_commands/safe.lua +++ b/mods/WorldEdit/worldedit_commands/safe.lua @@ -1,7 +1,7 @@ local safe_region_callback = {} local safe_region_param = {} -check_region = function(name, param) +function check_region(name, param) local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions if pos1 == nil or pos2 == nil then worldedit.player_notify(name, "no region selected") @@ -12,7 +12,7 @@ end --`callback` is a callback to run when the user confirms --`nodes_needed` is a function accepting `param`, `pos1`, and `pos2` to calculate the number of nodes needed -safe_region = function(callback, nodes_needed) +function safe_region(callback, nodes_needed) --default node volume calculation nodes_needed = nodes_needed or check_region @@ -63,3 +63,5 @@ minetest.register_chatcommand("/n", { safe_region_callback[name], safe_region_param[name] = nil, nil end, }) + +return safe_region, check_region From cbe20a81b84f150a359532e2206f131fbd3e86c9 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Wed, 20 May 2015 17:04:50 +0200 Subject: [PATCH 51/54] Added dumpnodes mod - Added dumpnodes mod, creating /dumpnodes command which can be used by admins to drop the nodenames and top tiles' images for every node on the server in the aim of beginning a process designed to generate automatically the colors.txt file needed by minetestmapper --- mods/dumpnodes/init.lua | 50 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 mods/dumpnodes/init.lua diff --git a/mods/dumpnodes/init.lua b/mods/dumpnodes/init.lua new file mode 100644 index 00000000..10b7ba9e --- /dev/null +++ b/mods/dumpnodes/init.lua @@ -0,0 +1,50 @@ +local function nd_get_tiles(nd) + if nd.tiles then + return nd.tiles + elseif nd.tile_images then + return nd.tile_images + end + return nil +end + +minetest.register_chatcommand("dumpnodes", { + params = "", + description = "", + privs = {server = true}, + func = function(plname, param) + local n = 0 + local ntbl = {} + for nn, nd in pairs(minetest.registered_nodes) do + local prefix, name = nn:match('(.*):(.*)') + if prefix == nil or name == nil or prefix == '' or name == '' then + -- nothing + else + if ntbl[prefix] == nil then + ntbl[prefix] = {} + end + ntbl[prefix][name] = nd + end + end + local out, err = io.open('nodes.txt', 'wb') + if not out then + return minetest.chat_send_player(plname, 'io.open: ' .. err) + end + for prefix, i in pairs(ntbl) do + out:write('# ' .. prefix .. '\n') + for name, nd in pairs(i) do + if nd.drawtype ~= 'airlike' and nd_get_tiles(nd) ~= nil then + local tl = nd_get_tiles(nd)[1] + if type(tl) == 'table' then + tl = tl.name + end + tl = (tl .. '^'):match('(.-)^') + out:write(prefix .. ':' .. name .. ' ' .. tl .. '\n') + n = n + 1 + end + end + out:write('\n') + end + out:close() + minetest.chat_send_player(plname, n .. " nodes dumped.") + end, +}) From 9a0547a54e88e8befadf32f32b89711aa7fc3839 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Wed, 20 May 2015 17:30:19 +0200 Subject: [PATCH 52/54] Made cow dung able to burn during 8 seconds --- mods/mobs/cow.lua | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/mods/mobs/cow.lua b/mods/mobs/cow.lua index f1f27ade..41c26fe3 100755 --- a/mods/mobs/cow.lua +++ b/mods/mobs/cow.lua @@ -205,3 +205,9 @@ minetest.register_node("mobs:dung", { end end }) + +minetest.register_craft({ + type = "fuel", + recipe = "mobs:dung", + burntime = "8", +}) From 4b7d5935fbd744a7f95812717a2d387b45ee7fd0 Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 21 May 2015 17:28:31 +0200 Subject: [PATCH 53/54] Added /list_players - Added /list_players extracted from `mt_essentials` by IndriAppolo, originally called /players. Solves #57 --- mods/_misc/init.lua | 3 +++ mods/_misc/list_players.lua | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 mods/_misc/list_players.lua diff --git a/mods/_misc/init.lua b/mods/_misc/init.lua index 2e8435c5..17497039 100755 --- a/mods/_misc/init.lua +++ b/mods/_misc/init.lua @@ -24,3 +24,6 @@ dofile(minetest.get_modpath("_misc").."/craft_obsidian.lua") -- UnCraft Woll dofile(minetest.get_modpath("_misc").."/uncraft_woll.lua") + +-- List players +dofile(minetest.get_modpath("_misc").."/list_players.lua") diff --git a/mods/_misc/list_players.lua b/mods/_misc/list_players.lua new file mode 100644 index 00000000..42c7254a --- /dev/null +++ b/mods/_misc/list_players.lua @@ -0,0 +1,18 @@ +-- list_players +-- Extracted from MT_essentials, by IndriAppolo +-- + +minetest.register_chatcommand("list_players", { + params = "", + description = "List currentky connected players", + func = function(name,param) + local list + for i,player in ipairs(minetest.get_connected_players()) do + local lname = player:get_player_name() + if not list then list = lname.." " + else list = list..lname.." " end + end + minetest.chat_send_player(name,"-- "..table.getn(minetest.get_connected_players()).." player(s) connected --\n"..list) + return true + end, +}) From f1355b515fb2b78835bdab9f397c683c27880afe Mon Sep 17 00:00:00 2001 From: LeMagnesium Date: Thu, 21 May 2015 21:17:46 +0200 Subject: [PATCH 54/54] Created alias for list_players command --- mods/_misc/list_players.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/mods/_misc/list_players.lua b/mods/_misc/list_players.lua index 42c7254a..f6587cd5 100644 --- a/mods/_misc/list_players.lua +++ b/mods/_misc/list_players.lua @@ -16,3 +16,5 @@ minetest.register_chatcommand("list_players", { return true end, }) + +minetest.register_chatcommand("players", core.chatcommands["list_players"])