diff --git a/CSMbreadcrumbs/LICENSE b/CSMbreadcrumbs/LICENSE new file mode 100644 index 0000000..8000a6f --- /dev/null +++ b/CSMbreadcrumbs/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/CSMbreadcrumbs/init.lua b/CSMbreadcrumbs/init.lua new file mode 100644 index 0000000..ffc8756 --- /dev/null +++ b/CSMbreadcrumbs/init.lua @@ -0,0 +1,170 @@ +-- minetest CSM breadcrumbs -- +-- by SwissalpS -- +-- Leaves a trail of fading waypoints at intervals. +-- Adds command .bread to configure during gameplay +bc = { + version = 20211206.1721, + colour = 0xefef00, + interval = 30, -- how often to place a new waypoint + duration = 300, -- how long before waypoints fade + formName = '__breadcrumbs__', + store = assert(core.get_mod_storage()), + bMain = true, + tCache = {}, + lastid = -1, +} + + +function bc.clearAll() + + for _, id in pairs(bc.tCache) do + core.localplayer:hud_remove(id) + end + + bc.tCache = {} + +end -- clearAll + + +function bc.formInput(sFormName, tFields) + + if bc.formName ~= sFormName then return false end + + local interval = tonumber(tFields.interval) + local duration = tonumber(tFields.duration) + local colour = tonumber(tFields.colour) + if nil == colour and tFields.colour then + colour = tonumber('0x' .. tFields.colour) + end + + if tFields.bMain then bc.bMain = 'true' == tFields.bMain end + if interval and 0 < interval then bc.interval = interval end + if duration and 0 < duration then bc.duration = duration end + if colour and -1 < colour then bc.colour = colour end + + if tFields.clear then bc.clearAll() end + + return true + +end -- formInput + + +function bc.formShow() + + local sOut = 'size[5,5]' + .. 'button[1,0;2,1;clear;Clear All]' + .. 'checkbox[1,1;bMain;Active;' + .. (bc.bMain and 'true' or 'false') .. ']' + .. 'field[interval;Interval;' .. tostring(bc.interval) .. ']' + .. 'field[duration;Duration;' .. tostring(bc.duration) .. ']' + .. 'field[colour;Colour;0x' .. string.format('%x', bc.colour) .. ']' + --[[ + .. 'field_close_on_enter[interval;false]' + .. 'field_close_on_enter[duration;false]' + .. 'field_close_on_enter[colour;false]' + --]] + + core.show_formspec(bc.formName, sOut) + +end -- formShow + + +function bc.init() + + -- read settings + local colour = bc.store:get_int('colour') + if 0 < colour then bc.colour = colour end + + local interval = bc.store:get_int('interval') + if 0 < interval then bc.interval = interval end + + local duration = bc.store:get_int('duration') + if 0 < duration then bc.duration = duration end + + local sMain = bc.store:get_string('bMain') + bc.bMain = '' == sMain + + -- start loop + core.after(5, bc.update) + +end -- init + + +function bc.pos2string(tPos) + + return tostring(math.floor(tPos.x)) .. ' | ' + .. tostring(math.floor(tPos.y)) .. ' | ' + .. tostring(math.floor(tPos.z)) + +end -- pos2string + + +function bc.remove(id, sPos) + + core.localplayer:hud_remove(id) + bc.tCache[sPos] = nil + +end -- remove + + +function bc.shutdown() + + -- save settings + bc.store:set_int('colour', bc.colour) + bc.store:set_int('interval', bc.interval) + bc.store:set_int('duration', bc.duration) + bc.store:set_string('bMain', bc.bMain and '' or '-') + +end -- shutdown + + +function bc.update() + + -- call again + core.after(bc.interval, bc.update) + + if not bc.bMain then return end + + local oP = core.localplayer + if not oP then return end + + local tPos = oP:get_pos() + local sPos = bc.pos2string(tPos) + + if bc.tCache[sPos] then return end + + local id = oP:hud_add({ + hud_elem_type = 'waypoint', + name = sPos, + text = 'm', + precision = 5, + number = bc.colour, + world_pos = tPos, + offset = { x = 0, y = 0}, + alignment = {x = 1, y = -1}, + }) + bc.tCache[sPos] = id + + -- have waypoint fade + core.after(bc.duration, bc.remove, id, sPos) + +end -- update + + +-- hook in to core shutdown callback +core.register_on_shutdown(bc.shutdown) +-- hook in to formspec signals +core.register_on_formspec_input(bc.formInput) +-- register chat command +core.register_chatcommand('bread', { + description = 'Invokes formspec to change settings .', + func = bc.formShow, + params = '', +}) + +-- start delayed +core.after(5, bc.init) + +--print('[CSM, Too Much Info, Loaded]') +print('[bread-crumbs Loaded]') + diff --git a/CSMbreadcrumbs/mod.conf b/CSMbreadcrumbs/mod.conf new file mode 100644 index 0000000..563049b --- /dev/null +++ b/CSMbreadcrumbs/mod.conf @@ -0,0 +1,3 @@ +name = breadcrumbs +description = Leave a trail of fading waypoints at intervals. + diff --git a/CSMdeathMarkers/LICENSE b/CSMdeathMarkers/LICENSE new file mode 100644 index 0000000..8000a6f --- /dev/null +++ b/CSMdeathMarkers/LICENSE @@ -0,0 +1,504 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 + USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random + Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/CSMdeathMarkers/README.md b/CSMdeathMarkers/README.md new file mode 100644 index 0000000..4546cf1 --- /dev/null +++ b/CSMdeathMarkers/README.md @@ -0,0 +1,20 @@ +[![ContentDB](https://content.minetest.net/packages/SwissalpS/deathmarkers/shields/downloads/)](https://content.minetest.net/packages/SwissalpS/deathmarkers/) +# CSM Death Markers +Minetest Client Side Mod that shows waypoints to where player has died. + +The waypoints change colour and fade over time and are stored over sessions per player and server. + +If the bones are punched, the waypoint is cleared. It is also cleared if the player stands in the bone position. +Useful when other player has removed bones already, they didn't spawn at all or the items were removed without punching the node. + +Based on https://gitlab.com/PeterNerlich/death_markers + +## Installing the CSM +Depending on your OS and build/install of Minetest the location is different. The folder you are looking for is called ``clientmods``. + 1. Inside the ``clientmods`` folder create one called something like ``deathMarkers``. + 2. Download and extract the mod files + 3. and move them into the folder you created in step 1. + 4. Turn on client side mods in your minetest settings. From the menu go to settings > all settings > client > enable_client_modding. + 5. Join or start a session and log back out. (This adds a line to mods.conf: ``load_mod_deathmarkers = false``) + 7. In ``clientmods/mods.conf`` change the line ``load_mod_deathmarkers = false`` to ``load_mod_deathmarkers = true`` + 8. Join or start a session and enjoy diff --git a/CSMdeathMarkers/init.lua b/CSMdeathMarkers/init.lua new file mode 100644 index 0000000..7218cc8 --- /dev/null +++ b/CSMdeathMarkers/init.lua @@ -0,0 +1,275 @@ +-- minetest CSM deathMarkers -- +-- 2021 by Luke aka SwissalpS -- +-- based on https://gitlab.com/PeterNerlich/death_markers -- +local UPDATE_INTERVAL = 3 +local WAYPOINT_SATURATION = 1 +local WAYPOINT_EXPIRES_SECONDS = 42 * 60 + +local iDeaths = 0 +local tDeaths = {} +local sStoreID = '' +local tColourCache = {} +local bSkipClearOnVisit = false +local oStore = core.get_mod_storage() + + +-- by PeterNerlich +local function interpolate(a, b, t) return t * (b - a) + a end + + +-- by PeterNerlich +local function currentColour(fT) + + -- clamp t between 0 and 1, in steps of 0.01 + local iT = math.max(0, math.min(1, math.floor(fT * 100 + 0.5) / 100)) + + if nil == tColourCache[iT] then + -- helper variables + local iT2 = iT^2 -- t squared + local iInvT = 1 - iT -- inverse t + local iInvT2 = iInvT^2 -- inverse t squared + + local iRed = iT2 + local iGreen = 2 * iT * iInvT + local iBlue = iInvT2 + local iAverage = math.sqrt(iRed^2 + iGreen^2 + iBlue^2) + + iRed = interpolate(iAverage, iRed, WAYPOINT_SATURATION) + iGreen = interpolate(iAverage, iGreen, WAYPOINT_SATURATION) + iBlue = interpolate(iAverage, iBlue, WAYPOINT_SATURATION) + + local iWhiteStart = iInvT2^2 + local iDimming = 1 - iT^8 + + iRed = (iRed * (1 - iWhiteStart) + iWhiteStart) * iDimming + iGreen = (iGreen * (1 - iWhiteStart) + iWhiteStart) * iDimming + iBlue = (iBlue * (1 - iWhiteStart) + iWhiteStart) * iDimming + + -- we have 255 steps per subpixel + local iBase = 0xFF + + -- clamp values, discard fractions + iRed = math.floor(iBase * math.max(0, math.min(1, iRed))) + iGreen = math.floor(iBase * math.max(0, math.min(1, iGreen))) + iBlue = math.floor(iBase * math.max(0, math.min(1, iBlue))) + + -- pack it into one number representing the RGB values + tColourCache[iT] = iRed * 2^16 + iGreen * 2^8 + iBlue + end + + return tColourCache[iT] + +end -- currentColour + + +local function pos2string(tPos) + + return tostring(math.floor(tPos.x)) .. ' | ' + .. tostring(math.floor(tPos.y)) .. ' | ' + .. tostring(math.floor(tPos.z)) + +end -- pos2string + + +local function clearAll() + + local oPlayer = core.localplayer + + for sPos, tMarker in pairs(tDeaths) do + + oPlayer:hud_remove(tMarker.id) + tDeaths[sPos] = nil + + end -- loop waypoints + +end -- clearAll + + +local function onFormInput(sFormName, _) + + if 'bultin:death' ~= sFormName then return end + + bSkipClearOnVisit = false + +end -- onFormInput + + +local function makeWaypoint(oPlayer, sPos, tPos) + + return oPlayer:hud_add({ + hud_elem_type = 'waypoint', + name = 'Bone #' .. tostring(iDeaths) .. ' ' .. sPos, + text = 'm', + precision = 3, + number = 0xFF0000, + world_pos = tPos, + offset = { x = 0, y = 0}, + alignment = {x = 1, y = -1}, + }) + +end -- makeWaypoint + + +local function onSave() + + -- save shutdown time + oStore:set_int(sStoreID .. 'shutdown', os.time()) + -- save death-count + oStore:set_int(sStoreID .. 'deathCount', iDeaths) + -- save table of waypoints + oStore:set_string(sStoreID .. 'deaths', core.serialize(tDeaths)) + + --print('[deathMarkers saved marker DB]') + +end -- onSave + + +local function onDeath() + + iDeaths = iDeaths + 1 + local oPlayer = core.localplayer + + -- get player's position + local tPos = oPlayer:get_pos() + -- adjust position + tPos.x = math.floor(tPos.x + 0.5) + tPos.y = math.floor(tPos.y + 0.5) + tPos.z = math.floor(tPos.z + 0.5) + local sPos = pos2string(tPos) + + -- make waypoint and add to table + tDeaths[sPos] = { + pos = tPos, + ts = os.time(), + id = makeWaypoint(oPlayer, sPos, tPos), + } + + -- mark player as dead + bSkipClearOnVisit = true + + onSave() + +end -- onDeath + + +local function onPunch(tPos, tNode) + + if 'bones:bones' ~= tNode.name then return false end + + local sPos = pos2string(tPos) + + if tDeaths[sPos] then + + -- player punched bones -> clear the waypoint + core.localplayer:hud_remove(tDeaths[sPos].id) + tDeaths[sPos] = nil + + -- and save (in case our game crashes) + onSave() + + end + + return false + +end -- onPunch + + +local function onUpdate() + + core.after(UPDATE_INTERVAL, onUpdate) + + local oPlayer = core.localplayer + + local iNow = os.time() + for sPos, tMarker in pairs(tDeaths) do + + local fT = (iNow - tMarker.ts) / WAYPOINT_EXPIRES_SECONDS + if 1 < fT then + + -- waypoint has expired -> remove it + oPlayer:hud_remove(tMarker.id) + tDeaths[sPos] = nil + + else + + -- adjust colour + oPlayer:hud_change(tMarker.id, 'number', currentColour(fT)) + + end + + end -- loop waypoints + + -- check if player has visited bones and clear marker + -- skip clearing marker as player may still be dead at bones + if bSkipClearOnVisit then return end + + local tPos = oPlayer:get_pos() + local sPos = pos2string(tPos) + + if tDeaths[sPos] then + + -- player is at bones -> clear the waypoint + oPlayer:hud_remove(tDeaths[sPos].id) + tDeaths[sPos] = nil + + end + +end -- onUpdate + + +local function onInit() + + local oPlayer = core.localplayer + if not oPlayer then + -- onInit was called to early, try again later + core.after(1, onInit) + return + end + + local oSI = core.get_server_info() + sStoreID = oPlayer:get_name() + -- in singleplayer mode the port changes + if 'singleplayer' ~= sStoreID then + sStoreID = sStoreID .. '-' .. oSI.ip .. ':' .. oSI.port + end + + -- read death-count + iDeaths = oStore:get_int(sStoreID .. 'deathCount') + -- get table of saved markers + tDeaths = core.deserialize(oStore:get_string(sStoreID .. 'deaths')) or {} + -- how long between sessions + local iDiff = os.time() - oStore:get_int(sStoreID .. 'shutdown') + + for sPos, tMarker in pairs(tDeaths) do + + -- add inactive time passed between sessions to each marker + tMarker.ts = tMarker.ts + iDiff + -- re-create the waypoint + tMarker.id = makeWaypoint(oPlayer, sPos, tMarker.pos) + + end -- loop waypoints + + core.after(UPDATE_INTERVAL, onUpdate) + + print('[deathMarkers initialized]') + +end -- onInit + + +-- hook in to core shutdown callback to save markers and shutdown time +core.register_on_shutdown(onSave) +-- hook in to formspec signals to catch when 'you died' formspec is closed +core.register_on_formspec_input(onFormInput) +-- hook in to death event +core.register_on_death(onDeath) +-- hook in to check if our bone is being dug +core.register_on_punchnode(onPunch) +-- add chatcommand to clear all waypoints +core.register_chatcommand('cadw', { + description = 'Clears all death waypoints.', + func = clearAll, + params = '', +}) + +-- init delayed so core.localplayer exists +core.after(1, onInit) diff --git a/CSMdeathMarkers/mod.conf b/CSMdeathMarkers/mod.conf new file mode 100644 index 0000000..9f47316 --- /dev/null +++ b/CSMdeathMarkers/mod.conf @@ -0,0 +1,3 @@ +name = deathmarkers +description = Shows waypoints to where player died. The waypoints change colour and fade over time. + diff --git a/CSMsilenceBeacon/LICENSE b/CSMsilenceBeacon/LICENSE new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/CSMsilenceBeacon/LICENSE @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/CSMsilenceBeacon/init.lua b/CSMsilenceBeacon/init.lua new file mode 100644 index 0000000..123d0de --- /dev/null +++ b/CSMsilenceBeacon/init.lua @@ -0,0 +1,5 @@ +-- silence beacons when placed in a location that leaves no space to activate. +core.register_on_receiving_chat_message(function(sMsg) + return sMsg:sub(1, 47) == 'Not enough room to activate beacon pointing in ' +end) + diff --git a/CSMsilenceBeacon/mod.conf b/CSMsilenceBeacon/mod.conf new file mode 100644 index 0000000..5ab1529 --- /dev/null +++ b/CSMsilenceBeacon/mod.conf @@ -0,0 +1,2 @@ +name = silencebeacon +description = CSM that silences beacon messages when placed in tight spot diff --git a/autominer/init.lua b/autominer/init.lua new file mode 100644 index 0000000..1349c8e --- /dev/null +++ b/autominer/init.lua @@ -0,0 +1,187 @@ +--- +-- autominer + + +autominer = {} +local dmg=false +local digging=false +local radius=6 + +local nodes=nlist.get("autominer") + + +local function sleep(n) -- seconds + local t0 = os.clock() + while os.clock() - t0 <= n do end +end +local function shuffle(tbl) + for i = #tbl, 2, -1 do + local j = math.random(i) + tbl[i], tbl[j] = tbl[j], tbl[i] + end + return tbl +end +local function checklava(pos) + local n=minetest.find_node_near(pos, 2, {'mcl_core:lava_source','mcl_core:lava_flowing'}, true) + if n == nil then return false end + return true +end +local function checkgravel(pos) + local n=minetest.find_node_near(pos, 1, {'mcl_core:gravel','mcl_core:sand'}, true) + if n == nil then return false end + return true +end + +-- shamelessly stolen from dragonfire autotool +local function check_tool(stack, node_groups, old_best_time) + local toolcaps = stack:get_tool_capabilities() + if not toolcaps then return end + local best_time = old_best_time + for group, groupdef in pairs(toolcaps.groupcaps) do + local level = node_groups[group] + if level then + local this_time = groupdef.times[level] + if this_time < best_time then + best_time = this_time + end + end + end + return best_time < old_best_time, best_time +end + +local function amautotool(pos) + local player = minetest.localplayer + local inventory = minetest.get_inventory("current_player") + local node=minetest.get_node_or_nil(pos) + local node_groups = minetest.get_node_def(node.name).groups + local new_index = player:get_wield_index() + local is_better, best_time = false, math.huge + is_better, best_time = check_tool(player:get_wielded_item(), node_groups, best_time) + is_better, best_time = check_tool(inventory.hand[1], node_groups, best_time) + for index, stack in pairs(inventory.main) do + is_better, best_time = check_tool(stack, node_groups, best_time) + if is_better then + new_index = index + end + end + player:set_wield_index(new_index) +end + +local function find_tnod() + local pos = minetest.localplayer:get_pos() + local rr = vector.add(pos,{x=0,y=0,z=radius}) + local pos1 = vector.add(pos,{x=radius,y=radius,z=radius}) + local pos2 = vector.add(pos,{x=-radius,y=-radius,z=-radius}) + local rt=shuffle(minetest.find_nodes_in_area(pos1, pos2, shuffle(nodes), true)) + for k,v in pairs(rt) do + for kk,vv in pairs(shuffle(v)) do + -- minetest.display_chat_message("Found nodes:" ..dump(rt)) + if ( vv.y > -57 ) and not checkgravel(vv) and not checklava(vv) then + rr=vv + break + end + end + end + if (checkgravel(rr) or checklava(rr)) then return minetest.after(0.2,find_tnod) end + return rr +-- return rt +end +local function get_hnode() + local ppos=minetest.localplayer:get_pos() + local n=minetest.get_node_or_nil(vector.add(ppos,{x=0,y=1,z=0})) + return n +end +local function dighead() + if not minetest.localplayer then return end + local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0}) + local n=get_hnode() + if n==nil or n['name'] == 'air' then return end + --amautotool(ppos) + minetest.localplayer:set_wield_index(1) + minetest.dig_node(ppos) + minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) + digging=false + if (minetest.settings:get_bool('aminer_active')) then + local hp=minetest.localplayer:get_hp() + local hn=get_hnode() + if (hp > 17) then + minetest.after(0.2,autominer.aminer ) + else + minetest.display_chat_message("taken too much damage. wait.") + local ppos=vector.add(minetest.localplayer:get_pos(),{x=0,y=1,z=0}) + minetest.dig_node(ppos) + minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) + minetest.after(1.0,function() minetest.dig_node(vector.add(ppos,{x=0,y=0,z=0})) end ) + minetest.after(1.4,function() minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) end ) + minetest.after(1.8,function() minetest.dig_node(vector.add(ppos,{x=0,y=0,z=0})) end ) + minetest.after(2.5,function() minetest.dig_node(vector.add(ppos,{x=0,y=1,z=0})) end ) + -- minetest.settings:set_bool("aminer_active",false) + end + end +end + +local function rwarp() + if not (minetest.settings:get_bool("aminer_active")) then return end + digging=true + local nod=find_tnod() + if not nod then + minetest.display_chat_message('lava detected. stop.') + return + end + minetest.localplayer:set_pos(vector.add(nod,{x=0.3,y=-1.2,z=0.3})) + dighead() + minetest.after(0.2, dighead) +end + +local function amine() + minetest.after(1.0,rwarp) +end +function autominer.aminer() + if not digging then + digging=true + dmg=hpchange.get_status() + if dmg then + minetest.after(3.0,rwarp) + else + minetest.after(0.5,rwarp) + end + end +end +local lastch=0 +minetest.register_globalstep(function() + if os.time() < lastch + 5 then return end + lastch=os.time() + if ( minetest.settings:get_bool('aminer_active') ) then + dmg=true + digging=false + autominer.aminer() + end +end) + +minetest.register_chatcommand("aminer", { + description = "", + func = function() + dmg=true + digging=false + minetest.settings:set_bool("aminer_active",true) + autominer.aminer() + end, +}) +minetest.register_chatcommand("amine", { + description = "", + func = amine +}) +minetest.register_chatcommand("dhe", { + description = "", + func = dighead +}) +minetest.register_on_damage_taken(function(hp) + dmg=true +end) + + +if (_G["minetest"]["register_cheat"] ~= nil) then + minetest.register_cheat("Autominer (!!! ALPHA!! this will lead to you dying!!!)", "Player", "aminer_active") +else + minetest.settings:set_bool('aminer_active',true) +end diff --git a/autominer/mod.conf b/autominer/mod.conf new file mode 100644 index 0000000..f7802a2 --- /dev/null +++ b/autominer/mod.conf @@ -0,0 +1,3 @@ +name = autominer +author = cora +description = Mining bot diff --git a/autominer/settingtypes.txt b/autominer/settingtypes.txt new file mode 100644 index 0000000..153a49c --- /dev/null +++ b/autominer/settingtypes.txt @@ -0,0 +1 @@ +aminer_active (Enable Autominer) bool false diff --git a/cchat/init.lua b/cchat/init.lua new file mode 100644 index 0000000..6232ea5 --- /dev/null +++ b/cchat/init.lua @@ -0,0 +1,113 @@ +-- +-- coras Chat hacks +-- * verify death messages +-- * log chat to stdout + +cchat = {} + +-- verify death +table.insert(minetest.registered_on_receiving_chat_message, 1, function(msg) + local d = msg:find('\1b@mcl_death_messages\1b') --mineclone specific + if d then + -- minetest.send_chat_message("real.") --uncomment to publish approval + minetest.display_chat_message("real.") + end + +end) + + +-- chat logging +local mod_name = minetest.get_current_modname() + +local function log(level, message) + minetest.log(level, ('[%s] %s'):format(mod_name, message)) +end + +log('action', 'Chatlog loading...') + +local LOG_LEVEL = 'action' + +local server_info = minetest.get_server_info() +local server_id = server_info.address .. ':' .. server_info.port +local my_name = '' + +local register_on_send = minetest.register_on_sending_chat_message or minetest.register_on_sending_chat_messages +local register_on_receive = minetest.register_on_receiving_chat_message or minetest.register_on_receiving_chat_messages + + +local function safe(func) + -- wrap a function w/ logic to avoid crashing the game + local f = function(...) + local status, out = pcall(func, ...) + if status then + return out + else + log('warning', 'Error (func): ' .. out) + return nil + end + end + return f +end + +local set_my_name_tries = 0 +local function set_my_name() + if minetest.localplayer then + my_name = minetest.localplayer:get_name() + elseif set_my_name_tries < 20 then + set_my_name_tries = set_my_name_tries + 1 + minetest.after(1, set_my_name) + else + my_name = '' + end +end + + + +local function loglastlogs() + if not fren then return end + for k,v in pairs(fren.friends) do + if fren.on_server(fren.name_of(k)) then + log("LASTLOGLOG START") + --minetest.display_chat_message('Last login of friend ' .. fren.name_of(k)) + log("Last login of friend "..fren.name_of(k)) + minetest.send_chat_message("/last-login "..fren.name_of(k)) + end + end + for k,v in pairs(fren.enemies) do + if fren.on_server(fren.name_of(k)) then + log("Last login of enemy "..fren.name_of(k)) + --minetest.display_chat_message('Last login of friend ' .. fren.name_of(k)) + minetest.send_chat_message("/last-login "..fren.name_of(k)) + minetest.after("5.0",function() log("LASTLOGLOG END") end) + end + end +end + +--minetest.after("5.0",function() loglastlogs() end) + +if minetest.register_on_connect then + minetest.register_on_connect(set_my_name) +elseif minetest.register_on_mods_loaded then + minetest.register_on_mods_loaded(set_my_name) +else + minetest.after(1, set_my_name) +end + + +if register_on_send then + register_on_send(safe(function(message) + local msg = minetest.strip_colors(message) + if msg ~= '' then + log(LOG_LEVEL, ('%s@%s [sent] %s'):format(my_name, server_id, msg)) + end + end)) +end + +if register_on_receive then + register_on_receive(safe(function(message) + local msg = minetest.strip_colors(message) + if msg ~= '' then + log(LOG_LEVEL, ('%s@%s %s'):format(my_name, server_id, msg)) + end + end)) +end diff --git a/cchat/mod.conf b/cchat/mod.conf new file mode 100644 index 0000000..46aadfa --- /dev/null +++ b/cchat/mod.conf @@ -0,0 +1,3 @@ +name = cchat +author = cora +description = cora's chat extensions, primarily log to stdout diff --git a/chatbell/README.md b/chatbell/README.md new file mode 100644 index 0000000..906f484 --- /dev/null +++ b/chatbell/README.md @@ -0,0 +1 @@ +Add a `chatbell_bell.ogg` to your sound pack. diff --git a/chatbell/depends.txt b/chatbell/depends.txt new file mode 100644 index 0000000..9e168eb --- /dev/null +++ b/chatbell/depends.txt @@ -0,0 +1 @@ +csm_com? diff --git a/chatbell/description.txt b/chatbell/description.txt new file mode 100644 index 0000000..85f690b --- /dev/null +++ b/chatbell/description.txt @@ -0,0 +1 @@ +Bell sounds on your name. diff --git a/chatbell/init.lua b/chatbell/init.lua new file mode 100644 index 0000000..629e80b --- /dev/null +++ b/chatbell/init.lua @@ -0,0 +1,145 @@ +--[[ + .__ __ ___. .__ .__ + ____ | |__ _____ _/ |\_ |__ ____ | | | | +_/ ___\| | \\__ \\ __\ __ \_/ __ \| | | | +\ \___| Y \/ __ \| | | \_\ \ ___/| |_| |__ + \___ >___| (____ /__| |___ /\___ >____/____/ + \/ \/ \/ \/ \/ +--]] + +local load_time_start = os.clock() +local modname = minetest.get_current_modname() + + +local on = true +local own_names = {} +local blocked = {} + +local function get_msg(msg) + local name + if msg:sub(1, 1) == "*" then -- /me + local f = msg:find(" ", 3) + if not f then + return msg + end + local name = msg:sub(3, f-1) + msg = msg:sub(f+1) + elseif msg:sub(1, 8) == "PM from " then -- /msg + local f = msg:find(":", 9) + if not f then + return msg + end + local name = msg:sub(9, f-1) + msg = msg:sub(f+2) + else -- normal chat + if msg:sub(1, 1) ~= "<" then + return msg + end + local f = msg:find(">") + if not f then + return msg + end + name = msg:sub(2, f-1) + msg = msg:sub(f+2) + end + if blocked[name] or own_names[name] then + return false + end + return msg +end + +local function is_special_char(c) + local abc = "abcdefghijklmnopqrstuvwxyzüöäß" + return (tonumber(c) or abc:find(c)) == nil +end + +--own_names[minetest.localplayer:get_name()] = true + +minetest.register_on_receiving_chat_message(function(omsg) + local msg = get_msg(omsg) + if not msg then + return + end + local lmsg = " "..msg:lower() + local ok = false + for own_name, b in pairs(own_names) do + local loname = own_name:lower() + for i = 1, #lmsg do + local f + f, i = lmsg:find(loname, i) + if not f then + break + end + if is_special_char(lmsg:sub(f-1, f-1)) and + (is_special_char(lmsg:sub(i+1, i+1)) or i >= #lmsg) then + ok = true + break + end + end + if ok then + break + end + end + if not ok then + return + end + minetest.sound_play("chatbell_bell", {gain = 0.5}) + minetest.display_chat_message(minetest.colorize("#52DA2D", omsg)) + return true +end) + +minetest.register_chatcommand("chatbell", { + params = "get | toggle | block | name ", + description = "Control the chatbell:n".. + " toggle: Toggle the bell on/off. (Default)\n".. + " block : Block/unblock a specific player.", + func = function(param) + local cmd = param + do + local f = param:find(" ") + if f then + cmd = param:sub(1, f-1) + param = param:sub(f+1) + else + param = "" + end + end + cmd = cmd:lower() + + if cmd == "toggle" or cmd == "" then + on = not on + return true, "Chatbell "..((on and "enabled") or "disabled").."." + + elseif cmd == "block" then + blocked[param] = not blocked[param] + return true, param.." "..((blocked[param] and "") or "not ").."blocked." + + elseif cmd == "name" then + own_names[param] = not own_names[param] or nil + return true, "Nickname "..param.." toggled ".. + (own_names[param] and "on" or "off").."." + + elseif cmd == "get" then + if not on then + return true, "Chatbell is disabled." + end + local msg = "Blocked players: "..dump(blocked).."Names:" + for name, b in pairs(own_names) do + msg = msg.."\n"..name + end + return true, msg + + else + return false, "Invalid arguments." + end + end, +}) + + +local time = math.floor(tonumber(os.clock()-load_time_start)*100+0.5)/100 +local msg = "["..modname.."] loaded after ca. "..time +if time > 0.05 then + print(msg) +else + minetest.log("info", msg) +end diff --git a/chatbell/license.txt b/chatbell/license.txt new file mode 100644 index 0000000..d30ca65 --- /dev/null +++ b/chatbell/license.txt @@ -0,0 +1 @@ +CC0 diff --git a/chatbell/mod.conf b/chatbell/mod.conf new file mode 100644 index 0000000..27a4117 --- /dev/null +++ b/chatbell/mod.conf @@ -0,0 +1 @@ +name = chatbell diff --git a/chatcolor/LICENSE b/chatcolor/LICENSE new file mode 100644 index 0000000..b513e03 --- /dev/null +++ b/chatcolor/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 random-geek + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/chatcolor/README.md b/chatcolor/README.md new file mode 100644 index 0000000..3b5a5fb --- /dev/null +++ b/chatcolor/README.md @@ -0,0 +1,59 @@ +# chatcolor + +[![](https://img.shields.io/badge/Minetest%20Forums-chatcolor-4E9A06)](https://forum.minetest.net/viewtopic.php?f=53&t=20345) + +A Minetest client-side mod (CSM) which adds custom chat message coloring based on player name or message type. + +## Features + +* Colors chat messages, DMs, /me messages, and join/leave messages +* Colors names in server status messages +* Set any color for any name +* Set default colors for each type of message +* Use either chat commands or GUI + +## How to Use + +### Installation + +See [this great forum post](https://forum.minetest.net/viewtopic.php?f=53&t=17830) on how to install CSMs. + +### Colors + +Colors can be either a hex color (such as `#00FF00`) or a HTML color name (such as `plum`). + +For a full list of HTML colors, see [this page](https://html-color-codes.info/color-names/). + +### `.colors` + +Displays a GUI for modifying colors. + +### `.setcolor ` + +Color messages from player `` as ``. To set a default for a certain type of message, use the names `default_chat`, `default_dm`, etc. (see `.colors` for a full list). + +Examples: + +`.setcolor lizzy123 #00FFFF` + +`.setcolor default_me grey` + +### `.delcolor ` + +Delete a color setting for a player. Their messages will then appear in a default color. + +Examples: + +`.delcolor joe15` + +### `.listcolors` + +Shows a list of all player and default colors in chat. + +## Screenshots + +![Colored names in chat](https://github.com/random-geek/Chat-color/blob/master/screenshots/Capture20.PNG "Colored names in chat") + +![Main GUI](https://github.com/random-geek/Chat-color/blob/master/screenshots/Capture21.PNG "Main GUI") + +![Modification view](https://github.com/random-geek/Chat-color/blob/master/screenshots/Capture22.PNG "Modification view") diff --git a/chatcolor/init.lua b/chatcolor/init.lua new file mode 100644 index 0000000..0d20d17 --- /dev/null +++ b/chatcolor/init.lua @@ -0,0 +1,301 @@ +-- random-geek's colored chat CSM + +local MESSAGE_TYPES = {"chat", "me", "join", "leave", "dm"} +local DEFAULT_COLOR = "#FFFFFF" + +local data = minetest.get_mod_storage() +local guiRow = 1 -- Which row in the GUI is selected + +-- Make sure all our defaults are in place. +for _, type in ipairs(MESSAGE_TYPES) do + local key = "default_" .. type + if data:get_string(key) == "" then + data:set_string(key, DEFAULT_COLOR) + end +end + +-- Removes Minetest \x1b escape sequences (colors, translations) from a string. +-- +-- This may give wrong output for malformed strings or backslash-escaped right +-- parentheses within an escape string. See unescape_enriched() in +-- minetest/src/util/string.h for a correct implementation. +local function remove_escapes(str) + -- Remove \x1b followed by anything in parentheses + str = string.gsub(str, "\x1b%(.-%)", "") + -- Remove \x1b followed by a single character + str = string.gsub(str, "\x1b.", "") + return str +end + +-- Test remove_escapes() +-- assert(remove_escapes("\x1b\xb1(Escapes\x1b() are\x1bE cool!\x1b(T@__Az-1\\\\))") == "(Escapes are cool!)") + +-- Find the type and source of a chat message. +local function message_info(richMsg) + -- Strip any translation data to get a plaintext English message. + local msg = remove_escapes(richMsg) + local type, name + + if string.sub(msg, 1, 1) == "<" then -- Normal chat messages ( message) + type = "chat" + name = string.match(msg, "^<([1-9A-Za-z-_]+)> ") + elseif string.sub(msg, 1, 2) == "* " then -- /me messages (* player message) + type = "me" + name = string.match(msg, "^%* ([1-9A-Za-z-_]+) ") + elseif string.sub(msg, 1, 4) == "*** " then -- Join/leave messages (*** player joined/left the game.) + local tempName, typeStr = string.match(msg, "^%*%*%* ([1-9A-Za-z-_]+) (%a+)") + name = tempName + if typeStr == "joined" then + type = "join" + elseif typeStr == "left" then + type = "leave" + end + elseif string.sub(msg, 1, 8) == "DM from " then -- Direct messages (DM from player: message) + type = "dm" + -- PM was switched to DM in Minetest 5.1.0, this supports both. + name = string.match(msg, "^DM from ([1-9A-Za-z-_]+): ") + end + + -- Note: either may be nil. + if type and name then + return {type = type, name = name} + end + -- Unrecognized message types will return nil. +end + +local function table_contains(tab, target) + for _, val in ipairs(tab) do + if val == target then + return true + end + end + + return false +end + +-- Set player/default color. +-- name: player name or default_something +-- color: HTML string, hex color ('#' will be prepended if necessary), or nil to delete entry. +local function set_color(name, color) + if not name or name == "" then + minetest.display_chat_message("Player or setting name required.") + return + elseif not string.match(name, "^[1-9A-Za-z-_]+$") then + minetest.display_chat_message(string.format("Invalid player or setting name '%s'.", name)) + return + elseif color == "" then + minetest.display_chat_message("Color (hex color or color name) required.") + return + end + + local key + if string.sub(name, 1, 8) == "default_" then + if not table_contains(MESSAGE_TYPES, string.sub(name, 9)) then + minetest.display_chat_message(string.format("No setting called '%s'.", name)) + return + end + + if not color then + minetest.display_chat_message("Cannot delete defaults!") + return + end + key = name + else + -- Note: Commands/GUI omit the player prefix. + key = "player_" .. name + end + + -- Check color if it exists. + if color then + -- Prepend '#' to hex colors if necessary. + local newColor = color + if tonumber(newColor, 16) then + newColor = "#" .. newColor + end + + if not minetest.colorspec_to_colorstring(newColor) then + minetest.display_chat_message(string.format("Invalid color name '%s'.", color)) + return + end + + data:set_string(key, newColor) + minetest.display_chat_message( + string.format("Set color for %s to %s.", name, minetest.colorize(newColor, newColor)) + ) + else -- Delete player color entry + data:set_string(key, "") + minetest.display_chat_message(string.format("Deleted color for %s.", name)) + end +end + +-- Return a nicely sorted array of {name, color} pairs. +local function get_list() + local list = data:to_table().fields + local arr = {} + + -- List players, excluding player_ prefix. + for key, color in pairs(list) do + if string.sub(key, 1, 7) == "player_" then + local name = string.sub(key, 8) + arr[#arr + 1] = {name, color} + end + end + + -- Sort alphabetically. + table.sort( + arr, + function(a, b) + return a[1] < b[1] + end + ) + + -- List defaults at end + for _, type in ipairs(MESSAGE_TYPES) do + local key = "default_" .. type + local color = list[key] + arr[#arr + 1] = {key, color} + end + + return arr +end + +local function get_formspec(modify, defaultPlayer, defaultColor) + if not modify then -- Fetch main screen + local list = get_list() + + -- Convert list to formspec-friendly format + local tableRows = {} + for _, row in ipairs(list) do + tableRows[#tableRows + 1] = row[1] .. "," .. row[2] .. "," .. row[2] + end + local tableString = table.concat(tableRows, ",") + + return [[ + formspec_version[5] + size[8,9] + label[0.5,0.6;Colored Chat] + button[0.5,1;2.1,0.8;main_modify;Modify...] + button[2.9,1;2.2,0.8;main_delete;Delete] + button[5.4,1;2.1,0.8;main_add;Add...] + tablecolumns[text;color;text] + table[0.5,2.1;7,5.3;main_table;]] .. tableString .. [[;]] .. guiRow .. [[] + button_exit[0.5,7.7;2.1,0.8;exit;Exit] + tooltip[main_modify;Change the color for the selected element] + tooltip[main_delete;Delete the selected element] + tooltip[main_add;Add a color definition] + ]] + else -- Fetch modify screen + return [[ + formspec_version[5] + size[8,3.2] + field[0.5,0.8;3.4,0.8;mod_player;Player;]] .. defaultPlayer .. [[] + field[4.1,0.8;3.4,0.8;mod_color;HTML/hex color;]] .. defaultColor .. [[] + button[5,1.9;2.5,0.8;mod_set;Set] + button[0.5,1.9;2.5,0.8;mod_cancel;Cancel] + ]] + end +end + +minetest.register_on_formspec_input(function(formname, fields) + -- Ignore potential formspecs from other mods. + if string.sub(formname, 1, 10) ~= "chatcolor:" then + return + end + + -- Update the selected row index if needed. + if fields.main_table then + local event = minetest.explode_table_event(fields.main_table) + if event.type == "CHG" or event.type == "DCL" then + guiRow = event.row + end + end + + if fields.main_delete then + local list = get_list() + local key = list[guiRow][1] + set_color(key, nil) + minetest.show_formspec("chatcolor:maingui", get_formspec()) + elseif fields.main_modify then + local row = get_list()[guiRow] + -- Get formspec and send selected name to modify screen + minetest.show_formspec("chatcolor:modify", get_formspec(true, row[1], row[2])) + elseif fields.main_add then + minetest.show_formspec("chatcolor:modify", get_formspec(true, "", "")) + elseif (fields.mod_set or fields.key_enter) and fields.mod_player and fields.mod_color then + set_color(fields.mod_player, fields.mod_color) + minetest.show_formspec("chatcolor:maingui", get_formspec()) + elseif fields.mod_cancel then + minetest.show_formspec("chatcolor:maingui", get_formspec()) + end +end) + +minetest.register_chatcommand("colors", { + params = "", + description = "Display colored chat GUI.", + func = function(param) + guiRow = 1 -- Select first row of table + minetest.show_formspec("chatcolor:maingui", get_formspec()) + end +}) + +minetest.register_chatcommand("setcolor", { -- Assign a color to chat messages from a specific person + params = " ", + description = "Colorize a specified player's chat messages.", + func = function(param) + local args = string.split(param, " ") + -- If color is empty, pass an empty string to avoid deleting the entry. + set_color(args[1], args[2] or "") + end +}) + +minetest.register_chatcommand("delcolor", { + params = "", + description = "Set a specified player's chat messages to the default color.", + func = function(param) + set_color(param, nil) + end +}) + +minetest.register_chatcommand("listcolors", { + params = "", + description = "List player/color pairs.", + func = function(param) + local list = get_list() + for _, row in ipairs(list) do + minetest.display_chat_message(row[1] .. ", " .. minetest.colorize(row[2], row[2])) + end + end +}) + +-- I don't remember if or why `register_on_mods_loaded` was necessary. +minetest.register_on_mods_loaded(function() + minetest.register_on_receiving_chat_message(function(message) + local plain = minetest.strip_colors(message) + local info = message_info(plain) + + if info then -- Normal chat/me/join messages + local color = data:get_string("player_" .. info.name) + if color == "" then -- If no color, set to default + color = data:get_string("default_" .. info.type) + end + + local colorized = minetest.colorize(color, plain) + minetest.display_chat_message(colorized) + return true -- Override the original chat + elseif string.sub(plain, 1, 2) == "# " then -- /status message + local colorized = plain + + local list = data:to_table().fields + for key, color in pairs(list) do + if string.sub(key, 1, 7) == "player_" then + local playerName = string.sub(key, 8) + -- Replace plain name with colored version + colorized = string.gsub(colorized, playerName, minetest.colorize(color, playerName)) + end + end + + minetest.display_chat_message(colorized) + return true -- Override the original chat + end + end) +end) diff --git a/chatcolor/mod.conf b/chatcolor/mod.conf new file mode 100644 index 0000000..0916f45 --- /dev/null +++ b/chatcolor/mod.conf @@ -0,0 +1,2 @@ +name = chatcolor +description = Adds custom coloring of chat messages based on player or message type. diff --git a/chatcolor/screenshots/Capture20.PNG b/chatcolor/screenshots/Capture20.PNG new file mode 100644 index 0000000..107de02 Binary files /dev/null and b/chatcolor/screenshots/Capture20.PNG differ diff --git a/chatcolor/screenshots/Capture21.PNG b/chatcolor/screenshots/Capture21.PNG new file mode 100644 index 0000000..2648893 Binary files /dev/null and b/chatcolor/screenshots/Capture21.PNG differ diff --git a/chatcolor/screenshots/Capture22.PNG b/chatcolor/screenshots/Capture22.PNG new file mode 100644 index 0000000..4f875e4 Binary files /dev/null and b/chatcolor/screenshots/Capture22.PNG differ diff --git a/chatstuff/README.md b/chatstuff/README.md new file mode 100644 index 0000000..71f93f1 --- /dev/null +++ b/chatstuff/README.md @@ -0,0 +1,16 @@ +# df-mod-chatstuff +A DragonFire CSM that add's chat stuff. (Don't mistake this for the chateffects csm). + +# Commands + 1) .bye This will send a chat message to everyone with the text out of the variable $autobye_message. + +# Settings + 1) autohi_message Message that's send when joining a server + 2) autobye_message Message that's send when using .bye command + +# Cheat-Menu entrys + 1) AutoHi + +# Contributors + 1) @j45 For designing the original idea + 2) @Code-Sploit For desiging code diff --git a/chatstuff/autobye.lua b/chatstuff/autobye.lua new file mode 100644 index 0000000..6f22501 --- /dev/null +++ b/chatstuff/autobye.lua @@ -0,0 +1,42 @@ +-- Some settings + +function init_settings(T) + for key, value in pairs(T) do + if minetest.settings:get(key) == nil then + if type(value) == "boolean" then + minetest.settings:set_bool(key, value) + else + minetest.settings:set(key, value) + end + end + end +end + +init_settings({ + autobye_message = "I gotta go, have fun!" +}) + +-- Function to say the message + +function disconnect() + minetest.disconnect() +end + +function bye() + if type(minetest.settings:get("autobye_message")) ~= "string" or minetest.settings:get("autobye_message") == nil then return end + + local message = minetest.settings:get("autobye_message") + + minetest.send_chat_message(message) + disconnect() +end + +-- Register section + +minetest.register_chatcommand("bye", { + description = "Send's the configured autobye message and exits to mainmenu", + + func = function() + bye() + end +}) diff --git a/chatstuff/autohi.lua b/chatstuff/autohi.lua new file mode 100644 index 0000000..96f374c --- /dev/null +++ b/chatstuff/autohi.lua @@ -0,0 +1,48 @@ +-- Some settings + +function init_settings(T) + for key, value in pairs(T) do + if minetest.settings:get(key) == nil then + if type(value) == "boolean" then + minetest.settings:set_bool(key, value) + else + minetest.settings:set(key, value) + end + end + end +end + +init_settings({ + autohi_message = "Hi" +}) + +-- Function to say the message + +function check() + if not minetest.localplayer then + minetest.after(0, check) + return false + end + + return true +end + +function say() + -- Check if you are in a game + if check() ~= true then return end + + -- Check if autohi is enabled + if not minetest.settings:get_bool("autohi") then return end + + if type(minetest.settings:get("autohi_message")) ~= "string" or minetest.settings:get("autohi_message") == nil then return end + + local message = minetest.settings:get("autohi_message") + + minetest.send_chat_message(message) +end + +-- Register section + +minetest.after(0, say) + +minetest.register_cheat("AutoHi", "Chat", "autohi") diff --git a/chatstuff/init.lua b/chatstuff/init.lua new file mode 100644 index 0000000..039d9b0 --- /dev/null +++ b/chatstuff/init.lua @@ -0,0 +1,8 @@ +-- Get the modpath of current csm + +local modpath = minetest.get_modpath("chatstuff") + +-- Execute the files + +dofile(modpath .. "autobye.lua") +dofile(modpath .. "autohi.lua") diff --git a/chatstuff/mod.conf b/chatstuff/mod.conf new file mode 100644 index 0000000..861d3d4 --- /dev/null +++ b/chatstuff/mod.conf @@ -0,0 +1,3 @@ +name = chatstuff +description = Add's chat stuff +author = Code-Sploit diff --git a/chatstuff/settingtypes.txt b/chatstuff/settingtypes.txt new file mode 100644 index 0000000..e40c473 --- /dev/null +++ b/chatstuff/settingtypes.txt @@ -0,0 +1,2 @@ +autohi_message (Message to auto-send when joining a server) string Hi +autobye_message (Message to auto-send when using .bye chatcommand) string I gotta go, have fun! diff --git a/colour_chat/LICENSE b/colour_chat/LICENSE new file mode 100644 index 0000000..93f5629 --- /dev/null +++ b/colour_chat/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2018 red-001 + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/colour_chat/README.md b/colour_chat/README.md new file mode 100644 index 0000000..e746761 --- /dev/null +++ b/colour_chat/README.md @@ -0,0 +1,5 @@ +# colour_chat +A minetest CSM mod for changing the colour of text sent to the server. + +### Usage +Use .set_colour to set the colour of chat sent to the server, you can use either HTML named colours or HTML hexdecimal colour codes. Use .rainbow to generate rainbow text diff --git a/colour_chat/init.lua b/colour_chat/init.lua new file mode 100644 index 0000000..e3c82bf --- /dev/null +++ b/colour_chat/init.lua @@ -0,0 +1,121 @@ +local modstorage = core.get_mod_storage() + +local register_on_message = core.register_on_sending_chat_message +if core.register_on_sending_chat_messages then + register_on_message = core.register_on_sending_chat_messages +end + +local function rgb_to_hex(rgb) + local hexadecimal = '#' + + for key, value in pairs(rgb) do + local hex = '' + + while(value > 0)do + local index = math.fmod(value, 16) + 1 + value = math.floor(value / 16) + hex = string.sub('0123456789ABCDEF', index, index) .. hex + end + + if(string.len(hex) == 0)then + hex = '00' + + elseif(string.len(hex) == 1)then + hex = '0' .. hex + end + + hexadecimal = hexadecimal .. hex + end + + return hexadecimal +end + +local function color_from_hue(hue) + local h = hue / 60 + local c = 255 + local x = (1 - math.abs(h%2 - 1)) * 255 + + local i = math.floor(h); + if (i == 0) then + return rgb_to_hex({c, x, 0}) + elseif (i == 1) then + return rgb_to_hex({x, c, 0}) + elseif (i == 2) then + return rgb_to_hex({0, c, x}) + elseif (i == 3) then + return rgb_to_hex({0, x, c}); + elseif (i == 4) then + return rgb_to_hex({x, 0, c}); + else + return rgb_to_hex({c, 0, x}); + end +end + +local function canTalk() + if core.get_privilege_list then + return core.get_privilege_list().shout + else + return true + end +end + +local function say(message) + if not canTalk() then + minetest.display_chat_message("You need 'shout' in order to talk") + return + end + minetest.send_chat_message(message) + if minetest.get_server_info().protocol_version < 29 then + local name = minetest.localplayer:get_name() + minetest.display_chat_message("<"..name.."> " .. message) + end +end + +register_on_message(function(message) + if message:sub(1,1) == "/" or modstorage:get_string("colour") == "" or modstorage:get_string("colour") == "white" then + return false + end + + say(core.get_color_escape_sequence(modstorage:get_string("colour")) .. message) + return true +end) + +core.register_chatcommand("set_colour", { + description = core.gettext("Change chat colour"), + func = function(colour) + modstorage:set_string("colour", colour) + return true, "Chat colour changed." + end, +}) + +core.register_chatcommand("rainbow", { + description = core.gettext("rainbow text"), + func = function(param) + if not canTalk() then + return false, "You need 'shout' in order to use this command" + end + local step = 360 / param:len() + local hue = 0 + -- iterate the whole 360 degrees + local output = "" + for i = 1, param:len() do + local char = param:sub(i,i) + if char:match("%s") then + output = output .. char + else + output = output .. core.get_color_escape_sequence(color_from_hue(hue)) .. char + end + hue = hue + step + end + say(output) + return true +end, +}) + +core.register_chatcommand("say", { + description = core.gettext("Send text without applying colour to it"), + func = function(text) + say(text) + return true + end, +}) diff --git a/csm_inspect/LICENSE b/csm_inspect/LICENSE new file mode 100644 index 0000000..19e3071 --- /dev/null +++ b/csm_inspect/LICENSE @@ -0,0 +1,504 @@ + 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/csm_inspect/README.md b/csm_inspect/README.md new file mode 100644 index 0000000..9d0000c --- /dev/null +++ b/csm_inspect/README.md @@ -0,0 +1,38 @@ +# csm-inspect +Client mod that adds a command to inspect nodes and items. + +## Commands +### inspect +Arguments: `help | get | on | off | hand | toggle` + +#### Help +Display a help message. + +#### Get +Display whether inspection is enabled or disabled. + +#### On +Enable inspection. + +#### Off +Disable inspection. + +#### Hand +Show wielded item. + +#### Toggle +Toggle inspection. If run with no arguments, this is default. + +## How to install +1. Enter your minetest directory. +2. Find the `clientmods` directory. +3. Unpack this mod into that directory. +4. Rename unpacked directory (should be named `csm-inspect-master`) to `inspect`. +5. Set the in-game setting `enable_client_modding` to true. +6. You're done! + +## How to use +When inspection is enabled (type `.inspect get` to find out), punch a node to see everything about it. + +## License +Code: **LGPL v2.1+** diff --git a/csm_inspect/init.lua b/csm_inspect/init.lua new file mode 100644 index 0000000..fd1ea0e --- /dev/null +++ b/csm_inspect/init.lua @@ -0,0 +1,61 @@ +local inspect = false +minetest.register_chatcommand("inspect", { + description = "Modify inspection settings", + params = "help|get|on|off|hand|toggle", + func = function(param) + param = param:lower() + if param == "help" then + minetest.display_chat_message("HELP: Show this help message.") + minetest.display_chat_message("GET: Inspection settings.") + minetest.display_chat_message("ON: Enable inspection.") + minetest.display_chat_message("OFF: Disable inspection.") + minetest.display_chat_message("HAND: Show held item.") + minetest.display_chat_message("TOGGLE: Toggle inspection. (Default)") + return true + elseif param == "get" then + if inspect then + return true, "Inspection is enabled." + else + return true, "Inspection is disabled." + end + elseif param == "on" then + inspect = true + return true, "Inspection enabled." + elseif param == "off" then + inspect = false + return true, "Inspection disabled." + elseif param == "hand" then + local stack = minetest.get_wielded_item() + if stack:get_name() == "" then + minetest.display_chat_message("Your hand is empty.") + return true + end + if stack:get_wear() > 0 then -- If a tool, then say wear instead of count. + minetest.display_chat_message("You are holding a " .. stack:get_name() .. " which is " .. tostring(math.floor((stack:get_wear()/65535) * 100)) .. "% worn.") + return true + else + minetest.display_chat_message("You are holding " .. tostring(stack:get_count()) .. " of " .. stack:get_name() .. ".") + return true + end + return false, "Not Implimented." + elseif param == "toggle" or param == "" then + inspect = not inspect + if inspect then + return true, "Inspection enabled." + else + return true, "Inspection disabled." + end + return true + else + return false, "Invalid Arguments." + end + end +}) + +minetest.register_on_punchnode(function(pos, node) + if inspect then + minetest.display_chat_message("Node name: " .. node.name) + minetest.display_chat_message("Param1: " .. tostring(node.param1)) + minetest.display_chat_message("Param2, Facedir: " .. tostring(node.param2) .. ", " .. tostring(node.param2 % 32)) + end +end)