From 23ca5fd22e16a93277ff30a23727ac6ae5738aeb Mon Sep 17 00:00:00 2001 From: garywhite207 Date: Mon, 16 Apr 2018 12:01:21 -0700 Subject: [PATCH] Updated mods --- mods/beds/README.txt | 44 +- mods/beds/api.lua | 32 +- mods/beds/beds.lua | 16 +- mods/beds/functions.lua | 41 +- mods/beds/license.txt | 60 +++ mods/beds/spawns.lua | 4 +- mods/boats/README.txt | 23 +- mods/boats/init.lua | 54 +- mods/boats/license.txt | 63 +++ mods/bones/README.txt | 21 +- mods/bones/init.lua | 153 +++--- mods/bones/license.txt | 58 +++ mods/bones/textures/bones_bottom.png | Bin 181 -> 740 bytes mods/bones/textures/bones_front.png | Bin 183 -> 656 bytes mods/bones/textures/bones_rear.png | Bin 187 -> 637 bytes mods/bones/textures/bones_side.png | Bin 188 -> 700 bytes mods/bones/textures/bones_top.png | Bin 182 -> 662 bytes mods/bucket/README.txt | 31 +- mods/bucket/init.lua | 83 +-- mods/bucket/license.txt | 51 ++ mods/carts/README.txt | 22 + mods/carts/cart_entity.lua | 403 +++++++++++++++ mods/carts/depends.txt | 1 + mods/carts/functions.lua | 221 ++++++++ mods/carts/init.lua | 20 + mods/carts/license.txt | 54 ++ mods/carts/models/carts_cart.b3d | Bin 0 -> 3008 bytes mods/carts/models/carts_cart.blend | Bin 0 -> 544408 bytes mods/carts/rails.lua | 59 +++ mods/carts/sounds/carts_cart_moving.1.ogg | Bin 0 -> 14761 bytes mods/carts/sounds/carts_cart_moving.2.ogg | Bin 0 -> 14749 bytes mods/carts/sounds/carts_cart_moving.3.ogg | Bin 0 -> 14989 bytes mods/carts/textures/carts_cart.png | Bin 0 -> 1103 bytes mods/carts/textures/carts_cart_front.png | Bin 0 -> 459 bytes mods/carts/textures/carts_cart_side.png | Bin 0 -> 486 bytes mods/carts/textures/carts_cart_top.png | Bin 0 -> 522 bytes mods/carts/textures/carts_rail_crossing.png | Bin 0 -> 612 bytes .../textures/carts_rail_crossing_brk.png | Bin 0 -> 684 bytes .../textures/carts_rail_crossing_pwr.png | Bin 0 -> 676 bytes mods/carts/textures/carts_rail_curved.png | Bin 0 -> 580 bytes mods/carts/textures/carts_rail_curved_brk.png | Bin 0 -> 618 bytes mods/carts/textures/carts_rail_curved_pwr.png | Bin 0 -> 614 bytes mods/carts/textures/carts_rail_straight.png | Bin 0 -> 602 bytes .../textures/carts_rail_straight_brk.png | Bin 0 -> 660 bytes .../textures/carts_rail_straight_pwr.png | Bin 0 -> 661 bytes mods/carts/textures/carts_rail_t_junction.png | Bin 0 -> 707 bytes .../textures/carts_rail_t_junction_brk.png | Bin 0 -> 698 bytes .../textures/carts_rail_t_junction_pwr.png | Bin 0 -> 697 bytes mods/creative/README.txt | 27 +- mods/creative/depends.txt | 1 + mods/creative/init.lua | 262 ++-------- mods/creative/inventory.lua | 177 +++++++ mods/creative/license.txt | 60 +++ mods/doors/README.txt | 69 +-- mods/doors/init.lua | 477 ++++++++++-------- mods/doors/license.txt | 164 ++++++ mods/doors/sounds/doors_glass_door_close.ogg | Bin 0 -> 7289 bytes mods/doors/sounds/doors_glass_door_open.ogg | Bin 0 -> 7288 bytes mods/doors/textures/doors_door_glass.png | Bin 3064 -> 491 bytes .../textures/doors_door_obsidian_glass.png | Bin 2988 -> 420 bytes 60 files changed, 2037 insertions(+), 714 deletions(-) create mode 100644 mods/beds/license.txt create mode 100644 mods/boats/license.txt create mode 100644 mods/bones/license.txt create mode 100644 mods/bucket/license.txt create mode 100644 mods/carts/README.txt create mode 100644 mods/carts/cart_entity.lua create mode 100644 mods/carts/depends.txt create mode 100644 mods/carts/functions.lua create mode 100644 mods/carts/init.lua create mode 100644 mods/carts/license.txt create mode 100644 mods/carts/models/carts_cart.b3d create mode 100644 mods/carts/models/carts_cart.blend create mode 100644 mods/carts/rails.lua create mode 100644 mods/carts/sounds/carts_cart_moving.1.ogg create mode 100644 mods/carts/sounds/carts_cart_moving.2.ogg create mode 100644 mods/carts/sounds/carts_cart_moving.3.ogg create mode 100644 mods/carts/textures/carts_cart.png create mode 100644 mods/carts/textures/carts_cart_front.png create mode 100644 mods/carts/textures/carts_cart_side.png create mode 100644 mods/carts/textures/carts_cart_top.png create mode 100644 mods/carts/textures/carts_rail_crossing.png create mode 100644 mods/carts/textures/carts_rail_crossing_brk.png create mode 100644 mods/carts/textures/carts_rail_crossing_pwr.png create mode 100644 mods/carts/textures/carts_rail_curved.png create mode 100644 mods/carts/textures/carts_rail_curved_brk.png create mode 100644 mods/carts/textures/carts_rail_curved_pwr.png create mode 100644 mods/carts/textures/carts_rail_straight.png create mode 100644 mods/carts/textures/carts_rail_straight_brk.png create mode 100644 mods/carts/textures/carts_rail_straight_pwr.png create mode 100644 mods/carts/textures/carts_rail_t_junction.png create mode 100644 mods/carts/textures/carts_rail_t_junction_brk.png create mode 100644 mods/carts/textures/carts_rail_t_junction_pwr.png create mode 100644 mods/creative/inventory.lua create mode 100644 mods/creative/license.txt create mode 100644 mods/doors/license.txt create mode 100644 mods/doors/sounds/doors_glass_door_close.ogg create mode 100644 mods/doors/sounds/doors_glass_door_open.ogg diff --git a/mods/beds/README.txt b/mods/beds/README.txt index 9710c45..cda6ebd 100644 --- a/mods/beds/README.txt +++ b/mods/beds/README.txt @@ -1,30 +1,26 @@ Minetest Game mod: beds ======================= -by BlockMen (c) 2014-2015 +See license.txt for license information. -Version: 1.1.1 +Authors of source code +---------------------- +Originally by BlockMen (MIT) +Various Minetest developers and contributors (MIT) -About -~~~~~ -This mod adds a bed to Minetest which allows to skip the night. To sleep rightclick the bed, if playing -in singleplayer mode the night gets skipped imideatly. If playing on server you get shown how many other -players are in bed too. If all players are sleeping the night gets skipped aswell. Also the night skip can be forced -if more than 50% of the players are lying in bed and use this option. +Authors of media (textures) +--------------------------- +BlockMen (CC BY-SA 3.0) -Another feature is a controled respawning. If you have slept in bed (not just lying in it) your respawn point -is set to the beds location and you will respawn there after death. -You can disable the respawn at beds by setting "enable_bed_respawn = false" in minetest.conf -You can also disable the night skip feature by setting "enable_bed_night_skip = false" in minetest.conf or by using -the /set command ingame. +This mod adds a bed to Minetest which allows to skip the night. +To sleep, rightclick the bed. If playing in singleplayer mode the night gets skipped +immediately. If playing multiplayer you get shown how many other players are in bed too, +if all players are sleeping the night gets skipped. The night skip can be forced if more +than 50% of the players are lying in bed and use this option. - -License of source code, textures: WTFPL ---------------------------------------- -(c) Copyright BlockMen (2014-2015) - - -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. +Another feature is a controlled respawning. If you have slept in bed (not just lying in +it) your respawn point is set to the beds location and you will respawn there after +death. +You can disable the respawn at beds by setting "enable_bed_respawn = false" in +minetest.conf. +You can disable the night skip feature by setting "enable_bed_night_skip = false" in +minetest.conf or by using the /set command in-game. diff --git a/mods/beds/api.lua b/mods/beds/api.lua index 53d4e48..97dde43 100644 --- a/mods/beds/api.lua +++ b/mods/beds/api.lua @@ -16,7 +16,7 @@ local function destruct_bed(pos, n) if reverse then reverse = not reverse minetest.remove_node(other) - nodeupdate(other) + minetest.check_for_falling(other) else reverse = not reverse end @@ -33,8 +33,8 @@ function beds.register_bed(name, def) paramtype2 = "facedir", is_ground_content = false, stack_max = 1, - groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, - sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 1}, + sounds = def.sounds or default.node_sound_wood_defaults(), node_box = { type = "fixed", fixed = def.nodebox.bottom, @@ -46,6 +46,14 @@ function beds.register_bed(name, def) on_place = function(itemstack, placer, pointed_thing) local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + local pos if minetest.registered_items[minetest.get_node(under).name].buildable_to then pos = under @@ -59,8 +67,8 @@ function beds.register_bed(name, def) return itemstack end - local def = minetest.registered_nodes[minetest.get_node(pos).name] - if not def or not def.buildable_to then + local node_def = minetest.registered_nodes[minetest.get_node(pos).name] + if not node_def or not node_def.buildable_to then return itemstack end @@ -81,7 +89,8 @@ function beds.register_bed(name, def) minetest.set_node(pos, {name = name .. "_bottom", param2 = dir}) minetest.set_node(botpos, {name = name .. "_top", param2 = dir}) - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then itemstack:take_item() end return itemstack @@ -91,8 +100,9 @@ function beds.register_bed(name, def) destruct_bed(pos, 1) end, - on_rightclick = function(pos, node, clicker) + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) beds.on_rightclick(pos, clicker) + return itemstack end, on_rotate = function(pos, node, user, mode, new_param2) @@ -112,8 +122,8 @@ function beds.register_bed(name, def) end local newp = vector.add(pos, minetest.facedir_to_dir(new_param2)) local node3 = minetest.get_node_or_nil(newp) - local def = node3 and minetest.registered_nodes[node3.name] - if not def or not def.buildable_to then + local node_def = node3 and minetest.registered_nodes[node3.name] + if not node_def or not node_def.buildable_to then return false end if minetest.is_protected(newp, user:get_player_name()) then @@ -136,8 +146,8 @@ function beds.register_bed(name, def) paramtype2 = "facedir", is_ground_content = false, pointable = false, - groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, - sounds = default.node_sound_wood_defaults(), + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, + sounds = def.sounds or default.node_sound_wood_defaults(), drop = name .. "_bottom", node_box = { type = "fixed", diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua index 5f31f13..bb2fd5d 100644 --- a/mods/beds/beds.lua +++ b/mods/beds/beds.lua @@ -66,7 +66,7 @@ beds.register_bed("beds:bed", { }, top = { "beds_bed_top_top.png^[transformR90", - "default_wood.png", + "default_wood.png", "beds_bed_side_top_r.png", "beds_bed_side_top_r.png^[transformfx", "beds_bed_side_top.png", @@ -88,3 +88,17 @@ beds.register_bed("beds:bed", { minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") minetest.register_alias("beds:bed_top_red", "beds:bed_top") + +-- Fuel + +minetest.register_craft({ + type = "fuel", + recipe = "beds:fancy_bed_bottom", + burntime = 13, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "beds:bed_bottom", + burntime = 12, +}) diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua index afc8e15..78df9a1 100644 --- a/mods/beds/functions.lua +++ b/mods/beds/functions.lua @@ -1,7 +1,7 @@ local pi = math.pi local player_in_bed = 0 local is_sp = minetest.is_singleplayer() -local enable_respawn = minetest.setting_getbool("enable_bed_respawn") +local enable_respawn = minetest.settings:get_bool("enable_bed_respawn") if enable_respawn == nil then enable_respawn = true end @@ -22,7 +22,7 @@ local function get_look_yaw(pos) end local function is_night_skip_enabled() - local enable_night_skip = minetest.setting_getbool("enable_bed_night_skip") + local enable_night_skip = minetest.settings:get_bool("enable_bed_night_skip") if enable_night_skip == nil then enable_night_skip = true end @@ -70,7 +70,7 @@ local function lay_down(player, pos, bed_pos, state, skip) -- physics, eye_offset, etc player:set_eye_offset({x = 0, y = 0, z = 0}, {x = 0, y = 0, z = 0}) - player:set_look_yaw(math.random(1, 180) / 100) + player:set_look_horizontal(math.random(1, 180) / 100) default.player_attached[name] = false player:set_physics_override(1, 1, 1) hud_flags.wielditem = true @@ -85,7 +85,7 @@ local function lay_down(player, pos, bed_pos, state, skip) -- physics, eye_offset, etc player:set_eye_offset({x = 0, y = -13, z = 0}, {x = 0, y = 0, z = 0}) local yaw, param2 = get_look_yaw(bed_pos) - player:set_look_yaw(yaw) + player:set_look_horizontal(yaw) local dir = minetest.facedir_to_dir(param2) local p = {x = bed_pos.x + dir.x / 2, y = bed_pos.y, z = bed_pos.z + dir.z / 2} player:set_physics_override(0, 0, 0) @@ -100,7 +100,7 @@ end local function update_formspecs(finished) local ges = #minetest.get_connected_players() - local form_n = "" + local form_n local is_majority = (ges / 2) < player_in_bed if finished then @@ -130,7 +130,6 @@ end function beds.skip_night() minetest.set_timeofday(0.23) - beds.set_spawns() end function beds.on_rightclick(pos, player) @@ -149,6 +148,7 @@ function beds.on_rightclick(pos, player) -- move to bed if not beds.player[name] then lay_down(player, ppos, pos) + beds.set_spawns() -- save respawn positions when entering bed else lay_down(player, nil, nil, false) end @@ -173,23 +173,18 @@ end -- Callbacks - -minetest.register_on_joinplayer(function(player) - beds.read_spawns() -end) - --- respawn player at bed if enabled and valid position is found -minetest.register_on_respawnplayer(function(player) - if not enable_respawn then - return false - end - local name = player:get_player_name() - local pos = beds.spawn[name] or nil - if pos then - player:setpos(pos) - return true - end -end) +-- Only register respawn callback if respawn enabled +if enable_respawn then + -- respawn player at bed if enabled and valid position is found + minetest.register_on_respawnplayer(function(player) + local name = player:get_player_name() + local pos = beds.spawn[name] + if pos then + player:setpos(pos) + return true + end + end) +end minetest.register_on_leaveplayer(function(player) local name = player:get_player_name() diff --git a/mods/beds/license.txt b/mods/beds/license.txt new file mode 100644 index 0000000..0494b36 --- /dev/null +++ b/mods/beds/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2014-2016 Various Minetest developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2014-2016 BlockMen + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua index 48b8a66..6b1f404 100644 --- a/mods/beds/spawns.lua +++ b/mods/beds/spawns.lua @@ -32,11 +32,11 @@ function beds.read_spawns() beds.save_spawns() os.rename(file, file .. ".backup") file = org_file - else - spawns = {} end end +beds.read_spawns() + function beds.save_spawns() if not beds.spawn then return diff --git a/mods/boats/README.txt b/mods/boats/README.txt index 1de7167..59631d9 100644 --- a/mods/boats/README.txt +++ b/mods/boats/README.txt @@ -1,16 +1,15 @@ Minetest Game mod: boats ======================== -by PilzAdam +See license.txt for license information. -License of source code: ------------------------ -WTFPL +Authors of source code +---------------------- +Originally by PilzAdam (MIT) +Various Minetest developers and contributors (MIT) -License of media (textures and sounds): ---------------------------------------- -WTFPL - -Authors of media files: ------------------------ -textures: Zeg9 -model: thetoon and Zeg9, modified by PavelS(SokolovPavel) +Authors of media (textures and model) +------------------------------------- +Textures: Zeg9 (CC BY-SA 3.0) +Model: thetoon and Zeg9 (CC BY-SA 3.0), + modified by PavelS(SokolovPavel) (CC BY-SA 3.0), + modified by sofar (CC BY-SA 3.0) diff --git a/mods/boats/init.lua b/mods/boats/init.lua index f8d0ccb..4d8f467 100644 --- a/mods/boats/init.lua +++ b/mods/boats/init.lua @@ -34,6 +34,8 @@ end local boat = { physical = true, + -- Warning: Do not change the position of the collisionbox top surface, + -- lowering it causes the boat to fall through the world if underwater collisionbox = {-0.5, -0.35, -0.5, 0.5, 0.3, 0.5}, visual = "mesh", mesh = "boats_boat.obj", @@ -77,7 +79,7 @@ function boat.on_rightclick(self, clicker) minetest.after(0.2, function() default.player_set_animation(clicker, "sit" , 30) end) - self.object:setyaw(clicker:get_look_yaw() - math.pi / 2) + clicker:set_look_horizontal(self.object:getyaw()) end end @@ -107,18 +109,20 @@ function boat.on_punch(self, puncher) end if not self.driver then self.removed = true + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "boats:boat") then + local leftover = inv:add_item("main", "boats:boat") + -- if no room in inventory add a replacement boat to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end -- delay remove to ensure player is detached minetest.after(0.1, function() self.object:remove() end) - if not minetest.setting_getbool("creative_mode") then - local inv = puncher:get_inventory() - if inv:room_for_item("main", "boats:boat") then - inv:add_item("main", "boats:boat") - else - minetest.add_item(self.object:getpos(), "boats:boat") - end - end end end @@ -165,7 +169,7 @@ function boat.on_step(self, dtime) local p = self.object:getpos() p.y = p.y - 0.5 - local new_velo = {x = 0, y = 0, z = 0} + local new_velo local new_acce = {x = 0, y = 0, z = 0} if not is_water(p) then local nodedef = minetest.registered_nodes[minetest.get_node(p).name] @@ -219,18 +223,32 @@ minetest.register_craftitem("boats:boat", { wield_image = "boats_wield.png", wield_scale = {x = 2, y = 2, z = 1}, liquids_pointable = true, + groups = {flammable = 2}, on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + if pointed_thing.type ~= "node" then - return + return itemstack end if not is_water(pointed_thing.under) then - return + return itemstack end pointed_thing.under.y = pointed_thing.under.y + 0.5 - minetest.add_entity(pointed_thing.under, "boats:boat") - if not minetest.setting_getbool("creative_mode") then - itemstack:take_item() + boat = minetest.add_entity(pointed_thing.under, "boats:boat") + if boat then + boat:setyaw(placer:get_look_horizontal()) + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end end return itemstack end, @@ -245,3 +263,9 @@ minetest.register_craft({ {"group:wood", "group:wood", "group:wood"}, }, }) + +minetest.register_craft({ + type = "fuel", + recipe = "boats:boat", + burntime = 20, +}) diff --git a/mods/boats/license.txt b/mods/boats/license.txt new file mode 100644 index 0000000..d4afe75 --- /dev/null +++ b/mods/boats/license.txt @@ -0,0 +1,63 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures and model) +-------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2012-2016 Zeg9 +Copyright (C) 2012-2016 thetoon +Copyright (C) 2012-2016 PavelS(SokolovPavel) +Copyright (C) 2016 sofar (sofar@foo-projects.org) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/bones/README.txt b/mods/bones/README.txt index b40a384..91bcd10 100644 --- a/mods/bones/README.txt +++ b/mods/bones/README.txt @@ -1,17 +1,12 @@ Minetest Game mod: bones ======================== +See license.txt for license information. -License of source code: ------------------------ -Copyright (C) 2012 PilzAdam - -WTFPL - -License of media (textures and sounds) --------------------------------------- -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -http://creativecommons.org/licenses/by-sa/3.0/ - -Authors of media files +Authors of source code ---------------------- -Bad_Command_ +Originally by PilzAdam (MIT) +Various Minetest developers and contributors (MIT) + +Authors of media (textures) +--------------------------- +All textures: paramat (CC BY-SA 3.0) diff --git a/mods/bones/init.lua b/mods/bones/init.lua index 661bbab..9583bc2 100644 --- a/mods/bones/init.lua +++ b/mods/bones/init.lua @@ -1,7 +1,5 @@ -- Minetest 0.4 mod: bones --- See README.txt for licensing and other information. - -bones = {} +-- See README.txt for licensing and other information. local function is_owner(pos, name) local owner = minetest.get_meta(pos):get_string("owner") @@ -11,7 +9,7 @@ local function is_owner(pos, name) return false end -bones.bones_formspec = +local bones_formspec = "size[8,9]" .. default.gui_bg .. default.gui_bg_img .. @@ -23,13 +21,13 @@ bones.bones_formspec = "listring[current_player;main]" .. default.get_hotbar_bg(0,4.85) -local share_bones_time = tonumber(minetest.setting_get("share_bones_time")) or 1200 -local share_bones_time_early = tonumber(minetest.setting_get("share_bones_time_early")) or share_bones_time / 4 +local share_bones_time = tonumber(minetest.settings:get("share_bones_time")) or 1200 +local share_bones_time_early = tonumber(minetest.settings:get("share_bones_time_early")) or share_bones_time / 4 minetest.register_node("bones:bones", { description = "Bones", tiles = { - "bones_top.png", + "bones_top.png^[transform2", "bones_bottom.png", "bones_side.png", "bones_side.png", @@ -37,12 +35,9 @@ minetest.register_node("bones:bones", { "bones_front.png" }, paramtype2 = "facedir", - groups = {dig_immediate=2}, - sounds = default.node_sound_dirt_defaults({ - footstep = {name="default_gravel_footstep", gain=0.5}, - dug = {name="default_gravel_footstep", gain=1.0}, - }), - + groups = {dig_immediate = 2}, + sounds = default.node_sound_gravel_defaults(), + can_dig = function(pos, player) local inv = minetest.get_meta(pos):get_inventory() local name = "" @@ -51,46 +46,46 @@ minetest.register_node("bones:bones", { end return is_owner(pos, name) and inv:is_empty("main") end, - + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) if is_owner(pos, player:get_player_name()) then return count end return 0 end, - + allow_metadata_inventory_put = function(pos, listname, index, stack, player) return 0 end, - + allow_metadata_inventory_take = function(pos, listname, index, stack, player) if is_owner(pos, player:get_player_name()) then return stack:get_count() end return 0 end, - + on_metadata_inventory_take = function(pos, listname, index, stack, player) local meta = minetest.get_meta(pos) if meta:get_inventory():is_empty("main") then minetest.remove_node(pos) end end, - + on_punch = function(pos, node, player) - if(not is_owner(pos, player:get_player_name())) then + if not is_owner(pos, player:get_player_name()) then return end - - if(minetest.get_meta(pos):get_string("infotext") == "") then + + if minetest.get_meta(pos):get_string("infotext") == "" then return end - + local inv = minetest.get_meta(pos):get_inventory() local player_inv = player:get_inventory() local has_space = true - - for i=1,inv:get_size("main") do + + for i = 1, inv:get_size("main") do local stk = inv:get_stack("main", i) if player_inv:room_for_item("main", stk) then inv:set_stack("main", i, nil) @@ -100,7 +95,7 @@ minetest.register_node("bones:bones", { break end end - + -- remove bones if player emptied them if has_space then if player_inv:room_for_item("main", {name = "bones:bones"}) then @@ -111,12 +106,12 @@ minetest.register_node("bones:bones", { minetest.remove_node(pos) end end, - + on_timer = function(pos, elapsed) local meta = minetest.get_meta(pos) local time = meta:get_int("time") + elapsed if time >= share_bones_time then - meta:set_string("infotext", meta:get_string("owner").."'s old bones") + meta:set_string("infotext", meta:get_string("owner") .. "'s old bones") meta:set_string("owner", "") else meta:set_int("time", time) @@ -131,13 +126,9 @@ local function may_replace(pos, player) local node_name = minetest.get_node(pos).name local node_definition = minetest.registered_nodes[node_name] - -- if the node is unknown, we let the protection mod decide - -- this is consistent with when a player could dig or not dig it - -- unknown decoration would often be removed - -- while unknown building materials in use would usually be left + -- if the node is unknown, we return false if not node_definition then - -- only replace nodes that are not protected - return not minetest.is_protected(pos, player:get_player_name()) + return false end -- allow replacing air and liquids @@ -157,71 +148,93 @@ local function may_replace(pos, player) return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) end +local drop = function(pos, itemstack) + local obj = minetest.add_item(pos, itemstack:take_item(itemstack:get_count())) + if obj then + obj:setvelocity({ + x = math.random(-10, 10) / 9, + y = 5, + z = math.random(-10, 10) / 9, + }) + end +end + minetest.register_on_dieplayer(function(player) - if minetest.setting_getbool("creative_mode") then + + local bones_mode = minetest.settings:get("bones_mode") or "bones" + if bones_mode ~= "bones" and bones_mode ~= "drop" and bones_mode ~= "keep" then + bones_mode = "bones" + end + + -- return if keep inventory set or in creative mode + if bones_mode == "keep" or (creative and creative.is_enabled_for + and creative.is_enabled_for(player:get_player_name())) then return end - + local player_inv = player:get_inventory() if player_inv:is_empty("main") and player_inv:is_empty("craft") then return end - local pos = player:getpos() - pos.x = math.floor(pos.x+0.5) - pos.y = math.floor(pos.y+0.5) - pos.z = math.floor(pos.z+0.5) - local param2 = minetest.dir_to_facedir(player:get_look_dir()) + local pos = vector.round(player:getpos()) local player_name = player:get_player_name() - local player_inv = player:get_inventory() - if (not may_replace(pos, player)) then - if (may_replace({x=pos.x, y=pos.y+1, z=pos.z}, player)) then - -- drop one node above if there's space - -- this should solve most cases of protection related deaths in which players dig straight down - -- yet keeps the bones reachable - pos.y = pos.y+1 + -- check if it's possible to place bones, if not find space near player + if bones_mode == "bones" and not may_replace(pos, player) then + local air = minetest.find_node_near(pos, 1, {"air"}) + if air and not minetest.is_protected(air, player_name) then + pos = air else - -- drop items instead of delete - for i=1,player_inv:get_size("main") do - minetest.add_item(pos, player_inv:get_stack("main", i)) - end - for i=1,player_inv:get_size("craft") do - minetest.add_item(pos, player_inv:get_stack("craft", i)) - end - -- empty lists main and craft - player_inv:set_list("main", {}) - player_inv:set_list("craft", {}) - return + bones_mode = "drop" end end - - minetest.set_node(pos, {name="bones:bones", param2=param2}) - + + if bones_mode == "drop" then + + -- drop inventory items + for i = 1, player_inv:get_size("main") do + drop(pos, player_inv:get_stack("main", i)) + end + player_inv:set_list("main", {}) + + -- drop crafting grid items + for i = 1, player_inv:get_size("craft") do + drop(pos, player_inv:get_stack("craft", i)) + end + player_inv:set_list("craft", {}) + + drop(pos, ItemStack("bones:bones")) + return + end + + local param2 = minetest.dir_to_facedir(player:get_look_dir()) + minetest.set_node(pos, {name = "bones:bones", param2 = param2}) + local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - inv:set_size("main", 8*4) + inv:set_size("main", 8 * 4) inv:set_list("main", player_inv:get_list("main")) - - for i=1,player_inv:get_size("craft") do + + for i = 1, player_inv:get_size("craft") do local stack = player_inv:get_stack("craft", i) if inv:room_for_item("main", stack) then inv:add_item("main", stack) else --drop if no space left - minetest.add_item(pos, stack) + drop(pos, stack) end end - + player_inv:set_list("main", {}) player_inv:set_list("craft", {}) - - meta:set_string("formspec", bones.bones_formspec) + + meta:set_string("formspec", bones_formspec) meta:set_string("owner", player_name) - + if share_bones_time ~= 0 then - meta:set_string("infotext", player_name.."'s fresh bones") + meta:set_string("infotext", player_name .. "'s fresh bones") if share_bones_time_early == 0 or not minetest.is_protected(pos, player_name) then meta:set_int("time", 0) diff --git a/mods/bones/license.txt b/mods/bones/license.txt new file mode 100644 index 0000000..fe52584 --- /dev/null +++ b/mods/bones/license.txt @@ -0,0 +1,58 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + diff --git a/mods/bones/textures/bones_bottom.png b/mods/bones/textures/bones_bottom.png index ada72ceaee53f83beb0963a5e5788ed423c7155b..859c6bbe243f4f1f7397a95007df53e52432a00b 100644 GIT binary patch delta 727 zcmV;|0x12p0ptac8Gix*005AYXf^-<010qNS#tmY3ljhU3ljkVnw%H_000McNliru z;0Fm32Or2&&XfQE0)t6JK~yNuC6P@}t56t(-*Vu1THs27B9us)YD^OwLl=!Jw_W+0 zUAS{q<40@^nnJ3E2rYzfdceErdS;$XW;(aGw{aYMp2u~k#yQP#~U0sD?cra8|rK;*?vq8OH zk6{=^QL3tPT{j4VG);@5I6FHtP4oHrxoMj3@9(y4i=rrsqGK2a03=DGC`w(|JkJwC z%CaPc^!xp~u74jM9t1%EfHX}30O`8E-EMVV*EDUlS`CN8lamvcW%v7i6h(i3f5YJr zV=M^5(a{kAAW;;1z20~{K0iMP0L!xSJa3w2v)M?Jlq3nqagC+k z?{+(k@!Q)QrL-)|BuQ-Bj-n`vq9jS;I7SE!1_O@cP=B}EbzRrC?bT{kRh1wJFE1~h zPN!*_10DeKJkPSM+wHb(izbsv+qMkDNRosQ;(2~Hn`K${`}>PAPSf;|q?EEOD~ci$ zhM{FyudlDi$H%_!13*y}gb>3pT-OBvK@g_XDF9?y1^^w~ws*T-zu$j+e4I|FEXz_# zlOz#E5q|&FEgoCX>klF9?F7 zD1?yFXyp68VHkIJcMQ+->-C!F`8bYE)11%e08rpK&h_>6<>jU4d50M+%c|=d0MKHw zsOwsiB$j2rzP{ey-zlZ4s&X9Xd0r3%nx+*+;W!SZ^xwaK{{aJoU*GftL`MJs002ov JPDHLkV1lspOD6yT delta 164 zcmV;V09*g$1+@W?8Gi!+001a04^sdD01r@1R7C&)03972Jv}|Ar>ET9+)_}sWB>pF zVM#nfl=5YcA+76Bs&EMswF={|-Ps+$ zR&HNZ19lIFC32^cp!ZNH*zRKFw|g|ur2n4*-4BSN4bXpPZcZ`+di848y3`>z?ODQDmBCHk;jw<9ITeluD&+HoIQ0UteE8KR=htrBbTh zZZ8&#R1n8;u~>Y6f8W~K+0itOa~{XB>$>y#JPboAWvx~#m&?!3&tG3(2%6Dw{6?^eJu!r z!C+un*2~MwUkgepA;f00S*=#OVHf~rvss${=H>>#?SJj<|2&GKG;}_n*A|OKwOSnv z277yZ00<$3ko52mZ?#%!XaJc`r?XnE3WdVsvlI-vA>$?8&@i80@l~ToGkr3i}-h4hUl}b`d$8nTW cySuyp07^y~%YEn0RR91007*qoM6N<$f>h=)KmY&$ delta 166 zcmV;X09pT#1-Ai^8Gi!+001a04^sdD01r@1R7C&)03972Jv}|Ar>ET9+)_}sWB>pF zV@X6oRCob3ivg;|01U#C`0jt^zp_8ENW>y68>>k~o&`oBEefSBm;Cm7)G7=f*fj&# z>MLr%^5A3)yMosV+P=jR6udn0uBkAb4K%-x3`jlpNDTj%E+5Al?y^xaWagBlKM>CW U_tR6pjsO4v07*qoM6N<$f>-cCPXGV_ diff --git a/mods/bones/textures/bones_rear.png b/mods/bones/textures/bones_rear.png index 8e1ac10b4f0ee0956c6e19a6ca4d75c2d8f2c783..4cfe236d5d6017af2f7879cbc0ba8b1d8434b6e4 100644 GIT binary patch delta 623 zcmV-#0+9W?0sRD!8Gix*005AYXf^-<010qNS#tmY3ljhU3ljkVnw%H_000McNliru z;0Fm303nW}Z(-)WIoocxN`I*=%WT_ze0&73+wJb} z?{~Xhk|aWio12>~%lf`|UHAO_{45B9!{Ok09)OpZ7XZ)C&y2Bg9DU#a{QP8$<#`Su zilU+@tYH`kAr}`H<2V8UP?lw$=bUrSxl*cWnyRX_)=82mrHB#5aXg#N%zLp|^nEX- z9ERcj{T;yF-G3c`q9_0m$8pNC6hcfNIOlEKc3o!_0E7?#x~|h&Tc^`$Hk$=Ouv{(; z9)NYmFv0&Z-2Mj>+9=j0RVm9_kG{CEdZ;o zYv1?dIKH~NGWd8rQc7Ld{rdVcoz-e(mIh!k#)nF;58OG=U_`c5=BZL4T zZQI(mJ)h5~;0PhMZR5ZC`S}q-P)gV9wPh@;s)}=NaND+&QYqzrzn_*4g21FnjM-h+ z)ph;w@Myp}kD}=N`x^jbY|1`OQ`dFh-rg+7andw(97ieTdER=x29PAlX0y4yy`60E zecuF1mdoYu?=NG_^SnII&Dn)vcsw4`9LJf@=YQRUCKpFI_qPB5002ov JPDHLkV1jt?Er|dC delta 170 zcmV;b09F6}1iJx{8Gi!+001a04^sdD01r@1R7C&)03972Jv}|Ar>ET9+)_}sWB>pF zXGugsRCoau%K-`iF%ZJQB=-MrzFTZr84zLFSWUWkPhb?%;)>MWCCAh{2-Y_10c_=# z@ZQ@=&MrSNED_Zo1Z}*c$K#}Kj4|?lJ772)Xb0EHfS#8ykRvNLP?uxf_->p&QVU-K~z%|zNHjY)%{L=i!exG1g!LFmfg z?804FEm}|{N*byXNScJncPHwiKj7YHdkzl=&ffj~eU@cG5PyiGcyn_D0Q33$>gsAf zpL?EX7{=-8X%GZ;U7Mzf5aOGr`TqXabsZs86vg}dds&v7&4w{{d3hPf@vhJ`jizbq z^_uVXdK|~8s@gQoYPE`@D9`h%s*aD3Ez5d-e(t*N>+9?1=clTws;c%((*yuYsj8}N z+e(szF|O+xV}Cpt4BEDx&1QrU0Lb$k0C>YNHk*xM7`m>%zP^q|qr<~PK@hgvZJMUP zzrUl=2q8oW+27v>0A7~mUa#jk&dJFM0NA!&mSxv<>-D;eSvRMS)W4`~G6FfPZm!cb6oI zU>FAcA9Z$y0^Etv)RmX970GKh5)c!E>%?}gvheITrM%j0I=t}ZjvN} z!C+AFL^B@QS zpsFg{w%fJ^0Dd~1wr$(*_XR=t{QP`-dt;1gnkXiUVh{vT6zRHNRh8#?jIo1*gFg_# VJXL%dq$B_U002ovPDHLkV1g1+N%#N& delta 171 zcmV;c0960H1-t=}8Gi!+001a04^sdD01r@1R7C&)03972Jv}|Ar>ET9+)_}sWB>pF zXh}ptRCoa$ivbEiQ3!+7b^kMe-XB4v4Pn_>O(OD*+>Jt76nDMg61;cs2f@0VHGr+2 z7W&bz%`S{#cZl9af;Lt>fkMHCapcIR!nm{Xw+Z`6a4%-qAtd(D|LJn9#Zihwpsn`#67c?RI;! z*)Ya5O}o3h1Arh1>h*dM1k>r%G|g(Y${5@4_m*Yl^ZC;>O`|9(l}h=1UI_8=@$vin z`}6Z7rM$krPLf0s(lj*;W3gDEEXxo=XJ=u*0mH8>dM(Hk&HP7)Md$`+m;zJYCm?5RT(KK0Y3GxVgEZlxmu0S=I^X zJPbp}ao*qGm8$Eyiq~v5m4lRWwOSnxhxK}mOw$B_IDd{U%K`v3?tDH6fY;Yo)w$pA z0bsk`o}ZtiBuQ-B4uZh<{oC8yN~J;w>G%6;o0L*Qi066Z@mL4}0EiI67;|0s<>kfm zyfjT!0RTMD0|48$0bn+pDG+V9TTRn0E-s{$wrz9HIp_bz<(xCd5JIMDVvHM&MowK( z*L6b3(|^;`(Jgg4opQPS`T1F`RuRTn9VJN;_)j>FGn>sU%X)izL%ObqVR&_QwOXwn z9vX{JiWia&$6soEFy%K%jIM;ky09lp=lap?ECw> jR4VOuJN0>mLg5coB@Z+lWlxy^0000x3{E delta 165 zcmV;W09yZ+1-1c@8Gi!+001a04^sdD01r@1R7C&)03972Jv}|Ar>ET9+)_}sWB>pF zVo5|nRCobR&e4fQQ3%D*B-{RL9u5PKyFk#NAi}b-nnWb&0i%!>-6>VL1n;O-821CP zmD@Y20lN=|CGw(?p!cCr@ES4l&3!b`r2jnw`u-t?w%2nx)*f)XYE%rFIVI^28;=4a T4BWyh00000NkvXXu0mjfmi<9m diff --git a/mods/bucket/README.txt b/mods/bucket/README.txt index a6674b4..45e0ec5 100644 --- a/mods/bucket/README.txt +++ b/mods/bucket/README.txt @@ -1,26 +1,13 @@ Minetest Game mod: bucket ========================= +See license.txt for license information. -License of source code: ------------------------ -Copyright (C) 2011-2012 Kahrl -Copyright (C) 2011-2012 celeron55, Perttu Ahola - -This program 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 of the License, or -(at your option) any later version. - -http://www.gnu.org/licenses/lgpl-2.1.html - -License of media (textures and sounds) --------------------------------------- -Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) -http://creativecommons.org/licenses/by-sa/3.0/ - -Authors of media files ------------------------ -Everything not listed in here: -Copyright (C) 2010-2012 celeron55, Perttu Ahola - +Authors of source code +---------------------- +Kahrl (LGPL 2.1) +celeron55, Perttu Ahola (LGPL 2.1) +Various Minetest developers and contributors (LGPL 2.1) +Authors of media (textures) +--------------------------- +ElementW (CC BY-SA 3.0) diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua index 89730de..5076dec 100644 --- a/mods/bucket/init.lua +++ b/mods/bucket/init.lua @@ -36,12 +36,17 @@ end -- inventory_image = texture of the new bucket item (ignored if itemname == nil) -- name = text description of the bucket item -- groups = (optional) groups of the bucket item, for example {water_bucket = 1} +-- force_renew = (optional) bool. Force the liquid source to renew if it has a +-- source neighbour, even if defined as 'liquid_renewable = false'. +-- Needed to avoid creating holes in sloping rivers. -- This function can be called from any mod (that depends on bucket). -function bucket.register_liquid(source, flowing, itemname, inventory_image, name, groups) +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, + groups, force_renew) bucket.liquids[source] = { source = source, flowing = flowing, itemname = itemname, + force_renew = force_renew, } bucket.liquids[flowing] = bucket.liquids[source] @@ -52,54 +57,53 @@ function bucket.register_liquid(source, flowing, itemname, inventory_image, name stack_max = 1, liquids_pointable = true, groups = groups, + on_place = function(itemstack, user, pointed_thing) -- Must be pointing to node if pointed_thing.type ~= "node" then return end - + local node = minetest.get_node_or_nil(pointed_thing.under) - local ndef - if node then - ndef = minetest.registered_nodes[node.name] - end + local ndef = node and minetest.registered_nodes[node.name] + -- Call on_rightclick if the pointed node defines it if ndef and ndef.on_rightclick and user and not user:get_player_control().sneak then return ndef.on_rightclick( pointed_thing.under, node, user, - itemstack) or itemstack + itemstack) end - local place_liquid = function(pos, node, source, flowing) - if check_protection(pos, - user and user:get_player_name() or "", - "place "..source) then - return - end - minetest.add_node(pos, {name=source}) - end + local lpos -- Check if pointing to a buildable node if ndef and ndef.buildable_to then -- buildable; replace the node - place_liquid(pointed_thing.under, node, - source, flowing) + lpos = pointed_thing.under else -- not buildable to; place the liquid above -- check if the node above can be replaced - local node = minetest.get_node_or_nil(pointed_thing.above) - if node and minetest.registered_nodes[node.name].buildable_to then - place_liquid(pointed_thing.above, - node, source, - flowing) - else + + lpos = pointed_thing.above + node = minetest.get_node_or_nil(lpos) + local above_ndef = node and minetest.registered_nodes[node.name] + + if not above_ndef or not above_ndef.buildable_to then -- do not remove the bucket with the liquid - return + return itemstack end end - return {name="bucket:bucket_empty"} + + if check_protection(lpos, user + and user:get_player_name() + or "", "place "..source) then + return + end + + minetest.set_node(lpos, {name = source}) + return ItemStack("bucket:bucket_empty") end }) end @@ -111,8 +115,11 @@ minetest.register_craftitem("bucket:bucket_empty", { stack_max = 99, liquids_pointable = true, on_use = function(itemstack, user, pointed_thing) - -- Must be pointing to node - if pointed_thing.type ~= "node" then + if pointed_thing.type == "object" then + pointed_thing.ref:punch(user, 1.0, { full_punch_interval=1.0 }, nil) + return user:get_wielded_item() + elseif pointed_thing.type ~= "node" then + -- do nothing if it's neither object nor node return end -- Check if pointing to a liquid source @@ -142,7 +149,7 @@ minetest.register_craftitem("bucket:bucket_empty", { else local pos = user:getpos() pos.y = math.floor(pos.y + 0.5) - core.add_item(pos, liquiddef.itemname) + minetest.add_item(pos, liquiddef.itemname) end -- set to return empty buckets minus 1 @@ -150,9 +157,24 @@ minetest.register_craftitem("bucket:bucket_empty", { end - minetest.add_node(pointed_thing.under, {name="air"}) + -- force_renew requires a source neighbour + local source_neighbor = false + if liquiddef.force_renew then + source_neighbor = + minetest.find_node_near(pointed_thing.under, 1, liquiddef.source) + end + if not (source_neighbor and liquiddef.force_renew) then + minetest.add_node(pointed_thing.under, {name = "air"}) + end return ItemStack(giving_back) + else + -- non-liquid nodes will have their on_punch triggered + local node_def = minetest.registered_nodes[node.name] + if node_def then + node_def.on_punch(pointed_thing.under, node, user, pointed_thing) + end + return user:get_wielded_item() end end, }) @@ -172,7 +194,8 @@ bucket.register_liquid( "bucket:bucket_river_water", "bucket_river_water.png", "River Water Bucket", - {water_bucket = 1} + {water_bucket = 1}, + true ) bucket.register_liquid( diff --git a/mods/bucket/license.txt b/mods/bucket/license.txt new file mode 100644 index 0000000..a5156ae --- /dev/null +++ b/mods/bucket/license.txt @@ -0,0 +1,51 @@ +License of source code +---------------------- + +GNU Lesser General Public License, version 2.1 +Copyright (C) 2011-2016 Kahrl +Copyright (C) 2011-2016 celeron55, Perttu Ahola +Copyright (C) 2011-2016 Various Minetest developers and contributors + +This program 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 program 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: +https://www.gnu.org/licenses/old-licenses/lgpl-2.1.html + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2015-2016 ElementW + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/carts/README.txt b/mods/carts/README.txt new file mode 100644 index 0000000..31ce644 --- /dev/null +++ b/mods/carts/README.txt @@ -0,0 +1,22 @@ +Carts (formerly boost_cart) +========================== + +Carts, based almost entirely on the mod boost_cart [1], which +itself is based on (and fully compatible with) the carts mod [2]. + +The model was originally designed by stujones11 [3] (CC-0). + +Cart textures are based on original work from PixelBOX (WTFPL). + + +[1] https://github.com/SmallJoker/boost_cart/ +[2] https://github.com/PilzAdam/carts/ +[3] https://github.com/stujones11/railcart/ + + +Features +---------- +- A fast cart for your railway or roller coaster (up to 7 m/s!) +- Boost and brake rails +- Rail junction switching with the 'right-left' walking keys +- Handbrake with the 'back' key diff --git a/mods/carts/cart_entity.lua b/mods/carts/cart_entity.lua new file mode 100644 index 0000000..a19da64 --- /dev/null +++ b/mods/carts/cart_entity.lua @@ -0,0 +1,403 @@ +local cart_entity = { + physical = false, -- otherwise going uphill breaks + collisionbox = {-0.5, -0.5, -0.5, 0.5, 0.5, 0.5}, + visual = "mesh", + mesh = "carts_cart.b3d", + visual_size = {x=1, y=1}, + textures = {"carts_cart.png"}, + + driver = nil, + punched = false, -- used to re-send velocity and position + velocity = {x=0, y=0, z=0}, -- only used on punch + old_dir = {x=1, y=0, z=0}, -- random value to start the cart on punch + old_pos = nil, + old_switch = 0, + railtype = nil, + attached_items = {} +} + +function cart_entity:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + local player_name = clicker:get_player_name() + if self.driver and player_name == self.driver then + self.driver = nil + carts:manage_attachment(clicker, nil) + elseif not self.driver then + self.driver = player_name + carts:manage_attachment(clicker, self.object) + end +end + +function cart_entity:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + if string.sub(staticdata, 1, string.len("return")) ~= "return" then + return + end + local data = minetest.deserialize(staticdata) + if not data or type(data) ~= "table" then + return + end + self.railtype = data.railtype + if data.old_dir then + self.old_dir = data.old_dir + end + if data.old_vel then + self.old_vel = data.old_vel + end +end + +function cart_entity:get_staticdata() + return minetest.serialize({ + railtype = self.railtype, + old_dir = self.old_dir, + old_vel = self.old_vel + }) +end + +function cart_entity:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + local pos = self.object:getpos() + if not self.railtype then + local node = minetest.get_node(pos).name + self.railtype = minetest.get_item_group(node, "connect_to_raillike") + end + -- Punched by non-player + if not puncher or not puncher:is_player() then + local cart_dir = carts:get_rail_direction(pos, self.old_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + self.velocity = vector.multiply(cart_dir, 2) + self.punched = true + return + end + -- Player digs cart by sneak-punch + if puncher:get_player_control().sneak then + if self.sound_handle then + minetest.sound_stop(self.sound_handle) + end + -- Detach driver and items + if self.driver then + if self.old_pos then + self.object:setpos(self.old_pos) + end + local player = minetest.get_player_by_name(self.driver) + carts:manage_attachment(player, nil) + end + for _,obj_ in ipairs(self.attached_items) do + if obj_ then + obj_:set_detach() + end + end + -- Pick up cart + local inv = puncher:get_inventory() + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(puncher:get_player_name())) + or not inv:contains_item("main", "carts:cart") then + local leftover = inv:add_item("main", "carts:cart") + -- If no room in inventory add a replacement cart to the world + if not leftover:is_empty() then + minetest.add_item(self.object:getpos(), leftover) + end + end + self.object:remove() + return + end + -- Player punches cart to alter velocity + local vel = self.object:getvelocity() + if puncher:get_player_name() == self.driver then + if math.abs(vel.x + vel.z) > carts.punch_speed_max then + return + end + end + + local punch_dir = carts:velocity_to_dir(puncher:get_look_dir()) + punch_dir.y = 0 + local cart_dir = carts:get_rail_direction(pos, punch_dir, nil, nil, self.railtype) + if vector.equals(cart_dir, {x=0, y=0, z=0}) then + return + end + + local punch_interval = 1 + if tool_capabilities and tool_capabilities.full_punch_interval then + punch_interval = tool_capabilities.full_punch_interval + end + time_from_last_punch = math.min(time_from_last_punch or punch_interval, punch_interval) + local f = 2 * (time_from_last_punch / punch_interval) + + self.velocity = vector.multiply(cart_dir, f) + self.old_dir = cart_dir + self.punched = true +end + +local function rail_on_step_event(handler, obj, dtime) + if handler then + handler(obj, dtime) + end +end + +-- sound refresh interval = 1.0sec +local function rail_sound(self, dtime) + if not self.sound_ttl then + self.sound_ttl = 1.0 + return + elseif self.sound_ttl > 0 then + self.sound_ttl = self.sound_ttl - dtime + return + end + self.sound_ttl = 1.0 + if self.sound_handle then + local handle = self.sound_handle + self.sound_handle = nil + minetest.after(0.2, minetest.sound_stop, handle) + end + local vel = self.object:getvelocity() + local speed = vector.length(vel) + if speed > 0 then + self.sound_handle = minetest.sound_play( + "carts_cart_moving", { + object = self.object, + gain = (speed / carts.speed_max) / 2, + loop = true, + }) + end +end + +local function get_railparams(pos) + local node = minetest.get_node(pos) + return carts.railparams[node.name] or {} +end + +local function rail_on_step(self, dtime) + local vel = self.object:getvelocity() + if self.punched then + vel = vector.add(vel, self.velocity) + self.object:setvelocity(vel) + self.old_dir.y = 0 + elseif vector.equals(vel, {x=0, y=0, z=0}) then + return + end + + local pos = self.object:getpos() + local update = {} + + -- stop cart if velocity vector flips + if self.old_vel and self.old_vel.y == 0 and + (self.old_vel.x * vel.x < 0 or self.old_vel.z * vel.z < 0) then + self.old_vel = {x = 0, y = 0, z = 0} + self.old_pos = pos + self.object:setvelocity(vector.new()) + self.object:setacceleration(vector.new()) + rail_on_step_event(get_railparams(pos).on_step, self, dtime) + return + end + self.old_vel = vector.new(vel) + + if self.old_pos and not self.punched then + local flo_pos = vector.round(pos) + local flo_old = vector.round(self.old_pos) + if vector.equals(flo_pos, flo_old) then + -- Do not check one node multiple times + return + end + end + + local ctrl, player + + -- Get player controls + if self.driver then + player = minetest.get_player_by_name(self.driver) + if player then + ctrl = player:get_player_control() + end + end + + if self.old_pos then + -- Detection for "skipping" nodes + local found_path = carts:pathfinder( + pos, self.old_pos, self.old_dir, ctrl, self.old_switch, self.railtype + ) + + if not found_path then + -- No rail found: reset back to the expected position + pos = vector.new(self.old_pos) + update.pos = true + end + end + + local cart_dir = carts:velocity_to_dir(vel) + local railparams + + -- dir: New moving direction of the cart + -- switch_keys: Currently pressed L/R key, used to ignore the key on the next rail node + local dir, switch_keys = carts:get_rail_direction( + pos, cart_dir, ctrl, self.old_switch, self.railtype + ) + + local new_acc = {x=0, y=0, z=0} + if vector.equals(dir, {x=0, y=0, z=0}) then + vel = {x = 0, y = 0, z = 0} + pos = vector.round(pos) + update.pos = true + update.vel = true + else + -- Direction change detected + if not vector.equals(dir, self.old_dir) then + vel = vector.multiply(dir, math.abs(vel.x + vel.z)) + update.vel = true + if dir.y ~= self.old_dir.y then + pos = vector.round(pos) + update.pos = true + end + end + -- Center on the rail + if dir.z ~= 0 and math.floor(pos.x + 0.5) ~= pos.x then + pos.x = math.floor(pos.x + 0.5) + update.pos = true + end + if dir.x ~= 0 and math.floor(pos.z + 0.5) ~= pos.z then + pos.z = math.floor(pos.z + 0.5) + update.pos = true + end + + -- Slow down or speed up.. + local acc = dir.y * -4.0 + + -- Get rail for corrected position + railparams = get_railparams(pos) + + -- no need to check for railparams == nil since we always make it exist. + local speed_mod = railparams.acceleration + if speed_mod and speed_mod ~= 0 then + -- Try to make it similar to the original carts mod + acc = acc + speed_mod + else + -- Handbrake or coast + if ctrl and ctrl.down then + acc = acc - 3 + else + acc = acc - 0.4 + end + end + + new_acc = vector.multiply(dir, acc) + end + + -- Limits + local max_vel = carts.speed_max + for _, v in pairs({"x","y","z"}) do + if math.abs(vel[v]) > max_vel then + vel[v] = carts:get_sign(vel[v]) * max_vel + new_acc[v] = 0 + update.vel = true + end + end + + self.object:setacceleration(new_acc) + self.old_pos = vector.new(pos) + if not vector.equals(dir, {x=0, y=0, z=0}) then + self.old_dir = vector.new(dir) + end + self.old_switch = switch_keys + + if self.punched then + -- Collect dropped items + for _, obj_ in pairs(minetest.get_objects_inside_radius(pos, 1)) do + if not obj_:is_player() and + obj_:get_luaentity() and + not obj_:get_luaentity().physical_state and + obj_:get_luaentity().name == "__builtin:item" then + + obj_:set_attach(self.object, "", {x=0, y=0, z=0}, {x=0, y=0, z=0}) + self.attached_items[#self.attached_items + 1] = obj_ + end + end + self.punched = false + update.vel = true + end + + railparams = railparams or get_railparams(pos) + + if not (update.vel or update.pos) then + rail_on_step_event(railparams.on_step, self, dtime) + return + end + + local yaw = 0 + if self.old_dir.x < 0 then + yaw = 0.5 + elseif self.old_dir.x > 0 then + yaw = 1.5 + elseif self.old_dir.z < 0 then + yaw = 1 + end + self.object:setyaw(yaw * math.pi) + + local anim = {x=0, y=0} + if dir.y == -1 then + anim = {x=1, y=1} + elseif dir.y == 1 then + anim = {x=2, y=2} + end + self.object:set_animation(anim, 1, 0) + + self.object:setvelocity(vel) + if update.pos then + self.object:setpos(pos) + end + + -- call event handler + rail_on_step_event(railparams.on_step, self, dtime) +end + +function cart_entity:on_step(dtime) + rail_on_step(self, dtime) + rail_sound(self, dtime) +end + +minetest.register_entity("carts:cart", cart_entity) + +minetest.register_craftitem("carts:cart", { + description = "Cart (Sneak+Click to pick up)", + inventory_image = minetest.inventorycube("carts_cart_top.png", "carts_cart_side.png", "carts_cart_side.png"), + wield_image = "carts_cart_side.png", + on_place = function(itemstack, placer, pointed_thing) + local under = pointed_thing.under + local node = minetest.get_node(under) + local udef = minetest.registered_nodes[node.name] + if udef and udef.on_rightclick and + not (placer and placer:get_player_control().sneak) then + return udef.on_rightclick(under, node, placer, itemstack, + pointed_thing) or itemstack + end + + if not pointed_thing.type == "node" then + return + end + if carts:is_rail(pointed_thing.under) then + minetest.add_entity(pointed_thing.under, "carts:cart") + elseif carts:is_rail(pointed_thing.above) then + minetest.add_entity(pointed_thing.above, "carts:cart") + else + return + end + + minetest.sound_play({name = "default_place_node_metal", gain = 0.5}, + {pos = pointed_thing.above}) + + if not (creative and creative.is_enabled_for + and creative.is_enabled_for(placer:get_player_name())) then + itemstack:take_item() + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "carts:cart", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) diff --git a/mods/carts/depends.txt b/mods/carts/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/carts/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/carts/functions.lua b/mods/carts/functions.lua new file mode 100644 index 0000000..a471719 --- /dev/null +++ b/mods/carts/functions.lua @@ -0,0 +1,221 @@ +function carts:get_sign(z) + if z == 0 then + return 0 + else + return z / math.abs(z) + end +end + +function carts:manage_attachment(player, obj) + if not player then + return + end + local status = obj ~= nil + local player_name = player:get_player_name() + if default.player_attached[player_name] == status then + return + end + default.player_attached[player_name] = status + + if status then + player:set_attach(obj, "", {x=0, y=6, z=0}, {x=0, y=0, z=0}) + player:set_eye_offset({x=0, y=-4, z=0},{x=0, y=-4, z=0}) + else + player:set_detach() + player:set_eye_offset({x=0, y=0, z=0},{x=0, y=0, z=0}) + end +end + +function carts:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=carts:get_sign(v.x), y=carts:get_sign(v.y), z=0} + else + return {x=0, y=carts:get_sign(v.y), z=carts:get_sign(v.z)} + end +end + +function carts:is_rail(pos, railtype) + local node = minetest.get_node(pos).name + if node == "ignore" then + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(pos, pos) + local area = VoxelArea:new{ + MinEdge = emin, + MaxEdge = emax, + } + local data = vm:get_data() + local vi = area:indexp(pos) + node = minetest.get_name_from_content_id(data[vi]) + end + if minetest.get_item_group(node, "rail") == 0 then + return false + end + if not railtype then + return true + end + return minetest.get_item_group(node, "connect_to_raillike") == railtype +end + +function carts:check_front_up_down(pos, dir_, check_up, railtype) + local dir = vector.new(dir_) + local cur + + -- Front + dir.y = 0 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + -- Up + if check_up then + dir.y = 1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + end + -- Down + dir.y = -1 + cur = vector.add(pos, dir) + if carts:is_rail(cur, railtype) then + return dir + end + return nil +end + +function carts:get_rail_direction(pos_, dir, ctrl, old_switch, railtype) + local pos = vector.round(pos_) + local cur + local left_check, right_check = true, true + + -- Check left and right + local left = {x=0, y=0, z=0} + local right = {x=0, y=0, z=0} + if dir.z ~= 0 and dir.x == 0 then + left.x = -dir.z + right.x = dir.z + elseif dir.x ~= 0 and dir.z == 0 then + left.z = dir.x + right.z = -dir.x + end + + if ctrl then + if old_switch == 1 then + left_check = false + elseif old_switch == 2 then + right_check = false + end + if ctrl.left and left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur, 1 + end + left_check = false + end + if ctrl.right and right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur, 2 + end + right_check = true + end + end + + -- Normal + cur = carts:check_front_up_down(pos, dir, true, railtype) + if cur then + return cur + end + + -- Left, if not already checked + if left_check then + cur = carts:check_front_up_down(pos, left, false, railtype) + if cur then + return cur + end + end + + -- Right, if not already checked + if right_check then + cur = carts:check_front_up_down(pos, right, false, railtype) + if cur then + return cur + end + end + + -- Backwards + if not old_switch then + cur = carts:check_front_up_down(pos, { + x = -dir.x, + y = dir.y, + z = -dir.z + }, true, railtype) + if cur then + return cur + end + end + + return {x=0, y=0, z=0} +end + +function carts:pathfinder(pos_, old_pos, old_dir, ctrl, pf_switch, railtype) + local pos = vector.round(pos_) + local pf_pos = vector.round(old_pos) + local pf_dir = vector.new(old_dir) + + for i = 1, 3 do + if vector.equals(pf_pos, pos) then + -- Success! Cart moved on correctly + return true + end + + pf_dir, pf_switch = carts:get_rail_direction(pf_pos, pf_dir, ctrl, pf_switch, railtype) + if vector.equals(pf_dir, {x=0, y=0, z=0}) then + -- No way forwards + return false + end + + pf_pos = vector.add(pf_pos, pf_dir) + end + -- Cart not found + return false +end + +function carts:register_rail(name, def_overwrite, railparams) + local def = { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + sounds = default.node_sound_metal_defaults() + } + for k, v in pairs(def_overwrite) do + def[k] = v + end + if not def.inventory_image then + def.wield_image = def.tiles[1] + def.inventory_image = def.tiles[1] + end + + if railparams then + carts.railparams[name] = table.copy(railparams) + end + + minetest.register_node(name, def) +end + +function carts:get_rail_groups(additional_groups) + -- Get the default rail groups and add more when a table is given + local groups = {dig_immediate = 2, attached_node = 1, rail = 1, connect_to_raillike = 1} + if type(additional_groups) == "table" then + for k, v in pairs(additional_groups) do + groups[k] = v + end + end + return groups +end diff --git a/mods/carts/init.lua b/mods/carts/init.lua new file mode 100644 index 0000000..53b33cc --- /dev/null +++ b/mods/carts/init.lua @@ -0,0 +1,20 @@ + +carts = {} +carts.modpath = minetest.get_modpath("carts") +carts.railparams = {} + +-- Maximal speed of the cart in m/s (min = -1) +carts.speed_max = 7 +-- Set to -1 to disable punching the cart from inside (min = -1) +carts.punch_speed_max = 5 + + +dofile(carts.modpath.."/functions.lua") +dofile(carts.modpath.."/rails.lua") + +-- Support for non-default games +if not default.player_attached then + default.player_attached = {} +end + +dofile(carts.modpath.."/cart_entity.lua") diff --git a/mods/carts/license.txt b/mods/carts/license.txt new file mode 100644 index 0000000..6c5beb4 --- /dev/null +++ b/mods/carts/license.txt @@ -0,0 +1,54 @@ + +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 SmallJoker +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media +----------------- + +CC-0, see: https://creativecommons.org/share-your-work/public-domain/cc0/, except +if other license is mentioned. + + +Authors +--------- +Originally from PixelBOX (Gambit): + carts_cart_side.png + carts_cart_top.png + carts_cart_front.png* + carts_cart.png* + +sofar + stujones11: + carts_cart.b3d and carts_cart.blend + +hexafraction, modified by sofar + carts_rail_*.png + +http://www.freesound.org/people/YleArkisto/sounds/253159/ - YleArkisto - CC-BY-3.0 + carts_cart_moving.*.ogg diff --git a/mods/carts/models/carts_cart.b3d b/mods/carts/models/carts_cart.b3d new file mode 100644 index 0000000000000000000000000000000000000000..4e7eba363de4d01da5e924e7517eaa44879879be GIT binary patch literal 3008 zcmbW3OHUL*6om@}eBl$tw}MZ6A&Tf~rrVK8BnC(rG;v`}2rm;7jf#mYJ8?(iA8^C` z1rrypU=r8HpWhlv3+uu0V(H$iZ7#vXsp(SpR+p60 z?ZQTFwPH-U(qYQsz}KF24>e*UL0k@r*J`W8gIJt7jW}~+@pTuAf;Np4`=vU5t*xPW z}vLB_rO}>%3C20>U(3o>n-hk zT>X^&+5U8{Hb3Va%fGJDwtiCozP{!poj>&>?K4q78&BS!tsf+xkK12H|7rT#`t|iYVP{Pabfd9iq-KlVj_>csLl_Lm+vIlp$3 z^RfHO{r~>l`KH&e=Ck&ftdBeY^!}~B3Fk|H#&B-rXw}E{pSAz2`;n}#%b&i!nooH@ zBDJ6Le!2HAtA6tP>DDLz|FChBpD zA45Iuf;Y_;?=#*dbP64UKA+ad-XUxk^m#S#(Dc^~_za6~vP9P>W*N#TTWTsY-@?9)QO&?lS`@UhPe=Y+Gu1@B{D5-th@!e#Gc z^V8(2a7DQ0ee4?oKU0PT#Kp(HC5#9+h1=f8zB4g4&c1m#Ph*}J_!09_2VHnJ`^FA6 z|F{o=|L`@3^^q$~P82J3W#l_E3J{F>E_oCn3O-`N2nQn?j5si&!3YQ=9_*Tp0>r~d zNEi`e#DWnKMo<_rVMK!w6Gm7VQDMY`5fw&Y7;#}lgb^1;Xc&>p)?fVmhjmjb?Dd{p`* z3q8D?kxc)z=pVU2U1x(IDh~*1`hf>D#uN2^|FZVv-IBixjk%SCxq0Tg`|@vde*;IC B>mUFC literal 0 HcmV?d00001 diff --git a/mods/carts/models/carts_cart.blend b/mods/carts/models/carts_cart.blend new file mode 100644 index 0000000000000000000000000000000000000000..7d2515eb70379538759ecb2e9fcf6f7390dc840c GIT binary patch literal 544408 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 ZTKuLI{ZdhgfMUU(GDQmUQ2EEd{{a&>6XXB@ literal 0 HcmV?d00001 diff --git a/mods/carts/rails.lua b/mods/carts/rails.lua new file mode 100644 index 0000000..066779d --- /dev/null +++ b/mods/carts/rails.lua @@ -0,0 +1,59 @@ +carts:register_rail("carts:rail", { + description = "Rail", + tiles = { + "carts_rail_straight.png", "carts_rail_curved.png", + "carts_rail_t_junction.png", "carts_rail_crossing.png" + }, + inventory_image = "carts_rail_straight.png", + wield_image = "carts_rail_straight.png", + groups = carts:get_rail_groups(), +}, {}) + +minetest.register_craft({ + output = "carts:rail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + +minetest.register_alias("default:rail", "carts:rail") + + +carts:register_rail("carts:powerrail", { + description = "Powered rail", + tiles = { + "carts_rail_straight_pwr.png", "carts_rail_curved_pwr.png", + "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = 5}) + +minetest.register_craft({ + output = "carts:powerrail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) + + +carts:register_rail("carts:brakerail", { + description = "Brake rail", + tiles = { + "carts_rail_straight_brk.png", "carts_rail_curved_brk.png", + "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png" + }, + groups = carts:get_rail_groups(), +}, {acceleration = -3}) + +minetest.register_craft({ + output = "carts:brakerail 18", + recipe = { + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "group:wood", "default:steel_ingot"}, + } +}) diff --git a/mods/carts/sounds/carts_cart_moving.1.ogg b/mods/carts/sounds/carts_cart_moving.1.ogg new file mode 100644 index 0000000000000000000000000000000000000000..869e765b84acb081468bba060ba973bff409dec5 GIT binary patch literal 14761 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 literal 0 HcmV?d00001 diff --git a/mods/carts/sounds/carts_cart_moving.2.ogg b/mods/carts/sounds/carts_cart_moving.2.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b4cc5084388f475ef3c47842a1593d6a1bb71604 GIT binary patch literal 14749 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 literal 0 HcmV?d00001 diff --git a/mods/carts/sounds/carts_cart_moving.3.ogg b/mods/carts/sounds/carts_cart_moving.3.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e19a782d85038a12ab273870ab8e2dc0a4eaa3c3 GIT binary patch literal 14989 zcmaiabyVCjv*2&acPl7ixg;aUtEg2yIXNBZpGaTMM|-^ zwD-IBzCYf1IobRsGs$E!nPet8t88JR20#Y%0%NY zb1D!O7Y8RV2PX$F72|qJz<+1pqfoerpMsUCnZ1*lsH7yTgf=TT8;2+Y356(#S~@#_ z5MpO{b#-MkcQi9|dJnUI$M)XQg8hTp`wzBe?Ao?w;*K^}PR{Sy|I(b;xp=ubc?H># zp8k{QwS=Sw65uTWKqo|=pgTn86h)nrArYj@ z`00BT6!6#~P}~haAVeIUI)F}8E5@He6afVZB5+oZI2?)p6w-p02&yD2NB@*R zrbJM(KZy4?X@G^e8{xk(XvO8C{87dGi34QB5fY#ZHsA*gi5HLtFbSel22k<5BLGAJ z02x_~Az6&ia7e430r~*|oVTj@eGX&;(PRUaWSHpBwVxtZ7J!auCl`_<7qKZ9L#rJ_ z_cw0`7qJXg{moo|yUPIpDymr04)|z)`@I7I&@%)=aF)F?Hx{o!#R9%DVApB!9ajbci!yWnPFH#PNg#_3t_$#PG!p;pq1LkCJ_f z!Pr?CrGhJ|8yVWz$>2&s@>IE6_n4HBM!}s_r_q7!RL)TZl$ENDm5gY&liHo3{p=sa zQ0e|XnduSdFuG@yirb5T=u6$BlEZ5e(9=?@h-CRn1SHq!4oQ)J#5p~(`djSx?2)Cu ze5@9zYseP0`oKcz)Xb&Sz%m5EY-t* z3!%f3YHVRF&Tbq@=F)D6njP5uhf*Po{oh1@y~Iw#g1fYEoc~M{v7mqt__BZP4OB%d zKS4V(!J_<&NBO0wD!%k24|JSBUzOiZmCtOFS6_`!AF5%e8E>as2U|=qTfFjG`CnNd z?e7%v005yF8eq(8V9bU<1TE;TWj_<(E$ZWr3|VK4*bs=J1;x-=#aOt<7bGR`C8aYJ z{cQrkd2I5SLh{@~3f)2q+#+^^Vl0#53ks8&2lEb_$`1a28S}4!(*gj_w6c!0vJhHn z2m<)4U0L zbs8c)tp@%7CB;b|#g_=hVmxlx4zhqz)`BPy25VvnV>j(CL>vvcJIdjgafK)7pW25n zC=t~g4+=B!@<`Hv)>FU&NHc}DQ zea2i;`B3s)eAAFhL?-|m;)j{}J&FM7Ej|G72?z2F_!(|83fzf;403LhK|%!cQ`JTV z8Pni{g7j&zc);9LQv@{?J__1Ojhz57BJ86B3GtI)d+-Z zD74;8_Yz?zuoZ5_c|z#)j3TrahNv#Z*)1jfH!J9@I#ibrI$g)B>a4E{HPc3Lb}^f+ zgKEye6!GCeE7i61%7PQ#!sFvA(U zl?0f+7X4qT^q~l;coCctQrRI`Y5teY(D@74G|W!_rS$A0XK84hKBDhRoY`NQAE|0E zn0}p|X`-DjkrF~?1l2fBe<=aBNNlfv6+Xgax9F^|&#$jJYp2iuMSIrEP#tQhX*SQV zp?!(ihn27uVj1W(OwHx9AKumaB5V!@D{sJNS8--;c8i+k`V7NOc4W=v+}_3rU(n(E1n|}u!z|;k zd87gW{!varK=f!6g!2P_#({(o`$q{f(3vWMfpoPhU~61c9HzdUccUPT+!}na6%an5 z1Ei}{0f&~>>ZsXNeu3y<=GJI|tvG8nOl?YggE%pgoFH5~IdF&$b8bz%plq&F6aK;{&IwZI-2j7&Dt~Uk}Mwd&f8^T&o?1YVA1qrT15JG`{gr=jo zrYZ+Qb#2)g4M7%2*FAo1T-H7?NjAUiOW8+0s#?H*&1TBltlaK7li|i%4V%A%m(b-dn3U8a27jL0tpzE3>``1f zOKds6RU;x!K0D$8Q=MELmGlUm|qat=^Y>XfpbpV`ehbkZnvO^XSqjQkz zuL8Eog~N41E8#H^8%{!muU|!YXe0l;?sdTDFC{1d2oeA*!c;rmBDu(VD1y#Cov|pd zc)yNDJDnkHftul@%YPTm8kb9JC>N6%~~+54F87DngvJh_K>k zO3{830#kK_S$r^9#j;pu|LWU*6C&cMvpX1cKs35(t0a@HE4yjpxb6LbICn)lkpKl9 zU#4-DLVA%gACJO!2oZa!-r+#{sR9uG6c_-9AY2kE832H+!1&~^*jb1(|8+_2jE-q3 zq6mG2Y)TO>^RM6he-=mp$V+ShtSpf6^xXCbLP)RW7 z_G73L_^;}u#Mz6eilb*fQXf6?BlR&59Y(CVKVn0sIbr_|NrnDW(W#yPRV5HH=-*iN z`+r5PnU9Sh<5whr?^A4qtKln&_yFM{)Os|f$2ie%!I6cNTTXDBg%5@LX(Ln)*i&OJ zL$cKXeMX(b^G=ELT~4=-Qz2pn0Dg$>)JOnS^k?P(-%g~i9jaXv^awrxKs;y|C-}?f z)t?!7RIl@peY;UU>j4TX8swTAeA%ApeeXdydvpmLKP|GiNEiYFYhM_ae+Ilt%}`U{ zr$X>Wcu>G95@59f@cMP~xBl;QtGhpc127Pd5s`=izX1RNDc_)=Z4NFTJ^>*Sv9}Tk zoA{S}eSQA|ZxN-h@4x#?hrwSI;PL+Q*sv!vft?h{++0^!TwGRBR#IG5QCwV6kyl(+ zSY2IOgg<`RK7OAODdm53aNo`{^d|Qzo8wtwXoKrXfB)1s!#BH2z3txL)g|#KTdjYz z4x*XkOj{m^h~%~3-n#@gXNTm+G|6tOO_#e{SEX{Qb)+wc}fX4{;1&nxr^8wAF^Sa<*WUskn5bOhCUN1{BG}Guz{4 zaSG*Uqf6j&VqN#rJW_}c3nkB33p}#YC*HyWcYs8v5>%0h3d(W|j^#e7h<1LI_!)m# zN<(7m?%psG2X`(yF5}Gtcmt1C3EcgzEBN-&y7a8^#ItLQz3l58lJp zjyAT|)^ztbv=vku?y6st~u$4~XU1db$$nrJW%&hU`KuygqtUlLD53`s2)Psf{|S zp91sKjDna{3 zLBiy_yelQH%!nx66OT#fQA_gEGPs5(JBiHfTjkyF{ul6LgZ#Fl6@L(y03;3s%FgXzOS6e-d6NCMQ`M-|%Lrl&&tzG41&f zCCcSgqz23Yjz5Usc-T`Y4ulTpQXk)vrWeHPOS9Mwd$3}J8%g9TGIJKV z=kzNoe>06xUN(v6i)AYo8B%EH1lQu6?=8fBtyzAc;vT#bAvBtg*yE~n$k};2^HJWB z)B77*=DI;RcwHKEL$4g?`TTo4c<$>yNc1SD4Rqv)Pmrz+Sh}0019Bfo`8As)ua^>u zbC_;Dm|q{0A(u`pq1R;@latVOHDGG6Po5CucD*sk)!Eg{Ylz0@6RL|HLLgl<6#7PS zwE>Mf@MuVhQpvxe7o7~P`Lw#!J4|UVU@FKQGGR z=N)W-3Z>n=hz*0|vH?pa-$reu@;EI`pT6eS6?Ji|r7i+1t4M7t{2Zb@SRSz9CK7%D zFko8RVm`oMql;kFmvj6${)-~5;EHE5?kWbQ=Rwldu{e&JyJ|Ykr;YscM)wH= zWsv3tO^e{Gp6G6L;oXFBDsc)LxM6a1$;YmQtB%+~njKb^S)SBzJwT%!o2m z-b`8>l_y{2LZP2r$(bCMrpgP)2iybGI+%Ycbp@JzC|cv($J}q}w6)^xNEK58X{fy4 zOYrE5V{a0SiN4Z15n%QRIr2r+Q+CjvHI{}u+XxW15FT4YiJ z>7-wcd=0)-kAhxk2#l{G{kUSBJOw7Kb1qQ3GQkRFa;&MwvPF1PN5!#iPH2TbLeC&Y z%6jTn$TrWljDLR(=}pP>^m{vU2J=x=3pXOLUoYMmPirF~r=H|B;0J#FU>FIihVLCX zDH2mKEp>7`X%PHWF(V=qE!t^|C~4*&(S6bpH7OUvfZTBH%5504{GP;X@~ZKAQBI^N z(Uf>#yn#fO$?ev};nj(k%rMi}B6s-BN4+$?aNcn4&M(hZ1qC$QKwBCd@4i-&LR3Dm z@8o^7govdKeb+lE4UOo3m-Dh%+)$qJ%d>KyW%AltQ)DpMl}7DDt->mm9CP)^*C2KF z^0~q!yLSp1Vlk~Sy+6G4Y7nG0U|Nu-c54GAMRrl|cqsLkJ&_|@Ta=iJfD$X)ylyPm zV%4oz&paYwTCvAM}+7nbrQ1hL)tuX^`R0Gi&ppcc^sd`^_Nj zTuX|jd(J|^85kof+Rjj{Ocgz++(hzt@mdJ3yssC3V|ULFRjfb7&XL)TU)E-Ce{cVI zX;%K6UPtkxuJw?++$vjnh`zmH0dDvH7^NN``g$Q|)sMbgqCg8wErd@<+hcYVbh?lz z|Fn8aMiSsI#?X})@Ujq^%PRwXadDrj{PnPxW7ba; z*>s_YE=_kJsd@TmOy*5|wGCtq12wbWvXiq`Y6gXL)rsR_!2li_P5mBL8D>e|KG@(6J$vlr71&v{VyiRQypJgahkLijTl2}2rH-{3 zJs3mvb5wG$URI`M^VBj6)yM9aPG5L!Jy+D3;gXGU`PJN%)*-y3gIB)6J11D>O#h8aG*dpH{~8vh?d4# zGg5Xe=KG$deUD`RAQ#J`6fl^SbfljKAjXuoDJ;_2s)e>%+m?Q!Bvf6ep{rGp#3v0$ zPBnL1BDdAU^M=j*xbNZ#3le7wl$W0G|M0>W#0$?JDV1>EJd_Pt{yeLq9YzkTv zRFkkj?9z6OEZO#c*@j6&q|r3?De|UxB{$AXK7u&Y2K9on!Fvcl;;_9C9{0cg{$68k zFFl#B+F;x%bP7`oT4l9Gr&1O-Nrq={a*O9=J!7a%ccW!~FWy1LA~BWJA*%`STBv7q z_u7=O$fn+UcYn0iK8pOobg)p-Og4B)fSs}APsRMY1QVCO(7md(7c1?#8wne)~s1miQmXpLWVREcp|ySn3T6-lyy*J{mVy)*nJ z3^ZH9<-V_QXD+lc}hi8ZVI=xF*Vu83v0p?j@41u_7j=UjD3Acx5%x!vU zY^o%0o`4l3%{u7>*ha&AyCmAbK>Q*EBtlEYzOB(ELP9_X&3*NpC%x^#dWsa3-V88v znUv6nu-l7we4c3~QYwo+@6kV(JkecEj3>$dQA1y&zNrcVEbFxHYC5BCO!5}Oy0i1g zwyC~fJmraMDx?Z;p?!P8U7|Z0&r~^j;uLr1q%keHUg(SWF-b3N{+?3KClpuM*TX>+VMifBeb1uClJ4L~JCsG< zl({9q=W|YphIL>WCY{C_O3Vv{TlikRCz{9}IRN^mW@FlCu6T&<2N3TOi!x(>VFF^6 z9cfQ%?=xjnd6-F$A`}f@@O$!OERH9(V7pIdAo#0JVz@cZS6&JGleWgr+)w>q4f9vT z=IQZrL_auRmItB96nSbx$g{8|+?V~zmvHbKzSQmEv%DeJO`#i9?z}OSeU*Q_GbJ2H z_PcEe9yz7wz_<_fc|(V-$UfBCBAvcfNy=SX^g-ftKsxZ~kif_9^5>^woQ_z|lvJ7t znVk}DJPBD#rk^nhD6EtB2P-ypcK6FNt>&6>iATSGm1|E#w>+j?$;UODtvz{e_f={s0#;$l!lL@U{wQeza(;R5~gJQOCw ztlHq-OM4OMlF%TuQZE{NUvj$0V`|ZO`i0$dc*EBZGq0dn?wmyIUelfzENrevyB`M% zP0~S|Fx!-rVAKU?MP{%7gRBw^H`f0(c6w7o?#R~>3a8)e>qn^`jb0v(?bUG>IFgpN z%5Z)B;*egKNKa#q@+mX4PkO;zw3L~4NG~7nVf~sO?7dqH^Hv+Xc)!j%L>N+;;==WV zGwm&R`BtoD@Lu!#=pM?hlnJhkC9}m7Ej_~m?fWau& zL)8!IhwKu||hFb4fP19ndgtCJ_ard2)^Svy){e<8(FbvZKR?=VN!v9j?&%443#MN~ai_y&s5ul^=;ZOr_E zYaA*?pRMh%v0Cbr3J#`-Cm_73gsE9?CfSKJ9;NVRbn7v049==-vrCPUupyh#-}%!& z9QMpnWyj{$u1gf=wRcd10Z^G4Cb|Np%7?fmvFiL5?~ok&yI!)r3FV`< z6~c>4YT!oeN-ZJs$Qm?cqHeRe))whwShdx6Y1@saKMgKwinGXD^XW`-EmT0ZXY09# z15urkr$nWsk*s1VyGBGyN|GJuWE*WT)hx+98QlC&UxCoPp7@FbRSThTsxB)j6$4&% z!43Lqn{g7a(Bug>wa;+DDn5V>r>g%Cjg%C!nr(j3F&RqJf4@K(q^Id z>DzC@*z|8>J<2SbZXdcHS`FJpn4KJ5DH*&Rtz(LNnoQ`WHAAMc;I;x1lGgR*+c~YC zWR0H5*BUUnPc$PZK2Nk@JJIv~b9kp}J(K7Gf<<31zq=EoU`eLZCwcvfljJ0~Vj??< zh!N*Q?REI}VPS3>p1r#>N?stKllYC0)Is}ty_nZ(!fI4K#_vZiJbe*CK)nC*O z5y*U`0I*DM`%E1z?kQ3g;PL0nH|TOW=!`QrFUxTvVyW_Ez#*i(p{G40gcQfV$!Y$z z-KY#7cmH)4!O0nj0L{J*z%yyKKm72XZJUIpvfKvF-TLuIX`dBE;LQ#_!8j%KE=ZkH z^y_jtKz&hkEcfawCT5Uu%8v!E6#w-=0J=+?BsKUcQC z+f#RL+QgR@`%=nJGzvh@Gv{ROD^+URYT9dJlA_BZ+eE-WuH+a#2C*z?&g{PStFIBZrL#tp+pga1wDbKs?P#I(P z*s=7>b(5CTj5~ACrxOkOPI(#v@UcO{)A)Vm2O%%yWkK@B$YEj2_VcP@sh=no3L;Io zx>ppm=<2y}AchXh(9y|ch|!J*h1RfZuSQHAz9CRn7L}+e1XXutY-s^qkkV%l-jVHx zGoW+QHec^V$G}7~Mn3AFd_wNf>9Yh+1C(oRnf(miPd(QQgq8G_wUxft-KY4*Rvoq= zu^aRB=|;BPYHpqY8O*iLoS5K(4s@quQAc0RkJb(pLgxM{8(9*)82Nc2j+#yl1K`c1 zzb8BSW=BsW$6t1q(*g)1<_3l5szFH(CP~GI^0=zWX~<{KHL%DnMDmRZ+k>Zre$ay= zqbKOGOpCQhgS0Rm3G(BlhR(P>%+0=p2cqg8n=jWka@iNXy{OVs+UAUU`Et%|WFczb z#95NlNy#0DApJvFQ@Y^=-dgR-OA`4*G%LciqBY!~wwrTXq0rj*1gxggt)W{S_GQq+ z6P2h?3r&t*OjKxjX8-QA<`aNH=u(gCB|nHAMtk#N?-Z4_7bnDJk~o+u9h3U@ z*s-rPSus7yw<|T<-}q!=?P2JPzQIBzh;6udIWA96K?iXK+GFO7b=SsT<$GniIV~Zj zWfmvS@}6`oOhiG}BMdPm7vzia?nPTvX*bvD+E zCPc00eH`*<&d0q!$KGrdIq3wB7y%(WJ1zg#*WRm*UX0H+VMO_t9 zE%8^ZCxhgs#sN2B^JS>vUf-+1J!4N1*Wsgk<{zDU)4lUjEXwC1UW4{YDbc#2Ur5!T za>YQt&rV*R_^^73Z&!O6tfz22v>)VBzCZqCT2Lo*+&#d*evj47JkO=2w$94qA1Yc9 zO0Y8>a{LQDQrL{T4lAi8{ugGKYDk{`qK-!LPRN9&Ud6zq?}PrJ|8BzP+AWH2-rjq; zRiZ1KqY@aYYVBu+(=jVK&q|hoQv@XvBKyrB-kptOef%nDt$RS1Dh~$$3=mH_x-Ugp zf4R=q4FAl!DB-U`{eqG-Yz2*>&5%9WmXCEV-}$Ba+FM=kW%OHg^}B+IR<2M2A&3#; zA!CrQGS9R4J58ioI}zT`LoC^uMr18lMQNA_*APDgYmTvJ4^ipP$RFoi)h>}mBDY2zm9r~Im%r#)aJ&Dgjj(WfVO`n%m-TJI(N6 zQA1$Tsj^e?L3kyYI5IHPG3;hC%HYfX_#`aMe7#!B+sI*g<0AmvGcBq&0hTK2kL~Z# zH>&3yu6?-W5ByC#YT3}}U&ihtKCRidEq*Q%KH503&pI|Ra?CU0Z0>T(W>l`!l$2J7 zab_dCw07z8c96c|DwaMfG^b1qM0>kc^Sn~f1Mx7jBn(5_OEBxeO$aM?*A8>%4@vfY&nk;age0Wn9s_pUcdxN-~vJ7az-Z@xXyBMTfl4Ce(Ty9-OQ$FTGD60{? z&Cx2OrX#LY(?`?(HI;(cjJ;Jin(b9W;+#YlMsFUy3Fe%)Fl|O_aG!U4G$i*!AAfllAEPj-OnkDwSVMz3E+qOg|Jo$m^l%X_6a=%9D_`xCuf zHkY(gJm5`-!iVV4aC^`-SFAH zWx3`(rYM&x?bI!4u<<|PNTAR#u|Idc=yk%@*Xa@k0%*I1!OzCBZgMhpsF-+8V}%53DD zc%NI@_EMieSJuKi?njA5OM_eM@vrYH^O=?HN14~FmA*6DU!OMc814;s@|Rrcvxf#L zTu)!tX@pJZV+RRT@j$#EHd&w)ICS4yI&8kH^yypFRZogJ$CmZV$I84HMpjEhI&j_L zN!5soDJpPb)AM>y)>WVtj7uKa{A`^n#+i%S)5X$-z^|5S8k^P(g&uK~+5JpwLt9JG z*)@Hg$RKpg`TS5^mk`ZqR0{}FN!~UGwYJy)FuPu^eGu!DTI8&tRGMqkr1RubCg-+T z3JI$t6Nte5qYC*b$9668M6Hoto2-a-1M|EXpJL`ZzW%j@JipVkEA8VY&Bi7gf$PJV zW4!!H>poE~ipZn>(_%hbdYA5QU1D}ESY2gD@B$jCCL3UV&T@@da;@W(_DQrpB3cyhvdZAfOR^GyzTYC zP`aY<`)g%I7=Qki>7Te*-eE9RcVV}2!$zh0Yo_?aLFt_V?OY?epy`cYT7A!(&Vt(E zkhjsOMs_E6*$=#?CP|-5Os>z(rart%`^Jx^Ieu>YqPo@9SQg+YB`J$3j zs^N}v=GVPR$F`EaB3LxjE=^ypE5<|sz8BFYu!n|tH!a=OFH<{IhRHm^kR3z(mk!wc z>Lmt>ZN;Dll{Rxh(Fu3b>$+oH3jlExR?SY5=+XdK@dHQXEBz5Qs%Y|8z9 zLJ0$ZVzr*LG%vegZDDDA5JDdq`6V90cP}I9ps_3JqDGjWym`*8S6P4Tz|X_Imm9cg zpfUcY>PO@&!;jL^o40le3Li>OaT_QHlbYYch)D)%ip6lL1Hg5k)vN~@D9u7Zam-xM z``k&yHCc3?H4E(*jZsAh=JFMoOtzSY7I%rt!nPD*;HUACAFOw1tNR8LyKJ`aa65KR z!U3C4j&gRsZs-fF8;B?P=xF6DSc271&$M(-ll#g<_Id%0pC@n+ug*2D3uTG}H@COO z($YgiGUNsqir*QxOI`S*0-qR}^N8^4Z}^W-+V1Y-+!q3W7TFk{k<918xkg9@^>Z4cBQwX_ppW_C7KyDFy7jHHyNyrziUd-{e&K&5X>S?` z;c20om5!X^0~M|gy*w=3K)0pN^*<*@CCP2d%6eZRG0Z*x{;QmNo}Xi#GJi#J)RTmE z9vz|W`~vH3)*D&_-HI>RU;VSVOpWcordiv{@!~M-*>+=}U~{Re;J#0B>8N|hTeLqD zJ3caFHT^6dNWRCct=wy!rftg}VGw{gQpL!rGx#&}bm`nNLUw4=Nxi){YN+~7U4;wS zddUnvZ_uP!B<`9qmpN4V;p;o*mxZ0>kDYDU%hA66lNv;^;S8bJv$+Yg@BppKIg*W= z1i;-K4=EbnsXm4Hru7hARc5hhxGpggnuT9Q9_Wum9JeevIpq!b;LcDo6rQj!j0)Bl ziEdVDA4?kTsBVq0CFdop=0dnN-d?FS^5FP}UjY6-N1*gQ{Lga)3IY@qtH{KwDy^t0 zC~q#P$t|reZmKFOFct%bcQY4Tgck^_ui`bD4#kpO@-bIf(P9W0CjY1&CC7Vy+6=26 zEcPic_h{Ks^SstC5h!Y5(kR}SJ+#A>%;5DjAH(8wo@cX?l6%ZH_3R6EDk;@X zVBw8pk7|20Wt=lYj(A?6bz9peM<7B2qR^JJaqnQ=2=)r2=yR6mKRX6CgF@4YBm#q7t2N`RXqx4O5 zn&D(f&2?R?15Q@vRHeAvFon`-m2M)o=) zM1-`vw9n*n!dazd?AB!v9&2UqHM8LR9HRCKnkwaIP&{cb=U+Id5oT zl@u)NNM{oKbf=hfi@8X}&j{kGkc6 z<+;AK#%jc9;0tJfzJ0k+i`RsVP%i5#jW^LoLauXB8d+<)Ybow)4XvEqX$eJL4bJF{ zi*(%f(1)e_Y%iIZe#f$5pZnla3G65CRemYS0)yR~feux|kRPtks}*h!-9iiQ3}G>g z=k~ZQP51_{JiCm^x@V|m`mv?KaI~YMz{+83Zs`?=Yrw#u5d)2~1*zRq`p>W`b&!vM zniX1JjXyH=#E%PtWD-VQyX>4VqznQiByY=wD*~MtZK2`i0@fX}&mN=u!|KvzboNR! z@^j?(X#9n`{rf1N(*2pP4L|F?;6j zfcKtWR&Tl1L(%3L&~vrUo@~IXVKH<)C!1wY0A+gWik=+)xr=1Zh8|hAmAfBpG}*lf z0uTeT{~fwNCpiO<;&Ufb z0zAF=I!tB6MbGFk8ErIcsmAcXPDopA)$ubx zI?!%6&Z&u1=T+a);d;`1$rwG?vm8`E?Wkq9V9^>nR@z$Ecv@`_uW{~du->FcVGR+) z^7d`$nK6=M4$4W+bUP!AjFg`+;!3JCpE8T8LXyxhYufI8)3@ z{-ilZMzLj6bYYr0o#f;&X)>m0$>H_PMazA20^F%kr&RD~M004-uk6fZ?7h0|*b$ZCPx4&>$*eBs zbtS<8=pMmMLB$mF*R%Mi{ED$am?`euezHQ`!0Pi-eiTIfnYP7z#I_JuK`TaYz5%p5t<4R{x@=g-BP~TO;5USq}PCSI|cG=2#;dCR}+G+PQH;Aj_JU zFWWI|S`?KSVyJ7IJ!`{fnzJ05b?ustPaG#-yiPmcNJ-OJy_h(m z0KDk=1&d~0z$-=KEs`ox{DyoyLO9IesjPgmB)OZl6P%B&pFeW z^_AaxFukueWw24@5?oW3W`)&(vO8*1lVp(x+rOB_LUQCgO)uS#-l=&;nCO!)p zP4Ebgb`e~8g*b6{eMwE3W8$V0zbRfpITC&@e{#SgYOVaH zrQzF1>b&yUe&b#yR$zMZnCy`{Il0MK(N~nE0S;ij>HIz^rfo_JvYa>X3~aL*>az!n z9N@P!{q;jX`d0d-JbN1G!aQqGxIg6-wg+aN=^l<>lxgmydN_HBvVeQlLjAmo1Dfz; zsLnlpHwz`aGL_eaCVmOed#{<_TKbz5c4T6Dor>`bvBAhsY3y7GDima%MSMLHbon;k z2qS-vGFR~~TgJd|rud?nb6}=yZ#w-(v+6uyGw{ldMQ^p}vxGr$;{4_DQZ+^=-;`c= zlov&}MSwe1$K69@E^4QGhEw!*(w+ytjE`0;>VT!ls7hX2`AA!!cFHC--4lHorArBR zi<9m-lGi^_a=aVT1>agtD5g68sH$w8`mv=%o_GiqXGM9J9g!Oes2|KOa#wr2FCDEj zo4**fCWo)VmI^=Gp$ScWFGW>+37=@fgC`gYteoZ@^G}S?`Y?{WrtdiR(tgA&*QFOF zD~vEHiMnd{(L|F(RS|^@(~9*_n080geHH+TtXhVjwRcGITb4f69>``fQCcb|j}$lZ zJe`v8@NOX`P&#zzYYkTVc-%EpFz`XCY3?}EGb-Bv>!S- z&NL*X>Ef~`56;E)1V_ZFbJ1qCeDbw<3Aks3?R(CcSG?&KujQWYOgOeqGNxgU(gXQf z*XiWaV9+#fK?UsL4J-1YrKw8C=M}=%jn0l z^&Ww0?X~QVs!LDHP8bQxx=<#RyG!SeU$v8`lpc^PLhr0BrCXwxEnKwY+|dE)*JPbE zZTuUPlCU^-u87D#&#JNZv6sZrv=j%1+Yb*cW1mCNX0Z9;)&%8ymk`IlPoi;F5ZqB9-6i zek1}_2ZcocIolOXqaP&R3fJ=tVfrw1@DSz9O<@t4CsNSL5?$t?UV8vmO$EOcd)f2*?7+2637=9{0r#?V zuGetv9VbS9WrB>ay#cGc&ple@F#&B1UXjhq*wXDjv(1uTD-12mLdrXPVU=l|N}(u9 z7IaddAOAs}VSjsi>v#8uXjzkg_I)hTA^)V8;@WhmOKHnX%33B9YSq?>yQ~(1%a^Qf U1LFgu%}!PAYO%eVzRv*v2hvqWL;wH) literal 0 HcmV?d00001 diff --git a/mods/carts/textures/carts_cart.png b/mods/carts/textures/carts_cart.png new file mode 100644 index 0000000000000000000000000000000000000000..965347c0f374d91e277104617b780a41fd773b3e GIT binary patch literal 1103 zcmV-V1hD&wP){jSUo0NJt$p5EMP<{U_~xtMJ{7TE@VkDWlJ$o zP*7A_~R#sM5S65tITxx1+ZEbCDZ*OyRb9i`oetv#}f`W&KhmDPmlarI5pP!(h zpsK2>tgNiBudlPSv$?ss!otGI$;s5z)O9Hz761SM0b)x>L;#2d9Y_EG010qNS#tmY z3ljhU3ljkVnw%H_000McNliru;0qH5Fdz>}63YMp0!&FnK~y-)Ws;9q(oht~FJe)E zLyDXYsZ1h>$kix8T11#>8AUyxsrvz?mAC@Lj9<;+U)~)94u{>hd(Jy=pL_3n=lg|= zp3yUmQ5wxQuI4D4U>yA#i=%F}dNLN(8uTjS^$)L;o{f!k@MEst-8z1e$rlQRwY9?A zeExU~E-L98qWH#_%jIUpbfa57RiFI$x)VJ(kTX9^r)BK$)bl=-3X18pCoP`oRF|Kr z>bFFxR9aSLoq|zW@rcRf?8-`NVSBG}uC%{Izwhs7R9TM7YFoh(t3ICReXrJ)3{@IB zZS6+Yot@>~-TmnHUW<-^^&(9aX`@41N`g|FC{wclfnMdEFUIo^X;DGoOjmRZp#1{f z9AN^V@j$ta9nNX%5P#5&RbX`p@-f9ccu*`i^kN@S1_iAmzG8KTe|d-iX88}^!Q2lE ztV_AAq|W7@dD((diP1 z;JJi>WCRE@<1=f-<_93-GYQ!I5P?nMW>yfqS;6gMAY$_an7}6sn3@N$`2mOt#4#6` zsd)l6KM-v*?#?2Rbu+H8Mr?kNG$DQ!0q-Nm?F?&@%?~EvMZm)hfeAnK0U^HVWEjRd zuSqsPNLm)>FWwpgHa`&U`Qs~dfxxui&p84bvH1ZA$2wS+bIr|#9oO)glYRhTx#>_S z14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>rcZ^NvttlZq(;^N}TlP51&u%M}s5$HSy&H|6fVg?3oVGw3ym^DWN zD7etm#W6(UvTuL4P?LgyYknsG$u%2HC%LX&JQXmD?<>rQvFyf;1n<-ZIX7dv(?{mgpOEI`^I_JzF7i?Zj$HE0c*L zb2K~mFrRo=skS@ZZAM{nabw%W@E;{bCHr4H9lqH;F>d{zgDslQ_GyQvER;27T=B@l ojw@3t`~%Bs-z|Mgg|ZCsyLhCy_nt6*4RkDnr>mdKI;Vst0P1j#E&u=k literal 0 HcmV?d00001 diff --git a/mods/carts/textures/carts_cart_side.png b/mods/carts/textures/carts_cart_side.png new file mode 100644 index 0000000000000000000000000000000000000000..f53808c6577f033c884d217af26282394e2e708c GIT binary patch literal 486 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstUx|vage(c z14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>;y3+1?vL1$VK1K@O#`3d4wi>ZcIteb?39fp{ zK;)*E;%S)bZ5SFF8Wt9om6es7n_FC5Tvt~&dGh4>^XD&Euwe7%&4>PP`vP#4_utCA2LW$g1Y83p+GKL7cS z`6;CrACJgIs`Ui<%nW4a(=_&cv^?`z-*ZOJjJ}RN4!Qxt7rt=^C{53}JKb7WBOq(m zlL^8K)30bVU9!Bh`t??w6B|<`p8IS_$$0K_;RwUW>PfeyIu0(bRJ{1s@ekv>%TkB? T8n+w+I-kMQ)z4*}Q$iB}5|f_( literal 0 HcmV?d00001 diff --git a/mods/carts/textures/carts_cart_top.png b/mods/carts/textures/carts_cart_top.png new file mode 100644 index 0000000000000000000000000000000000000000..d9a31a9d2ceea10e003506b3b2dede75644b7ec8 GIT binary patch literal 522 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 Ef;&nLHUIzs literal 0 HcmV?d00001 diff --git a/mods/carts/textures/carts_rail_curved_pwr.png b/mods/carts/textures/carts_rail_curved_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..781bbd0ad6e223803e071b05b19767a802ce2ace GIT binary patch literal 614 zcmV-s0-61ZP)j zK~y-)rIO!kl5rHqKVK*B3=_(zMz)kjg=96h6}#vU2&9OyBnFMBi*B|EhLsSAMr1?< zi>`tZ3?h1|An>LuFULzk&}p{B^o8wbhJ`&h>eo^LfrWN<{dda;&F0 zbv`JwR}Zh4=viAR~Wsl zW11$F_cJ_;54Xes$;ThmQog{$sX4l{-m0G!KG2^9mBTmb_8A5#j-5s=N{m8b@8oG;pibBrR5r~?k-MW zpHrYD773sQ#|ec(D<8@4_hXtScbh4yCQbkV0q03X zK~y-)m6JbcQ&AMge=m9AMX#b11Utw@P;fF5LCMy^QE+l`5%)M17llxSK!ZbuNS6+s zS|nX6q&kSJ5{iNn0t#)oZ9>|HrXl)jUjAK&+q|X*ZT#kQ4(I!w@4%t*`Mgdf5}Ff~ zN~Lr*oAv8#fLt=Bl~M>H$iyQ$>;w^x?Kinz7l3-RjqADqEIhfXAHDcw*#K`oY%+Bf zT-RlPr@>C6&3R$tgaUY-zCY-kFhix3yjt2l+F)+AVog0n1I#Wf>)#fHR!Wgx*|Gov z{HF#MjxktzdP_?wDHICKPe*mj>v4JVGyv7Qhj47XPLJJ&$DlozjOn}2J{kt!RSjDy z0E+81yiT8uvRQ7x!Rz#KLIEyb5lAU{`+ECmgPFyWmA!`+Lh$_1+uxM9?rNnJGmE8B z27me+M)pUA+}&8=3BGmuh_?R&V^2AH3Y`oEA%#&px|`FFo` z!Q^4D=>bp!lu~5k5&ih(7sFtEbC2k4bA|U`%l_@1P=Ni$58r>o?Q-pof%y5`&@ap` oD=T|{%pAmAEv01PUDX2k4GN3zvr-!!H2?qr07*qoM6N<$fCV8v+V!?0wGC6 zK~y-)m6J_KR8bg)pL6Cq<8;6Xj1~qrsJ3Zlf6_u)2kqLlh-m3TkXqzo$QFs&B8iNG zXpwG)qU_IQiy{y$C`^dLJpSOArlOwa-kE#vX>t86G<#QP@f~>I=X*a`Qg3gs&15nb zuxu>b+S+Qf+3d=U1JKiQ!fLHiO3_|liAp=R)R9CMl1a&8J|GA!GxI*i7yuqzs0f{26^RP0l@u1imMZq-3^*LRUU zja5o<_3_B23^G*)tuLV-QI6hUbD zG3Vh(!6cxyroFz>Hr)QW+=HLg9E-Q`=F>Q(DM{Xs*p`xfm|ehlAwmd@7qb6k46$!; u%`IGiq(%13QV*W~qX$P#d`z!%0^m3LBm9nEw3qw<0000_pdYGnWb0wPI7 zK~y-)osvyR6k#03fA72FuIqp$7!?~#qIsG_M1@2L=^Pbxt3yQhf==aOJync#5bOiG zWZ1NmMuxUX-LL{x@2d-&q?M^$hJ2P*GDQlt3dQSg8Jcs8Cz9XN{t86x_ltS?b zD21{tOXYI8HI4uny?RiU+Rsra6lk2jkDk_O)FhFDWKvSD1O%aC`HPR2Ie}@KxMO{s zxi&5|fRSfYbhm@+x~wj)viPM&i{5~gPzw}c1X98#T?4={3e%KaOddG)?w%xaWDC!Q}K3DaQfey|aW{iTE&^KnTzz_%%f}h)765rbEXt z3`U2G_0n>=oU$zIuQg_~*}59#dj2*70dTKpzv?(TfNk4s`#eHADJgp)sib5_YnrK| zOR_;y{u<&NCuwVIqx8b!?Ddy%24ipMY1kcS@NQ}eEg`8?LlOe!i%DERBnT7{(A*lU z9G@uu+(G~Fj5u&A_TE12Q7-@kGNz?}6bc18y&+sL z#IJ=cm#XaCsuP5YkE3{|@r`{2J#Qs45JfUoOA800000NkvXXu0mjf=&2yY literal 0 HcmV?d00001 diff --git a/mods/carts/textures/carts_rail_t_junction.png b/mods/carts/textures/carts_rail_t_junction.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1b946242544b69c643df109dbd6c0b10df4b92 GIT binary patch literal 707 zcmV;!0zCbRP)VYK$K`w5h)#fdNq@)O>ZBUDF(;~t@z)dtn!5apm8iQJd zwTKo{2+gC=>Q$Q}D5x35Mcir=JjV((%f#{JjLw_WVrCv1_T#|eayj37&-a|~7ZE{3 z$Ye6&IF8irf67!UCFyiJ!WkmM(@O^>-`g!Dwmr9gEVQ!&F zq4gNHZ4-?4bFzQbhygr&H9>bf1VO<3>^!pzE3{a3m?o^0gs=>z37f1K07@xx#Bp6$ zVgLh=J{hj-3c!WC69(%!H8Z?-$o~#q&J0*0dKMV@=(UFy6%j5;6EV`HhBL4glM>(Hfd}+4#QC@`pi+ zD?+wZW`k+a+F_xT;>pM~hk;0*bUH1mR7(COspB|nWHeXL6$AkQxhk9g2}48}I=4?c zj$Xs_yy^%#I=h;lF)sON8mw&=Gp`3I1I=41EXUqY(_35O)#1s=2bN`#ytl>+qLji50xZjl#=P!*HrDt+ zDTUUWcs#zwNIgA0Ms+VzW2lrOkw{3igPW)J$mXsy_`c81!Z1N0q_`3?mtSW4R*O<7 ze4Q^4GYw{1j$qq%)U@h@?{s!mRCxLJ3ylpXOT{u98%)N3&J7Zj7#0h@yzu=~<@dmTA#-I1VhAg?I%V2by&X0M~U1xkxUT zlN7+6=U-GVmlJ^NUWkY&)0wFcmRPlqHb41b!WZeOLV@B2jl1Ky0pbe+73 zwHB>4XL@_9Bpw6c!{;eZ*9zPk8c%$nwdUI6vDH2h*L9OZwJ`@?OfaC7s46)Wi$%%j z^JFra4UOdcKIwEikz9!gcQ5Rht(}($f`GQt5K$>+aXDsYeu>@NHRV|NHd`X)D89BF z#Tb)Vy6S@;baYl!c>8gJ#s-Il#TA+w97cZ56P03=QbeVgJ%=kKJ{{=h;p<8DS08Nj govpP}C=`;MKcb3xV4`WA^Z)<=07*qoM6N<$g3BW@R{#J2 literal 0 HcmV?d00001 diff --git a/mods/carts/textures/carts_rail_t_junction_pwr.png b/mods/carts/textures/carts_rail_t_junction_pwr.png new file mode 100644 index 0000000000000000000000000000000000000000..dd0eede22302af3278a9ca5acef885b748055f63 GIT binary patch literal 697 zcmV;q0!ICbP)|Nj>vf{0Kk z6vTDia$4H^b0OJmR&u#qQlmtK=NER%Oj9R85KuePi@i2QZOURvpt{=P`|Ki%u`oG3 zN3roBT5F<#9uD^ms1(4H*TZx)K@>$yO-wN{y+DIqg=N9Qq7W~EWkJ220>E(`Lb}Q4 z^O6F%{`8~D=ko$^{y_+cVntNWgCHObLyR#1q*fMso=Yb4EAQ{`m*s#;WHRRfN*vrj zvqPE>T*LQ$05<>d*-&52e9Q3!SOIvRi`JUDp(~_MzbSDrH1dU-Fa$trjWMvUMH2); z0z9^N6KgC*<1QP=ad`G$<IFGTS+fF=(yvJQq*`N^WOWTa7V9<}NP>V>%99 z!t-2g+ot>C$uf!i0eJgioFkP6m-|K%AK11{=Hc*iABf{PNh2tYdBYzClqeBN^!9zf z%=+p^GRBZjrxVGQh;ZvftE_K7MGyou7yF2cF>?zslQZ*d*=VyE3!kToq%6g!hJ9$Q z6HAwU@Rhdqk_xZhjZ#}q? -Copyright (C) 2016 Jean-Patrick G. (kilbith) - -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. +Authors of source code +---------------------- +Originally by Perttu Ahola (celeron55) (MIT) +Jean-Patrick G. (kilbith) (MIT) +Author of media (textures) +-------------------------- +Jean-Patrick G. (kilbith) (CC BY-SA 3.0) diff --git a/mods/creative/depends.txt b/mods/creative/depends.txt index 4ad96d5..975e652 100644 --- a/mods/creative/depends.txt +++ b/mods/creative/depends.txt @@ -1 +1,2 @@ default +sfinv diff --git a/mods/creative/init.lua b/mods/creative/init.lua index bc4687f..51d6f79 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,225 +1,22 @@ --- minetest/creative/init.lua - creative = {} -local player_inventory = {} -local creative_mode = minetest.setting_getbool("creative_mode") --- Create detached creative inventory after loading all mods -creative.init_creative_inventory = function(player) - local player_name = player:get_player_name() - player_inventory[player_name] = {} - player_inventory[player_name].size = 0 - player_inventory[player_name].filter = "" - player_inventory[player_name].start_i = 1 - player_inventory[player_name].tab_id = 2 +local creative_mode_cache = minetest.settings:get_bool("creative_mode") - minetest.create_detached_inventory("creative_" .. player_name, { - allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) - if creative_mode and not to_list == "main" then - return count - else - return 0 - end - end, - allow_put = function(inv, listname, index, stack, player) - return 0 - end, - allow_take = function(inv, listname, index, stack, player) - if creative_mode then - return -1 - else - return 0 - end - end, - on_move = function(inv, from_list, from_index, to_list, to_index, count, player) - end, - on_put = function(inv, listname, index, stack, player) - end, - on_take = function(inv, listname, index, stack, player) - local player_name, stack_name = player:get_player_name(), stack:get_name() - --print(player_name .. " takes item from creative inventory; listname = " .. listname .. ", index = " .. index .. ", stack = " .. dump(stack:to_table())) - if stack then - minetest.log("action", player_name .. " takes " .. stack_name .. " from creative inventory") - --print("Stack name: " .. stack_name .. ", Stack count: " .. stack:get_count()) - end - end, - }) - - creative.update_creative_inventory(player_name) - --print("creative inventory size: " .. player_inventory[player_name].size) +function creative.is_enabled_for(name) + return creative_mode_cache end -local function tab_category(tab_id) - local id_category = { - nil, -- Reserved for crafting tab. - minetest.registered_items, - minetest.registered_nodes, - minetest.registered_tools, - minetest.registered_craftitems - } +dofile(minetest.get_modpath("creative") .. "/inventory.lua") - -- If index out of range, show default ("All") page. - return id_category[tab_id] or id_category[2] -end - -function creative.update_creative_inventory(player_name) - local creative_list = {} - local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) - local inv = player_inventory[player_name] - - for name, def in pairs(tab_category(inv.tab_id)) do - if not (def.groups.not_in_creative_inventory == 1) and - def.description and def.description ~= "" and - (def.name:find(inv.filter, 1, true) or - def.description:lower():find(inv.filter, 1, true)) then - creative_list[#creative_list+1] = name - end - end - - table.sort(creative_list) - player_inv:set_size("main", #creative_list) - player_inv:set_list("main", creative_list) - inv.size = #creative_list -end - --- Create the trash field -local trash = minetest.create_detached_inventory("creative_trash", { - -- Allow the stack to be placed and remove it in on_put() - -- This allows the creative inventory to restore the stack - allow_put = function(inv, listname, index, stack, player) - if creative_mode then - return stack:get_count() - else - return 0 - end - end, - on_put = function(inv, listname) - inv:set_list(listname, {}) - end, -}) -trash:set_size("main", 1) - -creative.formspec_add = "" - -creative.set_creative_formspec = function(player, start_i) - local player_name = player:get_player_name() - local inv = player_inventory[player_name] - local pagenum = math.floor(start_i / (3*8) + 1) - local pagemax = math.ceil(inv.size / (3*8)) - - player:set_inventory_formspec([[ - size[8,8.6] - image[4.06,3.4;0.8,0.8;creative_trash_icon.png] - list[current_player;main;0,4.7;8,1;] - list[current_player;main;0,5.85;8,3;8] - list[detached:creative_trash;main;4,3.3;1,1;] - listring[] - tablecolumns[color;text;color;text] - tableoptions[background=#00000000;highlight=#00000000;border=false] - button[5.4,3.2;0.8,0.9;creative_prev;<] - button[7.25,3.2;0.8,0.9;creative_next;>] - button[2.1,3.4;0.8,0.5;creative_search;?] - button[2.75,3.4;0.8,0.5;creative_clear;X] - tooltip[creative_search;Search] - tooltip[creative_clear;Reset] - listring[current_player;main] - ]] .. - "field[0.3,3.5;2.2,1;creative_filter;;" .. inv.filter .. "]" .. - "listring[detached:creative_" .. player_name .. ";main]" .. - "tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;" .. tostring(inv.tab_id) .. ";true;false]" .. - "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. - "table[6.05,3.35;1.15,0.5;pagenum;#FFFF00," .. tostring(pagenum) .. ",#FFFFFF,/ " .. tostring(pagemax) .. "]" .. - default.get_hotbar_bg(0,4.7) .. - default.gui_bg .. default.gui_bg_img .. default.gui_slots - .. creative.formspec_add - ) -end - -creative.set_crafting_formspec = function(player) - player:set_inventory_formspec([[ - size[8,8.6] - list[current_player;craft;2,0.75;3,3;] - list[current_player;craftpreview;6,1.75;1,1;] - list[current_player;main;0,4.7;8,1;] - list[current_player;main;0,5.85;8,3;8] - list[detached:creative_trash;main;0,2.75;1,1;] - image[0.06,2.85;0.8,0.8;creative_trash_icon.png] - image[5,1.75;1,1;gui_furnace_arrow_bg.png^[transformR270] - tabheader[0,0;creative_tabs;Crafting,All,Nodes,Tools,Items;1;true;false] - listring[current_player;main] - listring[current_player;craft] - ]] .. - default.get_hotbar_bg(0,4.7) .. - default.gui_bg .. default.gui_bg_img .. default.gui_slots - ) -end - -minetest.register_on_joinplayer(function(player) - -- If in creative mode, modify player's inventory forms - if not creative_mode then - return - end - creative.init_creative_inventory(player) - creative.set_creative_formspec(player, 0) -end) - -minetest.register_on_player_receive_fields(function(player, formname, fields) - if formname ~= "" or not creative_mode then - return - end - - local player_name = player:get_player_name() - local inv = player_inventory[player_name] - - if fields.quit then - if inv.tab_id == 1 then - creative.set_crafting_formspec(player) - end - elseif fields.creative_tabs then - local tab = tonumber(fields.creative_tabs) - inv.tab_id = tab - - if tab == 1 then - creative.set_crafting_formspec(player) - else - creative.update_creative_inventory(player_name) - creative.set_creative_formspec(player, 0) - end - elseif fields.creative_clear then - inv.filter = "" - creative.update_creative_inventory(player_name) - creative.set_creative_formspec(player, 0) - elseif fields.creative_search then - inv.filter = fields.creative_filter:lower() - creative.update_creative_inventory(player_name) - creative.set_creative_formspec(player, 0) - else - local formspec = player:get_inventory_formspec() - local start_i = player_inventory[player_name].start_i or 0 - - if fields.creative_prev then - start_i = start_i - 3*8 - if start_i < 0 then - start_i = inv.size - (inv.size % (3*8)) - if inv.size == start_i then - start_i = math.max(0, inv.size - (3*8)) - end - end - elseif fields.creative_next then - start_i = start_i + 3*8 - if start_i >= inv.size then - start_i = 0 - end - end - - player_inventory[player_name].start_i = start_i - creative.set_creative_formspec(player, start_i) - end -end) - -if creative_mode then - local digtime = 0.5 - local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 3} +if creative_mode_cache then + -- Dig time is modified according to difference (leveldiff) between tool + -- 'maxlevel' and node 'level'. Digtime is divided by the larger of + -- leveldiff and 1. + -- To speed up digging in creative, hand 'maxlevel' and 'digtime' have been + -- increased such that nodes of differing levels have an insignificant + -- effect on digtime. + local digtime = 42 + local caps = {times = {digtime, digtime, digtime}, uses = 0, maxlevel = 256} minetest.register_item(":", { type = "none", @@ -239,22 +36,27 @@ if creative_mode then damage_groups = {fleshy = 10}, } }) +end - minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) - return true - end) +-- Unlimited node placement +minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return creative.is_enabled_for(placer:get_player_name()) +end) - function minetest.handle_node_drops(pos, drops, digger) - if not digger or not digger:is_player() then - return - end - local inv = digger:get_inventory() - if inv then - for _, item in ipairs(drops) do - item = ItemStack(item):get_name() - if not inv:contains_item("main", item) then - inv:add_item("main", item) - end +-- Don't pick up if the item is already in the inventory +local old_handle_node_drops = minetest.handle_node_drops +function minetest.handle_node_drops(pos, drops, digger) + if not digger or not digger:is_player() then + return + end + if not creative.is_enabled_for(digger:get_player_name()) then + return old_handle_node_drops(pos, drops, digger) + end + local inv = digger:get_inventory() + if inv then + for _, item in ipairs(drops) do + if not inv:contains_item("main", item, true) then + inv:add_item("main", item) end end end diff --git a/mods/creative/inventory.lua b/mods/creative/inventory.lua new file mode 100644 index 0000000..0e1d813 --- /dev/null +++ b/mods/creative/inventory.lua @@ -0,0 +1,177 @@ +local player_inventory = {} + +function creative.init_creative_inventory(player) + local player_name = player:get_player_name() + player_inventory[player_name] = { + size = 0, + filter = "", + start_i = 0 + } + + minetest.create_detached_inventory("creative_" .. player_name, { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + if not to_list == "main" then + return count + else + return 0 + end + end, + allow_put = function(inv, listname, index, stack, player2) + return 0 + end, + allow_take = function(inv, listname, index, stack, player2) + return -1 + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player2) + end, + on_put = function(inv, listname, index, stack, player2) + end, + on_take = function(inv, listname, index, stack, player2) + if stack and stack:get_count() > 0 then + minetest.log("action", player_name .. " takes " .. stack:get_name().. " from creative inventory") + end + end, + }, player_name) + + return player_inventory[player_name] +end + +function creative.update_creative_inventory(player_name, tab_content) + local creative_list = {} + local inv = player_inventory[player_name] or + creative.init_creative_inventory(minetest.get_player_by_name(player_name)) + local player_inv = minetest.get_inventory({type = "detached", name = "creative_" .. player_name}) + + for name, def in pairs(tab_content) do + if not (def.groups.not_in_creative_inventory == 1) and + def.description and def.description ~= "" and + (def.name:find(inv.filter, 1, true) or + def.description:lower():find(inv.filter, 1, true)) then + creative_list[#creative_list+1] = name + end + end + + table.sort(creative_list) + player_inv:set_size("main", #creative_list) + player_inv:set_list("main", creative_list) + inv.size = #creative_list +end + +-- Create the trash field +local trash = minetest.create_detached_inventory("creative_trash", { + -- Allow the stack to be placed and remove it in on_put() + -- This allows the creative inventory to restore the stack + allow_put = function(inv, listname, index, stack, player) + return stack:get_count() + end, + on_put = function(inv, listname) + inv:set_list(listname, {}) + end, +}) +trash:set_size("main", 1) + +creative.formspec_add = "" + +function creative.register_tab(name, title, items) + sfinv.register_page("creative:" .. name, { + title = title, + is_in_nav = function(self, player, context) + return creative.is_enabled_for(player:get_player_name()) + end, + get = function(self, player, context) + local player_name = player:get_player_name() + creative.update_creative_inventory(player_name, items) + local inv = player_inventory[player_name] + local start_i = inv.start_i or 0 + local pagenum = math.floor(start_i / (3*8) + 1) + local pagemax = math.ceil(inv.size / (3*8)) + return sfinv.make_formspec(player, context, + "label[6.2,3.35;" .. minetest.colorize("#FFFF00", tostring(pagenum)) .. " / " .. tostring(pagemax) .. "]" .. + [[ + image[4.06,3.4;0.8,0.8;creative_trash_icon.png] + listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF] + list[current_player;main;0,4.7;8,1;] + list[current_player;main;0,5.85;8,3;8] + list[detached:creative_trash;main;4,3.3;1,1;] + listring[] + button[5.4,3.2;0.8,0.9;creative_prev;<] + button[7.25,3.2;0.8,0.9;creative_next;>] + button[2.1,3.4;0.8,0.5;creative_search;?] + button[2.75,3.4;0.8,0.5;creative_clear;X] + tooltip[creative_search;Search] + tooltip[creative_clear;Reset] + listring[current_player;main] + field_close_on_enter[creative_filter;false] + ]] .. + "field[0.3,3.5;2.2,1;creative_filter;;" .. minetest.formspec_escape(inv.filter) .. "]" .. + "listring[detached:creative_" .. player_name .. ";main]" .. + "list[detached:creative_" .. player_name .. ";main;0,0;8,3;" .. tostring(start_i) .. "]" .. + default.get_hotbar_bg(0,4.7) .. + default.gui_bg .. default.gui_bg_img .. default.gui_slots + .. creative.formspec_add, false) + end, + on_enter = function(self, player, context) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + if inv then + inv.start_i = 0 + end + end, + on_player_receive_fields = function(self, player, context, fields) + local player_name = player:get_player_name() + local inv = player_inventory[player_name] + assert(inv) + + if fields.creative_clear then + inv.start_i = 0 + inv.filter = "" + creative.update_creative_inventory(player_name, items) + sfinv.set_player_inventory_formspec(player, context) + elseif fields.creative_search or + fields.key_enter_field == "creative_filter" then + inv.start_i = 0 + inv.filter = fields.creative_filter:lower() + creative.update_creative_inventory(player_name, items) + sfinv.set_player_inventory_formspec(player, context) + elseif not fields.quit then + local start_i = inv.start_i or 0 + + if fields.creative_prev then + start_i = start_i - 3*8 + if start_i < 0 then + start_i = inv.size - (inv.size % (3*8)) + if inv.size == start_i then + start_i = math.max(0, inv.size - (3*8)) + end + end + elseif fields.creative_next then + start_i = start_i + 3*8 + if start_i >= inv.size then + start_i = 0 + end + end + + inv.start_i = start_i + sfinv.set_player_inventory_formspec(player, context) + end + end + }) +end + +minetest.register_on_joinplayer(function(player) + creative.update_creative_inventory(player:get_player_name(), minetest.registered_items) +end) + +creative.register_tab("all", "All", minetest.registered_items) +creative.register_tab("nodes", "Nodes", minetest.registered_nodes) +creative.register_tab("tools", "Tools", minetest.registered_tools) +creative.register_tab("craftitems", "Items", minetest.registered_craftitems) + +local old_homepage_name = sfinv.get_homepage_name +function sfinv.get_homepage_name(player) + if creative.is_enabled_for(player:get_player_name()) then + return "creative:all" + else + return old_homepage_name(player) + end +end diff --git a/mods/creative/license.txt b/mods/creative/license.txt new file mode 100644 index 0000000..4ad1d5f --- /dev/null +++ b/mods/creative/license.txt @@ -0,0 +1,60 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 Perttu Ahola (celeron55) +Copyright (C) 2015-2016 Jean-Patrick G. (kilbith) + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures) +---------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2016 Jean-Patrick G. (kilbith) + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/mods/doors/README.txt b/mods/doors/README.txt index b1c1363..9ad7093 100644 --- a/mods/doors/README.txt +++ b/mods/doors/README.txt @@ -1,62 +1,62 @@ Minetest Game mod: doors ======================== -version: 2.0 +See license.txt for license information. -License of source code: ------------------------ -Copyright (C) 2012 PilzAdam -modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor) -Steel trapdoor added by sofar. -Copyright (C) 2016 sofar@foo-projects.org -Re-implemented most of the door algorithms, added meshes, UV wrapped texture +Authors of source code +---------------------- +Originally by PilzAdam (MIT) + +Modified by BlockMen (MIT): Added sounds, glass doors (glass, obsidian glass) and trapdoor. + +Modified by sofar (sofar@foo-projects.org) (MIT): +Added Steel trapdoor. +Re-implemented most of the door algorithms, added meshes, UV wrapped texture. Added doors API to facilitate coding mods accessing and operating doors. -Added Fence Gate model, code, and sounds +Added Fence Gate model, code, and sounds. -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. +Various Minetest developers and contributors (MIT) -License of textures --------------------------------------- -following Textures created by Fernando Zapata (CC BY-SA 3.0): + +Authors of media (textures) +--------------------------- +Following textures created by Fernando Zapata (CC BY-SA 3.0): door_wood.png door_wood_a.png door_wood_a_r.png door_wood_b.png door_wood_b_r.png -following Textures created by BlockMen (WTFPL): +Following textures created by BlockMen (CC BY-SA 3.0): door_trapdoor.png door_obsidian_glass_side.png -following textures created by celeron55 (CC BY-SA 3.0): +Following textures created by celeron55 (CC BY-SA 3.0): door_glass_a.png door_glass_b.png -following Textures created by PenguinDad (CC BY-SA 4.0): +Following textures created by PenguinDad (CC BY-SA 4.0): door_glass.png door_obsidian_glass.png -following textures created by sofar (CC-BY-SA-3.0) +Following textures created by sofar (CC-BY-SA-3.0): doors_trapdoor_steel.png doors_trapdoor_steel_side.png door_trapdoor_side.png - -Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen: WTFPL +Obsidian door textures by red-001 based on textures by Pilzadam and BlockMen (CC BY-SA 3.0): door_obsidian_glass.png -Glass door textures by red-001 based on textures by celeron55: CC BY-SA 3.0 +Glass door textures by red-001 based on textures by celeron55 (CC BY-SA 3.0): door_glass.png -All other textures (created by PilzAdam): WTFPL + +All other textures (created by PilzAdam) (CC BY-SA 3.0): Door textures were converted to the new texture map by sofar, paramat and red-001, under the same license as the originals. -Models: --------------------------------------- + +Authors of media (models) +------------------------- Door 3d models by sofar (CC-BY-SA-3.0) - door_a.obj - door_b.obj @@ -64,18 +64,21 @@ Fence gate models by sofar (CC-BY-SA-3.0) - fencegate_open.obj - fencegate_closed.obj -License of sounds --------------------------------------- + +Authors of media (sounds) +------------------------- Opening-Sound created by CGEffex (CC BY 3.0), modified by BlockMen door_open.ogg Closing-Sound created by bennstir (CC BY 3.0) door_close.ogg fencegate_open.ogg: - http://www.freesound.org/people/mhtaylor67/sounds/126041/ - CC0 + http://www.freesound.org/people/mhtaylor67/sounds/126041/ - (CC0 1.0) fencegate_close.ogg: - http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - CC-BY-3.0 - http://www.freesound.org/people/rivernile7/sounds/249573/ - CC-BY-3.0 -Steel door sounds (open & close (CC-BY-3.0) by HazMatt + http://www.freesound.org/people/BarkersPinhead/sounds/274807/ - (CC-BY-3.0) + http://www.freesound.org/people/rivernile7/sounds/249573/ - (CC-BY-3.0) +Steel door sounds open & close (CC-BY-3.0) by HazMatt - http://www.freesound.org/people/HazMattt/sounds/187283/ doors_steel_door_open.ogg doors_steel_door_close.ogg +doors_glass_door_open.ogg, doors_glass_door_close.ogg: + https://www.freesound.org/people/SkeetMasterFunk69/sounds/235546/ (CC0 1.0) diff --git a/mods/doors/init.lua b/mods/doors/init.lua index 90ddcc3..371b43a 100644 --- a/mods/doors/init.lua +++ b/mods/doors/init.lua @@ -1,12 +1,3 @@ - ---[[ - -Copyright (C) 2012 PilzAdam - modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor) -Copyright (C) 2015 - Auke Kok - ---]] - -- our API object doors = {} @@ -15,9 +6,19 @@ local _doors = {} _doors.registered_doors = {} _doors.registered_trapdoors = {} +local function replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("doors_owner") + if owner and owner ~= "" then + meta:set_string("owner", owner) + meta:set_string("doors_owner", "") + end +end + -- returns an object to a door object or nil function doors.get(pos) - if _doors.registered_doors[minetest.get_node(pos).name] then + local node_name = minetest.get_node(pos).name + if _doors.registered_doors[node_name] then -- A normal upright door return { pos = pos, @@ -25,23 +26,23 @@ function doors.get(pos) if self:state() then return false end - return _doors.door_toggle(self.pos, player) + return _doors.door_toggle(self.pos, nil, player) end, close = function(self, player) if not self:state() then return false end - return _doors.door_toggle(self.pos, player) + return _doors.door_toggle(self.pos, nil, player) end, toggle = function(self, player) - return _doors.door_toggle(self.pos, player) + return _doors.door_toggle(self.pos, nil, player) end, state = function(self) local state = minetest.get_meta(self.pos):get_int("state") return state %2 == 1 end } - elseif _doors.registered_trapdoors[minetest.get_node(pos).name] then + elseif _doors.registered_trapdoors[node_name] then -- A trapdoor return { pos = pos, @@ -49,20 +50,19 @@ function doors.get(pos) if self:state() then return false end - return _doors.trapdoor_toggle(self.pos, player) + return _doors.trapdoor_toggle(self.pos, nil, player) end, close = function(self, player) if not self:state() then return false end - return _doors.trapdoor_toggle(self.pos, player) + return _doors.trapdoor_toggle(self.pos, nil, player) end, toggle = function(self, player) - return _doors.trapdoor_toggle(self.pos, player) + return _doors.trapdoor_toggle(self.pos, nil, player) end, state = function(self) - local name = minetest.get_node(pos).name - return name:sub(-5) == "_open" + return minetest.get_node(self.pos).name:sub(-5) == "_open" end } else @@ -91,7 +91,7 @@ minetest.register_node("doors:hidden", { on_blast = function() end, tiles = {"doors_blank.png"}, -- 1px transparent block inside door hinge near node top. - nodebox = { + node_box = { type = "fixed", fixed = {-15/32, 13/32, -15/32, -13/32, 1/2, -13/32}, }, @@ -105,56 +105,55 @@ minetest.register_node("doors:hidden", { -- table used to aid door opening/closing local transform = { { - { v = "_a", param2 = 3 }, - { v = "_a", param2 = 0 }, - { v = "_a", param2 = 1 }, - { v = "_a", param2 = 2 }, + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, }, { - { v = "_b", param2 = 1 }, - { v = "_b", param2 = 2 }, - { v = "_b", param2 = 3 }, - { v = "_b", param2 = 0 }, + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, }, { - { v = "_b", param2 = 1 }, - { v = "_b", param2 = 2 }, - { v = "_b", param2 = 3 }, - { v = "_b", param2 = 0 }, + {v = "_b", param2 = 1}, + {v = "_b", param2 = 2}, + {v = "_b", param2 = 3}, + {v = "_b", param2 = 0}, }, { - { v = "_a", param2 = 3 }, - { v = "_a", param2 = 0 }, - { v = "_a", param2 = 1 }, - { v = "_a", param2 = 2 }, + {v = "_a", param2 = 3}, + {v = "_a", param2 = 0}, + {v = "_a", param2 = 1}, + {v = "_a", param2 = 2}, }, } -function _doors.door_toggle(pos, clicker) +function _doors.door_toggle(pos, node, clicker) local meta = minetest.get_meta(pos) - local def = minetest.registered_nodes[minetest.get_node(pos).name] + node = node or minetest.get_node(pos) + local def = minetest.registered_nodes[node.name] local name = def.door.name local state = meta:get_string("state") if state == "" then -- fix up lvm-placed right-hinged doors, default closed - if minetest.get_node(pos).name:sub(-2) == "_b" then + if node.name:sub(-2) == "_b" then state = 2 + else + state = 0 end else state = tonumber(state) end - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - local owner = meta:get_string("doors_owner") - if owner ~= "" then - if clicker:get_player_name() ~= owner then - return false - end - end + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false end - local old = state -- until Lua-5.2 we have no bitwise operators :( if state % 2 == 1 then state = state - 1 @@ -162,11 +161,13 @@ function _doors.door_toggle(pos, clicker) state = state + 1 end - local dir = minetest.get_node(pos).param2 + local dir = node.param2 if state % 2 == 0 then - minetest.sound_play(def.door.sounds[1], {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play(def.door.sounds[1], + {pos = pos, gain = 0.3, max_hear_distance = 10}) else - minetest.sound_play(def.door.sounds[2], {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.sound_play(def.door.sounds[2], + {pos = pos, gain = 0.3, max_hear_distance = 10}) end minetest.swap_node(pos, { @@ -179,21 +180,34 @@ function _doors.door_toggle(pos, clicker) end -local function on_place_node(place_to, newnode, placer, oldnode, itemstack, pointed_thing) +local function on_place_node(place_to, newnode, + placer, oldnode, itemstack, pointed_thing) -- Run script hook - local _, callback - for _, callback in ipairs(core.registered_on_placenodes) do + for _, callback in ipairs(minetest.registered_on_placenodes) do -- Deepcopy pos, node and pointed_thing because callback can modify them local place_to_copy = {x = place_to.x, y = place_to.y, z = place_to.z} - local newnode_copy = {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} - local oldnode_copy = {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} + local newnode_copy = + {name = newnode.name, param1 = newnode.param1, param2 = newnode.param2} + local oldnode_copy = + {name = oldnode.name, param1 = oldnode.param1, param2 = oldnode.param2} local pointed_thing_copy = { type = pointed_thing.type, above = vector.new(pointed_thing.above), under = vector.new(pointed_thing.under), ref = pointed_thing.ref, } - callback(place_to_copy, newnode_copy, placer, oldnode_copy, itemstack, pointed_thing_copy) + callback(place_to_copy, newnode_copy, placer, + oldnode_copy, itemstack, pointed_thing_copy) + end +end + +local function can_dig_door(pos, digger) + replace_old_owner_information(pos) + if default.can_interact_with_node(digger, pos) then + return true + else + minetest.record_protection_violation(pos, digger:get_player_name()) + return false end end @@ -212,8 +226,8 @@ function doors.register(name, def) local h = meta:get_int("right") + 1 local p2 = node.param2 local replace = { - { { type = "a", state = 0 }, { type = "a", state = 3 } }, - { { type = "b", state = 1 }, { type = "b", state = 2 } } + {{type = "a", state = 0}, {type = "a", state = 3}}, + {{type = "b", state = 1}, {type = "b", state = 2}} } local new = replace[l][h] -- retain infotext and doors_owner fields @@ -240,9 +254,10 @@ function doors.register(name, def) minetest.register_craftitem(":" .. name, { description = def.description, inventory_image = def.inventory_image, + groups = table.copy(def.groups), on_place = function(itemstack, placer, pointed_thing) - local pos = nil + local pos if not pointed_thing.type == "node" then return itemstack @@ -250,9 +265,10 @@ function doors.register(name, def) local node = minetest.get_node(pointed_thing.under) local pdef = minetest.registered_nodes[node.name] - if pdef and pdef.on_rightclick then + if pdef and pdef.on_rightclick and + not placer:get_player_control().sneak then return pdef.on_rightclick(pointed_thing.under, - node, placer, itemstack) + node, placer, itemstack, pointed_thing) end if pdef and pdef.buildable_to then @@ -266,8 +282,11 @@ function doors.register(name, def) end end - local above = { x = pos.x, y = pos.y + 1, z = pos.z } - if not minetest.registered_nodes[minetest.get_node(above).name].buildable_to then + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local top_node = minetest.get_node_or_nil(above) + local topdef = top_node and minetest.registered_nodes[top_node.name] + + if not topdef or not topdef.buildable_to then return itemstack end @@ -279,10 +298,10 @@ function doors.register(name, def) local dir = minetest.dir_to_facedir(placer:get_look_dir()) local ref = { - { x = -1, y = 0, z = 0 }, - { x = 0, y = 0, z = 1 }, - { x = 1, y = 0, z = 0 }, - { x = 0, y = 0, z = -1 }, + {x = -1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}, } local aside = { @@ -305,35 +324,31 @@ function doors.register(name, def) meta:set_int("state", state) if def.protected then - local pn = placer:get_player_name() - meta:set_string("doors_owner", pn) + meta:set_string("owner", pn) meta:set_string("infotext", "Owned by " .. pn) end - if not minetest.setting_getbool("creative_mode") then + if not (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) then itemstack:take_item() end - on_place_node(pos, minetest.get_node(pos), placer, node, itemstack, pointed_thing) + minetest.sound_play(def.sounds.place, {pos = pos}) + + on_place_node(pos, minetest.get_node(pos), + placer, node, itemstack, pointed_thing) return itemstack end }) + def.inventory_image = nil - local can_dig = function(pos, digger) - if not def.protected then - return true - end - if minetest.check_player_privs(digger, "protection_bypass") then - return true - end - local meta = minetest.get_meta(pos) - local name = "" - if digger then - name = digger:get_player_name() - end - return meta:get_string("doors_owner") == name + if def.recipe then + minetest.register_craft({ + output = name, + recipe = def.recipe, + }) end + def.recipe = nil if not def.sounds then def.sounds = default.node_sound_wood_defaults() @@ -355,22 +370,46 @@ function doors.register(name, def) sounds = { def.sound_close, def.sound_open }, } - def.on_rightclick = function(pos, node, clicker) - _doors.door_toggle(pos, clicker) + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + _doors.door_toggle(pos, node, clicker) + return itemstack end def.after_dig_node = function(pos, node, meta, digger) minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) - nodeupdate({x = pos.x, y = pos.y + 1, z = pos.z}) - end - def.can_dig = function(pos, player) - return can_dig(pos, player) + minetest.check_for_falling({x = pos.x, y = pos.y + 1, z = pos.z}) end def.on_rotate = function(pos, node, user, mode, new_param2) return false end if def.protected then + def.can_dig = can_dig_door def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, "You do not own this locked door.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked door", owner + end else def.on_blast = function(pos, intensity) minetest.remove_node(pos) @@ -384,76 +423,21 @@ function doors.register(name, def) minetest.remove_node({x = pos.x, y = pos.y + 1, z = pos.z}) end - minetest.register_node(":" .. name .. "_a", { - description = def.description, - visual = "mesh", - mesh = "door_a.obj", - tiles = def.tiles, - drawtype = "mesh", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - walkable = true, - is_ground_content = false, - buildable_to = false, - drop = def.drop, - groups = def.groups, - sounds = def.sounds, - door = def.door, - on_rightclick = def.on_rightclick, - after_dig_node = def.after_dig_node, - can_dig = def.can_dig, - on_rotate = def.on_rotate, - on_blast = def.on_blast, - on_destruct = def.on_destruct, - selection_box = { - type = "fixed", - fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} - }, - collision_box = { - type = "fixed", - fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} - }, - }) + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.sunlight_propagates = true + def.walkable = true + def.is_ground_content = false + def.buildable_to = false + def.selection_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} + def.collision_box = {type = "fixed", fixed = {-1/2,-1/2,-1/2,1/2,3/2,-6/16}} - minetest.register_node(":" .. name .. "_b", { - description = def.description, - visual = "mesh", - mesh = "door_b.obj", - tiles = def.tiles, - drawtype = "mesh", - paramtype = "light", - paramtype2 = "facedir", - sunlight_propagates = true, - walkable = true, - is_ground_content = false, - buildable_to = false, - drop = def.drop, - groups = def.groups, - sounds = def.sounds, - door = def.door, - on_rightclick = def.on_rightclick, - after_dig_node = def.after_dig_node, - can_dig = def.can_dig, - on_rotate = def.on_rotate, - on_blast = def.on_blast, - on_destruct = def.on_destruct, - selection_box = { - type = "fixed", - fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} - }, - collision_box = { - type = "fixed", - fixed = { -1/2,-1/2,-1/2,1/2,3/2,-6/16} - }, - }) + def.mesh = "door_a.obj" + minetest.register_node(":" .. name .. "_a", def) - if def.recipe then - minetest.register_craft({ - output = name, - recipe = def.recipe, - }) - end + def.mesh = "door_b.obj" + minetest.register_node(":" .. name .. "_b", def) _doors.registered_doors[name .. "_a"] = true _doors.registered_doors[name .. "_b"] = true @@ -463,7 +447,7 @@ doors.register("door_wood", { tiles = {{ name = "doors_door_wood.png", backface_culling = true }}, description = "Wooden Door", inventory_image = "doors_item_wood.png", - groups = { snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2 }, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, recipe = { {"group:wood", "group:wood"}, {"group:wood", "group:wood"}, @@ -472,11 +456,12 @@ doors.register("door_wood", { }) doors.register("door_steel", { - tiles = {{ name = "doors_door_steel.png", backface_culling = true }}, + tiles = {{name = "doors_door_steel.png", backface_culling = true}}, description = "Steel Door", inventory_image = "doors_item_steel.png", protected = true, - groups = { snappy = 1, bendy = 2, cracky = 1, melty = 2, level = 2 }, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_metal_defaults(), sound_open = "doors_steel_door_open", sound_close = "doors_steel_door_close", recipe = { @@ -487,11 +472,13 @@ doors.register("door_steel", { }) doors.register("door_glass", { - tiles = { "doors_door_glass.png"}, + tiles = {"doors_door_glass.png"}, description = "Glass Door", inventory_image = "doors_item_glass.png", - groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, + groups = {cracky=3, oddly_breakable_by_hand=3}, sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", recipe = { {"default:glass", "default:glass"}, {"default:glass", "default:glass"}, @@ -500,11 +487,13 @@ doors.register("door_glass", { }) doors.register("door_obsidian_glass", { - tiles = { "doors_door_obsidian_glass.png" }, + tiles = {"doors_door_obsidian_glass.png"}, description = "Obsidian Glass Door", inventory_image = "doors_item_obsidian_glass.png", - groups = { snappy=1, cracky=1, oddly_breakable_by_hand=3 }, + groups = {cracky=3}, sounds = default.node_sound_glass_defaults(), + sound_open = "doors_glass_door_open", + sound_close = "doors_glass_door_close", recipe = { {"default:obsidian_glass", "default:obsidian_glass"}, {"default:obsidian_glass", "default:obsidian_glass"}, @@ -538,44 +527,41 @@ end ----trapdoor---- -function _doors.trapdoor_toggle(pos, clicker) - if clicker and not minetest.check_player_privs(clicker, "protection_bypass") then - local meta = minetest.get_meta(pos) - local owner = meta:get_string("doors_owner") - if owner ~= "" then - if clicker:get_player_name() ~= owner then - return false - end - end +function _doors.trapdoor_toggle(pos, node, clicker) + node = node or minetest.get_node(pos) + + replace_old_owner_information(pos) + + if clicker and not default.can_interact_with_node(clicker, pos) then + return false end - local node = minetest.get_node(pos) local def = minetest.registered_nodes[node.name] if string.sub(node.name, -5) == "_open" then - minetest.sound_play(def.sound_close, {pos = pos, gain = 0.3, max_hear_distance = 10}) - minetest.swap_node(pos, {name = string.sub(node.name, 1, string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) + minetest.sound_play(def.sound_close, + {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = string.sub(node.name, 1, + string.len(node.name) - 5), param1 = node.param1, param2 = node.param2}) else - minetest.sound_play(def.sound_open, {pos = pos, gain = 0.3, max_hear_distance = 10}) - minetest.swap_node(pos, {name = node.name .. "_open", param1 = node.param1, param2 = node.param2}) + minetest.sound_play(def.sound_open, + {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.swap_node(pos, {name = node.name .. "_open", + param1 = node.param1, param2 = node.param2}) end end function doors.register_trapdoor(name, def) + if not name:find(":") then + name = "doors:" .. name + end + local name_closed = name local name_opened = name.."_open" - local function check_player_priv(pos, player) - if not def.protected or minetest.check_player_privs(player, "protection_bypass") then - return true - end - local meta = minetest.get_meta(pos) - local pn = player:get_player_name() - return meta:get_string("doors_owner") == pn - end - - def.on_rightclick = function(pos, node, clicker) - _doors.trapdoor_toggle(pos, clicker) + def.on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) + _doors.trapdoor_toggle(pos, node, clicker) + return itemstack end -- Common trapdoor configuration @@ -583,24 +569,48 @@ function doors.register_trapdoor(name, def) def.paramtype = "light" def.paramtype2 = "facedir" def.is_ground_content = false - def.can_dig = check_player_priv if def.protected then + def.can_dig = can_dig_door def.after_place_node = function(pos, placer, itemstack, pointed_thing) local pn = placer:get_player_name() local meta = minetest.get_meta(pos) - meta:set_string("doors_owner", pn) + meta:set_string("owner", pn) meta:set_string("infotext", "Owned by "..pn) - return minetest.setting_getbool("creative_mode") + return (creative and creative.is_enabled_for and creative.is_enabled_for(pn)) end def.on_blast = function() end + def.on_key_use = function(pos, player) + local door = doors.get(pos) + door:toggle(player) + end + def.on_skeleton_key_use = function(pos, player, newsecret) + replace_old_owner_information(pos) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + local pname = player:get_player_name() + + -- verify placer is owner of lockable door + if owner ~= pname then + minetest.record_protection_violation(pos, pname) + minetest.chat_send_player(pname, "You do not own this trapdoor.") + return nil + end + + local secret = meta:get_string("key_lock_secret") + if secret == "" then + secret = newsecret + meta:set_string("key_lock_secret", secret) + end + + return secret, "a locked trapdoor", owner + end else def.on_blast = function(pos, intensity) minetest.remove_node(pos) - minetest.remove_node({ x = pos.x, y = pos.y + 1, z = pos.z}) - return { name } + return {name} end end @@ -627,8 +637,10 @@ function doors.register_trapdoor(name, def) type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -6/16, 0.5} } - def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side, - def.tile_side, def.tile_side } + def_closed.tiles = {def.tile_front, + def.tile_front .. '^[transformFY', + def.tile_side, def.tile_side, + def.tile_side, def.tile_side} def_opened.node_box = { type = "fixed", @@ -638,10 +650,11 @@ function doors.register_trapdoor(name, def) type = "fixed", fixed = {-0.5, -0.5, 6/16, 0.5, 0.5, 0.5} } - def_opened.tiles = { def.tile_side, def.tile_side, + def_opened.tiles = {def.tile_side, def.tile_side, def.tile_side .. '^[transform3', def.tile_side .. '^[transform1', - def.tile_front, def.tile_front } + def.tile_front .. '^[transform46', + def.tile_front .. '^[transform6'} def_opened.drop = name_closed def_opened.groups.not_in_creative_inventory = 1 @@ -659,7 +672,7 @@ doors.register_trapdoor("doors:trapdoor", { wield_image = "doors_trapdoor.png", tile_front = "doors_trapdoor.png", tile_side = "doors_trapdoor_side.png", - groups = {snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=2, door=1}, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2, door = 1}, }) doors.register_trapdoor("doors:trapdoor_steel", { @@ -669,9 +682,10 @@ doors.register_trapdoor("doors:trapdoor_steel", { tile_front = "doors_trapdoor_steel.png", tile_side = "doors_trapdoor_steel_side.png", protected = true, + sounds = default.node_sound_metal_defaults(), sound_open = "doors_steel_door_open", sound_close = "doors_steel_door_close", - groups = {snappy=1, bendy=2, cracky=1, melty=2, level=2, door=1}, + groups = {cracky = 1, level = 2, door = 1}, }) minetest.register_craft({ @@ -698,21 +712,21 @@ function doors.register_fencegate(name, def) local fence = { description = def.description, drawtype = "mesh", - tiles = { def.texture }, + tiles = {def.texture}, paramtype = "light", paramtype2 = "facedir", sunlight_propagates = true, is_ground_content = false, drop = name .. "_closed", - connect_sides = { "left", "right" }, + connect_sides = {"left", "right"}, groups = def.groups, sounds = def.sounds, - on_rightclick = function(pos, clicker) - local node = minetest.get_node(pos) + on_rightclick = function(pos, node, clicker, itemstack, pointed_thing) local node_def = minetest.registered_nodes[node.name] minetest.swap_node(pos, {name = node_def.gate, param2 = node.param2}) minetest.sound_play(node_def.sound, {pos = pos, gain = 0.3, max_hear_distance = 8}) + return itemstack end, selection_box = { type = "fixed", @@ -743,7 +757,7 @@ function doors.register_fencegate(name, def) fence_open.collision_box = { type = "fixed", fixed = {{-1/2, -1/2, -1/4, -3/8, 1/2, 1/4}, - {-5/8, -3/8, -14/16, -3/8, 3/8, 0}}, + {-1/2, -3/8, -1/2, -3/8, 3/8, 0}}, } minetest.register_node(":" .. name .. "_closed", fence_closed) @@ -773,7 +787,7 @@ doors.register_fencegate("doors:gate_acacia_wood", { }) doors.register_fencegate("doors:gate_junglewood", { - description = "Junglewood Fence Gate", + description = "Jungle Wood Fence Gate", texture = "default_junglewood.png", material = "default:junglewood", groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} @@ -783,12 +797,57 @@ doors.register_fencegate("doors:gate_pine_wood", { description = "Pine Fence Gate", texture = "default_pine_wood.png", material = "default:pine_wood", - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} }) doors.register_fencegate("doors:gate_aspen_wood", { description = "Aspen Fence Gate", texture = "default_aspen_wood.png", material = "default:aspen_wood", - groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 2} + groups = {choppy = 3, oddly_breakable_by_hand = 2, flammable = 3} +}) + + +----fuels---- + +minetest.register_craft({ + type = "fuel", + recipe = "doors:trapdoor", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:door_wood", + burntime = 14, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_wood_closed", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_acacia_wood_closed", + burntime = 8, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_junglewood_closed", + burntime = 9, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_pine_wood_closed", + burntime = 6, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "doors:gate_aspen_wood_closed", + burntime = 5, }) diff --git a/mods/doors/license.txt b/mods/doors/license.txt new file mode 100644 index 0000000..8ce73c4 --- /dev/null +++ b/mods/doors/license.txt @@ -0,0 +1,164 @@ +License of source code +---------------------- + +The MIT License (MIT) +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar (sofar@foo-projects.org) +Copyright (C) 2012-2016 Various Minetest developers and contributors + +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. + +For more details: +https://opensource.org/licenses/MIT + + +Licenses of media (textures, models and sounds) +----------------------------------------------- + +Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) +Copyright (C) 2011-2016 Fernando Zapata +Copyright (C) 2014-2016 celeron55 +Copyright (C) 2012-2016 PilzAdam +Copyright (C) 2014-2016 BlockMen +Copyright (C) 2015-2016 sofar +Copyright (C) 2016 red-001 +Copyright (C) 2016 paramat + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/3.0/ + +----------------------- + +Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) +Copyright (C) 2014-2016 PenguinDad + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +ShareAlike — If you remix, transform, or build upon the material, you must distribute +your contributions under the same license as the original. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by-sa/4.0/ + +----------------------- + +Attribution 3.0 Unported (CC BY 3.0) +Copyright (C) 2014 CGEffex +Copyright (C) 2014 bennstir +Copyright (C) 2016 BarkersPinhead +Copyright (C) 2016 rivernile7 +Copyright (C) 2016 HazMatt + +You are free to: +Share — copy and redistribute the material in any medium or format. +Adapt — remix, transform, and build upon the material for any purpose, even commercially. +The licensor cannot revoke these freedoms as long as you follow the license terms. + +Under the following terms: + +Attribution — You must give appropriate credit, provide a link to the license, and +indicate if changes were made. You may do so in any reasonable manner, but not in any way +that suggests the licensor endorses you or your use. + +No additional restrictions — You may not apply legal terms or technological measures that +legally restrict others from doing anything the license permits. + +Notices: + +You do not have to comply with the license for elements of the material in the public +domain or where your use is permitted by an applicable exception or limitation. +No warranties are given. The license may not give you all of the permissions necessary +for your intended use. For example, other rights such as publicity, privacy, or moral +rights may limit how you use the material. + +For more details: +http://creativecommons.org/licenses/by/3.0/ + +----------------------- + +CC0 1.0 Universal (CC0 1.0) Public Domain Dedication +mhtaylor67 +SkeetMasterFunk69 + +No Copyright + +The person who associated a work with this deed has dedicated the work to the public +domain by waiving all of his or her rights to the work worldwide under copyright law, +including all related and neighboring rights, to the extent allowed by law. + +You can copy, modify, distribute and perform the work, even for commercial purposes, all +without asking permission. See Other Information below. + +Other Information + +In no way are the patent or trademark rights of any person affected by CC0, nor are the +rights that other persons may have in the work or in how the work is used, such as +publicity or privacy rights. +Unless expressly stated otherwise, the person who associated a work with this deed makes +no warranties about the work, and disclaims liability for all uses of the work, to the +fullest extent permitted by applicable law. +When using or citing the work, you should not imply endorsement by the author or the +affirmer. + +For more details: +https://creativecommons.org/publicdomain/zero/1.0/ diff --git a/mods/doors/sounds/doors_glass_door_close.ogg b/mods/doors/sounds/doors_glass_door_close.ogg new file mode 100644 index 0000000000000000000000000000000000000000..b3c135598e8a7c7a56d54e05c3ed7ceb006004ca GIT binary patch literal 7289 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 N#BKh$-tEoM{{YSn#=8Ij literal 0 HcmV?d00001 diff --git a/mods/doors/sounds/doors_glass_door_open.ogg b/mods/doors/sounds/doors_glass_door_open.ogg new file mode 100644 index 0000000000000000000000000000000000000000..66e6812d1877340c2f12ddeae02eae1f7c0e1cb1 GIT binary patch literal 7288 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 JtvWFX`X7uryYB!1 literal 0 HcmV?d00001 diff --git a/mods/doors/textures/doors_door_glass.png b/mods/doors/textures/doors_door_glass.png index f597299bdfaa2389d40c5179069ccd5685b937f9..26c427b9fef32a34b2fd8daa7bff4117933d1924 100644 GIT binary patch delta 429 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 DKBSx> delta 2962 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 IM6N<$f)I_IfB*mh