From 04f28c1be53fcccd17daf24c1bff42955a707a9c Mon Sep 17 00:00:00 2001 From: Wuzzy Date: Thu, 5 Jan 2017 05:17:16 +0100 Subject: [PATCH] Import new torches mod by BlockMen and sofar --- mods/torches/LICENSE.txt | 502 ++++++++++++++++++++++++ mods/torches/README.txt | 69 +++- mods/torches/changelog.txt | 37 ++ mods/torches/crafting.lua | 14 - mods/torches/description.txt | 1 + mods/torches/init.lua | 413 ++++++++++--------- mods/torches/mod.conf | 1 + mods/torches/models/torch_floor.obj | 50 +++ mods/torches/models/torch_wall.obj | 64 +++ mods/torches/screenshot.png | Bin 0 -> 36243 bytes mods/torches/settingtypes.txt | 9 + mods/torches/textures/torches_fire1.png | Bin 408 -> 0 bytes mods/torches/textures/torches_fire2.png | Bin 561 -> 0 bytes mods/torches/textures/torches_side.png | Bin 195 -> 0 bytes mods/torches/textures/torches_torch.png | Bin 227 -> 0 bytes 15 files changed, 921 insertions(+), 239 deletions(-) create mode 100644 mods/torches/LICENSE.txt create mode 100644 mods/torches/changelog.txt delete mode 100644 mods/torches/crafting.lua create mode 100644 mods/torches/description.txt create mode 100644 mods/torches/mod.conf create mode 100644 mods/torches/models/torch_floor.obj create mode 100644 mods/torches/models/torch_wall.obj create mode 100644 mods/torches/screenshot.png create mode 100644 mods/torches/settingtypes.txt delete mode 100644 mods/torches/textures/torches_fire1.png delete mode 100644 mods/torches/textures/torches_fire2.png delete mode 100644 mods/torches/textures/torches_side.png delete mode 100644 mods/torches/textures/torches_torch.png diff --git a/mods/torches/LICENSE.txt b/mods/torches/LICENSE.txt new file mode 100644 index 00000000..4362b491 --- /dev/null +++ b/mods/torches/LICENSE.txt @@ -0,0 +1,502 @@ + 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/mods/torches/README.txt b/mods/torches/README.txt index 0816b35f..a463b567 100644 --- a/mods/torches/README.txt +++ b/mods/torches/README.txt @@ -1,29 +1,62 @@ Minetest mod "Torches" -======================= -version: 1.1 +====================== -License of source code: WTFPL ------------------------------------------ -(c) Copyright BlockMen (2013) +(c) Copyright BlockMen (2013-2015) +(C) Copyright sofar (2016) -This program is free software. It comes without any warranty, to -the extent permitted by applicable law. You can redistribute it -and/or modify it under the terms of the Do What The Fuck You Want -To Public License, Version 2, as published by Sam Hocevar. See -http://sam.zoy.org/wtfpl/COPYING for more details. +About this mod: +~~~~~~~~~~~~~~~ +This mod changes the default torch drawtype from "torchlike" to "mesh", +giving the torch a three dimensional appearance. The mesh contains the +proper pixel mapping to make the animation appear as a particle above +the torch, while in fact the animation is just the texture of the mesh. + +Originally, this mod created in-game alternatives with several +draw styles. The alternatives have been removed and instead of +providing alternate nodes, this mod now directly modifies the existing +nodes. Conversion from the wallmounted style is done through an LBM. + +The wield light part is inspired, but not copied from "walking light", +a mod by "echo". After looking at the code I decided to implement +it from scratch as I found it to be too resource intensive and not +implemented efficiently enough. Still, echo deserves the credit for +the excellent idea. + +Torches is meant for minetest-0.4.14, and does not directly support +older minetest releases. You'll need a recent git, or nightly build. -Using the mod: --------------- +License: +~~~~~~~~ +(c) Copyright BlockMen (2013-2015) -This mod adds 3D torches to Minetest. They also have real flames and look much more realistic. +Textures and Meshes/Models: +CC-BY 3.0 BlockMen +Note that the models were entirely done from scratch by sofar. -Notice: Already placed old torches wont be changed. +Code: +Licensed under the GNU LGPL version 2.1 or higher. +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; + +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 + +See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt + + +Github: +~~~~~~~ +https://github.com/BlockMen/torches + +Forum: +~~~~~~ +https://forum.minetest.net/viewtopic.php?id=6099 Changelog: ----------- -- Torches on wall dont fall when node under it is dug -- Torches fall directly when not placed on floor or wall -- fixed different placing bugs \ No newline at end of file +~~~~~~~~~~ +see changelog.txt diff --git a/mods/torches/changelog.txt b/mods/torches/changelog.txt new file mode 100644 index 00000000..cab14fd7 --- /dev/null +++ b/mods/torches/changelog.txt @@ -0,0 +1,37 @@ +Changelog: +---------- +1.1 - 1.2.x: +- Torches on wall dont fall when node under it is dug +- Torches fall directly when not placed on floor or wall +- fixed different placing bugs + +1.3: +- Torches only show flames when player is near (13 blocks) +- Old torches are converted to new, ceiling torches are dropped + +1.3.1: +- fix dropping torches when digging a block next to it +- all torches attached to a block get droped when dug + +1.3.2: +- fix crashes by unknown nodes + +2.0: +- Use new mesh drawtype to improve wallmounted torches +- Update particle usage +- New textures; flame texture fix by Yepoleb +- Fix for doors, chests, etc (rightclick support) + +2.1 +- Fix wallmounted torch mesh +- Clean up code, use wallmounted paramtype2 +- Fix torches being placeable on ceilings (reported by kilbith) + +3.0 +- Minetest style added and used by default +- style can be changed via settings +- using Minetest style allows ceiling torches via settings +- Minetest style supports all texturepacks (as long torch shaped) + +3.0.1 +- Fix global variable that caused rarely placing issues (thanks to tchncs for pointing out) diff --git a/mods/torches/crafting.lua b/mods/torches/crafting.lua deleted file mode 100644 index 687f5471..00000000 --- a/mods/torches/crafting.lua +++ /dev/null @@ -1,14 +0,0 @@ -minetest.register_craft({ - type = "fuel", - recipe = "torches:torch", - burntime = 4, -}) - -minetest.register_craft({ - output = 'torches:torch 4', - recipe = { - {'group:coal'}, - {'default:stick'}, - } -}) - diff --git a/mods/torches/description.txt b/mods/torches/description.txt new file mode 100644 index 00000000..1ce04a36 --- /dev/null +++ b/mods/torches/description.txt @@ -0,0 +1 @@ +Mesh-based torches - three dimensional torches for minetest. diff --git a/mods/torches/init.lua b/mods/torches/init.lua index a2cae899..7761c74c 100644 --- a/mods/torches/init.lua +++ b/mods/torches/init.lua @@ -1,231 +1,230 @@ -local VIEW_DISTANCE = 13 -local null = {x=0, y=0, z=0} +-- +-- 3d torch part +-- -local dirs = {{-1,0,-1},{-1,0,0},{0,0,-1}, -{1,0,1},{1,0,0},{0,0,1},{0,1,0}} +minetest.register_node(":default:torch", { + description = "Torch", + drawtype = "mesh", + mesh = "torch_floor.obj", + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + liquids_pointable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-1/16, -2/16, -1/16, 1/16, 0.5, 1/16}, + wall_bottom = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, + }, + sounds = default.node_sound_wood_defaults(), + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + -- no interaction possible with entities, for now. + return itemstack + end ---fire_particles -local function add_fire(pos) - pos.y = pos.y+0.19 - minetest.add_particle(pos, null, null, 1.1, - 1.5, true, "torches_fire"..tostring(math.random(1,2)) ..".png") - pos.y = pos.y +0.01 - minetest.add_particle(pos, null, null, 0.8, - 1.5, true, "torches_fire"..tostring(math.random(1,2)) ..".png") -end + local under = pointed_thing.under + local node = minetest.get_node(under) + local def = minetest.registered_nodes[node.name] + if def and def.on_rightclick then + return def.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack, false + end ---help functions -function check_attached_node_fdir(p, n) - local def = minetest.registered_nodes[n.name] - local d = {x=0, y=0, z=0} - if def.paramtype2 == "facedir" then - if n.param2 == 0 then - d.z = 1 - elseif n.param2 == 1 then - d.x = 1 - elseif n.param2 == 2 then - d.z = -1 - elseif n.param2 == 3 then - d.x = -1 + local above = pointed_thing.above + local wdir = minetest.dir_to_wallmounted({x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}) + local fakestack = itemstack + local retval + if wdir <= 1 then + retval = fakestack:set_name("default:torch") + else + retval = fakestack:set_name("default:torch_wall") + end + if not retval then + return itemstack + end + + itemstack = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name("default:torch") + + return itemstack + end +}) + +minetest.register_node(":default:torch_wall", { + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = {{ + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + }}, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-0.1, -0.1, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, 0.1, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.2, 0.3, 0.1}, + }, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_lbm({ + name = "torches:convert_wallmounted", + nodenames = {"default:torch", "torches:floor", "torches:wall"}, + action = function(pos, node) + if node.param2 >= 2 then + minetest.set_node(pos, {name = "default:torch_wall", + param2 = node.param2}) + else + minetest.set_node(pos, {name = "default:torch", + param2 = node.param2}) end end - local p2 = {x=p.x+d.x, y=p.y+d.y, z=p.z+d.z} - local nn = minetest.env:get_node(p2).name - local def2 = minetest.registered_nodes[nn] - if def2 and not def2.walkable then +}) + +-- +-- torch wield light +-- + +if not minetest.is_yes(minetest.setting_get("torches_wieldlight_enable") or true) then + return +end +local torchlight_update_interval = minetest.setting_get("torches_wieldlight_interval") or 0.25 + +minetest.register_node("torches:torchlight", { + drawtype = "airlike", + groups = {not_in_creative_inventory = 1}, + walkable = false, + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + pointable = false, + buildable_to = true, + drops = {}, +}) + +-- state tables +local torchlight = {} +local playerlist = {} + +local function wields_torch(player) + if not player then + return false + end + local item = player:get_wielded_item() + if not item then + return false + end + return item:get_name() == "default:torch" +end + +local function wielded_torch(name) + if not torchlight[name] then return false end return true end -local function is_wall(wallparam) - if wallparam == 0 then return false end - local para2 = 0 - if wallparam == 2 then - para2 = 1 - elseif wallparam == 3 then - para2 = 3 - elseif wallparam == 4 then - para2 = 0 - elseif wallparam == 5 then - para2 = 2 - end - return para2 +local function is_torchlight(pos) + local node = minetest.get_node(pos) + return node.name == "torches:torchlight" end -local function player_near(pos) - for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, VIEW_DISTANCE)) do - if object:is_player() then - return true - end +local function remove_torchlight(pos) + if is_torchlight(pos) then + minetest.swap_node(pos, {name = "air"}) end +end +local function place_torchlight(pos) + local name = minetest.get_node(pos).name + if name == "torches:torchlight" then + return true + end + if (minetest.get_node_light(pos) or 0) > 11 then + -- no reason to place torch here, so save a bunch + -- of node updates this way + return false + end + if name == "air" then + minetest.swap_node(pos, {name = "torches:torchlight"}) + return true + end return false end --- abms for flames -minetest.register_abm({ - nodenames = {"torches:wand"}, - interval = 1, - chance = 1, - action = function(pos) - if player_near(pos) then - add_fire(pos) - end +local function get_torchpos(player) + return vector.add({x = 0, y = 1, z = 0}, vector.round(player:getpos())) +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + playerlist[name] = true +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + -- don't look at wielded() here, it's likely invalid + if torchlight[name] then + remove_torchlight(torchlight[name]) + torchlight[name] = nil end -}) + playerlist[name] = nil +end) -minetest.register_abm({ - nodenames = {"torches:floor"}, - interval = 1, - chance = 1, - action = function(pos) - if player_near(pos) then - add_fire(pos) - end - end -}) - -minetest.register_craftitem("torches:torch", { - description = "Torch", - inventory_image = "torches_torch.png", - wield_image = "torches_torch.png", - stack_max = 64, - wield_scale = {x=1,y=1,z=1+1/16}, - liquids_pointable = false, - on_place = function(itemstack, placer, pointed_thing) - local pn = placer:get_player_name() - if pointed_thing.type ~= "node" - or string.find(minetest.env:get_node(pointed_thing.above).name, "group:torch") - or string.find(minetest.env:get_node(pointed_thing.above).name, "doors:") then - return itemstack - end - if minetest.is_protected(pointed_thing.above, pn) then - return itemstack - end - local above = pointed_thing.above - local under = pointed_thing.under - local wdir = minetest.dir_to_wallmounted({x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}) - local pos = {x = above.x, y = above.y, z = above.z} - local u_n = minetest.get_node(under) - local udef = minetest.registered_nodes[u_n.name] - if u_n and udef and not udef.walkable then above = under end - u_n = minetest.get_node(above) - udef = minetest.registered_nodes[u_n.name] - if u_n and udef and udef.walkable then return itemstack end - if wdir == 1 then - minetest.env:add_node(above, {name = "torches:floor"}) - if minetest.env:get_node(under).name:find("wallet:wall") == 1 then - update_wall_global(pos) - end - else - minetest.env:add_node(above, {name = "torches:wand", param2 = is_wall(wdir)}) - end - if not wdir == 0 or not minetest.setting_getbool("creative_mode") then - itemstack:take_item() - end - return itemstack - - end - -}) - -minetest.register_node("torches:floor", { - inventory_image = "default_torch.png", - wield_image = "torches_torch.png", - wield_scale = {x=1,y=1,z=1+2/16}, - drawtype = "nodebox", - tiles = {"torches_torch.png^[transformfy", "default_wood.png", "torches_torch.png", - "torches_torch.png^[transformfx", "torches_torch.png", "torches_torch.png"}, - paramtype = "light", - paramtype2 = "none", - is_ground_content = false, - sunlight_propagates = true, - drop = "default:torch", - walkable = false, - light_source = 13, - groups = {choppy=2,dig_immediate=3,flammable=1,not_in_creative_inventory=1,torch=1,attached_node=1,dig_by_water=1}, - legacy_wallmounted = true, - node_box = { - type = "fixed", - fixed = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, - }, - selection_box = { - type = "fixed", - fixed = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, - }, - --after_dig_node = function(pos, oldnode, oldmetadata, digger) - -- if not digger:is_player() then minetest.add_item(pos, {name="default:torch"}) end - --end, - - update = function(pos,node, pos2) - if pos2.y < pos.y then - minetest.dig_node(pos) - end - end, -}) - -local wall_ndbx = { - {-1/16,-6/16, 6/16, 1/16, -5/16, 0.5}, - {-1/16,-5/16, 5/16, 1/16, -4/16, 7/16}, - {-1/16,-4/16, 4/16, 1/16, -3/16, 6/16}, - {-1/16,-3/16, 3/16, 1/16, -2/16, 5/16}, - {-1/16,-2/16, 2/16, 1/16, -1/16, 4/16}, - {-1/16,-1/16, 1/16, 1/16, 0, 3/16}, - {-1/16,0, 1/16, 1/16, 1/16, 2/16}, - {-1/16, 0, -1/16, 1/16, 2/16, 1/16}, -} - -minetest.register_node("torches:wand", { - inventory_image = "default_torch.png", - wield_image = "torches_torch.png", - wield_scale = {x=1,y=1,z=1+1/16}, - drawtype = "nodebox", - tiles = {"torches_torch.png^[transformfy", "default_wood.png", "torches_side.png", - "torches_side.png^[transformfx", "default_wood.png", "torches_torch.png"}, - - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = false, - sunlight_propagates = true, - walkable = false, - light_source = 13, - groups = {choppy=2,dig_immediate=3,flammable=1,not_in_creative_inventory=1,torch=1,attached_node=1,dig_by_water=1}, - legacy_wallmounted = true, - drop = "default:torch", - node_box = { - type = "fixed", - fixed = wall_ndbx - }, - selection_box = { - type = "fixed", - fixed = {-1/16, -6/16, 7/16, 1/16, 2/16, 2/16}, - }, - update = function(pos,node) - if not check_attached_node_fdir(pos, node) then - minetest.add_item(pos, {name="torches:torch"}) - end - end, - - -}) - -minetest.register_on_dignode(function(pos, oldnode, digger) - if minetest.find_node_near(pos, 1, {"group:torch"}) == nil then return end - for i=1,#dirs do - local v = dirs[i] - local p = {x=pos.x+v[1],y=pos.y+v[2],z=pos.z+v[3]} - local n = minetest.get_node_or_nil(p) - if n and n.name then - local def = minetest.registered_nodes[n.name] - if def and def.update then - def.update(p, n, pos) - end - end +minetest.register_on_shutdown(function() + for i, _ in pairs(torchlight) do + remove_torchlight(torchlight[i]) end end) -dofile(minetest.get_modpath("torches") .. "/crafting.lua") +local function update_torchlight(dtime) + for name, _ in pairs(playerlist) do + local player = minetest.get_player_by_name(name) + local wielded = wielded_torch(name) + local wields = wields_torch(player) + + if not wielded and wields then + local torchpos = get_torchpos(player) + if place_torchlight(torchpos) then + torchlight[name] = vector.new(torchpos) + end + elseif wielded and not wields then + remove_torchlight(torchlight[name]) + torchlight[name] = nil + elseif wielded and wields then + local torchpos = get_torchpos(player) + if not vector.equals(torchpos, torchlight[name]) or + not is_torchlight(torchpos) then + if place_torchlight(torchpos) then + remove_torchlight(torchlight[name]) + torchlight[name] = vector.new(torchpos) + elseif vector.distance(torchlight[name], torchpos) > 2 then + -- player went into some node + remove_torchlight(torchlight[name]) + torchlight[name] = nil + end + end + end + end + minetest.after(torchlight_update_interval, update_torchlight) +end + +minetest.after(torchlight_update_interval, update_torchlight) -minetest.register_alias("default:torch", "torches:torch") diff --git a/mods/torches/mod.conf b/mods/torches/mod.conf new file mode 100644 index 00000000..b8c44b94 --- /dev/null +++ b/mods/torches/mod.conf @@ -0,0 +1 @@ +name = torches diff --git a/mods/torches/models/torch_floor.obj b/mods/torches/models/torch_floor.obj new file mode 100644 index 00000000..e2487efe --- /dev/null +++ b/mods/torches/models/torch_floor.obj @@ -0,0 +1,50 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_floor.blend' +# www.blender.org +mtllib torch_floor.mtl +o Cube_Cube.001 +v 0.062500 0.062500 -0.062500 +v 0.062500 -0.500000 -0.062500 +v 0.062500 0.062500 0.062500 +v 0.062500 -0.500000 0.062500 +v -0.062500 0.062500 -0.062500 +v -0.062500 -0.500000 -0.062500 +v -0.062500 0.062500 0.062500 +v -0.062500 -0.500000 0.062500 +v -0.353553 -0.500000 0.353553 +v -0.353553 0.500000 0.353553 +v 0.353553 -0.500000 -0.353553 +v 0.353553 0.500000 -0.353553 +v -0.353553 -0.500000 -0.353553 +v 0.353553 -0.500000 0.353553 +v -0.353553 0.500000 -0.353553 +v 0.353553 0.500000 0.353553 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.000000 0.000000 -1.000000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.000000 -0.707100 +vn -0.707100 -0.000000 0.707100 +g Cube_Cube.001_Cube_Cube.001_Material.001 +usemtl Material.001 +s off +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +g Cube_Cube.001_Cube_Cube.001_Material.002 +usemtl Material.002 +f 9/9/4 10/10/4 12/11/4 11/12/4 +f 13/12/5 14/9/5 16/10/5 15/11/5 diff --git a/mods/torches/models/torch_wall.obj b/mods/torches/models/torch_wall.obj new file mode 100644 index 00000000..57baa9e6 --- /dev/null +++ b/mods/torches/models/torch_wall.obj @@ -0,0 +1,64 @@ +# Blender v2.76 (sub 11) OBJ File: 'torch_wall.blend' +# www.blender.org +mtllib torch_wall.mtl +o Cube_Cube.001 +v 0.062469 -0.195248 0.023570 +v 0.062469 -0.476498 -0.463570 +v 0.062469 -0.303502 0.086070 +v 0.062469 -0.584752 -0.401070 +v -0.062531 -0.195248 0.023570 +v -0.062531 -0.476498 -0.463570 +v -0.062531 -0.303502 0.086070 +v -0.062531 -0.584752 -0.401070 +v -0.353584 -0.613553 0.022500 +v -0.353584 -0.613553 0.460000 +v 0.353522 0.093553 0.022500 +v 0.353522 0.093553 0.460000 +v -0.353584 0.093553 0.022500 +v 0.353522 -0.613553 0.022500 +v -0.353584 0.093553 0.460000 +v 0.353522 -0.613553 0.460000 +v 0.353553 0.056811 -0.121957 +v 0.353553 -0.224439 -0.609096 +v -0.353553 -0.555561 0.231596 +v -0.353553 -0.836811 -0.255543 +v -0.353553 0.056811 -0.121957 +v -0.353553 -0.224439 -0.609096 +v 0.353553 -0.555561 0.231596 +v 0.353553 -0.836811 -0.255543 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437500 0.625000 +vt 0.437500 0.500000 +vt 0.437500 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +vt 0.000000 0.562500 +vt 0.000000 -0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.562500 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vn -0.000000 0.500000 0.866000 +vn -0.000000 0.866000 -0.500000 +vn 1.000000 0.000000 0.000000 +vn -0.707100 0.612400 -0.353600 +vn -0.707100 -0.612400 0.353600 +vn -0.707100 0.707100 -0.000000 +vn -0.707100 -0.707100 -0.000000 +g Cube_Cube.001_Cube_Cube.001_Material.001 +usemtl Material.001 +s off +f 3/1/1 1/2/1 5/3/1 7/4/1 +f 8/5/1 4/6/1 2/7/1 6/8/1 +f 3/2/2 4/6/2 8/5/2 7/3/2 +f 1/3/3 3/2/3 4/6/3 2/5/3 +f 5/2/2 1/3/2 2/5/2 6/6/2 +f 7/3/3 8/5/3 6/6/3 5/2/3 +f 17/9/4 18/10/4 20/11/4 19/12/4 +f 21/9/5 22/10/5 24/11/5 23/12/5 +g Cube_Cube.001_Cube_Cube.001_Material.002 +usemtl Material.002 +f 9/12/6 10/13/6 12/14/6 11/9/6 +f 13/9/7 14/12/7 16/13/7 15/14/7 diff --git a/mods/torches/screenshot.png b/mods/torches/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9f85919fd676fc32d3333bcba43c218353785a GIT binary patch literal 36243 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 literal 0 HcmV?d00001 diff --git a/mods/torches/settingtypes.txt b/mods/torches/settingtypes.txt new file mode 100644 index 00000000..3d99e647 --- /dev/null +++ b/mods/torches/settingtypes.txt @@ -0,0 +1,9 @@ + +# Enable wielded torches to light the area around it as the player moves. This is +# somewhat resource intensive and may be disabled to reduce lag. +torches_wieldlight_enable (Enable held torch to emit light) bool false + +# How often the wieldlight should be moved if the player moves with a torch in their +# hand. Reducing this makes it feel more laggy, but reduces the amount of network +# packets sent to clients. +torches_wieldlight_interval (Torch light from held torch update interval) float 0.25 diff --git a/mods/torches/textures/torches_fire1.png b/mods/torches/textures/torches_fire1.png deleted file mode 100644 index 5faa24fc404689deab8bf68d039327f713649a8c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 408 zcmV;J0cZY+P)3{AfWK@h~rhHQw! zlEMsXec?5nvw7~_=5=?VLkv$j=X}q3&v!mZ!XOM({4e-B0-O~>5RglBzk?wZOh7LE z3s#^IQ!$B#P*8x{%tK6Di6vf8h1!fl90@1tPcQ><8e$e=E{R|j;Z5xhK9H8lHB{S}7`UZ>)Rb zTS+YM_H1I5?t&D$ zP@-WFxP!FiiSHL-8jGf=MLs3B=Ic@JM#nGww%`Mk8Aa~)LD9AV00000v@7=@1tejslA0qV*Nc2V*x+!l9Ti65INErQsFAX;dPi=Yt^x-yGW#0EjIsEY{F zHcGn?tM-D_tlL_sU+V+M#htmCiIX(BRMf?@xViH_nK|#gAt;n5Vc}gUWdL&DwZnU0 z45i%vF9lin2L#MR%y)O*KYs*XhlnP<3+6f(GY@glf9Ef#LCiti-+d;&pq>QU`YoNi z;NCtf=%Fj%VnA@F7eN8yJwwR|x*X*+1G{Y&A%287n=!;f*-T{32v3`~o@y@)3*JDS z$~ew$SN^Ubdx%pIA7&7Iy>Lk1FCIwJAMa7HarQ`hg?Sm`#2zu;C&qh|JXSljF)g$g zDTdhS7k}2pFO$i0btl0Uh*y)XdxEW!`01$lrnGxINvZaW46M0ph50NSS;xxodRuCGdx)E5a&JmU&-f)i) z60AaeWQy-VeC`OwS~Ca=5EFT-ti8kr!QB00000NkvXXu0mjfNbUU( diff --git a/mods/torches/textures/torches_side.png b/mods/torches/textures/torches_side.png deleted file mode 100644 index d8d6505042add49ad5b5e3468e021df22ed811a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 195 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbL!S%6Q7>xWbM|Ns9t*AlnZleW>9 zu{Dr&FjjCfRdO{~Ob;@gTIx2v++#+C=luGBjf;B!_cQ#z!SMh8bO*EWa-a!JB|&~b zlgcKawE*(0JY5_^B*K#uT$p*bhzLALZ(v%{pdin_ih-F~+e@hp g-x$OaPMprfuvMHfYLe|uIiM*Fp00i_>zopr0Fj_HNdN!< diff --git a/mods/torches/textures/torches_torch.png b/mods/torches/textures/torches_torch.png deleted file mode 100644 index 59e79a8fd6a24947d1984d38678a426a2221eb68..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 227 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dymH|E?uK)l4x73rhHB_)OQnWW# zaxznOHdpht*GdaAsZMg3SmZjn#C>X+=d^OKxpe{mdl~*;WBC7X>i>WLSvORj0UE+s z666=m;PC858jus=>Eak-ar*6fL!kx*0q4LJ(alYdivAzI6|KVB+q&|8%CqHP-Y@Qc zF}FFoQQ}o157(V?VFno)1HM&NEAm>KnfUbX=kS??UR2O}5b^u~=V_)Cz6T8qr@3t$ X&6qAH7pMmS?O^b9^>bP0l+XkKQWsIS