commit c70cf49f3bd46d2a23b0dd499579d2c203db44e5 Author: BuildTools Date: Mon Aug 10 02:24:57 2015 -0400 First commit diff --git a/game.conf b/game.conf new file mode 100644 index 0000000..1167906 --- /dev/null +++ b/game.conf @@ -0,0 +1 @@ +name = WaynesGame \ No newline at end of file diff --git a/menu/background.png b/menu/background.png new file mode 100644 index 0000000..d9aa37e Binary files /dev/null and b/menu/background.png differ diff --git a/menu/header.png b/menu/header.png new file mode 100644 index 0000000..9d8926f Binary files /dev/null and b/menu/header.png differ diff --git a/menu/icon.png b/menu/icon.png new file mode 100644 index 0000000..da8370f Binary files /dev/null and b/menu/icon.png differ diff --git a/minetest.conf b/minetest.conf new file mode 100644 index 0000000..956a631 --- /dev/null +++ b/minetest.conf @@ -0,0 +1,11 @@ +mg_flags = trees, nocaves, dungeons, nolight +time_speed = 60 +movement_speed_walk = 4.8 +movement_speed_climb = 4 + + +pickup_radius = 0.75 +attract_radius = 17 + +enable_item_drops = false +enable_item_pickup = true \ No newline at end of file diff --git a/mods/3d_armor/3d_armor/README.txt b/mods/3d_armor/3d_armor/README.txt new file mode 100644 index 0000000..224f81c --- /dev/null +++ b/mods/3d_armor/3d_armor/README.txt @@ -0,0 +1,24 @@ +[mod] Visible Player Armor [3d_armor] +===================================== + +Depends: default + +Recommends: inventory_plus or unified_inventory (use only one) + +Adds craftable armor that is visible to other players. Each armor item worn contributes to +a player's armor group level making them less vulnerable to weapons. + +Armor takes damage when a player is hurt but also offers a percentage chance of healing. +Overall level is boosted by 10% when wearing a full matching set. + +Fire protection added by TenPlus1 when using crystal armor if Ethereal mod active, level 1 +protects against torches, level 2 for crystal spike, level 3 for fire, level 5 for lava. + +Configuration +------------- + +Armor can be configured by adding a file called armor.conf in 3d_armor mod and/or world directory. +see armor.conf.example for all available options. + +Note: worldpath config settings override any settings made in the mod's directory. + diff --git a/mods/3d_armor/3d_armor/admin.lua b/mods/3d_armor/3d_armor/admin.lua new file mode 100644 index 0000000..50a5e5c --- /dev/null +++ b/mods/3d_armor/3d_armor/admin.lua @@ -0,0 +1,33 @@ +minetest.register_alias("adminboots","3d_armor:boots_admin") +minetest.register_alias("adminhelmet","3d_armor:helmet_admin") +minetest.register_alias("adminchestplate","3d_armor:chestplate_admin") +minetest.register_alias("adminlegginss","3d_armor:leggings_admin") + +minetest.register_tool("3d_armor:helmet_admin", { + description = "Admin Helmet", + inventory_image = "3d_armor_inv_helmet_admin.png", + groups = {armor_head=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1}, + wear = 0, +}) + +minetest.register_tool("3d_armor:chestplate_admin", { + description = "Admin Chestplate", + inventory_image = "3d_armor_inv_chestplate_admin.png", + groups = {armor_torso=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1}, + wear = 0, +}) + +minetest.register_tool("3d_armor:leggings_admin", { + description = "Admin Leggings", + inventory_image = "3d_armor_inv_leggings_admin.png", + groups = {armor_legs=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1}, + wear = 0, +}) + +minetest.register_tool("3d_armor:boots_admin", { + description = "Admin Boots", + inventory_image = "3d_armor_inv_boots_admin.png", + groups = {armor_feet=1000, armor_heal=1000, armor_use=0, not_in_creative_inventory=1}, + wear = 0, +}) + diff --git a/mods/3d_armor/3d_armor/armor.conf.example b/mods/3d_armor/3d_armor/armor.conf.example new file mode 100644 index 0000000..15cfe91 --- /dev/null +++ b/mods/3d_armor/3d_armor/armor.conf.example @@ -0,0 +1,56 @@ +-- Armor Configuration (defaults) + +-- You can remove any unwanted armor materials from this table. +-- Note that existing armor that is removed will show up as an unknown item. +ARMOR_MATERIALS = { + wood = "group:wood", + cactus = "default:cactus", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + diamond = "default:diamond", + gold = "default:gold_ingot", + mithril = "moreores:mithril_ingot", + crystal = "ethereal:crystal_ingot", +} + +-- Enable fire protection (defaults true if using ethereal mod) +ARMOR_FIRE_PROTECT = false + +-- Fire protection nodes, (name, protection level, damage) +ARMOR_FIRE_NODES = { + {"default:lava_source", 5, 4}, + {"default:lava_flowing", 5, 4}, + {"fire:basic_flame", 3, 4}, + {"ethereal:crystal_spike", 2, 1}, + {"bakedclay:safe_fire", 2, 1}, + {"default:torch", 1, 1}, +} + +-- Increase this if you get initialization glitches when a player first joins. +ARMOR_INIT_DELAY = 1 + +-- Number of initialization attempts. +-- Use in conjunction with ARMOR_INIT_DELAY if initialization problems persist. +ARMOR_INIT_TIMES = 1 + +-- Increase this if armor is not getting into bones due to server lag. +ARMOR_BONES_DELAY = 1 + +-- How often player armor/wield items are updated. +ARMOR_UPDATE_TIME = 1 + +-- Drop armor when a player dies. +-- Uses bones mod if present, otherwise items are dropped around the player. +ARMOR_DROP = true + +-- Pulverise armor when a player dies, overrides ARMOR_DROP. +ARMOR_DESTROY = false + +-- You can use this to increase or decrease overall armor effectiveness, +-- eg: ARMOR_LEVEL_MULTIPLIER = 0.5 will reduce armor level by half. +ARMOR_LEVEL_MULTIPLIER = 1 + +-- You can use this to increase or decrease overall armor healing, +-- eg: ARMOR_HEAL_MULTIPLIER = 0 will disable healing altogether. +ARMOR_HEAL_MULTIPLIER = 1 + diff --git a/mods/3d_armor/3d_armor/armor.lua b/mods/3d_armor/3d_armor/armor.lua new file mode 100644 index 0000000..2fb4eb3 --- /dev/null +++ b/mods/3d_armor/3d_armor/armor.lua @@ -0,0 +1,598 @@ +ARMOR_INIT_DELAY = 1 +ARMOR_INIT_TIMES = 1 +ARMOR_BONES_DELAY = 1 +ARMOR_UPDATE_TIME = 1 +ARMOR_DROP = minetest.get_modpath("bones") ~= nil +ARMOR_DESTROY = false +ARMOR_LEVEL_MULTIPLIER = 1 +ARMOR_HEAL_MULTIPLIER = 1 +ARMOR_MATERIALS = { + wood = "group:wood", + cactus = "default:cactus", + steel = "default:steel_ingot", + bronze = "default:bronze_ingot", + diamond = "default:diamond", + gold = "default:gold_ingot", + mithril = "moreores:mithril_ingot", + crystal = "ethereal:crystal_ingot", +} +ARMOR_FIRE_PROTECT = minetest.get_modpath("ethereal") ~= nil +ARMOR_FIRE_NODES = { + {"default:lava_source", 5, 4}, + {"default:lava_flowing", 5, 4}, + {"fire:basic_flame", 3, 4}, + {"ethereal:crystal_spike", 2, 1}, + {"bakedclay:safe_fire", 2, 1}, + {"default:torch", 1, 1}, +} + +local skin_mod = nil +local inv_mod = nil + +local modpath = minetest.get_modpath(ARMOR_MOD_NAME) +local worldpath = minetest.get_worldpath() +local input = io.open(modpath.."/armor.conf", "r") +if input then + dofile(modpath.."/armor.conf") + input:close() + input = nil +end +input = io.open(worldpath.."/armor.conf", "r") +if input then + dofile(worldpath.."/armor.conf") + input:close() + input = nil +end +if not minetest.get_modpath("moreores") then + ARMOR_MATERIALS.mithril = nil +end +if not minetest.get_modpath("ethereal") then + ARMOR_MATERIALS.crystal = nil +end + +-- override hot nodes so they do not hurt player anywhere but mod +if ARMOR_FIRE_PROTECT == true then + for _, row in ipairs(ARMOR_FIRE_NODES) do + if minetest.registered_nodes[row[1]] then + minetest.override_item(row[1], {damage_per_second = 0}) + end + end +end + +local time = 0 + +armor = { + player_hp = {}, + elements = {"head", "torso", "legs", "feet"}, + physics = {"jump","speed","gravity"}, + formspec = "size[8,8.5]list[detached:player_name_armor;armor;0,1;2,3;]" + .."image[2,0.75;2,4;armor_preview]" + .."list[current_player;main;0,4.5;8,4;]" + .."list[current_player;craft;4,1;3,3;]" + .."list[current_player;craftpreview;7,2;1,1;]", + textures = {}, + default_skin = "character", + version = "0.4.4", +} + +if minetest.get_modpath("inventory_plus") then + inv_mod = "inventory_plus" + armor.formspec = "size[8,8.5]button[0,0;2,0.5;main;Back]" + .."list[detached:player_name_armor;armor;0,1;2,3;]" + .."image[2.5,0.75;2,4;armor_preview]" + .."label[5,1;Level: armor_level]" + .."label[5,1.5;Heal: armor_heal]" + .."label[5,2;Fire: armor_fire]" + .."list[current_player;main;0,4.5;8,4;]" +elseif minetest.get_modpath("unified_inventory") then + inv_mod = "unified_inventory" + unified_inventory.register_button("armor", { + type = "image", + image = "inventory_plus_armor.png", + }) + unified_inventory.register_page("armor", { + get_formspec = function(player) + local name = player:get_player_name() + local formspec = "background[0.06,0.99;7.92,7.52;3d_armor_ui_form.png]" + .."label[0,0;Armor]" + .."list[detached:"..name.."_armor;armor;0,1;2,3;]" + .."image[2.5,0.75;2,4;"..armor.textures[name].preview.."]" + .."label[5,1;Level: "..armor.def[name].level.."]" + .."label[5,1.5;Heal: "..armor.def[name].heal.."]" + .."label[5,2;Fire: "..armor.def[name].fire.."]" + if minetest.setting_getbool("unified_inventory_lite") then + formspec = "background[0.06,0.49;7.92,7.52;3d_armor_ui_form.png]" + .."label[0,0;Armor]" + .."list[detached:"..name.."_armor;armor;0,0.5;2,3;]" + .."image[2.5,0.25;2,4;"..armor.textures[name].preview.."]" + .."label[5,0.5;Level: "..armor.def[name].level.."]" + .."label[5,1;Heal: "..armor.def[name].heal.."]" + .."label[5,1.5;Fire: "..armor.def[name].fire.."]" + end + return {formspec=formspec} + end, + }) +elseif minetest.get_modpath("inventory_enhanced") then + inv_mod = "inventory_enhanced" +end + +if minetest.get_modpath("skins") then + skin_mod = "skins" +elseif minetest.get_modpath("simple_skins") then + skin_mod = "simple_skins" +elseif minetest.get_modpath("u_skins") then + skin_mod = "u_skins" +elseif minetest.get_modpath("wardrobe") then + skin_mod = "wardrobe" +end + +armor.def = { + state = 0, + count = 0, +} + +armor.update_player_visuals = function(self, player) + if not player then + return + end + local name = player:get_player_name() + if self.textures[name] then + default.player_set_textures(player, { + self.textures[name].skin, + self.textures[name].armor, + self.textures[name].wielditem, + }) + end +end + +armor.set_player_armor = function(self, player) + local name, player_inv = armor:get_valid_player(player, "[set_player_armor]") + if not name then + return + end + local armor_texture = "3d_armor_trans.png" + local armor_level = 0 + local armor_heal = 0 + local armor_fire = 0 + local state = 0 + local items = 0 + local elements = {} + local textures = {} + local physics_o = {speed=1,gravity=1,jump=1} + local material = {type=nil, count=1} + local preview = armor:get_preview(name) or "character_preview.png" + for _,v in ipairs(self.elements) do + elements[v] = false + end + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + local item = stack:get_name() + if stack:get_count() == 1 then + local def = stack:get_definition() + for k, v in pairs(elements) do + if v == false then + local level = def.groups["armor_"..k] + if level then + local texture = item:gsub("%:", "_") + table.insert(textures, texture..".png") + preview = preview.."^"..texture.."_preview.png" + armor_level = armor_level + level + state = state + stack:get_wear() + items = items + 1 + local heal = def.groups["armor_heal"] or 0 + armor_heal = armor_heal + heal + local fire = def.groups["armor_fire"] or 0 + armor_fire = armor_fire + fire + for kk,vv in ipairs(self.physics) do + local o_value = def.groups["physics_"..vv] + if o_value then + physics_o[vv] = physics_o[vv] + o_value + end + end + local mat = string.match(item, "%:.+_(.+)$") + if material.type then + if material.type == mat then + material.count = material.count + 1 + end + else + material.type = mat + end + elements[k] = true + end + end + end + end + end + if minetest.get_modpath("shields") then + armor_level = armor_level * 0.9 + end + if material.type and material.count == #self.elements then + armor_level = armor_level * 1.1 + end + armor_level = armor_level * ARMOR_LEVEL_MULTIPLIER + armor_heal = armor_heal * ARMOR_HEAL_MULTIPLIER + if #textures > 0 then + armor_texture = table.concat(textures, "^") + end + local armor_groups = {fleshy=100} + if armor_level > 0 then + armor_groups.level = math.floor(armor_level / 20) + armor_groups.fleshy = 100 - armor_level + end + player:set_armor_groups(armor_groups) + player:set_physics_override(physics_o) + self.textures[name].armor = armor_texture + self.textures[name].preview = preview + self.def[name].state = state + self.def[name].count = items + self.def[name].level = armor_level + self.def[name].heal = armor_heal + self.def[name].jump = physics_o.jump + self.def[name].speed = physics_o.speed + self.def[name].gravity = physics_o.gravity + self.def[name].fire = armor_fire + self:update_player_visuals(player) +end + +armor.update_armor = function(self, player, dtime) + local name, player_inv, armor_inv, pos = armor:get_valid_player(player, "[update_armor]") + if not name then + return + end + local hp = player:get_hp() or 0 + if ARMOR_FIRE_PROTECT == true and dtime then + pos.y = pos.y + 1.4 -- head level + local node_head = minetest.get_node(pos).name + pos.y = pos.y - 1.2 -- feet level + local node_feet = minetest.get_node(pos).name + -- is player inside a hot node? + for _, row in ipairs(ARMOR_FIRE_NODES) do + -- check for fire protection, if not enough then get hurt + if row[1] == node_head or row[1] == node_feet then + if hp > 0 and armor.def[name].fire < row[2] then + hp = hp - row[3] * dtime + player:set_hp(hp) + break + end + end + end + end + if hp <= 0 or hp == self.player_hp[name] then + return + end + if self.player_hp[name] > hp then + local heal_max = 0 + local state = 0 + local items = 0 + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + if stack:get_count() > 0 then + local use = stack:get_definition().groups["armor_use"] or 0 + local heal = stack:get_definition().groups["armor_heal"] or 0 + local item = stack:get_name() + stack:add_wear(use) + armor_inv:set_stack("armor", i, stack) + player_inv:set_stack("armor", i, stack) + state = state + stack:get_wear() + items = items + 1 + if stack:get_count() == 0 then + local desc = minetest.registered_items[item].description + if desc then + minetest.chat_send_player(name, "Your "..desc.." got destroyed!") + end + self:set_player_armor(player) + armor:update_inventory(player) + end + heal_max = heal_max + heal + end + end + self.def[name].state = state + self.def[name].count = items + heal_max = heal_max * ARMOR_HEAL_MULTIPLIER + if heal_max > math.random(100) then + player:set_hp(self.player_hp[name]) + return + end + end + self.player_hp[name] = hp +end + +armor.get_player_skin = function(self, name) + local skin = nil + if skin_mod == "skins" or skin_mod == "simple_skins" then + skin = skins.skins[name] + elseif skin_mod == "u_skins" then + skin = u_skins.u_skins[name] + elseif skin_mod == "wardrobe" then + skin = string.gsub(wardrobe.playerSkins[name], "%.png$","") + end + return skin or armor.default_skin +end + +armor.get_preview = function(self, name) + if skin_mod == "skins" then + return armor:get_player_skin(name).."_preview.png" + end +end + +armor.get_armor_formspec = function(self, name) + if not armor.textures[name] then + minetest.log("error", "3d_armor: Player texture["..name.."] is nil [get_armor_formspec]") + return "" + end + if not armor.def[name] then + minetest.log("error", "3d_armor: Armor def["..name.."] is nil [get_armor_formspec]") + return "" + end + local formspec = armor.formspec:gsub("player_name", name) + formspec = formspec:gsub("armor_preview", armor.textures[name].preview) + formspec = formspec:gsub("armor_level", armor.def[name].level) + formspec = formspec:gsub("armor_heal", armor.def[name].heal) + formspec = formspec:gsub("armor_fire", armor.def[name].fire) + return formspec +end + +armor.update_inventory = function(self, player) + local name = armor:get_valid_player(player, "[set_player_armor]") + if not name or inv_mod == "inventory_enhanced" then + return + end + if inv_mod == "unified_inventory" then + if unified_inventory.current_page[name] == "armor" then + unified_inventory.set_inventory_formspec(player, "armor") + end + else + local formspec = armor:get_armor_formspec(name) + if inv_mod == "inventory_plus" then + local page = player:get_inventory_formspec() + if page:find("detached:"..name.."_armor") then + inventory_plus.set_inventory_formspec(player, formspec) + end + else + player:set_inventory_formspec(formspec) + end + end +end + +armor.get_valid_player = function(self, player, msg) + msg = msg or "" + if not player then + minetest.log("error", "3d_armor: Player reference is nil "..msg) + return + end + local name = player:get_player_name() + if not name then + minetest.log("error", "3d_armor: Player name is nil "..msg) + return + end + local pos = player:getpos() + local player_inv = player:get_inventory() + local armor_inv = minetest.get_inventory({type="detached", name=name.."_armor"}) + if not pos then + minetest.log("error", "3d_armor: Player position is nil "..msg) + return + elseif not player_inv then + minetest.log("error", "3d_armor: Player inventory is nil "..msg) + return + elseif not armor_inv then + minetest.log("error", "3d_armor: Detached armor inventory is nil "..msg) + return + end + return name, player_inv, armor_inv, pos +end + +-- Register Player Model + +default.player_register_model("3d_armor_character.b3d", { + animation_speed = 30, + textures = { + armor.default_skin..".png", + "3d_armor_trans.png", + "3d_armor_trans.png", + }, + animations = { + stand = {x=0, y=79}, + lay = {x=162, y=166}, + walk = {x=168, y=187}, + mine = {x=189, y=198}, + walk_mine = {x=200, y=219}, + sit = {x=81, y=160}, + }, +}) + +-- Register Callbacks + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = armor:get_valid_player(player, "[on_player_receive_fields]") + if not name or inv_mod == "inventory_enhanced" then + return + end + if inv_mod == "inventory_plus" and fields.armor then + local formspec = armor:get_armor_formspec(name) + inventory_plus.set_inventory_formspec(player, formspec) + return + end + for field, _ in pairs(fields) do + if string.find(field, "skins_set") then + minetest.after(0, function(player) + local skin = armor:get_player_skin(name) + armor.textures[name].skin = skin..".png" + armor:set_player_armor(player) + end, player) + end + end +end) + +minetest.register_on_joinplayer(function(player) + default.player_set_model(player, "3d_armor_character.b3d") + local name = player:get_player_name() + local player_inv = player:get_inventory() + local armor_inv = minetest.create_detached_inventory(name.."_armor", { + on_put = function(inv, listname, index, stack, player) + player:get_inventory():set_stack(listname, index, stack) + armor:set_player_armor(player) + armor:update_inventory(player) + end, + on_take = function(inv, listname, index, stack, player) + player:get_inventory():set_stack(listname, index, nil) + armor:set_player_armor(player) + armor:update_inventory(player) + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + local plaver_inv = player:get_inventory() + local stack = inv:get_stack(to_list, to_index) + player_inv:set_stack(to_list, to_index, stack) + player_inv:set_stack(from_list, from_index, nil) + armor:set_player_armor(player) + armor:update_inventory(player) + end, + allow_put = function(inv, listname, index, stack, player) + return 1 + end, + allow_take = function(inv, listname, index, stack, player) + return stack:get_count() + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return count + end, + }) + if inv_mod == "inventory_plus" then + inventory_plus.register_button(player,"armor", "Armor") + end + armor_inv:set_size("armor", 6) + player_inv:set_size("armor", 6) + for i=1, 6 do + local stack = player_inv:get_stack("armor", i) + armor_inv:set_stack("armor", i, stack) + end + + -- Legacy support, import player's armor from old inventory format + for _,v in pairs(armor.elements) do + local list = "armor_"..v + armor_inv:add_item("armor", player_inv:get_stack(list, 1)) + player_inv:set_stack(list, 1, nil) + end + -- TODO Remove this on the next version upate + + armor.player_hp[name] = 0 + armor.def[name] = { + state = 0, + count = 0, + level = 0, + heal = 0, + jump = 1, + speed = 1, + gravity = 1, + fire = 0, + } + armor.textures[name] = { + skin = armor.default_skin..".png", + armor = "3d_armor_trans.png", + wielditem = "3d_armor_trans.png", + preview = armor.default_skin.."_preview.png", + } + if skin_mod == "skins" then + local skin = skins.skins[name] + if skin and skins.get_type(skin) == skins.type.MODEL then + armor.textures[name].skin = skin..".png" + end + elseif skin_mod == "simple_skins" then + local skin = skins.skins[name] + if skin then + armor.textures[name].skin = skin..".png" + end + elseif skin_mod == "u_skins" then + local skin = u_skins.u_skins[name] + if skin and u_skins.get_type(skin) == u_skins.type.MODEL then + armor.textures[name].skin = skin..".png" + end + elseif skin_mod == "wardrobe" then + local skin = wardrobe.playerSkins[name] + if skin then + armor.textures[name].skin = skin + end + end + if minetest.get_modpath("player_textures") then + local filename = minetest.get_modpath("player_textures").."/textures/player_"..name + local f = io.open(filename..".png") + if f then + f:close() + armor.textures[name].skin = "player_"..name..".png" + end + end + for i=1, ARMOR_INIT_TIMES do + minetest.after(ARMOR_INIT_DELAY * i, function(player) + armor:set_player_armor(player) + if not inv_mod then + armor:update_inventory(player) + end + end, player) + end +end) + +if ARMOR_DROP == true or ARMOR_DESTROY == true then + armor.drop_armor = function(pos, stack) + local obj = minetest.add_item(pos, stack) + if obj then + obj:setvelocity({x=math.random(-1, 1), y=5, z=math.random(-1, 1)}) + end + end + minetest.register_on_dieplayer(function(player) + local name, player_inv, armor_inv, pos = armor:get_valid_player(player, "[on_dieplayer]") + if not name then + return + end + local drop = {} + for i=1, player_inv:get_size("armor") do + local stack = armor_inv:get_stack("armor", i) + if stack:get_count() > 0 then + table.insert(drop, stack) + armor_inv:set_stack("armor", i, nil) + player_inv:set_stack("armor", i, nil) + end + end + armor:set_player_armor(player) + if inv_mod == "unified_inventory" then + unified_inventory.set_inventory_formspec(player, "craft") + elseif inv_mod == "inventory_plus" then + local formspec = inventory_plus.get_formspec(player,"main") + inventory_plus.set_inventory_formspec(player, formspec) + else + armor:update_inventory(player) + end + if ARMOR_DESTROY == false then + minetest.after(ARMOR_BONES_DELAY, function() + local node = minetest.get_node(vector.round(pos)) + if node then + if node.name == "bones:bones" then + local meta = minetest.get_meta(vector.round(pos)) + local owner = meta:get_string("owner") + local inv = meta:get_inventory() + for _,stack in ipairs(drop) do + if name == owner and inv:room_for_item("main", stack) then + inv:add_item("main", stack) + else + armor.drop_armor(pos, stack) + end + end + end + else + for _,stack in ipairs(drop) do + armor.drop_armor(pos, stack) + end + end + end) + end + end) +end + +minetest.register_globalstep(function(dtime) + time = time + dtime + if time > ARMOR_UPDATE_TIME then + for _,player in ipairs(minetest.get_connected_players()) do + armor:update_armor(player, time) + end + time = 0 + end +end) + diff --git a/mods/3d_armor/3d_armor/crafting_guide.txt b/mods/3d_armor/3d_armor/crafting_guide.txt new file mode 100644 index 0000000..abd1519 --- /dev/null +++ b/mods/3d_armor/3d_armor/crafting_guide.txt @@ -0,0 +1,79 @@ +3d_armor -- Crafting Guide +-------------------------- + +Helmets: + ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | | X | ++---+---+---+ +| | | | ++---+---+---+ + +[3d_armor:helmet_wood] X = [default:wood] +[3d_armor:helmet_cactus] X = [default:cactus] +[3d_armor:helmet_steel] X = [default:steel_ingot] +[3d_armor:helmet_bronze] X = [default:bronze_ingot] +[3d_armor:helmet_diamond] X = [default:diamond] +[3d_armor:helmet_gold] X = [default:gold_ingot] +[3d_armor:helmet_mithril] X = [moreores:mithril_ingot] * +[3d_armor:helmet_crystal] X = [ethereal:crystal_ingot] ** + +Chestplates: + ++---+---+---+ +| X | | X | ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | X | X | ++---+---+---+ + +[3d_armor:chestplate_wood] X = [default:wood] +[3d_armor:chestplate_cactus] X = [default:cactus] +[3d_armor:chestplate_steel] X = [default:steel_ingot] +[3d_armor:chestplate_bronze] X = [default:bronze_ingot] +[3d_armor:chestplate_diamond] X = [default:diamond] +[3d_armor:chestplate_gold] X = [default:gold_ingot] +[3d_armor:chestplate_mithril] X = [moreores:mithril_ingot] * +[3d_armor:chestplate_crystal] X = [ethereal:crystal_ingot] ** + +Leggings: + ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | | X | ++---+---+---+ +| X | | X | ++---+---+---+ + +[3d_armor:leggings_wood] X = [default:wood] +[3d_armor:leggings_cactus] X = [default:cactus] +[3d_armor:leggings_steel] X = [default:steel_ingot] +[3d_armor:leggings_bronze] X = [default:bronze_ingot] +[3d_armor:leggings_diamond] X = [default:diamond] +[3d_armor:leggings_gold] X = [default:gold_ingot] +[3d_armor:leggings_mithril] X = [moreores:mithril_ingot] * +[3d_armor:leggings_crystal] X = [ethereal:crystal_ingot] ** + +Boots: + ++---+---+---+ +| X | | X | ++---+---+---+ +| X | | X | ++---+---+---+ + +[3d_armor:boots_wood] X = [default:wood] +[3d_armor:boots_cactus] X = [default:cactus] +[3d_armor:boots_steel] X = [default:steel_ingot] +[3d_armor:boots_bronze] X = [default:bronze_ingot +[3d_armor:boots_diamond] X = [default:diamond] +[3d_armor:boots_gold] X = [default:gold_ingot] +[3d_armor:boots_mithril] X = [moreores:mithril_ingot] * +[3d_armor:boots_crystal] X = [ethereal:crystal_ingot] ** + + * Requires moreores mod by Calinou - https://forum.minetest.net/viewtopic.php?id=549 +** Requires ethereal mod by Chinchow & TenPlus1 - https://github.com/tenplus1/ethereal diff --git a/mods/3d_armor/3d_armor/depends.txt b/mods/3d_armor/3d_armor/depends.txt new file mode 100644 index 0000000..3acf737 --- /dev/null +++ b/mods/3d_armor/3d_armor/depends.txt @@ -0,0 +1,6 @@ +default +inventory_plus? +unified_inventory? +fire? +ethereal? +bakedclay? diff --git a/mods/3d_armor/3d_armor/init.lua b/mods/3d_armor/3d_armor/init.lua new file mode 100644 index 0000000..4a2116f --- /dev/null +++ b/mods/3d_armor/3d_armor/init.lua @@ -0,0 +1,254 @@ +ARMOR_MOD_NAME = minetest.get_current_modname() +dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/armor.lua") +dofile(minetest.get_modpath(ARMOR_MOD_NAME).."/admin.lua") + +if ARMOR_MATERIALS.wood then + minetest.register_tool("3d_armor:helmet_wood", { + description = "Wood Helmet", + inventory_image = "3d_armor_inv_helmet_wood.png", + groups = {armor_head=5, armor_heal=0, armor_use=2000}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_wood", { + description = "Wood Chestplate", + inventory_image = "3d_armor_inv_chestplate_wood.png", + groups = {armor_torso=10, armor_heal=0, armor_use=2000}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_wood", { + description = "Wood Leggings", + inventory_image = "3d_armor_inv_leggings_wood.png", + groups = {armor_legs=5, armor_heal=0, armor_use=2000}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_wood", { + description = "Wood Boots", + inventory_image = "3d_armor_inv_boots_wood.png", + groups = {armor_feet=5, armor_heal=0, armor_use=2000}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.cactus then + minetest.register_tool("3d_armor:helmet_cactus", { + description = "Cactuc Helmet", + inventory_image = "3d_armor_inv_helmet_cactus.png", + groups = {armor_head=5, armor_heal=0, armor_use=1000}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_cactus", { + description = "Cactus Chestplate", + inventory_image = "3d_armor_inv_chestplate_cactus.png", + groups = {armor_torso=10, armor_heal=0, armor_use=1000}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_cactus", { + description = "Cactus Leggings", + inventory_image = "3d_armor_inv_leggings_cactus.png", + groups = {armor_legs=5, armor_heal=0, armor_use=1000}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_cactus", { + description = "Cactus Boots", + inventory_image = "3d_armor_inv_boots_cactus.png", + groups = {armor_feet=5, armor_heal=0, armor_use=2000}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.steel then + minetest.register_tool("3d_armor:helmet_steel", { + description = "Steel Helmet", + inventory_image = "3d_armor_inv_helmet_steel.png", + groups = {armor_head=10, armor_heal=0, armor_use=500}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_steel", { + description = "Steel Chestplate", + inventory_image = "3d_armor_inv_chestplate_steel.png", + groups = {armor_torso=15, armor_heal=0, armor_use=500}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_steel", { + description = "Steel Leggings", + inventory_image = "3d_armor_inv_leggings_steel.png", + groups = {armor_legs=15, armor_heal=0, armor_use=500}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_steel", { + description = "Steel Boots", + inventory_image = "3d_armor_inv_boots_steel.png", + groups = {armor_feet=10, armor_heal=0, armor_use=500}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.bronze then + minetest.register_tool("3d_armor:helmet_bronze", { + description = "Bronze Helmet", + inventory_image = "3d_armor_inv_helmet_bronze.png", + groups = {armor_head=10, armor_heal=6, armor_use=250}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_bronze", { + description = "Bronze Chestplate", + inventory_image = "3d_armor_inv_chestplate_bronze.png", + groups = {armor_torso=15, armor_heal=6, armor_use=250}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_bronze", { + description = "Bronze Leggings", + inventory_image = "3d_armor_inv_leggings_bronze.png", + groups = {armor_legs=15, armor_heal=6, armor_use=250}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_bronze", { + description = "Bronze Boots", + inventory_image = "3d_armor_inv_boots_bronze.png", + groups = {armor_feet=10, armor_heal=6, armor_use=250}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.diamond then + minetest.register_tool("3d_armor:helmet_diamond", { + description = "Diamond Helmet", + inventory_image = "3d_armor_inv_helmet_diamond.png", + groups = {armor_head=15, armor_heal=12, armor_use=100}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_diamond", { + description = "Diamond Chestplate", + inventory_image = "3d_armor_inv_chestplate_diamond.png", + groups = {armor_torso=20, armor_heal=12, armor_use=100}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_diamond", { + description = "Diamond Leggings", + inventory_image = "3d_armor_inv_leggings_diamond.png", + groups = {armor_legs=20, armor_heal=12, armor_use=100}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_diamond", { + description = "Diamond Boots", + inventory_image = "3d_armor_inv_boots_diamond.png", + groups = {armor_feet=15, armor_heal=12, armor_use=100}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.gold then + minetest.register_tool("3d_armor:helmet_gold", { + description = "Gold Helmet", + inventory_image = "3d_armor_inv_helmet_gold.png", + groups = {armor_head=10, armor_heal=6, armor_use=250}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_gold", { + description = "Gold Chestplate", + inventory_image = "3d_armor_inv_chestplate_gold.png", + groups = {armor_torso=15, armor_heal=6, armor_use=250}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_gold", { + description = "Gold Leggings", + inventory_image = "3d_armor_inv_leggings_gold.png", + groups = {armor_legs=15, armor_heal=6, armor_use=250}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_gold", { + description = "Gold Boots", + inventory_image = "3d_armor_inv_boots_gold.png", + groups = {armor_feet=10, armor_heal=6, armor_use=250}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.mithril then + minetest.register_tool("3d_armor:helmet_mithril", { + description = "Mithril Helmet", + inventory_image = "3d_armor_inv_helmet_mithril.png", + groups = {armor_head=15, armor_heal=12, armor_use=50}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_mithril", { + description = "Mithril Chestplate", + inventory_image = "3d_armor_inv_chestplate_mithril.png", + groups = {armor_torso=20, armor_heal=12, armor_use=50}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_mithril", { + description = "Mithril Leggings", + inventory_image = "3d_armor_inv_leggings_mithril.png", + groups = {armor_legs=20, armor_heal=12, armor_use=50}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_mithril", { + description = "Mithril Boots", + inventory_image = "3d_armor_inv_boots_mithril.png", + groups = {armor_feet=15, armor_heal=12, armor_use=50}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.crystal then + minetest.register_tool("3d_armor:helmet_crystal", { + description = "Crystal Helmet", + inventory_image = "3d_armor_inv_helmet_crystal.png", + groups = {armor_head=15, armor_heal=12, armor_use=50, armor_fire=1}, + wear = 0, + }) + minetest.register_tool("3d_armor:chestplate_crystal", { + description = "Crystal Chestplate", + inventory_image = "3d_armor_inv_chestplate_crystal.png", + groups = {armor_torso=20, armor_heal=12, armor_use=50, armor_fire=1}, + wear = 0, + }) + minetest.register_tool("3d_armor:leggings_crystal", { + description = "Crystal Leggings", + inventory_image = "3d_armor_inv_leggings_crystal.png", + groups = {armor_legs=20, armor_heal=12, armor_use=50, armor_fire=1}, + wear = 0, + }) + minetest.register_tool("3d_armor:boots_crystal", { + description = "Crystal Boots", + inventory_image = "3d_armor_inv_boots_crystal.png", + groups = {armor_feet=15, armor_heal=12, armor_use=50, physics_speed=1, physics_jump=0.5, armor_fire=1}, + wear = 0, + }) +end + +for k, v in pairs(ARMOR_MATERIALS) do + minetest.register_craft({ + output = "3d_armor:helmet_"..k, + recipe = { + {v, v, v}, + {v, "", v}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "3d_armor:chestplate_"..k, + recipe = { + {v, "", v}, + {v, v, v}, + {v, v, v}, + }, + }) + minetest.register_craft({ + output = "3d_armor:leggings_"..k, + recipe = { + {v, v, v}, + {v, "", v}, + {v, "", v}, + }, + }) + minetest.register_craft({ + output = "3d_armor:boots_"..k, + recipe = { + {v, "", v}, + {v, "", v}, + }, + }) +end + diff --git a/mods/3d_armor/3d_armor/models/3d_armor_character.b3d b/mods/3d_armor/3d_armor/models/3d_armor_character.b3d new file mode 100644 index 0000000..278956b Binary files /dev/null and b/mods/3d_armor/3d_armor/models/3d_armor_character.b3d differ diff --git a/mods/3d_armor/3d_armor/models/3d_armor_character.blend b/mods/3d_armor/3d_armor/models/3d_armor_character.blend new file mode 100644 index 0000000..5ded978 Binary files /dev/null and b/mods/3d_armor/3d_armor/models/3d_armor_character.blend differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png new file mode 100644 index 0000000..a05e4c5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png new file mode 100644 index 0000000..d61ab25 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png new file mode 100644 index 0000000..7cfe378 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png new file mode 100644 index 0000000..6da8019 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png new file mode 100644 index 0000000..7dc43e3 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png new file mode 100644 index 0000000..33f9221 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png new file mode 100644 index 0000000..50bbf20 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png new file mode 100644 index 0000000..a3ab7d1 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png new file mode 100644 index 0000000..6678b16 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png new file mode 100644 index 0000000..eb99c4e Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png new file mode 100644 index 0000000..2de3966 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png new file mode 100644 index 0000000..5ca40ac Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png new file mode 100644 index 0000000..3e4173b Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png new file mode 100644 index 0000000..b0c4684 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png new file mode 100644 index 0000000..4664be5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png new file mode 100644 index 0000000..25fc47a Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png new file mode 100644 index 0000000..0ec5d6c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png new file mode 100644 index 0000000..53d6d15 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_boots_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png new file mode 100644 index 0000000..404d6e8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png new file mode 100644 index 0000000..09325a5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png new file mode 100644 index 0000000..d9c7267 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png new file mode 100644 index 0000000..90d887a Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png new file mode 100644 index 0000000..ee433de Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png new file mode 100644 index 0000000..32bf6f6 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png new file mode 100644 index 0000000..e36aa49 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png new file mode 100644 index 0000000..c43015c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png new file mode 100644 index 0000000..81a7b21 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png new file mode 100644 index 0000000..17e2eb8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png new file mode 100644 index 0000000..91b1631 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png new file mode 100644 index 0000000..cb11321 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png new file mode 100644 index 0000000..2bbeab8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png new file mode 100644 index 0000000..eca051c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png new file mode 100644 index 0000000..23cdbda Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png new file mode 100644 index 0000000..0e45907 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png new file mode 100644 index 0000000..ea7a1d7 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png new file mode 100644 index 0000000..cdca575 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_chestplate_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png new file mode 100644 index 0000000..4d52d4c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png new file mode 100644 index 0000000..51ecb9b Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png new file mode 100644 index 0000000..438002e Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png new file mode 100644 index 0000000..61fa1af Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png new file mode 100644 index 0000000..8cd68d5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png new file mode 100644 index 0000000..4e3bfe2 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png new file mode 100644 index 0000000..c323e94 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png new file mode 100644 index 0000000..451a15d Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png new file mode 100644 index 0000000..2649670 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png new file mode 100644 index 0000000..33a273a Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png new file mode 100644 index 0000000..6fa3af5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png new file mode 100644 index 0000000..d2e7ac8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png new file mode 100644 index 0000000..1d108a2 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png new file mode 100644 index 0000000..a331f6a Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png new file mode 100644 index 0000000..ec5c203 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png new file mode 100644 index 0000000..2c8721c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png new file mode 100644 index 0000000..0bdb8f7 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png new file mode 100644 index 0000000..fe1cead Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_helmet_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png new file mode 100644 index 0000000..f94c844 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png new file mode 100644 index 0000000..7f5f968 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png new file mode 100644 index 0000000..b665eb8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png new file mode 100644 index 0000000..5709a17 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png new file mode 100644 index 0000000..6bcd620 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png new file mode 100644 index 0000000..8598cf9 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png new file mode 100644 index 0000000..a4c180d Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png new file mode 100644 index 0000000..77286b5 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png new file mode 100644 index 0000000..66993a1 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_boots_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png new file mode 100644 index 0000000..29f3897 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png new file mode 100644 index 0000000..da2f3e0 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png new file mode 100644 index 0000000..a695e78 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png new file mode 100644 index 0000000..4d23066 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png new file mode 100644 index 0000000..eee800b Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png new file mode 100644 index 0000000..1dddc3d Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png new file mode 100644 index 0000000..e4c50a7 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png new file mode 100644 index 0000000..421b3e3 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png new file mode 100644 index 0000000..434374f Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_chestplate_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png new file mode 100644 index 0000000..e019702 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png new file mode 100644 index 0000000..53cdaf1 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png new file mode 100644 index 0000000..746c264 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png new file mode 100644 index 0000000..8a29eec Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png new file mode 100644 index 0000000..2eb3a5c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png new file mode 100644 index 0000000..e8f83d8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png new file mode 100644 index 0000000..abdd0ca Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png new file mode 100644 index 0000000..4c636f2 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png new file mode 100644 index 0000000..e8ee2fe Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_helmet_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png new file mode 100644 index 0000000..04b64c0 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png new file mode 100644 index 0000000..b574108 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png new file mode 100644 index 0000000..9b85ba2 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png new file mode 100644 index 0000000..5b3f703 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png new file mode 100644 index 0000000..2ab1c8e Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png new file mode 100644 index 0000000..7424833 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png new file mode 100644 index 0000000..b9b1b3c Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png new file mode 100644 index 0000000..77ee17e Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png new file mode 100644 index 0000000..f162e51 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_inv_leggings_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png new file mode 100644 index 0000000..6752256 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png new file mode 100644 index 0000000..fe47999 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_admin_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png new file mode 100644 index 0000000..3394288 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png new file mode 100644 index 0000000..c4aa7b9 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_bronze_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png new file mode 100644 index 0000000..7d22404 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png new file mode 100644 index 0000000..1a24863 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_cactus_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png new file mode 100644 index 0000000..cc61390 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png new file mode 100644 index 0000000..559d008 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_crystal_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png new file mode 100644 index 0000000..a646ba2 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png new file mode 100644 index 0000000..a6ac2e2 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_diamond_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png new file mode 100644 index 0000000..d207dff Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png new file mode 100644 index 0000000..75e6ca4 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_gold_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png new file mode 100644 index 0000000..ffff3ee Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png new file mode 100644 index 0000000..ee99178 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_mithril_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png new file mode 100644 index 0000000..78d5874 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png new file mode 100644 index 0000000..3e3ec85 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_steel_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png new file mode 100644 index 0000000..3880fc0 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png new file mode 100644 index 0000000..f8ee8e8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_leggings_wood_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_trans.png b/mods/3d_armor/3d_armor/textures/3d_armor_trans.png new file mode 100644 index 0000000..4d7beb8 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_trans.png differ diff --git a/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png b/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png new file mode 100644 index 0000000..6e5cfee Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/3d_armor_ui_form.png differ diff --git a/mods/3d_armor/3d_armor/textures/character_preview.png b/mods/3d_armor/3d_armor/textures/character_preview.png new file mode 100644 index 0000000..4ac4602 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/character_preview.png differ diff --git a/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png b/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png new file mode 100644 index 0000000..6cde640 Binary files /dev/null and b/mods/3d_armor/3d_armor/textures/inventory_plus_armor.png differ diff --git a/mods/3d_armor/LICENSE.md b/mods/3d_armor/LICENSE.md new file mode 100644 index 0000000..d383270 --- /dev/null +++ b/mods/3d_armor/LICENSE.md @@ -0,0 +1,11 @@ +3D Armor - Visible Player Armor +=============================== + +Default Item Textures (C) Cisoun - WTFPL + +Armor Textures: Copyright (C) 2013 Ryan Jones - CC-BY-SA + +Source Code: Copyright (C) 2013 Stuart Jones - LGPL + +Special credit to Jordach and MirceaKitsune for providing the default 3d character model. + diff --git a/mods/3d_armor/README.md b/mods/3d_armor/README.md new file mode 100644 index 0000000..556f1a7 --- /dev/null +++ b/mods/3d_armor/README.md @@ -0,0 +1,42 @@ +Modpack - 3d Armor [0.4.4] +========================== + +[mod] Visible Player Armor [3d_armor] +------------------------------------- + +depends: default + +recommends: inventory_plus or unified_inventory (use only one) + +Adds craftable armor that is visible to other players. Each armor item worn contributes to +a player's armor group level making them less vulnerable to weapons. + +Armor takes damage when a player is hurt, however, many armor items offer a 'stackable' +percentage chance of restoring the lost health points. Overall armor level is boosted by 10% +when wearing a full matching set (helmet, chestplate, leggings and boots of the same material) + +Fire protection has been added by TenPlus1 and in use when ethereal mod is found and crystal +armor has been enabled. each piece of armor offers 1 fire protection, level 1 protects +against torches, level 2 against crystal spikes, 3 for fire and 5 protects when in lava. + +Compatible with player skins [skins] by Zeg9 and Player Textures [player_textures] by PilzAdam +and [simple_skins] by TenPlus1. + +Armor can be configured by adding a file called armor.conf in 3d_armor mod or world directory. +see armor.conf.example for all available options. + +[mod] Visible Wielded Items [wieldview] +--------------------------------------- + +depends: 3d_armor + +Makes hand wielded items visible to other players. + +[mod] Shields [shields] +------------------------------------- + +depends: 3d_armor + +Originally a part of 3d_armor, shields have been re-included as an optional extra. +If you do not want shields then simply remove the shields folder from the modpack. + diff --git a/mods/3d_armor/modpack.txt b/mods/3d_armor/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/3d_armor/shields/README.txt b/mods/3d_armor/shields/README.txt new file mode 100644 index 0000000..3146bcb --- /dev/null +++ b/mods/3d_armor/shields/README.txt @@ -0,0 +1,6 @@ +Adds shields to 3d_armor + +Depends: 3d_armor + +Originally a part of 3d_armor, shields have been re-included as an optional extra. +If you do not what shields then simply remove the shields folder from the modpack. diff --git a/mods/3d_armor/shields/crafting_guide.txt b/mods/3d_armor/shields/crafting_guide.txt new file mode 100644 index 0000000..9b61dde --- /dev/null +++ b/mods/3d_armor/shields/crafting_guide.txt @@ -0,0 +1,36 @@ +Shields -- Crafting Guide +-------------------------- + ++---+---+---+ +| X | X | X | ++---+---+---+ +| X | X | X | ++---+---+---+ +| | X | | ++---+---+---+ + +[shields:shield_wood] X = [default:wood] +[shields:shield_cactus] X = [default:cactus] +[shields:shield_steel] X = [default:steel_ingot] +[shields:shield_bronze] X = [default:bronze_ingot] +[shields:shield_diamond] X = [default:diamond] +[shields:shield_gold] X = [default:gold_ingot] +[shields:shield_mithril] X = [moreores:mithril_ingot] +[shields:shield_crystal] X = [ethereal:crystal_ingot] + +Enhanced Shields +---------------- + ++---+ +| S | ++---+ +| X | ++---+ +| S | ++---+ + +[shields:shield_enhanced_wood] X = [shields:shield_wood] +[shields:shield_enhanced_cactus] X = [shields:shield_cactus] + +S = [default:steel_ingot] + diff --git a/mods/3d_armor/shields/depends.txt b/mods/3d_armor/shields/depends.txt new file mode 100644 index 0000000..585cc7a --- /dev/null +++ b/mods/3d_armor/shields/depends.txt @@ -0,0 +1,2 @@ +default +3d_armor diff --git a/mods/3d_armor/shields/init.lua b/mods/3d_armor/shields/init.lua new file mode 100644 index 0000000..b7e4340 --- /dev/null +++ b/mods/3d_armor/shields/init.lua @@ -0,0 +1,126 @@ +local use_moreores = minetest.get_modpath("moreores") + +-- Regisiter Shields + +minetest.register_tool("shields:shield_admin", { + description = "Admin Shield", + inventory_image = "shields_inv_shield_admin.png", + groups = {armor_shield=1000, armor_heal=100, armor_use=0}, + wear = 0, +}) + +if ARMOR_MATERIALS.wood then + minetest.register_tool("shields:shield_wood", { + description = "Wooden Shield", + inventory_image = "shields_inv_shield_wood.png", + groups = {armor_shield=5, armor_heal=0, armor_use=2000}, + wear = 0, + }) + minetest.register_tool("shields:shield_enhanced_wood", { + description = "Enhanced Wood Shield", + inventory_image = "shields_inv_shield_enhanced_wood.png", + groups = {armor_shield=8, armor_heal=0, armor_use=1000}, + wear = 0, + }) + minetest.register_craft({ + output = "shields:shield_enhanced_wood", + recipe = { + {"default:steel_ingot"}, + {"shields:shield_wood"}, + {"default:steel_ingot"}, + }, + }) +end + +if ARMOR_MATERIALS.cactus then + minetest.register_tool("shields:shield_cactus", { + description = "Cactus Shield", + inventory_image = "shields_inv_shield_cactus.png", + groups = {armor_shield=5, armor_heal=0, armor_use=2000}, + wear = 0, + }) + minetest.register_tool("shields:shield_enhanced_cactus", { + description = "Enhanced Cactus Shield", + inventory_image = "shields_inv_shield_enhanced_cactus.png", + groups = {armor_shield=8, armor_heal=0, armor_use=1000}, + wear = 0, + }) + minetest.register_craft({ + output = "shields:shield_enhanced_cactus", + recipe = { + {"default:steel_ingot"}, + {"shields:shield_cactus"}, + {"default:steel_ingot"}, + }, + }) +end + +if ARMOR_MATERIALS.steel then + minetest.register_tool("shields:shield_steel", { + description = "Steel Shield", + inventory_image = "shields_inv_shield_steel.png", + groups = {armor_shield=10, armor_heal=0, armor_use=500}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.bronze then + minetest.register_tool("shields:shield_bronze", { + description = "Bronze Shield", + inventory_image = "shields_inv_shield_bronze.png", + groups = {armor_shield=10, armor_heal=6, armor_use=250}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.diamond then + minetest.register_tool("shields:shield_diamond", { + description = "Diamond Shield", + inventory_image = "shields_inv_shield_diamond.png", + groups = {armor_shield=15, armor_heal=12, armor_use=100}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.gold then + minetest.register_tool("shields:shield_gold", { + description = "Gold Shield", + inventory_image = "shields_inv_shield_gold.png", + groups = {armor_shield=10, armor_heal=6, armor_use=250}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.mithril then + minetest.register_tool("shields:shield_mithril", { + description = "Mithril Shield", + inventory_image = "shields_inv_shield_mithril.png", + groups = {armor_shield=15, armor_heal=12, armor_use=50}, + wear = 0, + }) +end + +if ARMOR_MATERIALS.crystal then + minetest.register_tool("shields:shield_crystal", { + description = "Crystal Shield", + inventory_image = "shields_inv_shield_crystal.png", + groups = {armor_shield=15, armor_heal=12, armor_use=50, armor_fire=1}, + wear = 0, + }) +end + +for k, v in pairs(ARMOR_MATERIALS) do + minetest.register_craft({ + output = "shields:shield_"..k, + recipe = { + {v, v, v}, + {v, v, v}, + {"", v, ""}, + }, + }) +end + +minetest.after(0, function() + table.insert(armor.elements, "shield") +end) + diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_admin.png b/mods/3d_armor/shields/textures/shields_inv_shield_admin.png new file mode 100644 index 0000000..ae5ab7d Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_admin.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png b/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png new file mode 100644 index 0000000..67bac0f Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_bronze.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png b/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png new file mode 100644 index 0000000..00d1d58 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png b/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png new file mode 100644 index 0000000..1ec1981 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_crystal.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png b/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png new file mode 100644 index 0000000..ea7c567 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_diamond.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png new file mode 100644 index 0000000..39436cd Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png new file mode 100644 index 0000000..058e042 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_enhanced_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_gold.png b/mods/3d_armor/shields/textures/shields_inv_shield_gold.png new file mode 100644 index 0000000..8995834 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_gold.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png b/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png new file mode 100644 index 0000000..d32665a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_mithril.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_steel.png b/mods/3d_armor/shields/textures/shields_inv_shield_steel.png new file mode 100644 index 0000000..178b507 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_steel.png differ diff --git a/mods/3d_armor/shields/textures/shields_inv_shield_wood.png b/mods/3d_armor/shields/textures/shields_inv_shield_wood.png new file mode 100644 index 0000000..dcbe933 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_inv_shield_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_admin.png b/mods/3d_armor/shields/textures/shields_shield_admin.png new file mode 100644 index 0000000..430c3e3 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_admin.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_admin_preview.png b/mods/3d_armor/shields/textures/shields_shield_admin_preview.png new file mode 100644 index 0000000..762c2d2 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_admin_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_bronze.png b/mods/3d_armor/shields/textures/shields_shield_bronze.png new file mode 100644 index 0000000..89d6799 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_bronze.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png b/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png new file mode 100644 index 0000000..5f9ca7b Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_bronze_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_cactus.png b/mods/3d_armor/shields/textures/shields_shield_cactus.png new file mode 100644 index 0000000..8679aa5 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png b/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png new file mode 100644 index 0000000..ae83661 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_cactus_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_crystal.png b/mods/3d_armor/shields/textures/shields_shield_crystal.png new file mode 100644 index 0000000..888bc5a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_crystal.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png b/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png new file mode 100644 index 0000000..299776f Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_crystal_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_diamond.png b/mods/3d_armor/shields/textures/shields_shield_diamond.png new file mode 100644 index 0000000..e4938f9 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_diamond.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png b/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png new file mode 100644 index 0000000..afd004e Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_diamond_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png new file mode 100644 index 0000000..50d7673 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png new file mode 100644 index 0000000..b15df06 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_cactus_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png new file mode 100644 index 0000000..14bd057 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png new file mode 100644 index 0000000..9298383 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_enhanced_wood_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_gold.png b/mods/3d_armor/shields/textures/shields_shield_gold.png new file mode 100644 index 0000000..b198d18 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_gold.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_gold_preview.png b/mods/3d_armor/shields/textures/shields_shield_gold_preview.png new file mode 100644 index 0000000..66d8f2e Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_gold_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_mithril.png b/mods/3d_armor/shields/textures/shields_shield_mithril.png new file mode 100644 index 0000000..2fb622e Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_mithril.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png b/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png new file mode 100644 index 0000000..45306e3 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_mithril_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_steel.png b/mods/3d_armor/shields/textures/shields_shield_steel.png new file mode 100644 index 0000000..cfe58a1 Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_steel.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_steel_preview.png b/mods/3d_armor/shields/textures/shields_shield_steel_preview.png new file mode 100644 index 0000000..0a3d36a Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_steel_preview.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_wood.png b/mods/3d_armor/shields/textures/shields_shield_wood.png new file mode 100644 index 0000000..baf092d Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_wood.png differ diff --git a/mods/3d_armor/shields/textures/shields_shield_wood_preview.png b/mods/3d_armor/shields/textures/shields_shield_wood_preview.png new file mode 100644 index 0000000..b446e4e Binary files /dev/null and b/mods/3d_armor/shields/textures/shields_shield_wood_preview.png differ diff --git a/mods/3d_armor/technic_armor/README.txt b/mods/3d_armor/technic_armor/README.txt new file mode 100644 index 0000000..dff2255 --- /dev/null +++ b/mods/3d_armor/technic_armor/README.txt @@ -0,0 +1,6 @@ +Adds tin, silver and technic materials to 3d_armor. +Requires technic mod to be installed for craft registration. + +Depends: 3d_armor + +Source code and textures by poet.nohit diff --git a/mods/3d_armor/technic_armor/depends.txt b/mods/3d_armor/technic_armor/depends.txt new file mode 100644 index 0000000..b6cac21 --- /dev/null +++ b/mods/3d_armor/technic_armor/depends.txt @@ -0,0 +1 @@ +3d_armor diff --git a/mods/3d_armor/technic_armor/init.lua b/mods/3d_armor/technic_armor/init.lua new file mode 100644 index 0000000..a48e876 --- /dev/null +++ b/mods/3d_armor/technic_armor/init.lua @@ -0,0 +1,101 @@ +if minetest.get_modpath("technic") then + local stats = { + brass = { name="Brass", armor=1.8, heal=0, use=650 }, + cast = { name="Cast Iron", armor=2.5, heal=8, use=200 }, + carbon = { name="Carbon Steel", armor=2.7, heal=10, use=100 }, + stainless = { name="Stainless Steel", armor=2.7, heal=10, use=75 }, + } + local mats = { + brass="technic:brass_ingot", + cast="technic:cast_iron_ingot", + carbon="technic:carbon_steel_ingot", + stainless="technic:stainless_steel_ingot", + } + if minetest.get_modpath("moreores") then + stats.tin = { name="Tin", armor=1.6, heal=0, use=750 } + stats.silver = { name="Silver", armor=1.8, heal=6, use=650 } + mats.tin = "moreores:tin_ingot" + mats.silver = "moreores:silver_ingot" + end + + for k, v in pairs(stats) do + minetest.register_tool("technic_armor:helmet_"..k, { + description = v.name.." Helmet", + inventory_image = "technic_armor_inv_helmet_"..k..".png", + groups = {armor_head=math.floor(5*v.armor), armor_heal=v.heal, armor_use=v.use}, + wear = 0, + }) + minetest.register_tool("technic_armor:chestplate_"..k, { + description = v.name.." Chestplate", + inventory_image = "technic_armor_inv_chestplate_"..k..".png", + groups = {armor_torso=math.floor(8*v.armor), armor_heal=v.heal, armor_use=v.use}, + wear = 0, + }) + minetest.register_tool("technic_armor:leggings_"..k, { + description = v.name.." Leggings", + inventory_image = "technic_armor_inv_leggings_"..k..".png", + groups = {armor_legs=math.floor(7*v.armor), armor_heal=v.heal, armor_use=v.use}, + wear = 0, + }) + minetest.register_tool("technic_armor:boots_"..k, { + description = v.name.." Boots", + inventory_image = "technic_armor_inv_boots_"..k..".png", + groups = {armor_feet=math.floor(4*v.armor), armor_heal=v.heal, armor_use=v.use}, + wear = 0, + }) + end + for k, v in pairs(mats) do + minetest.register_craft({ + output = "technic_armor:helmet_"..k, + recipe = { + {v, v, v}, + {v, "", v}, + {"", "", ""}, + }, + }) + minetest.register_craft({ + output = "technic_armor:chestplate_"..k, + recipe = { + {v, "", v}, + {v, v, v}, + {v, v, v}, + }, + }) + minetest.register_craft({ + output = "technic_armor:leggings_"..k, + recipe = { + {v, v, v}, + {v, "", v}, + {v, "", v}, + }, + }) + minetest.register_craft({ + output = "technic_armor:boots_"..k, + recipe = { + {v, "", v}, + {v, "", v}, + }, + }) + end + + if minetest.get_modpath("shields") then + for k, v in pairs(stats) do + minetest.register_tool("technic_armor:shield_"..k, { + description = v.name.." Shield", + inventory_image = "technic_armor_inv_shield_"..k..".png", + groups = {armor_shield=math.floor(5*v.armor), armor_heal=v.heal, armor_use=v.use}, + wear = 0, + }) + local m = mats[k] + minetest.register_craft({ + output = "technic_armor:shield_"..k, + recipe = { + {m, m, m}, + {m, m, m}, + {"", m, ""}, + }, + }) + end + end +end + diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass.png new file mode 100644 index 0000000..a54b970 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass_preview.png new file mode 100644 index 0000000..b054d4f Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_brass_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon.png new file mode 100644 index 0000000..379cc8e Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon_preview.png new file mode 100644 index 0000000..8d7e480 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_carbon_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast.png new file mode 100644 index 0000000..5aa0aaa Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast_preview.png new file mode 100644 index 0000000..22699f2 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_cast_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver.png new file mode 100644 index 0000000..1af5ccc Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver_preview.png new file mode 100644 index 0000000..01e0caf Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_silver_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless.png new file mode 100644 index 0000000..eaa86c4 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless_preview.png new file mode 100644 index 0000000..53cc9e7 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_stainless_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin.png new file mode 100644 index 0000000..11c740a Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin_preview.png new file mode 100644 index 0000000..b1085af Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_boots_tin_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass.png new file mode 100644 index 0000000..d123aff Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass_preview.png new file mode 100644 index 0000000..94c2a47 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_brass_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon.png new file mode 100644 index 0000000..7f2b9f1 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon_preview.png new file mode 100644 index 0000000..da747e5 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_carbon_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast.png new file mode 100644 index 0000000..6fa0628 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast_preview.png new file mode 100644 index 0000000..bfbd4ec Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_cast_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver.png new file mode 100644 index 0000000..6790049 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver_preview.png new file mode 100644 index 0000000..abf63b6 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_silver_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless.png new file mode 100644 index 0000000..c2db5f6 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless_preview.png new file mode 100644 index 0000000..1266e6e Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_stainless_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin.png new file mode 100644 index 0000000..562354e Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin_preview.png new file mode 100644 index 0000000..362a4ad Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_chestplate_tin_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass.png new file mode 100644 index 0000000..b8f38d7 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass_preview.png new file mode 100644 index 0000000..cd625f4 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_brass_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon.png new file mode 100644 index 0000000..e8fdf84 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon_preview.png new file mode 100644 index 0000000..02a67b8 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_carbon_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast.png new file mode 100644 index 0000000..840d1b1 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast_preview.png new file mode 100644 index 0000000..c8d30c5 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_cast_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver.png new file mode 100644 index 0000000..0c26eb3 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver_preview.png new file mode 100644 index 0000000..a1d33d7 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_silver_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless.png new file mode 100644 index 0000000..865ebf8 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless_preview.png new file mode 100644 index 0000000..d08cc69 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_stainless_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin.png new file mode 100644 index 0000000..8497bf1 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin_preview.png new file mode 100644 index 0000000..efb95be Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_helmet_tin_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_brass.png new file mode 100644 index 0000000..145d6c3 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_carbon.png new file mode 100644 index 0000000..dbf043f Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_cast.png new file mode 100644 index 0000000..ba33d07 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_silver.png new file mode 100644 index 0000000..7af9003 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_stainless.png new file mode 100644 index 0000000..6d114e7 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_tin.png new file mode 100644 index 0000000..6fbc5b3 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_boots_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_brass.png new file mode 100644 index 0000000..4984954 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_carbon.png new file mode 100644 index 0000000..b921799 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_cast.png new file mode 100644 index 0000000..5e6749e Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_silver.png new file mode 100644 index 0000000..442caa2 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_stainless.png new file mode 100644 index 0000000..5462100 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_tin.png new file mode 100644 index 0000000..eeb7328 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_chestplate_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_brass.png new file mode 100644 index 0000000..e56ec30 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_carbon.png new file mode 100644 index 0000000..fc2a592 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_cast.png new file mode 100644 index 0000000..15092c1 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_silver.png new file mode 100644 index 0000000..4a17003 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_stainless.png new file mode 100644 index 0000000..1cc480e Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_tin.png new file mode 100644 index 0000000..c37cb75 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_helmet_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_brass.png new file mode 100644 index 0000000..876bf7c Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_carbon.png new file mode 100644 index 0000000..e4673a9 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_cast.png new file mode 100644 index 0000000..df61ca6 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_silver.png new file mode 100644 index 0000000..ad8c91b Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_stainless.png new file mode 100644 index 0000000..7e4feaf Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_tin.png new file mode 100644 index 0000000..bbaeb6a Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_leggings_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_brass.png new file mode 100644 index 0000000..dbb63cd Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_carbon.png new file mode 100644 index 0000000..c6ae42a Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_cast.png new file mode 100644 index 0000000..f1bcfb9 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_silver.png new file mode 100644 index 0000000..39dd7f4 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_stainless.png new file mode 100644 index 0000000..2455726 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_tin.png new file mode 100644 index 0000000..e6fb9d8 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_inv_shield_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass.png new file mode 100644 index 0000000..f9c84fd Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass_preview.png new file mode 100644 index 0000000..05048e3 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_brass_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon.png new file mode 100644 index 0000000..2c83e23 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon_preview.png new file mode 100644 index 0000000..9fb6391 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_carbon_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast.png new file mode 100644 index 0000000..e7ca67f Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast_preview.png new file mode 100644 index 0000000..67dd933 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_cast_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver.png new file mode 100644 index 0000000..6ae30f3 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver_preview.png new file mode 100644 index 0000000..0f6ecd2 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_silver_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless.png new file mode 100644 index 0000000..5eab543 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless_preview.png new file mode 100644 index 0000000..6504d9d Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_stainless_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin.png new file mode 100644 index 0000000..5973135 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin_preview.png new file mode 100644 index 0000000..a6d105f Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_leggings_tin_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_brass.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_brass.png new file mode 100644 index 0000000..7ffdb63 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_brass.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_brass_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_brass_preview.png new file mode 100644 index 0000000..83d65c4 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_brass_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_carbon.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_carbon.png new file mode 100644 index 0000000..f78e1a9 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_carbon.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_carbon_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_carbon_preview.png new file mode 100644 index 0000000..2b275cf Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_carbon_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_cast.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_cast.png new file mode 100644 index 0000000..0911277 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_cast.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_cast_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_cast_preview.png new file mode 100644 index 0000000..2d0aea6 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_cast_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_silver.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_silver.png new file mode 100644 index 0000000..8573eec Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_silver.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_silver_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_silver_preview.png new file mode 100644 index 0000000..1b04681 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_silver_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_stainless.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_stainless.png new file mode 100644 index 0000000..6d6adb3 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_stainless.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_stainless_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_stainless_preview.png new file mode 100644 index 0000000..8bdcbb4 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_stainless_preview.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_tin.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_tin.png new file mode 100644 index 0000000..048927c Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_tin.png differ diff --git a/mods/3d_armor/technic_armor/textures/technic_armor_shield_tin_preview.png b/mods/3d_armor/technic_armor/textures/technic_armor_shield_tin_preview.png new file mode 100644 index 0000000..25fa7a0 Binary files /dev/null and b/mods/3d_armor/technic_armor/textures/technic_armor_shield_tin_preview.png differ diff --git a/mods/3d_armor/wieldview/README.txt b/mods/3d_armor/wieldview/README.txt new file mode 100644 index 0000000..cffae46 --- /dev/null +++ b/mods/3d_armor/wieldview/README.txt @@ -0,0 +1,15 @@ +[mod] visible wielded items [wieldview] +======================================= + +depends: default, 3d_armor + +Makes hand wielded items visible to other players. + +default settings: [minetest.conf] + +# Set number of seconds between visible wielded item updates. +wieldview_update_time = 2 + +# Show nodes as tiles, disabled by default +wieldview_node_tiles = false + diff --git a/mods/3d_armor/wieldview/depends.txt b/mods/3d_armor/wieldview/depends.txt new file mode 100644 index 0000000..585cc7a --- /dev/null +++ b/mods/3d_armor/wieldview/depends.txt @@ -0,0 +1,2 @@ +default +3d_armor diff --git a/mods/3d_armor/wieldview/init.lua b/mods/3d_armor/wieldview/init.lua new file mode 100644 index 0000000..7a5a619 --- /dev/null +++ b/mods/3d_armor/wieldview/init.lua @@ -0,0 +1,76 @@ +local time = 0 +local update_time = tonumber(minetest.setting_get("wieldview_update_time")) +if not update_time then + update_time = 2 + minetest.setting_set("wieldview_update_time", tostring(update_time)) +end +local node_tiles = minetest.setting_getbool("wieldview_node_tiles") +if not node_tiles then + node_tiles = false + minetest.setting_set("wieldview_node_tiles", "false") +end + +wieldview = { + wielded_item = {}, + transform = {}, +} + +dofile(minetest.get_modpath(minetest.get_current_modname()).."/transform.lua") + +wieldview.get_item_texture = function(self, item) + local texture = "3d_armor_trans.png" + if item ~= "" then + if minetest.registered_items[item] then + if minetest.registered_items[item].inventory_image ~= "" then + texture = minetest.registered_items[item].inventory_image + elseif node_tiles == true and minetest.registered_items[item].tiles + and type(minetest.registered_items[item].tiles[1]) == "string" + and minetest.registered_items[item].tiles[1] ~= "" then + texture = minetest.inventorycube(minetest.registered_items[item].tiles[1]) + end + end + if wieldview.transform[item] then + texture = texture.."^[transform"..wieldview.transform[item] + end + end + return texture +end + +wieldview.update_wielded_item = function(self, player) + if not player then + return + end + local name = player:get_player_name() + local stack = player:get_wielded_item() + local item = stack:get_name() + if not item then + return + end + if self.wielded_item[name] then + if self.wielded_item[name] == item then + return + end + armor.textures[name].wielditem = self:get_item_texture(item) + armor:update_player_visuals(player) + end + self.wielded_item[name] = item +end + +minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + wieldview.wielded_item[name] = "" + minetest.after(0, function(player) + wieldview:update_wielded_item(player) + end, player) +end) + +minetest.register_globalstep(function(dtime) + time = time + dtime + if time > update_time then + for _,player in ipairs(minetest.get_connected_players()) do + wieldview:update_wielded_item(player) + end + time = 0 + end +end) + diff --git a/mods/3d_armor/wieldview/transform.lua b/mods/3d_armor/wieldview/transform.lua new file mode 100644 index 0000000..4d5133e --- /dev/null +++ b/mods/3d_armor/wieldview/transform.lua @@ -0,0 +1,24 @@ +-- Wielded Item Transformations - http://dev.minetest.net/texture + +wieldview.transform = { + ["default:torch"]="R270", + ["default:sapling"]="R270", + ["flowers:dandelion_white"]="R270", + ["flowers:dandelion_yellow"]="R270", + ["flowers:geranium"]="R270", + ["flowers:rose"]="R270", + ["flowers:tulip"]="R270", + ["flowers:viola"]="R270", + ["bucket:bucket_empty"]="R270", + ["bucket:bucket_water"]="R270", + ["bucket:bucket_lava"]="R270", + ["screwdriver:screwdriver"]="R270", + ["screwdriver:screwdriver1"]="R270", + ["screwdriver:screwdriver2"]="R270", + ["screwdriver:screwdriver3"]="R270", + ["screwdriver:screwdriver4"]="R270", + ["vessels:glass_bottle"]="R270", + ["vessels:drinking_glass"]="R270", + ["vessels:steel_bottle"]="R270", +} + diff --git a/mods/awards/api.lua b/mods/awards/api.lua new file mode 100644 index 0000000..e201cb5 --- /dev/null +++ b/mods/awards/api.lua @@ -0,0 +1,492 @@ +-- AWARDS +-- by Rubenwardy +------------------------------------------------------- +-- this is api function file +------------------------------------------------------- + +-- The global award namespace +awards = { + show_mode = "hud" +} + +-- Table Save Load Functions +function awards.save() + local file = io.open(minetest.get_worldpath().."/awards.txt", "w") + if file then + file:write(minetest.serialize(awards.players)) + file:close() + end +end + +function awards.load() + local file = io.open(minetest.get_worldpath().."/awards.txt", "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + return table + end + end + return {} +end + +awards.players = awards.load() +function awards.player(name) + return awards.players[name] +end + +-- A table of award definitions +awards.def = {} + +function awards.tbv(tb,value,default) + if not default then + default = {} + end + if not tb or type(tb) ~= "table" then + if not value then + value = "[NULL]" + end + minetest.log("error", "awards.tbv - table "..dump(value).." is null, or not a table! Dump: "..dump(tb)) + return + end + if not value then + error("[ERROR] awards.tbv was not used correctly!\n".. + "Value: '"..dump(value).."'\n".. + "Dump:"..dump(tb)) + return + end + if not tb[value] then + tb[value] = default + end +end + +function awards.assertPlayer(playern) + awards.tbv(awards.players, playern) + awards.tbv(awards.players[playern], "name", playern) + awards.tbv(awards.players[playern], "unlocked") + awards.tbv(awards.players[playern], "place") + awards.tbv(awards.players[playern], "count") + awards.tbv(awards.players[playern], "deaths", 0) + awards.tbv(awards.players[playern], "joins", 0) + awards.tbv(awards.players[playern], "chats", 0) +end + +-- Load files +dofile(minetest.get_modpath("awards").."/triggers.lua") + +-- API Functions +function awards._additional_triggers(name, data_table) + -- To add triggers in another mod, you should override this function + -- If the code can't handle the trigger passed, then call the last value of _additional_triggers + --[[ + local add_trig = awards._additional_triggers + awards._additional_triggers = function(name, data_table) + if data_table.trigger.type == "trigger" then + local tmp = { + award = name, + node = data_table.trigger.node, + target = data_table.trigger.target, + } + table.insert(awards.onTrigger,tmp) + elseif data_table.trigger.type == "trigger2" then + local tmp = { + award = name, + node = data_table.trigger.node, + target = data_table.trigger.target, + } + table.insert(awards.onTrigger2,tmp) + else + add_trig(name, data_table) + end + end + ]]-- +end +function awards.register_achievement(name,data_table) + -- see if a trigger is defined in the achievement definition + if data_table.trigger and data_table.trigger.type then + if data_table.trigger.type == "dig" then + local tmp = { + award = name, + node = data_table.trigger.node, + target = data_table.trigger.target, + } + table.insert(awards.onDig,tmp) + elseif data_table.trigger.type == "place" then + local tmp = { + award = name, + node = data_table.trigger.node, + target = data_table.trigger.target, + } + table.insert(awards.onPlace,tmp) + elseif data_table.trigger.type == "death" then + local tmp = { + award = name, + target = data_table.trigger.target, + } + table.insert(awards.onDeath,tmp) + elseif data_table.trigger.type == "chat" then + local tmp = { + award = name, + target = data_table.trigger.target, + } + table.insert(awards.onChat,tmp) + elseif data_table.trigger.type == "join" then + local tmp = { + award = name, + target = data_table.trigger.target, + } + table.insert(awards.onJoin,tmp) + else + awards._additional_triggers(name, data_table) + end + end + + -- check icon, background and custom_announce data + if data_table.icon == nil or data_table.icon == "" then + data_table.icon = "unknown.png" + end + if data_table.background == nil or data_table.background == "" then + data_table.background = "bg_default.png" + end + if data_table.custom_announce == nil or data_table.custom_announce == "" then + data_table.custom_announce = "Achievement Unlocked:" + end + + -- add the achievement to the definition table + data_table.name = name + awards.def[name] = data_table +end + +-- run a function when a node is dug +function awards.register_onDig(func) + table.insert(awards.onDig,func) +end + +-- run a function when a node is placed +function awards.register_onPlace(func) + table.insert(awards.onPlace,func) +end + +-- run a function when a player dies +function awards.register_onDeath(func) + table.insert(awards.onDeath,func) +end + +-- run a function when a player chats +function awards.register_onChat(func) + table.insert(awards.onChat,func) +end + +-- run a function when a player joins +function awards.register_onJoin(func) + table.insert(awards.onJoin,func) +end + +-- This function is called whenever a target condition is met. +-- It checks if a player already has that achievement, and if they do not, +-- it gives it to them +---------------------------------------------- +--awards.give_achievement(name,award) +-- name - the name of the player +-- award - the name of the award to give +function awards.give_achievement(name, award) + -- Access Player Data + local data = awards.players[name] + + -- Perform checks + if not data then + return + end + if not awards.def[award] then + return + end + awards.tbv(data,"unlocked") + + -- check to see if the player does not already have that achievement + if not data.unlocked[award] or data.unlocked[award]~=award then + -- Set award flag + data.unlocked[award]=award + + -- Give Prizes + if awards.def[award] and awards.def[award].prizes then + for i = 1, #awards.def[award].prizes do + local itemstack = ItemStack(awards.def[award].prizes[i]) + if itemstack:is_empty() or not itemstack:is_known() then + return + end + local receiverref = core.get_player_by_name(name) + if receiverref == nil then + return + end + receiverref:get_inventory():add_item("main", itemstack) + end + end + + -- Get data from definition tables + local title = award + local desc = "" + local background = "" + local icon = "" + local custom_announce = "" + if awards.def[award].title then + title = awards.def[award].title + end + if awards.def[award].custom_announce then + custom_announce = awards.def[award].custom_announce + end + if awards.def[award].background then + background = awards.def[award].background + end + if awards.def[award].icon then + icon = awards.def[award].icon + end + if awards.def[award] and awards.def[award].description then + desc = awards.def[award].description + end + + -- send the won award message to the player + if awards.show_mode == "formspec" then + -- use a formspec to send it + minetest.show_formspec(name, "achievements:unlocked", "size[4,2]".. + "image_button_exit[0,0;4,2;"..background..";close1; ]".. + "image_button_exit[0.2,0.8;1,1;"..icon..";close2; ]".. + "label[1.1,1;"..title.."]".. + "label[0.3,0.1;"..custom_announce.."]") + elseif awards.show_mode == "chat" then + -- use the chat console to send it + minetest.chat_send_player(name, "Achievement Unlocked: "..title) + if desc~="" then + minetest.chat_send_player(name, desc) + end + else + local player = minetest.get_player_by_name(name) + local one = player:hud_add({ + hud_elem_type = "image", + name = "award_bg", + scale = {x = 1, y = 1}, + text = background, + position = {x = 0.5, y = 0}, + offset = {x = 0, y = 138}, + alignment = {x = 0, y = -1} + }) + local two = player:hud_add({ + hud_elem_type = "text", + name = "award_au", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = "Achievement Unlocked!", + position = {x = 0.5, y = 0}, + offset = {x = 0, y = 40}, + alignment = {x = 0, y = -1} + }) + local three = player:hud_add({ + hud_elem_type = "text", + name = "award_title", + number = 0xFFFFFF, + scale = {x = 100, y = 20}, + text = title, + position = {x = 0.5, y = 0}, + offset = {x = 30, y = 100}, + alignment = {x = 0, y = -1} + }) + local four = player:hud_add({ + hud_elem_type = "image", + name = "award_icon", + scale = {x = 4, y = 4}, + text = icon, + position = {x = 0.5, y = 0}, + offset = {x = -81.5, y = 126}, + alignment = {x = 0, y = -1} + }) + minetest.after(3, function() + player:hud_remove(one) + player:hud_remove(two) + player:hud_remove(three) + player:hud_remove(four) + end) + end + + -- record this in the log + minetest.log("action", name.." has unlocked award "..title) + + -- save playertable + awards.save() + end +end + +-- List a player's achievements +minetest.register_chatcommand("list_awards", { + params = "obsolete", + description = "list_awards: obsolete. Use /awards", + func = function(name, param) + minetest.chat_send_player(name, "This command has been made obsolete. Use /awards instead.") + awards.showto(name, name, nil, false) + end +}) +minetest.register_chatcommand("awards", { + params = "", + description = "awards: list awards", + func = function(name, param) + awards.showto(name, name, nil, false) + end +}) +minetest.register_chatcommand("cawards", { + params = "", + description = "awards: list awards in chat", + func = function(name, param) + awards.showto(name, name, nil, true) + end +}) +minetest.register_chatcommand("awd", { + params = "award name", + description = "awd: Details of awd gotten", + func = function(name, param) + local def = awards.def[param] + if def then + minetest.chat_send_player(name,def.title..": "..def.description) + else + minetest.chat_send_player(name,"Award not found.") + end + end +}) +--[[minetest.register_chatcommand("gawd", { + params = "award name", + description = "gawd: give award to self", + func = function(name, param) + awards.give_achievement(name,param) + end +})]]-- + +function awards._order_awards(name) + local done = {} + local retval = {} + local player = awards.player(name) + if player and player.unlocked then + for _,got in pairs(player.unlocked) do + if awards.def[got] then + done[got] = true + table.insert(retval,{name=got,got=true}) + end + end + end + for _,def in pairs(awards.def) do + if not done[def.name] then + table.insert(retval,{name=def.name,got=false}) + end + end + return retval +end + +function awards.showto(name, to, sid, text) + if name == "" or name == nil then + name = to + end + if text then + if not awards.players[name] or not awards.players[name].unlocked then + minetest.chat_send_player(to, "You have not unlocked any awards") + return + end + minetest.chat_send_player(to, name.."'s awards:") + + for _, str in pairs(awards.players[name].unlocked) do + local def = awards.def[str] + if def then + if def.title then + if def.description then + minetest.chat_send_player(to, def.title..": "..def.description) + else + minetest.chat_send_player(to, def.title) + end + else + minetest.chat_send_player(to, str) + end + end + end + else + if sid == nil or sid < 1 then + sid = 1 + end + local formspec = "size[11,5]" + local listofawards = awards._order_awards(name) + + -- Sidebar + if sid then + local item = listofawards[sid+0] + local def = awards.def[item.name] + if def and def.secret and not item.got then + formspec = formspec .. "label[1,2.75;Secret Award]".. + "image[1,0;3,3;unknown.png]" + if def and def.description then + formspec = formspec .. "label[0,3.25;Unlock this award to find out what it is]" + end + else + local title = item.name + if def and def.title then + title = def.title + end + local status = "" + if item.got then + status = " (got)" + end + local icon = "" + if def and def.icon then + icon = def.icon + end + formspec = formspec .. "label[1,2.75;"..title..status.."]".. + "image[1,0;3,3;"..icon.."]" + if def and def.description then + formspec = formspec .. "label[0,3.25;"..def.description.."]" + end + end + end + + -- Create list box + formspec = formspec .. "textlist[4.75,0;6,5;awards;" + local first = true + for _,award in pairs(listofawards) do + local def = awards.def[award.name] + if def then + if not first then + formspec = formspec .. "," + end + first = false + + if def.secret and not award.got then + formspec = formspec .. "#ACACACSecret Award" + else + local title = award.name + if def and def.title then + title = def.title + end + if award.got then + formspec = formspec .. minetest.formspec_escape(title) + else + formspec = formspec .. "#ACACAC".. minetest.formspec_escape(title) + end + end + end + end + formspec = formspec .. ";"..sid.."]" + + -- Show formspec to user + minetest.show_formspec(to,"awards:awards",formspec) + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname~="awards:awards" then + return false + end + if fields.quit then + return true + end + local name = player:get_player_name() + if fields.awards then + local event = minetest.explode_textlist_event(fields.awards) + if event.type == "CHG" then + awards.showto(name,name,event.index,false) + end + end + + return true +end) + diff --git a/mods/awards/init.lua b/mods/awards/init.lua new file mode 100644 index 0000000..f1a213c --- /dev/null +++ b/mods/awards/init.lua @@ -0,0 +1,373 @@ +-- AWARDS +-- by Rubenwardy +------------------------------------------------------- +-- this is the init file for the award mod +------------------------------------------------------- + +local S +if (intllib) then + dofile(minetest.get_modpath("intllib").."/intllib.lua") + S = intllib.Getter(minetest.get_current_modname()) +else + S = function ( s ) return s end +end + +dofile(minetest.get_modpath("awards").."/api.lua") + +-- Light it up +awards.register_achievement("award_lightitup",{ + title = S("Light It Up"), + description = S("Place 100 torches."), + icon = "novicebuilder.png", + trigger = { + type = "place", + node = "default:torch", + target = 100 + } +}) + +-- Light ALL the things! +awards.register_achievement("award_light_all_the_things",{ + title = S("Light ALL The Things!"), + description = S("Place 1,000 torches."), + icon = "novicebuilder.png", + trigger = { + type = "place", + node = "default:torch", + target = 1000 + } +}) + + +-- Saint-Maclou +if minetest.get_modpath("moreblocks") then + awards.register_achievement("award_saint_maclou",{ + title = S("Saint-Maclou"), + description = S("Place 20 coal checkers."), + icon = "novicebuilder.png", + trigger = { + type = "place", + node = "moreblocks:coal_checker", + target = 20 + } + }) + + -- Castorama + awards.register_achievement("award_castorama",{ + title = S("Castorama"), + description = S("Place 20 iron checkers."), + icon = "novicebuilder.png", + trigger = { + type = "place", + node = "moreblocks:iron_checker", + target = 20 + } + }) + + -- Sam the Trapper + awards.register_achievement("award_sam_the_trapper",{ + title = S("Sam the Trapper"), + description = S("Place 2 trap stones."), + icon = "novicebuilder.png", + trigger = { + type = "place", + node = "moreblocks:trap_stone", + target = 2 + } + }) +end + +-- Obsessed with Obsidian +awards.register_achievement("award_obsessed_with_obsidian",{ + title = S("Obsessed with Obsidian"), + description = S("Mine 50 obsidian."), + icon = "miniminer.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:obsidian", + target = 50 + } +}) + +-- On the way +awards.register_achievement("award_on_the_way",{ + title = S("On The Way"), + description = S("Place 100 rails."), + icon = "novicebuilder.png", + trigger = { + type = "place", + node = "default:rail", + target = 100 + } +}) + +-- Lumberjack +awards.register_achievement("award_lumberjack",{ + title = S("Lumberjack"), + description = S("Dig 100 tree blocks."), + icon = "default_tree.png", + trigger = { + type = "dig", + node = "default:tree", + target = 100 + } +}) + +-- Semi-pro Lumberjack +awards.register_achievement("award_lumberjack_semipro",{ + title = S("Semi-pro Lumberjack"), + description = S("Dig 1,000 tree blocks."), + icon = "default_tree.png", + trigger = { + type = "dig", + node = "default:tree", + target = 1000 + } +}) + +-- Professional Lumberjack +awards.register_achievement("award_lumberjack_professional",{ + title = S("Professional Lumberjack"), + description = S("Dig 10,000 tree blocks."), + icon = "default_tree.png", + trigger = { + type = "dig", + node = "default:tree", + target = 10000 + } +}) + +-- L33T Lumberjack +awards.register_achievement("award_lumberjack_leet",{ + title = S("L33T Lumberjack"), + description = S("Dig 100,000 tree blocks."), + icon = "default_tree.png", + trigger = { + type = "dig", + node = "default:tree", + target = 100000 + } +}) + +-- Junglebaby +awards.register_achievement("award_junglebaby",{ + title = S("Junglebaby"), + description = S("Dig 100 jungle tree blocks."), + icon = "default_jungletree.png", + trigger = { + type = "dig", + node = "default:jungletree", + target = 100 + } +}) + +-- Jungleman +awards.register_achievement("award_jungleman",{ + title = S("Jungleman"), + description = S("Dig 1,000 jungle tree blocks."), + icon = "default_jungletree.png", + trigger = { + type = "dig", + node = "default:jungletree", + target = 1000 + } +}) + +-- Found some Mese! +awards.register_achievement("award_mesefind",{ + title = S("First Mese Find"), + description = S("Find some Mese."), + icon = "default_mese_block.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:stone_with_mese", + target = 1 + } +}) + +-- You're a copper +awards.register_achievement("award_youre_a_copper",{ + title = S("You're a copper"), + description = S("Dig 1,000 copper ores."), + icon = "miniminer.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:stone_with_copper", + target = 1000 + } +}) + +-- You're winner +awards.register_achievement("award_youre_winner",{ + title = S("YOU'RE A WINNER!"), + description = S("Dig 1 mossy cobblestone."), + icon = "miniminer.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:mossycobble", + target = 1 + }, + secret = true, +}) + +-- Found a Nyan cat! +awards.register_achievement("award_nyanfind",{ + title = S("OMG, Nyan Cat!"), + description = S("Find a nyan cat."), + icon = "default_nc_rb.png", + trigger = { + type = "dig", + node = "default:nyancat", + target = 1 + } +}) + +-- Mini Miner +awards.register_achievement("award_mine2",{ + title = S("Mini Miner"), + description = S("Dig 100 stone blocks."), + icon = "miniminer.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:stone", + target = 100 + } +}) + +-- Hardened Miner +awards.register_achievement("award_mine3",{ + title = S("Hardened Miner"), + description = S("Dig 1,000 stone blocks"), + icon = "miniminer.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:stone", + target = 1000 + } +}) + +-- Master Miner +awards.register_achievement("award_mine4",{ + title = S("Master Miner"), + description = S("Dig 10,000 stone blocks."), + icon = "miniminer.png", + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:stone", + target = 10000 + } +}) + +-- Marchand de sable +awards.register_achievement("award_marchand_de_sable",{ + title = S("Marchand De Sable"), + description = S("Dig 1,000 sand."), + background = "bg_mining.png", + trigger = { + type = "dig", + node = "default:sand", + target = 1000 + } +}) + +-- Join +awards.register_achievement("award_join2",{ + title = S("Frequent Visitor"), + description = S("Connect to the server 50 times."), + trigger = { + type = "join", + target = 50 + }, + secret = true +}) + +-- Dying Spree +awards.register_achievement("award_dying_spree",{ + title = S("Dying Spree"), + description = S("Die 5 times."), + trigger = { + type = "death", + target = 5 + } +}) + +-- Bot-like +awards.register_achievement("award_bot_like",{ + title = S("Bot-like"), + description = S("Die 10 times."), + trigger = { + type = "death", + target = 10 + } +}) + +-- You Suck! +awards.register_achievement("award_you_suck",{ + title = S("You Suck!"), + description = S("Die 100 times."), + trigger = { + type = "death", + target = 100 + }, + secret = true +}) + +-- Burned to death +awards.register_achievement("award_burn",{ + title = S("You're a witch!"), + description = S("Burn to death in a fire.") +}) +awards.register_onDeath(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 2, "fire:basic_flame") ~= nil then + return "award_burn" + end + return nil +end) + +-- Died in flowing lava +awards.register_achievement("award_in_the_flow",{ + title = S("In the Flow"), + description = S("Die in flowing lava.") +}) +awards.register_onDeath(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 2, "default:lava_flowing") ~= nil then + return "award_in_the_flow" + end + return nil +end) + +-- Die near diamond ore +awards.register_achievement("award_this_is_sad",{ + title = S("This is Sad"), + description = S("Die near diamond ore.") +}) +awards.register_onDeath(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "default:stone_with_diamond") ~= nil then + return "award_this_is_sad" + end + return nil +end) + +-- Die near diamond ore +awards.register_achievement("award_the_stack",{ + title = S("The Stack"), + description = S("Die near bones.") +}) +awards.register_onDeath(function(player,data) + local pos = player:getpos() + if pos and minetest.find_node_near(pos, 5, "bones:bones") ~= nil then + return "award_the_stack" + end + return nil +end) + diff --git a/mods/awards/readme.md b/mods/awards/readme.md new file mode 100644 index 0000000..e8cf8a2 --- /dev/null +++ b/mods/awards/readme.md @@ -0,0 +1,55 @@ +Awards +------ + +by Andrew "Rubenwardy" Ward, LGPL 2.1 or later. + +This mod adds achievements to Minetest. + +Majority of awards are back ported from Calinou's +old fork in Carbone, under same license. + + +Code Reference +-------------- + +The API +======= +* awards.register_achievement(name,data_table) + * name + * desciption + * sound [optional] + * image [optional] + * trigger [optional] [table] + * type - "dig", "place", "death", "chat" or "join" + * (for dig/place type) node - the nodes name + * (for all types) target - how many to dig / place + * secret [optional] - if true, then player needs to unlock to find out what it is. +* awards.give_achievement(name,award) + * -- gives an award to a player +* awards.register_onDig(func(player,data)) + * -- return award name or null +* awards.register_onPlace(func(player,data)) + * -- return award name or null +* awards.register_onDeath(func(player,data)) + * -- return award name or null +* awards.register_onChat(func(player,data)) + * -- return award name or null +* awards.register_onJoin(func(player,data)) + * -- return award name or null + + +Player Data +=========== + +A list of data referenced/hashed by the player's name. +* player name + * name [string] + * count [table] - dig counter + * modname [table] + * itemname [int] + * place [table] - place counter + * modname [table] + * itemname [int] + * deaths + * chats + * joins diff --git a/mods/awards/textures/bg_default.png b/mods/awards/textures/bg_default.png new file mode 100644 index 0000000..a6f57d3 Binary files /dev/null and b/mods/awards/textures/bg_default.png differ diff --git a/mods/awards/textures/bg_mining.png b/mods/awards/textures/bg_mining.png new file mode 100644 index 0000000..a698779 Binary files /dev/null and b/mods/awards/textures/bg_mining.png differ diff --git a/mods/awards/textures/mese.png b/mods/awards/textures/mese.png new file mode 100644 index 0000000..3fc800e Binary files /dev/null and b/mods/awards/textures/mese.png differ diff --git a/mods/awards/textures/miniminer.png b/mods/awards/textures/miniminer.png new file mode 100644 index 0000000..45c7238 Binary files /dev/null and b/mods/awards/textures/miniminer.png differ diff --git a/mods/awards/textures/novicebuilder.png b/mods/awards/textures/novicebuilder.png new file mode 100644 index 0000000..f24d843 Binary files /dev/null and b/mods/awards/textures/novicebuilder.png differ diff --git a/mods/awards/textures/template.png b/mods/awards/textures/template.png new file mode 100644 index 0000000..b290454 Binary files /dev/null and b/mods/awards/textures/template.png differ diff --git a/mods/awards/textures/unknown.png b/mods/awards/textures/unknown.png new file mode 100644 index 0000000..b290454 Binary files /dev/null and b/mods/awards/textures/unknown.png differ diff --git a/mods/awards/triggers.lua b/mods/awards/triggers.lua new file mode 100644 index 0000000..213d5c1 --- /dev/null +++ b/mods/awards/triggers.lua @@ -0,0 +1,229 @@ +-- AWARDS +-- by Rubenwardy +------------------------------------------------------- +-- this is the trigger handler file for the awards mod +------------------------------------------------------- + +-- Function and table holders for Triggers +awards.onDig = {} +awards.onPlace = {} +awards.onChat = {} +awards.onDeath = {} +awards.onJoin = {} + +-- Trigger Handles +minetest.register_on_dignode(function(pos, oldnode, digger) + if not digger or not pos or not oldnode then + return + end + local nodedug = string.split(oldnode.name, ":") + if #nodedug ~= 2 then + --minetest.log("error","Awards mod: "..oldnode.name.." is in wrong format!") + return + end + local mod = nodedug[1] + local item = nodedug[2] + local playern = digger:get_player_name() + + if (not playern or not nodedug or not mod or not item) then + return + end + awards.assertPlayer(playern) + awards.tbv(awards.players[playern].count, mod) + awards.tbv(awards.players[playern].count[mod], item, 0) + + -- Increment counter + awards.players[playern].count[mod][item]=awards.players[playern].count[mod][item] + 1 + + -- Run callbacks and triggers + local player=digger + local data=awards.players[playern] + for i=1,# awards.onDig do + local res = nil + if type(awards.onDig[i]) == "function" then + -- Run trigger callback + res = awards.onDig[i](player,data) + elseif type(awards.onDig[i]) == "table" then + -- Handle table trigger + if not awards.onDig[i].node or not awards.onDig[i].target or not awards.onDig[i].award then + -- table running failed! + print("[ERROR] awards - onDig trigger "..i.." is invalid!") + else + -- run the table + local tnodedug = string.split(awards.onDig[i].node, ":") + local tmod=tnodedug[1] + local titem=tnodedug[2] + if tmod==nil or titem==nil or not data.count[tmod] or not data.count[tmod][titem] then + -- table running failed! + elseif data.count[tmod][titem] > awards.onDig[i].target-1 then + res=awards.onDig[i].award + end + end + end + + if res then + awards.give_achievement(playern,res) + end + end +end) + +minetest.register_on_placenode(function(pos,node,digger) + if not digger or not pos or not node or not digger:get_player_name() or digger:get_player_name()=="" then + return + end + local nodedug = string.split(node.name, ":") + if #nodedug ~= 2 then + --minetest.log("error","Awards mod: "..node.name.." is in wrong format!") + return + end + local mod=nodedug[1] + local item=nodedug[2] + local playern = digger:get_player_name() + + -- Run checks + if (not playern or not nodedug or not mod or not item) then + return + end + awards.assertPlayer(playern) + awards.tbv(awards.players[playern].place, mod) + awards.tbv(awards.players[playern].place[mod], item, 0) + + -- Increment counter + awards.players[playern].place[mod][item] = awards.players[playern].place[mod][item] + 1 + + -- Run callbacks and triggers + local player = digger + local data = awards.players[playern] + for i=1,# awards.onPlace do + local res = nil + if type(awards.onPlace[i]) == "function" then + -- Run trigger callback + res = awards.onPlace[i](player,data) + elseif type(awards.onPlace[i]) == "table" then + -- Handle table trigger + if not awards.onPlace[i].node or not awards.onPlace[i].target or not awards.onPlace[i].award then + print("[ERROR] awards - onPlace trigger "..i.." is invalid!") + else + -- run the table + local tnodedug = string.split(awards.onPlace[i].node, ":") + local tmod = tnodedug[1] + local titem = tnodedug[2] + if tmod==nil or titem==nil or not data.place[tmod] or not data.place[tmod][titem] then + -- table running failed! + elseif data.place[tmod][titem] > awards.onPlace[i].target-1 then + res = awards.onPlace[i].award + end + end + end + + if res then + awards.give_achievement(playern,res) + end + end +end) + +minetest.register_on_dieplayer(function(player) + -- Run checks + local name = player:get_player_name() + if not player or not name or name=="" then + return + end + + -- Get player + awards.assertPlayer(name) + local data = awards.players[name] + + -- Increment counter + data.deaths = data.deaths + 1 + + -- Run callbacks and triggers + for _,trigger in pairs(awards.onDeath) do + local res = nil + if type(trigger) == "function" then + res = trigger(player,data) + elseif type(trigger) == "table" then + if trigger.target and trigger.award then + if data.deaths and data.deaths >= trigger.target then + res = trigger.award + end + end + end + if res ~= nil then + awards.give_achievement(name,res) + end + end +end) + +minetest.register_on_joinplayer(function(player) + -- Run checks + local name = player:get_player_name() + if not player or not name or name=="" then + return + end + + -- Get player + awards.assertPlayer(name) + local data = awards.players[name] + + -- Increment counter + data.joins = data.joins + 1 + + -- Run callbacks and triggers + for _,trigger in pairs(awards.onJoin) do + local res = nil + if type(trigger) == "function" then + res = trigger(player,data) + elseif type(trigger) == "table" then + if trigger.target and trigger.award then + if data.joins and data.joins >= trigger.target then + res = trigger.award + end + end + end + if res ~= nil then + awards.give_achievement(name,res) + end + end +end) + +minetest.register_on_chat_message(function(name, message) + -- Run checks + local idx = string.find(message,"/") + if not name or (idx ~= nil and idx <= 1) then + return + end + + -- Get player + awards.assertPlayer(name) + local data = awards.players[name] + local player = minetest.get_player_by_name(name) + + -- Increment counter + data.chats = data.chats + 1 + + -- Run callbacks and triggers + for _,trigger in pairs(awards.onChat) do + local res = nil + if type(trigger) == "function" then + res = trigger(player,data) + elseif type(trigger) == "table" then + if trigger.target and trigger.award then + if data.chats and data.chats >= trigger.target then + res = trigger.award + end + end + end + if res ~= nil then + awards.give_achievement(name,res) + end + end +end) + +minetest.register_on_newplayer(function(player) + local playern = player:get_player_name() + awards.assertPlayer(playern) +end) + +minetest.register_on_shutdown(function() + awards.save() +end) diff --git a/mods/beds/Changelog.txt b/mods/beds/Changelog.txt new file mode 100644 index 0000000..988db2a --- /dev/null +++ b/mods/beds/Changelog.txt @@ -0,0 +1,18 @@ +1.0.1 beta +---------- +- Add backwards compatibility with PilzAdam's beds mod +- Fix placement +- Fix small bugs +- Prevent possible crash + +1.1 +--- +- Add fancy bed model (based on jp's model) +- Add API to register beds +- Allow players always to detach from bed (by donat-b) +- If more than 50% of players want sleep they can skip the night +- Don't show sleep dialog in singleplayer + +1.1.1 +----- +- Prevent possbile crash by trying to reposition leaving players diff --git a/mods/beds/README.txt b/mods/beds/README.txt new file mode 100644 index 0000000..21d4433 --- /dev/null +++ b/mods/beds/README.txt @@ -0,0 +1,29 @@ +Minetest mod "Beds" +=================== +by BlockMen (c) 2014-2015 + +Version: 1.1.1 + +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. + +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 + + + +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. diff --git a/mods/beds/api.lua b/mods/beds/api.lua new file mode 100644 index 0000000..9104ee7 --- /dev/null +++ b/mods/beds/api.lua @@ -0,0 +1,111 @@ +function beds.register_bed(name, def) + minetest.register_node(name .. "_bottom", { + description = def.description, + inventory_image = def.inventory_image, + wield_image = def.wield_image, + drawtype = "nodebox", + tiles = def.tiles.bottom, + paramtype = "light", + 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(), + node_box = { + type = "fixed", + fixed = def.nodebox.bottom, + }, + selection_box = { + type = "fixed", + fixed = def.selectionbox, + + }, + after_place_node = function(pos, placer, itemstack) + local n = minetest.get_node_or_nil(pos) + if not n or not n.param2 then + minetest.remove_node(pos) + return true + end + local dir = minetest.facedir_to_dir(n.param2) + local p = vector.add(pos, dir) + local n2 = minetest.get_node_or_nil(p) + local def = n2 and minetest.registered_items[n2.name] + if not def or not def.buildable_to then + minetest.remove_node(pos) + return true + end + minetest.set_node(p, {name = n.name:gsub("%_bottom", "_top"), param2 = n.param2}) + return false + end, + on_destruct = function(pos) + local n = minetest.get_node_or_nil(pos) + if not n then return end + local dir = minetest.facedir_to_dir(n.param2) + local p = vector.add(pos, dir) + local n2 = minetest.get_node(p) + if minetest.get_item_group(n2.name, "bed") == 2 and n.param2 == n2.param2 then + minetest.remove_node(p) + end + end, + on_rightclick = function(pos, node, clicker) + beds.on_rightclick(pos, clicker) + end, + on_rotate = function(pos, node, user, mode, new_param2) + local dir = minetest.facedir_to_dir(node.param2) + local p = vector.add(pos, dir) + local node2 = minetest.get_node_or_nil(p) + if not node2 or not minetest.get_item_group(node2.name, "bed") == 2 or + not node.param2 == node2.param2 then + return false + end + if minetest.is_protected(p, user:get_player_name()) then + minetest.record_protection_violation(p, user:get_player_name()) + return false + end + if mode ~= screwdriver.ROTATE_FACE then + return false + 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 + return false + end + if minetest.is_protected(newp, user:get_player_name()) then + minetest.record_protection_violation(newp, user:get_player_name()) + return false + end + node.param2 = new_param2 + minetest.swap_node(pos, node) + minetest.remove_node(p) + minetest.set_node(newp, {name = node.name:gsub("%_bottom", "_top"), param2 = new_param2}) + return true + end, + }) + + minetest.register_node(name .. "_top", { + drawtype = "nodebox", + tiles = def.tiles.top, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, bed = 2}, + sounds = default.node_sound_wood_defaults(), + node_box = { + type = "fixed", + fixed = def.nodebox.top, + }, + selection_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, + }) + + minetest.register_alias(name, name .. "_bottom") + + -- register recipe + minetest.register_craft({ + output = name, + recipe = def.recipe + }) +end diff --git a/mods/beds/beds.lua b/mods/beds/beds.lua new file mode 100644 index 0000000..43bf98e --- /dev/null +++ b/mods/beds/beds.lua @@ -0,0 +1,88 @@ +-- fancy shaped bed +beds.register_bed("beds:fancy_bed", { + description = "Fancy Bed", + inventory_image = "beds_bed_fancy.png", + wield_image = "beds_bed_fancy.png", + tiles = { + bottom = { + "beds_bed_top1.png", + "default_wood.png", + "beds_bed_side1.png", + "beds_bed_side1.png^[transformFX", + "default_wood.png", + "beds_bed_foot.png", + }, + top = { + "beds_bed_top2.png", + "default_wood.png", + "beds_bed_side2.png", + "beds_bed_side2.png^[transformFX", + "beds_bed_head.png", + "default_wood.png", + } + }, + nodebox = { + bottom = { + {-0.5, -0.5, -0.5, -0.375, -0.065, -0.4375}, + {0.375, -0.5, -0.5, 0.5, -0.065, -0.4375}, + {-0.5, -0.375, -0.5, 0.5, -0.125, -0.4375}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.4375, 0.4375, -0.0625, 0.5}, + }, + top = { + {-0.5, -0.5, 0.4375, -0.375, 0.1875, 0.5}, + {0.375, -0.5, 0.4375, 0.5, 0.1875, 0.5}, + {-0.5, 0, 0.4375, 0.5, 0.125, 0.5}, + {-0.5, -0.375, 0.4375, 0.5, -0.125, 0.5}, + {-0.5, -0.375, -0.5, -0.4375, -0.125, 0.5}, + {0.4375, -0.375, -0.5, 0.5, -0.125, 0.5}, + {-0.4375, -0.3125, -0.5, 0.4375, -0.0625, 0.4375}, + } + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"", "", "group:stick"}, + {"wool:red", "wool:red", "wool:white"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +-- simple shaped bed +beds.register_bed("beds:bed", { + description = "Simple Bed", + inventory_image = "beds_bed.png", + wield_image = "beds_bed.png", + tiles = { + bottom = { + "beds_bed_top_bottom.png^[transformR90", + "default_wood.png", + "beds_bed_side_bottom_r.png", + "beds_bed_side_bottom_r.png^[transformfx", + "beds_transparent.png", + "beds_bed_side_bottom.png" + }, + top = { + "beds_bed_top_top.png^[transformR90", + "default_wood.png", + "beds_bed_side_top_r.png", + "beds_bed_side_top_r.png^[transformfx", + "beds_bed_side_top.png", + "beds_transparent.png", + } + }, + nodebox = { + bottom = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + top = {-0.5, -0.5, -0.5, 0.5, 0.06, 0.5}, + }, + selectionbox = {-0.5, -0.5, -0.5, 0.5, 0.06, 1.5}, + recipe = { + {"wool:red", "wool:red", "wool:white"}, + {"group:wood", "group:wood", "group:wood"} + }, + +}) + +-- aliases for PA's beds mod +minetest.register_alias("beds:bed_bottom_red", "beds:bed_bottom") +minetest.register_alias("beds:bed_top_red", "beds:bed_top") diff --git a/mods/beds/depends.txt b/mods/beds/depends.txt new file mode 100644 index 0000000..470ec30 --- /dev/null +++ b/mods/beds/depends.txt @@ -0,0 +1,2 @@ +default +wool diff --git a/mods/beds/functions.lua b/mods/beds/functions.lua new file mode 100644 index 0000000..4c5c7d1 --- /dev/null +++ b/mods/beds/functions.lua @@ -0,0 +1,213 @@ +local player_in_bed = 0 +local is_sp = minetest.is_singleplayer() +local enable_respawn = minetest.setting_getbool("enable_bed_respawn") +if enable_respawn == nil then + enable_respawn = true +end + + +-- helper functions + +local function get_look_yaw(pos) + local n = minetest.get_node(pos) + if n.param2 == 1 then + return 7.9, n.param2 + elseif n.param2 == 3 then + return 4.75, n.param2 + elseif n.param2 == 0 then + return 3.15, n.param2 + else + return 6.28, n.param2 + end +end + +local function check_in_beds(players) + local in_bed = beds.player + if not players then + players = minetest.get_connected_players() + end + + for n, player in ipairs(players) do + local name = player:get_player_name() + if not in_bed[name] then + return false + end + end + + return #players > 0 +end + +local function lay_down(player, pos, bed_pos, state, skip) + local name = player:get_player_name() + local hud_flags = player:hud_get_flags() + + if not player or not name then + return + end + + -- stand up + if state ~= nil and not state then + local p = beds.pos[name] or nil + if beds.player[name] ~= nil then + beds.player[name] = nil + player_in_bed = player_in_bed - 1 + end + -- skip here to prevent sending player specific changes (used for leaving players) + if skip then + return + end + if p then + player:setpos(p) + end + + -- 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) + default.player_attached[name] = false + player:set_physics_override(1, 1, 1) + hud_flags.wielditem = true + default.player_set_animation(player, "stand" , 30) + + -- lay down + else + beds.player[name] = 1 + beds.pos[name] = pos + player_in_bed = player_in_bed + 1 + + -- 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) + 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) + player:setpos(p) + default.player_attached[name] = true + hud_flags.wielditem = false + default.player_set_animation(player, "lay" , 0) + end + + player:hud_set_flags(hud_flags) +end + +local function update_formspecs(finished) + local ges = #minetest.get_connected_players() + local form_n = "" + local is_majority = (ges/2) < player_in_bed + + if finished then + form_n = beds.formspec .. + "label[2.7,11; Good morning.]" + else + form_n = beds.formspec .. + "label[2.2,11;"..tostring(player_in_bed).." of "..tostring(ges).." players are in bed]" + if is_majority then + form_n = form_n .. + "button_exit[2,8;4,0.75;force;Force night skip]" + end + end + + for name,_ in pairs(beds.player) do + minetest.show_formspec(name, "beds_form", form_n) + end +end + + +-- public functions + +function beds.kick_players() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + lay_down(player, nil, nil, false) + end +end + +function beds.skip_night() + minetest.set_timeofday(0.23) + beds.set_spawns() +end + +function beds.on_rightclick(pos, player) + local name = player:get_player_name() + local ppos = player:getpos() + local tod = minetest.get_timeofday() + + if tod > 0.2 and tod < 0.805 then + if beds.player[name] then + lay_down(player, nil, nil, false) + end + minetest.chat_send_player(name, "You can only sleep at night.") + return + end + + -- move to bed + if not beds.player[name] then + lay_down(player, ppos, pos) + else + lay_down(player, nil, nil, false) + end + + if not is_sp then + update_formspecs(false) + end + + -- skip the night and let all players stand up + if check_in_beds() then + minetest.after(2, function() + beds.skip_night() + if not is_sp then + update_formspecs(true) + end + beds.kick_players() + end) + end +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) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + lay_down(player, nil, nil, false, true) + beds.player[name] = nil + if check_in_beds() then + minetest.after(2, function() + beds.skip_night() + update_formspecs(true) + beds.kick_players() + end) + end +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "beds_form" then + return + end + if fields.quit or fields.leave then + lay_down(player, nil, nil, false) + update_formspecs(false) + end + + if fields.force then + beds.skip_night() + update_formspecs(true) + beds.kick_players() + end +end) diff --git a/mods/beds/init.lua b/mods/beds/init.lua new file mode 100644 index 0000000..09982c2 --- /dev/null +++ b/mods/beds/init.lua @@ -0,0 +1,16 @@ +beds = {} +beds.player = {} +beds.pos = {} +beds.spawn = {} + +beds.formspec = "size[8,15;true]".. + "bgcolor[#080808BB; true]".. + "button_exit[2,12;4,0.75;leave;Leave Bed]" + +local modpath = minetest.get_modpath("beds") + +-- load files +dofile(modpath.."/functions.lua") +dofile(modpath.."/api.lua") +dofile(modpath.."/beds.lua") +dofile(modpath.."/spawns.lua") diff --git a/mods/beds/spawns.lua b/mods/beds/spawns.lua new file mode 100644 index 0000000..6e087f8 --- /dev/null +++ b/mods/beds/spawns.lua @@ -0,0 +1,58 @@ +local world_path = minetest.get_worldpath() +local org_file = world_path .. "/beds_spawns" +local file = world_path .. "/beds_spawns" +local bkwd = false + +-- check for PA's beds mod spawns +local cf = io.open(world_path .. "/beds_player_spawns", "r") +if cf ~= nil then + io.close(cf) + file = world_path .. "/beds_player_spawns" + bkwd = true +end + +function beds.read_spawns() + local spawns = beds.spawn + local input = io.open(file, "r") + if input and not bkwd then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + spawns[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + elseif input and bkwd then + beds.spawn = minetest.deserialize(input:read("*all")) + input:close() + beds.save_spawns() + os.rename(file, file .. ".backup") + file = org_file + else + spawns = {} + end +end + +function beds.save_spawns() + if not beds.spawn then + return + end + local output = io.open(org_file, "w") + for i, v in pairs(beds.spawn) do + output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n") + end + io.close(output) +end + +function beds.set_spawns() + for name,_ in pairs(beds.player) do + local player = minetest.get_player_by_name(name) + local p = player:getpos() + beds.spawn[name] = p + end + beds.save_spawns() +end diff --git a/mods/beds/textures/beds_bed.png b/mods/beds/textures/beds_bed.png new file mode 100644 index 0000000..5c0054c Binary files /dev/null and b/mods/beds/textures/beds_bed.png differ diff --git a/mods/beds/textures/beds_bed_fancy.png b/mods/beds/textures/beds_bed_fancy.png new file mode 100644 index 0000000..4f9e8a7 Binary files /dev/null and b/mods/beds/textures/beds_bed_fancy.png differ diff --git a/mods/beds/textures/beds_bed_foot.png b/mods/beds/textures/beds_bed_foot.png new file mode 100644 index 0000000..74d84c8 Binary files /dev/null and b/mods/beds/textures/beds_bed_foot.png differ diff --git a/mods/beds/textures/beds_bed_head.png b/mods/beds/textures/beds_bed_head.png new file mode 100644 index 0000000..763f5e1 Binary files /dev/null and b/mods/beds/textures/beds_bed_head.png differ diff --git a/mods/beds/textures/beds_bed_side1.png b/mods/beds/textures/beds_bed_side1.png new file mode 100644 index 0000000..1ed8158 Binary files /dev/null and b/mods/beds/textures/beds_bed_side1.png differ diff --git a/mods/beds/textures/beds_bed_side2.png b/mods/beds/textures/beds_bed_side2.png new file mode 100644 index 0000000..9d1384d Binary files /dev/null and b/mods/beds/textures/beds_bed_side2.png differ diff --git a/mods/beds/textures/beds_bed_side_bottom.png b/mods/beds/textures/beds_bed_side_bottom.png new file mode 100644 index 0000000..99ff309 Binary files /dev/null and b/mods/beds/textures/beds_bed_side_bottom.png differ diff --git a/mods/beds/textures/beds_bed_side_bottom_r.png b/mods/beds/textures/beds_bed_side_bottom_r.png new file mode 100644 index 0000000..6f870e8 Binary files /dev/null and b/mods/beds/textures/beds_bed_side_bottom_r.png differ diff --git a/mods/beds/textures/beds_bed_side_top.png b/mods/beds/textures/beds_bed_side_top.png new file mode 100644 index 0000000..b2807c5 Binary files /dev/null and b/mods/beds/textures/beds_bed_side_top.png differ diff --git a/mods/beds/textures/beds_bed_side_top_r.png b/mods/beds/textures/beds_bed_side_top_r.png new file mode 100644 index 0000000..429ad7d Binary files /dev/null and b/mods/beds/textures/beds_bed_side_top_r.png differ diff --git a/mods/beds/textures/beds_bed_top1.png b/mods/beds/textures/beds_bed_top1.png new file mode 100644 index 0000000..b6fcc2c Binary files /dev/null and b/mods/beds/textures/beds_bed_top1.png differ diff --git a/mods/beds/textures/beds_bed_top2.png b/mods/beds/textures/beds_bed_top2.png new file mode 100644 index 0000000..2fe5bf2 Binary files /dev/null and b/mods/beds/textures/beds_bed_top2.png differ diff --git a/mods/beds/textures/beds_bed_top_bottom.png b/mods/beds/textures/beds_bed_top_bottom.png new file mode 100644 index 0000000..9b78be6 Binary files /dev/null and b/mods/beds/textures/beds_bed_top_bottom.png differ diff --git a/mods/beds/textures/beds_bed_top_top.png b/mods/beds/textures/beds_bed_top_top.png new file mode 100644 index 0000000..e877c80 Binary files /dev/null and b/mods/beds/textures/beds_bed_top_top.png differ diff --git a/mods/beds/textures/beds_transparent.png b/mods/beds/textures/beds_transparent.png new file mode 100644 index 0000000..2dc0e3d Binary files /dev/null and b/mods/beds/textures/beds_transparent.png differ diff --git a/mods/boats/README.txt b/mods/boats/README.txt new file mode 100644 index 0000000..5100481 --- /dev/null +++ b/mods/boats/README.txt @@ -0,0 +1,16 @@ +Minetest 0.4 mod: boats +======================= +by PilzAdam, slightly modified for NeXt + +License of source code: +----------------------- +WTFPL + +License of media (textures and sounds): +--------------------------------------- +WTFPL + +Authors of media files: +----------------------- +textures: Zeg9 +model: thetoon and Zeg9, modified by PavelS(SokolovPavel) diff --git a/mods/boats/depends.txt b/mods/boats/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/boats/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/boats/init.lua b/mods/boats/init.lua new file mode 100644 index 0000000..8d61dc5 --- /dev/null +++ b/mods/boats/init.lua @@ -0,0 +1,217 @@ + +-- +-- Helper functions +-- + +local function is_water(pos) + local nn = minetest.get_node(pos).name + return minetest.get_item_group(nn, "water") ~= 0 +end + +local function get_sign(i) + if i == 0 then + return 0 + else + return i / math.abs(i) + end +end + +local function get_velocity(v, yaw, y) + local x = -math.sin(yaw) * v + local z = math.cos(yaw) * v + return {x = x, y = y, z = z} +end + +local function get_v(v) + return math.sqrt(v.x ^ 2 + v.z ^ 2) +end + +-- +-- Boat entity +-- + +local boat = { + physical = true, + collisionbox = {-0.5, -0.4, -0.5, 0.5, 0.3, 0.5}, + visual = "mesh", + mesh = "boat.obj", + textures = {"default_wood.png"}, + + driver = nil, + v = 0, + last_v = 0, + removed = false +} + +function boat.on_rightclick(self, clicker) + if not clicker or not clicker:is_player() then + return + end + local name = clicker:get_player_name() + if self.driver and clicker == self.driver then + self.driver = nil + clicker:set_detach() + default.player_attached[name] = false + default.player_set_animation(clicker, "stand" , 30) + elseif not self.driver then + self.driver = clicker + clicker:set_attach(self.object, "", {x = 0, y = 11, z = -3}, {x = 0, y = 0, z = 0}) + default.player_attached[name] = true + minetest.after(0.2, function() + default.player_set_animation(clicker, "sit" , 30) + end) + self.object:setyaw(clicker:get_look_yaw() - math.pi / 2) + end +end + +function boat.on_activate(self, staticdata, dtime_s) + self.object:set_armor_groups({immortal = 1}) + if staticdata then + self.v = tonumber(staticdata) + end + self.last_v = self.v +end + +function boat.get_staticdata(self) + return tostring(self.v) +end + +function boat.on_punch(self, puncher, time_from_last_punch, tool_capabilities, direction) + if not puncher or not puncher:is_player() or self.removed then + return + end + if self.driver and puncher == self.driver then + self.driver = nil + puncher:set_detach() + default.player_attached[puncher:get_player_name()] = false + end + if not self.driver then + self.removed = true + -- delay remove to ensure player is detached + minetest.after(0.1, function() + self.object:remove() + end) + if not minetest.setting_getbool("creative_mode") then + puncher:get_inventory():add_item("main", "boats:boat") + end + end +end + +function boat.on_step(self, dtime) + self.v = get_v(self.object:getvelocity()) * get_sign(self.v) + if self.driver then + local ctrl = self.driver:get_player_control() + local yaw = self.object:getyaw() + if ctrl.up then + self.v = self.v + 0.1 + elseif ctrl.down then + self.v = self.v - 0.1 + end + if ctrl.left then + if self.v < 0 then + self.object:setyaw(yaw - (1 + dtime) * 0.03) + else + self.object:setyaw(yaw + (1 + dtime) * 0.03) + end + elseif ctrl.right then + if self.v < 0 then + self.object:setyaw(yaw + (1 + dtime) * 0.03) + else + self.object:setyaw(yaw - (1 + dtime) * 0.03) + end + end + end + local velo = self.object:getvelocity() + if self.v == 0 and velo.x == 0 and velo.y == 0 and velo.z == 0 then + self.object:setpos(self.object:getpos()) + return + end + local s = get_sign(self.v) + self.v = self.v - 0.02 * s + if s ~= get_sign(self.v) then + self.object:setvelocity({x = 0, y = 0, z = 0}) + self.v = 0 + return + end + if math.abs(self.v) > 4.5 then + self.v = 4.5 * get_sign(self.v) + end + + local p = self.object:getpos() + p.y = p.y - 0.5 + local new_velo = {x = 0, y = 0, z = 0} + 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] + if (not nodedef) or nodedef.walkable then + self.v = 0 + new_acce = {x = 0, y = 1, z = 0} + else + new_acce = {x = 0, y = -9.8, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + else + p.y = p.y + 1 + if is_water(p) then + local y = self.object:getvelocity().y + if y >= 4.5 then + y = 4.5 + elseif y < 0 then + new_acce = {x = 0, y = 20, z = 0} + else + new_acce = {x = 0, y = 5, z = 0} + end + new_velo = get_velocity(self.v, self.object:getyaw(), y) + self.object:setpos(self.object:getpos()) + else + new_acce = {x = 0, y = 0, z = 0} + if math.abs(self.object:getvelocity().y) < 1 then + local pos = self.object:getpos() + pos.y = math.floor(pos.y) + 0.5 + self.object:setpos(pos) + new_velo = get_velocity(self.v, self.object:getyaw(), 0) + else + new_velo = get_velocity(self.v, self.object:getyaw(), self.object:getvelocity().y) + self.object:setpos(self.object:getpos()) + end + end + end + self.object:setvelocity(new_velo) + self.object:setacceleration(new_acce) +end + +minetest.register_entity("boats:boat", boat) + +minetest.register_craftitem("boats:boat", { + description = "Boat", + inventory_image = "boat_inventory.png", + wield_image = "boat_wield.png", + wield_scale = {x = 2, y = 2, z = 1}, + liquids_pointable = true, + + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return + end + if not is_water(pointed_thing.under) then + return + 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() + end + return itemstack + end, +}) + +minetest.register_craft({ + output = "boats:boat", + recipe = { + {"", "", "" }, + {"group:wood", "", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + diff --git a/mods/boats/models/boat.obj b/mods/boats/models/boat.obj new file mode 100644 index 0000000..8c3424f --- /dev/null +++ b/mods/boats/models/boat.obj @@ -0,0 +1,3111 @@ +# Blender v2.73 (sub 0) OBJ File: '' +# www.blender.org +v -6.786140 -1.967150 -4.863200 +v -6.786140 -3.034000 -6.001260 +v -6.786140 -3.034000 -4.863200 +v -6.786140 -1.967150 -3.725140 +v -6.786140 -3.034000 -3.725140 +v -6.786140 -1.967150 -6.001260 +v -6.786140 -3.034000 -7.139320 +v -6.786140 -1.967150 -7.139320 +v -6.786140 -3.034000 -8.277380 +v -6.786140 -1.967150 -8.277380 +v -6.786140 -3.034000 -9.415440 +v -6.786140 -1.967150 -9.415440 +v -6.786140 -1.967150 -2.587080 +v -6.786140 -3.034000 -2.587080 +v -6.786140 -1.967150 -1.449020 +v -6.786140 -3.034000 -1.449020 +v -6.786140 -1.967150 -0.310965 +v -6.786140 -3.034000 -0.310965 +v -6.786140 -1.967150 0.827094 +v -6.786140 -3.034000 0.827094 +v -6.786140 -1.967150 1.965150 +v -6.786140 -3.034000 1.965150 +v -6.786140 -1.967150 3.103210 +v -6.786140 -3.034000 3.103210 +v -6.786140 -1.967150 4.241270 +v -6.786140 -3.034000 4.241270 +v -6.786140 -1.967150 5.379330 +v -6.786140 -3.034000 5.379330 +v -6.786140 -1.967150 6.517390 +v -6.786140 -3.034000 6.517390 +v -6.786140 -1.967150 7.655450 +v -6.786140 -3.034000 7.655450 +v -6.786140 -1.967150 8.793510 +v -6.786140 -3.033999 8.793510 +v 5.732520 -1.967150 -8.277380 +v 5.732520 -3.034000 -7.139320 +v 5.732520 -3.034000 -8.277380 +v 5.732520 -1.967150 -9.415440 +v 5.732520 -3.034000 -9.415440 +v 5.732520 -1.967150 -7.139320 +v 5.732520 -3.034000 -6.001260 +v 5.732520 -1.967150 -6.001260 +v 5.732520 -3.034000 -4.863200 +v 5.732520 -1.967150 -4.863200 +v 5.732520 -3.034000 -3.725140 +v 5.732520 -1.967150 -3.725140 +v 5.732520 -3.034000 -2.587080 +v 5.732520 -1.967150 -2.587080 +v 5.732520 -3.034000 -1.449020 +v 5.732520 -1.967150 -1.449020 +v 5.732520 -3.034000 -0.310965 +v 5.732520 -1.967150 -0.310965 +v 5.732520 -3.034000 0.827094 +v 5.732520 -1.967150 0.827094 +v 5.732520 -3.034000 1.965150 +v 5.732520 -1.967150 1.965150 +v 5.732520 -3.034000 3.103210 +v 5.732520 -1.967150 3.103210 +v 5.732520 -3.034000 4.241270 +v 5.732520 -1.967150 4.241270 +v 5.732520 -3.034000 5.379330 +v 5.732520 -1.967150 5.379330 +v 5.732520 -3.034000 6.517390 +v 5.732520 -1.967150 6.517390 +v 5.732520 -3.034000 7.655450 +v 5.732520 -1.967150 7.655450 +v 5.732520 -3.033999 8.793510 +v 5.732520 -1.967150 8.793510 +v -2.233900 -1.967150 -6.001260 +v -2.233900 -3.034000 -7.139320 +v -2.233900 -3.034000 -6.001260 +v -2.233900 -1.967150 -4.863200 +v -2.233900 -3.034000 -4.863200 +v -2.233900 -1.967150 -7.139320 +v -2.233900 -3.034000 -8.277380 +v -2.233900 -1.967150 -8.277380 +v -2.233900 -3.034000 -9.415440 +v -2.233900 -1.967150 -9.415440 +v -2.233900 -1.967150 -3.725140 +v -2.233900 -3.034000 -3.725140 +v -2.233900 -1.967150 -2.587080 +v -2.233900 -3.034000 -2.587080 +v -2.233900 -1.967150 -1.449020 +v -2.233900 -3.034000 -1.449020 +v -2.233900 -1.967150 -0.310965 +v -2.233900 -3.034000 -0.310965 +v -2.233900 -1.967150 0.827094 +v -2.233900 -3.034000 0.827094 +v -2.233900 -1.967150 1.965150 +v -2.233900 -3.034000 1.965150 +v -2.233900 -1.967150 3.103210 +v -2.233900 -3.034000 3.103210 +v -2.233900 -1.967150 4.241270 +v -2.233900 -3.034000 4.241270 +v -2.233900 -1.967150 5.379330 +v -2.233900 -3.034000 5.379330 +v -2.233900 -1.967150 6.517390 +v -2.233900 -3.034000 6.517390 +v -2.233900 -1.967150 7.655450 +v -2.233900 -3.034000 7.655450 +v -2.233900 -1.967150 8.793510 +v -2.233900 -3.033999 8.793510 +v 2.318340 -1.967150 -3.725140 +v 2.318340 -3.034000 -4.863200 +v 2.318340 -3.034000 -3.725140 +v 2.318340 -1.967150 -2.587080 +v 2.318340 -3.034000 -2.587080 +v 2.318340 -1.967150 -4.863200 +v 2.318340 -3.034000 -6.001260 +v 2.318340 -1.967150 -6.001260 +v 2.318340 -3.034000 -7.139320 +v 2.318340 -1.967150 -7.139320 +v 2.318340 -3.034000 -8.277380 +v 2.318340 -1.967150 -8.277380 +v 2.318340 -3.034000 -9.415440 +v 2.318340 -1.967150 -9.415440 +v 2.318340 -1.967150 -1.449020 +v 2.318340 -3.034000 -1.449020 +v 2.318340 -1.967150 -0.310965 +v 2.318340 -3.034000 -0.310965 +v 2.318340 -1.967150 0.827094 +v 2.318340 -3.034000 0.827094 +v 2.318340 -1.967150 1.965150 +v 2.318340 -3.034000 1.965150 +v 2.318340 -1.967150 3.103210 +v 2.318340 -3.034000 3.103210 +v 2.318340 -1.967150 4.241270 +v 2.318340 -3.034000 4.241270 +v 2.318340 -1.967150 5.379330 +v 2.318340 -3.034000 5.379330 +v 2.318340 -1.967150 6.517390 +v 2.318340 -3.034000 6.517390 +v 2.318340 -1.967150 7.655450 +v 2.318340 -3.034000 7.655450 +v 2.318340 -1.967150 8.793510 +v 2.318340 -3.033999 8.793510 +v -3.371960 -1.967150 6.517390 +v -3.371960 -3.034000 7.655450 +v -3.371960 -3.034000 6.517390 +v -3.371960 -1.967150 5.379330 +v -3.371960 -3.034000 5.379330 +v -3.371960 -1.967150 7.655450 +v -3.371960 -3.033999 8.793510 +v -3.371960 -1.967150 8.793510 +v -3.371960 -1.967150 4.241270 +v -3.371960 -3.034000 4.241270 +v -3.371960 -1.967150 3.103210 +v -3.371960 -3.034000 3.103210 +v -3.371960 -1.967150 1.965150 +v -3.371960 -3.034000 1.965150 +v -3.371960 -1.967150 0.827094 +v -3.371960 -3.034000 0.827094 +v -3.371960 -1.967150 -0.310965 +v -3.371960 -3.034000 -0.310965 +v -3.371960 -1.967150 -1.449020 +v -3.371960 -3.034000 -1.449020 +v -3.371960 -1.967150 -2.587080 +v -3.371960 -3.034000 -2.587080 +v -3.371960 -1.967150 -3.725140 +v -3.371960 -3.034000 -3.725140 +v -3.371960 -1.967150 -4.863200 +v -3.371960 -3.034000 -4.863200 +v -3.371960 -1.967150 -6.001260 +v -3.371960 -3.034000 -6.001260 +v -3.371960 -1.967150 -7.139320 +v -3.371960 -3.034000 -7.139320 +v -3.371960 -1.967150 -8.277380 +v -3.371960 -3.034000 -8.277380 +v -3.371960 -1.967150 -9.415440 +v -3.371960 -3.034000 -9.415440 +v 4.594460 -1.967150 8.793510 +v 3.456400 -3.033999 8.793510 +v 4.594460 -3.033999 8.793510 +v 3.456400 -1.967150 8.793510 +v 4.594460 0.276645 8.793510 +v 3.456400 0.276645 8.793510 +v 2.318340 0.276645 8.793510 +v 1.180280 -1.967150 8.793510 +v 3.456400 1.039180 8.793510 +v 4.594460 1.039180 8.793510 +v 5.732520 0.276645 8.793510 +v 5.732520 1.039180 8.793510 +v 6.870580 0.276645 8.793510 +v 6.870580 -1.967150 8.793510 +v 2.318340 1.039180 8.793510 +v 1.180280 0.276645 8.793510 +v 0.042220 0.276645 8.793510 +v 1.180280 1.039180 8.793510 +v 0.042220 -1.967150 8.793510 +v -1.095840 0.276645 8.793510 +v 0.042220 1.039180 8.793510 +v -1.095840 -1.967150 8.793510 +v 0.042220 -3.033999 8.793510 +v -1.095840 -3.033999 8.793510 +v 1.180280 -3.033999 8.793510 +v -2.233900 0.276645 8.793510 +v -4.510020 -1.967150 8.793510 +v -4.510020 -3.033999 8.793510 +v -3.371960 0.276645 8.793510 +v -1.095840 1.039180 8.793510 +v -2.233900 1.039180 8.793510 +v -4.510020 0.276645 8.793510 +v -3.371960 1.039180 8.793510 +v -4.510020 1.039180 8.793510 +v -5.648080 0.276645 8.793510 +v -5.648080 -1.967150 8.793510 +v -5.648080 1.039180 8.793510 +v -6.786140 0.276645 8.793510 +v -5.648080 -3.033999 8.793510 +v -7.786200 0.276645 8.793510 +v -7.786200 -1.967150 8.793510 +v -6.786140 1.039180 8.793510 +v 1.180280 -1.967150 1.965150 +v 1.180280 -3.034000 3.103210 +v 1.180280 -3.034000 1.965150 +v 1.180280 -1.967150 0.827094 +v 1.180280 -3.034000 0.827094 +v 1.180280 -1.967150 3.103210 +v 1.180280 -3.034000 4.241270 +v 1.180280 -1.967150 4.241270 +v 1.180280 -3.034000 5.379330 +v 1.180280 -1.967150 5.379330 +v 1.180280 -3.034000 6.517390 +v 1.180280 -1.967150 6.517390 +v 1.180280 -3.034000 7.655450 +v 1.180280 -1.967150 7.655450 +v 1.180280 -1.967150 -0.310965 +v 1.180280 -3.034000 -0.310965 +v 1.180280 -1.967150 -1.449020 +v 1.180280 -3.034000 -1.449020 +v 1.180280 -1.967150 -2.587080 +v 1.180280 -3.034000 -2.587080 +v 1.180280 -1.967150 -3.725140 +v 1.180280 -3.034000 -3.725140 +v 1.180280 -1.967150 -4.863200 +v 1.180280 -3.034000 -4.863200 +v 1.180280 -1.967150 -6.001260 +v 1.180280 -3.034000 -6.001260 +v 1.180280 -1.967150 -7.139320 +v 1.180280 -3.034000 -7.139320 +v 1.180280 -1.967150 -8.277380 +v 1.180280 -3.034000 -8.277380 +v 1.180280 -1.967150 -9.415440 +v 1.180280 -3.034000 -9.415440 +v 3.456400 -3.034000 -9.415440 +v 3.456400 -1.967150 -9.415440 +v 2.318340 0.276645 -9.415440 +v 1.180280 0.276645 -9.415440 +v 4.594460 -3.034000 -9.415440 +v 4.594460 -1.967150 -9.415440 +v 3.456400 0.276645 -9.415440 +v 2.318340 1.039180 -9.415440 +v 4.594460 0.276645 -9.415440 +v 3.456400 1.039180 -9.415440 +v 4.594460 1.039180 -9.415440 +v 5.732520 0.276645 -9.415440 +v 6.870580 -1.967150 -9.415440 +v 5.732520 1.039180 -9.415440 +v 6.870580 0.276645 -9.415440 +v 0.042220 0.276645 -9.415440 +v 0.042220 1.039180 -9.415440 +v 1.180280 1.039180 -9.415440 +v 0.042220 -1.967150 -9.415440 +v 0.042220 -3.034000 -9.415440 +v -1.095840 -1.967150 -9.415440 +v -1.095840 -3.034000 -9.415440 +v -2.233900 0.276645 -9.415440 +v -1.095840 0.276645 -9.415440 +v -3.371960 0.276645 -9.415440 +v -2.233900 1.039180 -9.415440 +v -1.095840 1.039180 -9.415440 +v -4.510020 0.276645 -9.415440 +v -4.510020 1.039180 -9.415440 +v -3.371960 1.039180 -9.415440 +v -4.510020 -1.967150 -9.415440 +v -5.648080 0.276645 -9.415440 +v -5.648080 1.039180 -9.415440 +v -5.648080 -1.967150 -9.415440 +v -4.510020 -3.034000 -9.415440 +v -6.786140 0.276645 -9.415440 +v -6.786140 1.039180 -9.415440 +v -5.648080 -3.034000 -9.415440 +v -7.786200 -1.967150 -9.415440 +v -7.786200 0.276645 -9.415440 +v 6.870580 -1.967150 7.655450 +v 6.870580 -1.967150 6.517390 +v 6.870580 -1.967150 5.379330 +v 6.870580 -1.967150 4.241270 +v 6.870580 -1.967150 3.103210 +v 6.870580 -1.967150 1.965150 +v 6.870580 -1.967150 0.827094 +v 6.870580 -1.967150 -0.310965 +v 6.870580 -1.967150 -1.449020 +v 6.870580 -1.967150 -2.587080 +v 6.870580 -1.967150 -3.725140 +v 6.870580 -1.967150 -4.863200 +v 6.870580 -1.967150 -6.001260 +v 6.870580 -1.967150 -7.139320 +v 6.870580 -1.967150 -8.277380 +v -5.648080 -3.034000 0.827094 +v -5.648080 -3.034000 -0.310965 +v -5.648080 -3.034000 1.965150 +v -4.510020 -3.034000 1.965150 +v -5.648080 -3.034000 3.103210 +v -4.510020 -3.034000 0.827094 +v -5.648080 -3.034000 4.241270 +v -4.510020 -3.034000 3.103210 +v -4.510020 -3.034000 -0.310965 +v -4.510020 -3.034000 -1.449020 +v -4.510020 -3.034000 -2.587080 +v -5.648080 -3.034000 -1.449020 +v -5.648080 -3.034000 -2.587080 +v -4.510020 -3.034000 -3.725140 +v -5.648080 -3.034000 -3.725140 +v -4.510020 -3.034000 -4.863200 +v -5.648080 -3.034000 -4.863200 +v -4.510020 -3.034000 -6.001260 +v -5.648080 -3.034000 -6.001260 +v -4.510020 -3.034000 -7.139320 +v -5.648080 -3.034000 -7.139320 +v -4.510020 -3.034000 -8.277380 +v -5.648080 -3.034000 -8.277380 +v -4.510020 -3.034000 4.241270 +v -4.510020 -3.034000 5.379330 +v -5.648080 -3.034000 5.379330 +v -5.648080 -3.034000 6.517390 +v -4.510020 -3.034000 6.517390 +v -5.648080 -3.034000 7.655450 +v -4.510020 -3.034000 7.655450 +v -1.095840 -3.034000 0.827094 +v -1.095840 -3.034000 -0.310965 +v -1.095840 -3.034000 1.965150 +v 0.042220 -3.034000 1.965150 +v -1.095840 -3.034000 3.103210 +v 0.042220 -3.034000 0.827094 +v -1.095840 -3.034000 4.241270 +v 0.042220 -3.034000 3.103210 +v 0.042220 -3.034000 -0.310965 +v 0.042220 -3.034000 -1.449020 +v 0.042220 -3.034000 -2.587080 +v -1.095840 -3.034000 -1.449020 +v -1.095840 -3.034000 -2.587080 +v 0.042220 -3.034000 -3.725140 +v -1.095840 -3.034000 -3.725140 +v 0.042220 -3.034000 -4.863200 +v -1.095840 -3.034000 -4.863200 +v 0.042220 -3.034000 -6.001260 +v -1.095840 -3.034000 -6.001260 +v 0.042220 -3.034000 -7.139320 +v -1.095840 -3.034000 -7.139320 +v 0.042220 -3.034000 -8.277380 +v -1.095840 -3.034000 -8.277380 +v 0.042220 -3.034000 4.241270 +v 0.042220 -3.034000 5.379330 +v -1.095840 -3.034000 5.379330 +v -1.095840 -3.034000 6.517390 +v 0.042220 -3.034000 6.517390 +v -1.095840 -3.034000 7.655450 +v 0.042220 -3.034000 7.655450 +v 3.456400 -3.034000 -3.725140 +v 3.456400 -3.034000 -4.863200 +v 3.456400 -3.034000 -2.587080 +v 4.594460 -3.034000 -2.587080 +v 3.456400 -3.034000 -1.449020 +v 4.594460 -3.034000 -3.725140 +v 3.456400 -3.034000 -0.310965 +v 4.594460 -3.034000 -1.449020 +v 4.594460 -3.034000 -4.863200 +v 4.594460 -3.034000 -6.001260 +v 4.594460 -3.034000 -7.139320 +v 3.456400 -3.034000 -6.001260 +v 3.456400 -3.034000 -7.139320 +v 4.594460 -3.034000 -8.277380 +v 3.456400 -3.034000 -8.277380 +v 4.594460 -3.034000 -0.310965 +v 4.594460 -3.034000 0.827094 +v 3.456400 -3.034000 0.827094 +v 3.456400 -3.034000 1.965150 +v 4.594460 -3.034000 1.965150 +v 3.456400 -3.034000 3.103210 +v 4.594460 -3.034000 3.103210 +v 3.456400 -3.034000 4.241270 +v 4.594460 -3.034000 4.241270 +v 3.456400 -3.034000 5.379330 +v 4.594460 -3.034000 5.379330 +v 3.456400 -3.034000 6.517390 +v 4.594460 -3.034000 6.517390 +v 3.456400 -3.034000 7.655450 +v 4.594460 -3.034000 7.655450 +v -2.233900 0.276645 -2.587080 +v -2.233900 1.039180 -1.449020 +v -2.233900 1.039180 -2.587080 +v -2.233900 0.276645 -3.725140 +v -2.233900 1.039180 -3.725140 +v -2.233900 0.276645 -1.449020 +v -2.233900 1.039180 -0.310965 +v -2.233900 0.276645 -0.310965 +v -2.233900 1.039180 0.827094 +v -2.233900 0.276645 0.827094 +v -2.233900 1.039180 1.965150 +v -2.233900 0.276645 1.965150 +v -2.233900 1.039180 3.103210 +v -2.233900 0.276645 3.103210 +v -2.233900 1.039180 4.241270 +v -2.233900 0.276645 4.241270 +v -2.233900 1.039180 5.379330 +v -2.233900 0.276645 5.379330 +v -2.233900 1.039180 6.517390 +v -2.233900 0.276645 6.517390 +v -2.233900 1.039180 7.655450 +v -2.233900 0.276645 7.655450 +v -2.233900 0.276645 -4.863200 +v -2.233900 1.039180 -4.863200 +v -2.233900 0.276645 -6.001260 +v -2.233900 1.039180 -6.001260 +v -2.233900 0.276645 -7.139320 +v -2.233900 1.039180 -7.139320 +v -2.233900 0.276645 -8.277380 +v -2.233900 1.039180 -8.277380 +v 2.318340 0.276645 4.241270 +v 2.318340 1.039180 5.379330 +v 2.318340 1.039180 4.241270 +v 2.318340 0.276645 3.103210 +v 2.318340 1.039180 3.103210 +v 2.318340 0.276645 5.379330 +v 2.318340 1.039180 6.517390 +v 2.318340 0.276645 6.517390 +v 2.318340 1.039180 7.655450 +v 2.318340 0.276645 7.655450 +v 2.318340 0.276645 1.965150 +v 2.318340 1.039180 1.965150 +v 2.318340 0.276645 0.827094 +v 2.318340 1.039180 0.827094 +v 2.318340 0.276645 -0.310965 +v 2.318340 1.039180 -0.310965 +v 2.318340 0.276645 -1.449020 +v 2.318340 1.039180 -1.449020 +v 2.318340 0.276645 -2.587080 +v 2.318340 1.039180 -2.587080 +v 2.318340 0.276645 -3.725140 +v 2.318340 1.039180 -3.725140 +v 2.318340 0.276645 -4.863200 +v 2.318340 1.039180 -4.863200 +v 2.318340 0.276645 -6.001260 +v 2.318340 1.039180 -6.001260 +v 2.318340 0.276645 -7.139320 +v 2.318340 1.039180 -7.139320 +v 2.318340 0.276645 -8.277380 +v 2.318340 1.039180 -8.277380 +v -6.786140 0.276645 6.517390 +v -6.786140 1.039180 7.655450 +v -6.786140 1.039180 6.517390 +v -6.786140 0.276645 5.379330 +v -6.786140 1.039180 5.379330 +v -6.786140 0.276645 7.655450 +v -6.786140 0.276645 4.241270 +v -6.786140 1.039180 4.241270 +v -6.786140 0.276645 3.103210 +v -6.786140 1.039180 3.103210 +v -6.786140 0.276645 1.965150 +v -6.786140 1.039180 1.965150 +v -6.786140 0.276645 0.827094 +v -6.786140 1.039180 0.827094 +v -6.786140 0.276645 -0.310965 +v -6.786140 1.039180 -0.310965 +v -6.786140 0.276645 -1.449020 +v -6.786140 1.039180 -1.449020 +v -6.786140 0.276645 -2.587080 +v -6.786140 1.039180 -2.587080 +v -6.786140 0.276645 -3.725140 +v -6.786140 1.039180 -3.725140 +v -6.786140 0.276645 -4.863200 +v -6.786140 1.039180 -4.863200 +v -6.786140 0.276645 -6.001260 +v -6.786140 1.039180 -6.001260 +v -6.786140 0.276645 -7.139320 +v -6.786140 1.039180 -7.139320 +v -6.786140 0.276645 -8.277380 +v -6.786140 1.039180 -8.277380 +v 1.180280 0.276645 -7.139320 +v 1.180280 1.039180 -8.277380 +v 1.180280 1.039180 -7.139320 +v 1.180280 0.276645 -6.001260 +v 1.180280 1.039180 -6.001260 +v 1.180280 0.276645 -8.277380 +v 1.180280 0.276645 -4.863200 +v 1.180280 1.039180 -4.863200 +v 1.180280 0.276645 -3.725140 +v 1.180280 1.039180 -3.725140 +v 1.180280 0.276645 -2.587080 +v 1.180280 1.039180 -2.587080 +v 1.180280 0.276645 -1.449020 +v 1.180280 1.039180 -1.449020 +v 1.180280 0.276645 -0.310965 +v 1.180280 1.039180 -0.310965 +v 1.180280 0.276645 0.827094 +v 1.180280 1.039180 0.827094 +v 1.180280 0.276645 1.965150 +v 1.180280 1.039180 1.965150 +v 1.180280 0.276645 3.103210 +v 1.180280 1.039180 3.103210 +v 1.180280 0.276645 4.241270 +v 1.180280 1.039180 4.241270 +v 1.180280 0.276645 5.379330 +v 1.180280 1.039180 5.379330 +v 1.180280 0.276645 6.517390 +v 1.180280 1.039180 6.517390 +v 1.180280 0.276645 7.655450 +v 1.180280 1.039180 7.655450 +v 5.732520 0.276645 3.103210 +v 5.732520 1.039180 1.965150 +v 5.732520 1.039180 3.103210 +v 5.732520 0.276645 4.241270 +v 5.732520 1.039180 4.241270 +v 5.732520 0.276645 1.965150 +v 5.732520 1.039180 0.827094 +v 5.732520 0.276645 0.827094 +v 5.732520 1.039180 -0.310965 +v 5.732520 0.276645 -0.310965 +v 5.732520 1.039180 -1.449020 +v 5.732520 0.276645 -1.449020 +v 5.732520 1.039180 -2.587080 +v 5.732520 0.276645 -2.587080 +v 5.732520 1.039180 -3.725140 +v 5.732520 0.276645 -3.725140 +v 5.732520 1.039180 -4.863200 +v 5.732520 0.276645 -4.863200 +v 5.732520 1.039180 -6.001260 +v 5.732520 0.276645 -6.001260 +v 5.732520 1.039180 -7.139320 +v 5.732520 0.276645 -7.139320 +v 5.732520 1.039180 -8.277380 +v 5.732520 0.276645 -8.277380 +v 5.732520 0.276645 5.379330 +v 5.732520 1.039180 5.379330 +v 5.732520 0.276645 6.517390 +v 5.732520 1.039180 6.517390 +v 5.732520 0.276645 7.655450 +v 5.732520 1.039180 7.655450 +v -3.371960 1.039180 7.655450 +v -3.371960 0.276645 7.655450 +v -3.371960 1.039180 6.517390 +v -3.371960 0.276645 6.517390 +v -3.371960 1.039180 5.379330 +v -3.371960 0.276645 5.379330 +v -3.371960 1.039180 4.241270 +v -3.371960 0.276645 4.241270 +v -3.371960 1.039180 3.103210 +v -3.371960 0.276645 3.103210 +v -3.371960 1.039180 1.965150 +v -3.371960 0.276645 1.965150 +v -3.371960 1.039180 0.827094 +v -3.371960 0.276645 0.827094 +v -3.371960 1.039180 -0.310965 +v -3.371960 0.276645 -0.310965 +v -3.371960 1.039180 -1.449020 +v -3.371960 0.276645 -1.449020 +v -3.371960 1.039180 -2.587080 +v -3.371960 0.276645 -2.587080 +v -3.371960 1.039180 -3.725140 +v -3.371960 0.276645 -3.725140 +v -3.371960 1.039180 -4.863200 +v -3.371960 0.276645 -4.863200 +v -3.371960 1.039180 -6.001260 +v -3.371960 0.276645 -6.001260 +v -3.371960 1.039180 -7.139320 +v -3.371960 0.276645 -7.139320 +v -3.371960 1.039180 -8.277380 +v -3.371960 0.276645 -8.277380 +v 6.870580 0.276645 7.655450 +v 6.870580 0.276645 6.517390 +v 6.870580 0.276645 5.379330 +v 6.870580 0.276645 4.241270 +v 6.870580 0.276645 3.103210 +v 6.870580 0.276645 1.965150 +v 6.870580 0.276645 0.827094 +v 6.870580 0.276645 -0.310965 +v 6.870580 0.276645 -1.449020 +v 6.870580 0.276645 -2.587080 +v 6.870580 0.276645 -3.725140 +v 6.870580 0.276645 -4.863200 +v 6.870580 0.276645 -6.001260 +v 6.870580 0.276645 -7.139320 +v 6.870580 0.276645 -8.277380 +v -1.095840 0.276645 -10.802900 +v -1.095840 -1.967150 -10.802900 +v -1.095840 0.276644 -12.034100 +v -1.095840 -1.967150 -12.034100 +v -1.095840 -4.601110 -10.802900 +v -1.095840 -4.601110 -12.034100 +v -1.095840 -4.601110 -9.415440 +v -1.095840 1.039180 -10.802900 +v -1.095840 1.039180 -12.034100 +v -1.095840 2.768579 -10.802900 +v -1.095840 2.768579 -12.034100 +v -1.095840 3.746069 -10.802900 +v -1.095840 2.768580 -7.883420 +v -1.095840 3.746069 -12.034100 +v -1.095840 3.746070 -7.883420 +v -1.095840 0.276644 -14.284900 +v -1.095840 -1.967151 -14.284900 +v -1.095840 -4.601110 -14.284900 +v 0.042220 -1.967150 -12.034100 +v 0.042220 -4.601110 -10.802900 +v 0.042220 -4.601110 -12.034100 +v 0.042220 -4.601110 -14.284900 +v 0.042220 -1.967150 -10.802900 +v 0.042220 -4.601110 -9.415440 +v 0.042220 0.276645 -10.802900 +v 0.042220 1.039180 -10.802900 +v 0.042220 0.276644 -12.034100 +v 0.042220 1.039180 -12.034100 +v 0.042220 2.768579 -12.034100 +v 0.042220 2.768579 -10.802900 +v 0.042220 -1.967151 -14.284900 +v 0.042220 0.276644 -14.284900 +v 0.042220 3.746069 -12.034100 +v 0.042220 3.746069 -10.802900 +v 0.042220 3.746070 -7.883420 +v 0.042220 2.768580 -7.883420 +v -7.786200 -1.967150 -8.277380 +v -7.786200 -1.967150 -7.139320 +v -7.786200 -1.967150 -6.001260 +v -7.786200 -1.967150 -4.863200 +v -7.786200 -1.967150 -3.725140 +v -7.786200 -1.967150 -2.587080 +v -7.786200 -1.967150 -1.449020 +v -7.786200 -1.967150 -0.310965 +v -7.786200 -1.967150 0.827094 +v -7.786200 -1.967150 1.965150 +v -7.786200 -1.967150 3.103210 +v -7.786200 -1.967150 4.241270 +v -7.786200 -1.967150 5.379330 +v -7.786200 -1.967150 6.517390 +v -7.786200 -1.967150 7.655450 +v -7.786200 0.276645 3.103210 +v -7.786200 0.276645 4.241270 +v -7.786200 0.276645 5.379330 +v -7.786200 0.276645 1.965150 +v -7.786200 0.276645 0.827094 +v -7.786200 0.276645 -0.310965 +v -7.786200 0.276645 -1.449020 +v -7.786200 0.276645 -2.587080 +v -7.786200 0.276645 -3.725140 +v -7.786200 0.276645 -4.863200 +v -7.786200 0.276645 -6.001260 +v -7.786200 0.276645 -7.139320 +v -7.786200 0.276645 -8.277380 +v -7.786200 0.276645 6.517390 +v -7.786200 0.276645 7.655450 +v 0.042220 1.039180 7.655450 +v 0.042220 1.039180 6.517390 +v -1.095840 1.039180 7.655450 +v 0.042220 1.039180 5.379330 +v -1.095840 1.039180 6.517390 +v -1.095840 1.039180 5.379330 +v 0.042220 1.039180 4.241270 +v -1.095840 1.039180 4.241270 +v 0.042220 1.039180 3.103210 +v -1.095840 1.039180 3.103210 +v 0.042220 1.039180 1.965150 +v -1.095840 1.039180 1.965150 +v 0.042220 1.039180 0.827094 +v -1.095840 1.039180 0.827094 +v 0.042220 1.039180 -0.310965 +v -1.095840 1.039180 -0.310965 +v 0.042220 1.039180 -1.449020 +v -1.095840 1.039180 -1.449020 +v 0.042220 1.039180 -2.587080 +v -1.095840 1.039180 -2.587080 +v 0.042220 1.039180 -3.725140 +v -1.095840 1.039180 -3.725140 +v 0.042220 1.039180 -4.863200 +v -1.095840 1.039180 -4.863200 +v 0.042220 1.039180 -6.001260 +v -1.095840 1.039180 -6.001260 +v 0.042220 1.039180 -7.139320 +v -1.095840 1.039180 -7.139320 +v 0.042220 1.039180 -8.277380 +v -1.095840 1.039180 -8.277380 +v -4.510020 1.039180 7.655450 +v -4.510020 1.039180 6.517390 +v -5.648080 1.039180 7.655450 +v -4.510020 1.039180 5.379330 +v -5.648080 1.039180 6.517390 +v -5.648080 1.039180 5.379330 +v -4.510020 1.039180 4.241270 +v -5.648080 1.039180 4.241270 +v -4.510020 1.039180 3.103210 +v -5.648080 1.039180 3.103210 +v -4.510020 1.039180 1.965150 +v -5.648080 1.039180 1.965150 +v -4.510020 1.039180 0.827094 +v -5.648080 1.039180 0.827094 +v -4.510020 1.039180 -0.310965 +v -5.648080 1.039180 -0.310965 +v -4.510020 1.039180 -1.449020 +v -5.648080 1.039180 -1.449020 +v -4.510020 1.039180 -2.587080 +v -5.648080 1.039180 -2.587080 +v -4.510020 1.039180 -3.725140 +v -5.648080 1.039180 -3.725140 +v -4.510020 1.039180 -4.863200 +v -5.648080 1.039180 -4.863200 +v -4.510020 1.039180 -6.001260 +v -5.648080 1.039180 -6.001260 +v -4.510020 1.039180 -7.139320 +v -5.648080 1.039180 -7.139320 +v -4.510020 1.039180 -8.277380 +v -5.648080 1.039180 -8.277380 +v 4.594460 1.039180 7.655450 +v 4.594460 1.039180 6.517390 +v 3.456400 1.039180 7.655450 +v 4.594460 1.039180 5.379330 +v 3.456400 1.039180 6.517390 +v 3.456400 1.039180 5.379330 +v 4.594460 1.039180 4.241270 +v 3.456400 1.039180 4.241270 +v 4.594460 1.039180 3.103210 +v 3.456400 1.039180 3.103210 +v 4.594460 1.039180 1.965150 +v 3.456400 1.039180 1.965150 +v 4.594460 1.039180 0.827094 +v 3.456400 1.039180 0.827094 +v 4.594460 1.039180 -0.310965 +v 3.456400 1.039180 -0.310965 +v 4.594460 1.039180 -1.449020 +v 3.456400 1.039180 -1.449020 +v 4.594460 1.039180 -2.587080 +v 3.456400 1.039180 -2.587080 +v 4.594460 1.039180 -3.725140 +v 3.456400 1.039180 -3.725140 +v 4.594460 1.039180 -4.863200 +v 3.456400 1.039180 -4.863200 +v 4.594460 1.039180 -6.001260 +v 3.456400 1.039180 -6.001260 +v 4.594460 1.039180 -7.139320 +v 3.456400 1.039180 -7.139320 +v 4.594460 1.039180 -8.277380 +v 3.456400 1.039180 -8.277380 +vt 0.116019 0.974315 +vt 0.087066 0.947167 +vt 0.116022 0.947170 +vt 0.144976 0.974318 +vt 0.144979 0.947173 +vt 0.087063 0.974311 +vt 0.058110 0.947165 +vt 0.058107 0.974308 +vt 0.029155 0.947162 +vt 0.029152 0.974306 +vt 0.000199 0.947159 +vt 0.000197 0.974303 +vt 0.173933 0.974322 +vt 0.173936 0.947177 +vt 0.202891 0.974326 +vt 0.202894 0.947180 +vt 0.231849 0.974330 +vt 0.231853 0.947184 +vt 0.260808 0.974334 +vt 0.260812 0.947187 +vt 0.289768 0.974338 +vt 0.289772 0.947190 +vt 0.318729 0.974342 +vt 0.318732 0.947194 +vt 0.347690 0.974345 +vt 0.347693 0.947196 +vt 0.376652 0.974348 +vt 0.376654 0.947199 +vt 0.405614 0.974351 +vt 0.405616 0.947201 +vt 0.434577 0.974353 +vt 0.434578 0.947203 +vt 0.463539 0.974355 +vt 0.463541 0.947205 +vt 0.029160 0.492913 +vt 0.058118 0.520059 +vt 0.029160 0.520059 +vt 0.000202 0.492913 +vt 0.000202 0.520059 +vt 0.058118 0.492913 +vt 0.087076 0.520059 +vt 0.087076 0.492913 +vt 0.116034 0.520059 +vt 0.116034 0.492914 +vt 0.144992 0.520060 +vt 0.144992 0.492914 +vt 0.173949 0.520060 +vt 0.173950 0.492914 +vt 0.202907 0.520060 +vt 0.202907 0.492915 +vt 0.231864 0.520060 +vt 0.231865 0.492915 +vt 0.260822 0.520061 +vt 0.260822 0.492916 +vt 0.289779 0.520061 +vt 0.289778 0.492916 +vt 0.318735 0.520060 +vt 0.318735 0.492916 +vt 0.347692 0.520060 +vt 0.347691 0.492915 +vt 0.376649 0.520059 +vt 0.376648 0.492915 +vt 0.405605 0.520058 +vt 0.405604 0.492914 +vt 0.434561 0.520056 +vt 0.434560 0.492912 +vt 0.463517 0.520055 +vt 0.463516 0.492911 +vt 0.087075 0.804197 +vt 0.058119 0.777052 +vt 0.087076 0.777053 +vt 0.116032 0.804198 +vt 0.116033 0.777053 +vt 0.058119 0.804197 +vt 0.029163 0.777052 +vt 0.029163 0.804196 +vt 0.000207 0.777052 +vt 0.000207 0.804196 +vt 0.144989 0.804200 +vt 0.144990 0.777054 +vt 0.173947 0.804201 +vt 0.173948 0.777055 +vt 0.202905 0.804202 +vt 0.202906 0.777056 +vt 0.231863 0.804203 +vt 0.231864 0.777057 +vt 0.260822 0.804204 +vt 0.260822 0.777057 +vt 0.289780 0.804205 +vt 0.289781 0.777058 +vt 0.318740 0.804205 +vt 0.318740 0.777058 +vt 0.347700 0.804206 +vt 0.347700 0.777058 +vt 0.376660 0.804206 +vt 0.376659 0.777058 +vt 0.405620 0.804205 +vt 0.405620 0.777057 +vt 0.434581 0.804205 +vt 0.434580 0.777056 +vt 0.463543 0.804203 +vt 0.463541 0.777054 +vt 0.144991 0.634078 +vt 0.116033 0.606933 +vt 0.144991 0.606933 +vt 0.173949 0.634079 +vt 0.173949 0.606933 +vt 0.116034 0.634078 +vt 0.087076 0.606933 +vt 0.087076 0.634079 +vt 0.058118 0.606933 +vt 0.058118 0.634079 +vt 0.029160 0.606933 +vt 0.029160 0.634079 +vt 0.000202 0.606933 +vt 0.000202 0.634080 +vt 0.202907 0.634079 +vt 0.202907 0.606933 +vt 0.231864 0.634078 +vt 0.231864 0.606933 +vt 0.260822 0.634078 +vt 0.260822 0.606933 +vt 0.289780 0.634078 +vt 0.289780 0.606932 +vt 0.318738 0.634077 +vt 0.318737 0.606932 +vt 0.347696 0.634077 +vt 0.347695 0.606931 +vt 0.376653 0.634076 +vt 0.376652 0.606930 +vt 0.405611 0.634074 +vt 0.405609 0.606928 +vt 0.434569 0.634072 +vt 0.434567 0.606927 +vt 0.463527 0.634069 +vt 0.463524 0.606924 +vt 0.405621 0.833166 +vt 0.434582 0.860316 +vt 0.405620 0.860316 +vt 0.376660 0.833166 +vt 0.376659 0.860315 +vt 0.434582 0.833166 +vt 0.463545 0.860317 +vt 0.463544 0.833166 +vt 0.347699 0.833166 +vt 0.347698 0.860314 +vt 0.318739 0.833165 +vt 0.318738 0.860313 +vt 0.289780 0.833164 +vt 0.289778 0.860311 +vt 0.260820 0.833163 +vt 0.260819 0.860309 +vt 0.231862 0.833161 +vt 0.231860 0.860308 +vt 0.202903 0.833160 +vt 0.202902 0.860306 +vt 0.173946 0.833158 +vt 0.173944 0.860304 +vt 0.144988 0.833157 +vt 0.144987 0.860302 +vt 0.116031 0.833155 +vt 0.116029 0.860300 +vt 0.087074 0.833154 +vt 0.087073 0.860299 +vt 0.058118 0.833153 +vt 0.058116 0.860297 +vt 0.029162 0.833152 +vt 0.029161 0.860295 +vt 0.000206 0.833151 +vt 0.000205 0.860294 +vt 0.662141 0.076691 +vt 0.691099 0.103837 +vt 0.662141 0.103837 +vt 0.633183 0.076691 +vt 0.633183 0.103837 +vt 0.691099 0.076691 +vt 0.720057 0.103837 +vt 0.720058 0.076691 +vt 0.662141 0.019597 +vt 0.691100 0.019597 +vt 0.720058 0.019597 +vt 0.749016 0.076691 +vt 0.691100 0.000194 +vt 0.662142 0.000194 +vt 0.633183 0.019597 +vt 0.633183 0.000194 +vt 0.604225 0.019597 +vt 0.604225 0.076691 +vt 0.720058 0.000194 +vt 0.749016 0.019597 +vt 0.777974 0.019597 +vt 0.749016 0.000195 +vt 0.777974 0.076691 +vt 0.806932 0.019597 +vt 0.777974 0.000195 +vt 0.806932 0.076691 +vt 0.777974 0.103837 +vt 0.806932 0.103837 +vt 0.749016 0.103837 +vt 0.835890 0.103837 +vt 0.835890 0.076691 +vt 0.864848 0.076691 +vt 0.835890 0.019597 +vt 0.893806 0.076691 +vt 0.893806 0.103837 +vt 0.864848 0.103837 +vt 0.864848 0.019597 +vt 0.806932 0.000195 +vt 0.835890 0.000195 +vt 0.893806 0.019597 +vt 0.864848 0.000195 +vt 0.893806 0.000194 +vt 0.922764 0.019597 +vt 0.922764 0.076691 +vt 0.922764 0.000194 +vt 0.951722 0.019597 +vt 0.951722 0.076691 +vt 0.951722 0.103837 +vt 0.922764 0.103837 +vt 0.977169 0.019597 +vt 0.977169 0.076690 +vt 0.951722 0.000194 +vt 0.289780 0.663036 +vt 0.318739 0.690182 +vt 0.289781 0.690182 +vt 0.260822 0.663036 +vt 0.260823 0.690182 +vt 0.318739 0.663035 +vt 0.347698 0.690181 +vt 0.347697 0.663035 +vt 0.376656 0.690180 +vt 0.376655 0.663033 +vt 0.405615 0.690178 +vt 0.405613 0.663032 +vt 0.434574 0.690176 +vt 0.434571 0.663030 +vt 0.463533 0.690173 +vt 0.463530 0.663027 +vt 0.231865 0.663036 +vt 0.231865 0.690182 +vt 0.202907 0.663036 +vt 0.202907 0.690182 +vt 0.173949 0.663036 +vt 0.173949 0.690182 +vt 0.144991 0.663036 +vt 0.144991 0.690182 +vt 0.116034 0.663036 +vt 0.116034 0.690182 +vt 0.087076 0.663036 +vt 0.087076 0.690182 +vt 0.058118 0.663036 +vt 0.058119 0.690182 +vt 0.029161 0.663037 +vt 0.029162 0.690182 +vt 0.000203 0.663038 +vt 0.000205 0.690183 +vt 0.579762 0.491109 +vt 0.550803 0.463966 +vt 0.579760 0.463963 +vt 0.550805 0.491111 +vt 0.579767 0.548202 +vt 0.608720 0.491107 +vt 0.608724 0.548199 +vt 0.521845 0.463968 +vt 0.521847 0.491114 +vt 0.550809 0.548204 +vt 0.579768 0.567604 +vt 0.521852 0.548206 +vt 0.550811 0.567606 +vt 0.492890 0.491116 +vt 0.492888 0.463971 +vt 0.521853 0.567608 +vt 0.492895 0.548208 +vt 0.463933 0.491118 +vt 0.492896 0.567610 +vt 0.463938 0.548210 +vt 0.637682 0.548197 +vt 0.637683 0.567600 +vt 0.608726 0.567602 +vt 0.637678 0.491105 +vt 0.608718 0.463961 +vt 0.637676 0.463959 +vt 0.666636 0.491103 +vt 0.666635 0.463957 +vt 0.695594 0.491102 +vt 0.695595 0.548197 +vt 0.666637 0.548197 +vt 0.695593 0.463956 +vt 0.724553 0.491102 +vt 0.724554 0.548197 +vt 0.695596 0.567600 +vt 0.666637 0.567600 +vt 0.753512 0.548197 +vt 0.753512 0.567600 +vt 0.724554 0.567600 +vt 0.753512 0.491102 +vt 0.724553 0.463955 +vt 0.782471 0.548197 +vt 0.782471 0.567600 +vt 0.782471 0.491102 +vt 0.753512 0.463955 +vt 0.811429 0.548197 +vt 0.811429 0.567600 +vt 0.782471 0.463955 +vt 0.811430 0.491102 +vt 0.836877 0.491102 +vt 0.836877 0.548197 +vt 0.811430 0.463955 +vt 0.434558 0.463956 +vt 0.405603 0.463958 +vt 0.463514 0.463955 +vt 0.376647 0.463959 +vt 0.347691 0.463959 +vt 0.318735 0.463959 +vt 0.289779 0.463959 +vt 0.260822 0.463959 +vt 0.231865 0.463958 +vt 0.202908 0.463957 +vt 0.173950 0.463956 +vt 0.144992 0.463956 +vt 0.116034 0.463956 +vt 0.087076 0.463955 +vt 0.058118 0.463955 +vt 0.029160 0.463955 +vt 0.000202 0.463955 +vt 0.260815 0.918228 +vt 0.231856 0.918225 +vt 0.289774 0.918230 +vt 0.289777 0.889271 +vt 0.318734 0.918233 +vt 0.260817 0.889269 +vt 0.347695 0.918235 +vt 0.318737 0.889273 +vt 0.231858 0.889266 +vt 0.202900 0.889264 +vt 0.173942 0.889262 +vt 0.202897 0.918222 +vt 0.173939 0.918219 +vt 0.144984 0.889259 +vt 0.144982 0.918216 +vt 0.116028 0.889257 +vt 0.116025 0.918214 +vt 0.087071 0.889255 +vt 0.087069 0.918211 +vt 0.058115 0.889253 +vt 0.058113 0.918209 +vt 0.029159 0.889251 +vt 0.029157 0.918206 +vt 0.000204 0.889249 +vt 0.000202 0.918204 +vt 0.347697 0.889274 +vt 0.376658 0.889276 +vt 0.376656 0.918237 +vt 0.405618 0.918239 +vt 0.405619 0.889277 +vt 0.434580 0.918241 +vt 0.434581 0.889278 +vt 0.463543 0.918242 +vt 0.463544 0.889279 +vt 0.260823 0.748099 +vt 0.231864 0.748098 +vt 0.289781 0.748099 +vt 0.289781 0.719140 +vt 0.318740 0.748099 +vt 0.260823 0.719140 +vt 0.347699 0.748099 +vt 0.318740 0.719140 +vt 0.231865 0.719140 +vt 0.202907 0.719140 +vt 0.173949 0.719140 +vt 0.202906 0.748098 +vt 0.173948 0.748097 +vt 0.144991 0.719139 +vt 0.144991 0.748097 +vt 0.116034 0.719139 +vt 0.116033 0.748096 +vt 0.087076 0.719139 +vt 0.087076 0.748096 +vt 0.058119 0.719139 +vt 0.058119 0.748096 +vt 0.029162 0.719139 +vt 0.029163 0.748096 +vt 0.000206 0.719140 +vt 0.000207 0.748096 +vt 0.347698 0.719140 +vt 0.376657 0.719139 +vt 0.376659 0.748098 +vt 0.405618 0.748097 +vt 0.405617 0.719137 +vt 0.434578 0.748095 +vt 0.434576 0.719135 +vt 0.463539 0.748093 +vt 0.463536 0.719133 +vt 0.144991 0.577975 +vt 0.116033 0.577975 +vt 0.173949 0.577975 +vt 0.173949 0.549017 +vt 0.202907 0.577975 +vt 0.144991 0.549017 +vt 0.231864 0.577975 +vt 0.202907 0.549018 +vt 0.116034 0.549017 +vt 0.087076 0.549017 +vt 0.058118 0.549017 +vt 0.087076 0.577975 +vt 0.058118 0.577975 +vt 0.029160 0.549017 +vt 0.029160 0.577975 +vt 0.000202 0.549017 +vt 0.000202 0.577975 +vt 0.231864 0.549018 +vt 0.260822 0.549018 +vt 0.260822 0.577975 +vt 0.289779 0.577975 +vt 0.289779 0.549018 +vt 0.318736 0.577974 +vt 0.318736 0.549017 +vt 0.347694 0.577974 +vt 0.347693 0.549017 +vt 0.376651 0.577973 +vt 0.376650 0.549016 +vt 0.405608 0.577971 +vt 0.405606 0.549014 +vt 0.434565 0.577969 +vt 0.434563 0.549013 +vt 0.463521 0.577967 +vt 0.463519 0.549011 +vt 0.237437 0.289790 +vt 0.256842 0.260831 +vt 0.256841 0.289791 +vt 0.237435 0.318750 +vt 0.256839 0.318751 +vt 0.237438 0.260831 +vt 0.256843 0.231873 +vt 0.237440 0.231872 +vt 0.256844 0.202915 +vt 0.237441 0.202914 +vt 0.256845 0.173957 +vt 0.237443 0.173956 +vt 0.256846 0.145001 +vt 0.237444 0.145000 +vt 0.256847 0.116044 +vt 0.237446 0.116043 +vt 0.256848 0.087089 +vt 0.237447 0.087088 +vt 0.256849 0.058134 +vt 0.237449 0.058133 +vt 0.256850 0.029180 +vt 0.237450 0.029179 +vt 0.256852 0.000226 +vt 0.237452 0.000225 +vt 0.237433 0.347711 +vt 0.256839 0.347712 +vt 0.237432 0.376673 +vt 0.256838 0.376674 +vt 0.237431 0.405636 +vt 0.256837 0.405637 +vt 0.237430 0.434601 +vt 0.256837 0.434601 +vt 0.237429 0.463567 +vt 0.256838 0.463567 +vt 0.392072 0.116043 +vt 0.411472 0.087086 +vt 0.411474 0.116042 +vt 0.392074 0.144999 +vt 0.411476 0.144998 +vt 0.392071 0.087087 +vt 0.411469 0.058130 +vt 0.392068 0.058132 +vt 0.411467 0.029175 +vt 0.392066 0.029177 +vt 0.411463 0.000221 +vt 0.392064 0.000223 +vt 0.392076 0.173956 +vt 0.411478 0.173955 +vt 0.392077 0.202913 +vt 0.411480 0.202912 +vt 0.392079 0.231871 +vt 0.411481 0.231870 +vt 0.392080 0.260829 +vt 0.411483 0.260828 +vt 0.392082 0.289788 +vt 0.411485 0.289787 +vt 0.392084 0.318747 +vt 0.411488 0.318746 +vt 0.392086 0.347707 +vt 0.411490 0.347705 +vt 0.392089 0.376667 +vt 0.411493 0.376665 +vt 0.392093 0.405628 +vt 0.411497 0.405625 +vt 0.392097 0.434589 +vt 0.411501 0.434585 +vt 0.392102 0.463550 +vt 0.411507 0.463546 +vt 0.082827 0.058117 +vt 0.102232 0.029164 +vt 0.102228 0.058119 +vt 0.082823 0.087072 +vt 0.102224 0.087075 +vt 0.082831 0.029162 +vt 0.102236 0.000209 +vt 0.082835 0.000207 +vt 0.082819 0.116028 +vt 0.102221 0.116031 +vt 0.082815 0.144984 +vt 0.102217 0.144987 +vt 0.082811 0.173940 +vt 0.102213 0.173943 +vt 0.082806 0.202897 +vt 0.102209 0.202900 +vt 0.082802 0.231854 +vt 0.102204 0.231857 +vt 0.082797 0.260812 +vt 0.102200 0.260815 +vt 0.082791 0.289770 +vt 0.102194 0.289774 +vt 0.082785 0.318729 +vt 0.102189 0.318733 +vt 0.082779 0.347689 +vt 0.102183 0.347693 +vt 0.082772 0.376649 +vt 0.102177 0.376654 +vt 0.082764 0.405611 +vt 0.102170 0.405616 +vt 0.082755 0.434573 +vt 0.102162 0.434579 +vt 0.082745 0.463537 +vt 0.102153 0.463544 +vt 0.363131 0.405631 +vt 0.343729 0.434595 +vt 0.343726 0.405633 +vt 0.363129 0.376670 +vt 0.343724 0.376671 +vt 0.363135 0.434593 +vt 0.343733 0.463559 +vt 0.363139 0.463555 +vt 0.363126 0.347709 +vt 0.343722 0.347710 +vt 0.363124 0.318749 +vt 0.343720 0.318750 +vt 0.363123 0.289790 +vt 0.343719 0.289791 +vt 0.363122 0.260831 +vt 0.343718 0.260832 +vt 0.363121 0.231873 +vt 0.343718 0.231873 +vt 0.363120 0.202915 +vt 0.343717 0.202915 +vt 0.363118 0.173957 +vt 0.343716 0.173958 +vt 0.363117 0.145001 +vt 0.343716 0.145001 +vt 0.363116 0.116044 +vt 0.343715 0.116045 +vt 0.363115 0.087089 +vt 0.343714 0.087089 +vt 0.363114 0.058133 +vt 0.343713 0.058134 +vt 0.363112 0.029179 +vt 0.343712 0.029180 +vt 0.363110 0.000226 +vt 0.343711 0.000226 +vt 0.517748 0.144989 +vt 0.498349 0.173948 +vt 0.498346 0.144991 +vt 0.517745 0.116032 +vt 0.498343 0.116034 +vt 0.517751 0.173946 +vt 0.498352 0.202905 +vt 0.517754 0.202903 +vt 0.498355 0.231863 +vt 0.517757 0.231861 +vt 0.498358 0.260820 +vt 0.517760 0.260818 +vt 0.498361 0.289778 +vt 0.517763 0.289776 +vt 0.498364 0.318737 +vt 0.517767 0.318734 +vt 0.498367 0.347695 +vt 0.517770 0.347693 +vt 0.498371 0.376653 +vt 0.517774 0.376651 +vt 0.498375 0.405612 +vt 0.517778 0.405609 +vt 0.498379 0.434570 +vt 0.517782 0.434567 +vt 0.498384 0.463528 +vt 0.517787 0.463525 +vt 0.517742 0.087075 +vt 0.498340 0.087077 +vt 0.517739 0.058119 +vt 0.498337 0.058121 +vt 0.517735 0.029162 +vt 0.498333 0.029165 +vt 0.517731 0.000205 +vt 0.498329 0.000208 +vt 0.208499 0.000223 +vt 0.189096 0.029175 +vt 0.189099 0.000221 +vt 0.208496 0.029177 +vt 0.189093 0.058129 +vt 0.208494 0.058131 +vt 0.189091 0.087084 +vt 0.208492 0.087086 +vt 0.189088 0.116040 +vt 0.208490 0.116042 +vt 0.189086 0.144996 +vt 0.208488 0.144998 +vt 0.189083 0.173953 +vt 0.208486 0.173955 +vt 0.189081 0.202910 +vt 0.208483 0.202912 +vt 0.189078 0.231868 +vt 0.208481 0.231870 +vt 0.189076 0.260827 +vt 0.208479 0.260829 +vt 0.189073 0.289786 +vt 0.208477 0.289788 +vt 0.189070 0.318746 +vt 0.208474 0.318748 +vt 0.189067 0.347707 +vt 0.208472 0.347709 +vt 0.189063 0.376669 +vt 0.208469 0.376671 +vt 0.189060 0.405633 +vt 0.208467 0.405635 +vt 0.189056 0.434597 +vt 0.208464 0.434599 +vt 0.189053 0.463564 +vt 0.208462 0.463566 +vt 0.546692 0.029158 +vt 0.546688 0.000201 +vt 0.546696 0.058115 +vt 0.546699 0.087072 +vt 0.546702 0.116029 +vt 0.546705 0.144986 +vt 0.546709 0.173943 +vt 0.546712 0.202900 +vt 0.546715 0.231858 +vt 0.546718 0.260815 +vt 0.546721 0.289773 +vt 0.546725 0.318731 +vt 0.546728 0.347689 +vt 0.546732 0.376647 +vt 0.546736 0.405605 +vt 0.546740 0.434563 +vt 0.546744 0.463521 +vt 0.779682 0.749443 +vt 0.744378 0.806538 +vt 0.744377 0.749444 +vt 0.713049 0.806539 +vt 0.713048 0.749445 +vt 0.744376 0.682422 +vt 0.713047 0.682423 +vt 0.779683 0.806538 +vt 0.779681 0.682421 +vt 0.779683 0.825941 +vt 0.744379 0.825941 +vt 0.713050 0.825941 +vt 0.744378 0.869946 +vt 0.713050 0.869946 +vt 0.744378 0.894818 +vt 0.818664 0.869946 +vt 0.713050 0.894818 +vt 0.818664 0.894818 +vt 0.655778 0.806540 +vt 0.655777 0.749446 +vt 0.655775 0.682424 +vt 0.569547 0.749447 +vt 0.538217 0.682426 +vt 0.569546 0.682425 +vt 0.626817 0.682425 +vt 0.538218 0.749448 +vt 0.502912 0.682427 +vt 0.502914 0.806542 +vt 0.502913 0.749448 +vt 0.538218 0.806541 +vt 0.502915 0.825944 +vt 0.538219 0.825944 +vt 0.569547 0.806541 +vt 0.569547 0.825944 +vt 0.569546 0.869948 +vt 0.538218 0.869947 +vt 0.626818 0.749446 +vt 0.626819 0.806540 +vt 0.569546 0.894819 +vt 0.538218 0.894819 +vt 0.463933 0.894818 +vt 0.463933 0.869946 +vt 0.603794 0.116022 +vt 0.603790 0.087065 +vt 0.603797 0.144979 +vt 0.603801 0.173936 +vt 0.603804 0.202894 +vt 0.603808 0.231851 +vt 0.603811 0.260809 +vt 0.603814 0.289766 +vt 0.603818 0.318724 +vt 0.603822 0.347682 +vt 0.603825 0.376640 +vt 0.603829 0.405597 +vt 0.603833 0.434555 +vt 0.603837 0.463513 +vt 0.603787 0.058108 +vt 0.603783 0.029151 +vt 0.603779 0.000194 +vt 0.029149 0.999750 +vt 0.000194 0.999747 +vt 0.058105 0.999753 +vt 0.087060 0.999756 +vt 0.116016 0.999760 +vt 0.144972 0.999764 +vt 0.173929 0.999768 +vt 0.202887 0.999773 +vt 0.231845 0.999778 +vt 0.260805 0.999783 +vt 0.289765 0.999787 +vt 0.318726 0.999792 +vt 0.347687 0.999795 +vt 0.376649 0.999799 +vt 0.405612 0.999801 +vt 0.434575 0.999804 +vt 0.463537 0.999806 +vt 0.057370 0.144980 +vt 0.057374 0.116024 +vt 0.057379 0.087069 +vt 0.057365 0.173936 +vt 0.057361 0.202893 +vt 0.057355 0.231850 +vt 0.057350 0.260807 +vt 0.057344 0.289765 +vt 0.057338 0.318724 +vt 0.057331 0.347683 +vt 0.057323 0.376643 +vt 0.057314 0.405603 +vt 0.057305 0.434564 +vt 0.057294 0.463526 +vt 0.057383 0.058113 +vt 0.057387 0.029158 +vt 0.057391 0.000203 +vt 0.314758 0.000227 +vt 0.314758 0.029181 +vt 0.285805 0.000227 +vt 0.314758 0.058135 +vt 0.285804 0.029180 +vt 0.314759 0.087090 +vt 0.285804 0.058135 +vt 0.285803 0.087090 +vt 0.314759 0.116045 +vt 0.285803 0.116045 +vt 0.314759 0.145002 +vt 0.285802 0.145001 +vt 0.314759 0.173958 +vt 0.285802 0.173958 +vt 0.314759 0.202916 +vt 0.285802 0.202915 +vt 0.314759 0.231874 +vt 0.285801 0.231873 +vt 0.314760 0.260832 +vt 0.285801 0.260832 +vt 0.314760 0.289791 +vt 0.285800 0.289791 +vt 0.314760 0.318751 +vt 0.285800 0.318751 +vt 0.314761 0.347712 +vt 0.285800 0.347712 +vt 0.314762 0.376673 +vt 0.285800 0.376674 +vt 0.314764 0.405635 +vt 0.285801 0.405637 +vt 0.314766 0.434598 +vt 0.285802 0.434600 +vt 0.314769 0.463562 +vt 0.285804 0.463565 +vt 0.160145 0.000217 +vt 0.160142 0.029172 +vt 0.131191 0.000214 +vt 0.160138 0.058126 +vt 0.131187 0.029168 +vt 0.160135 0.087082 +vt 0.131183 0.058123 +vt 0.131180 0.087078 +vt 0.160132 0.116037 +vt 0.131176 0.116034 +vt 0.160129 0.144994 +vt 0.131173 0.144990 +vt 0.160126 0.173950 +vt 0.131170 0.173947 +vt 0.160123 0.202907 +vt 0.131166 0.202904 +vt 0.160120 0.231865 +vt 0.131162 0.231862 +vt 0.160117 0.260824 +vt 0.131158 0.260820 +vt 0.160113 0.289783 +vt 0.131154 0.289779 +vt 0.160109 0.318743 +vt 0.131149 0.318739 +vt 0.160105 0.347704 +vt 0.131144 0.347699 +vt 0.160101 0.376666 +vt 0.131138 0.376660 +vt 0.160096 0.405629 +vt 0.131132 0.405623 +vt 0.160091 0.434593 +vt 0.131126 0.434587 +vt 0.160085 0.463559 +vt 0.131119 0.463552 +vt 0.469373 0.000213 +vt 0.469377 0.029168 +vt 0.440418 0.000217 +vt 0.469381 0.058124 +vt 0.440421 0.029172 +vt 0.469384 0.087080 +vt 0.440425 0.058127 +vt 0.440428 0.087083 +vt 0.469387 0.116037 +vt 0.440430 0.116039 +vt 0.469389 0.144994 +vt 0.440433 0.144996 +vt 0.469392 0.173951 +vt 0.440435 0.173953 +vt 0.469394 0.202908 +vt 0.440437 0.202910 +vt 0.469397 0.231865 +vt 0.440439 0.231868 +vt 0.469400 0.260823 +vt 0.440442 0.260826 +vt 0.469402 0.289781 +vt 0.440444 0.289784 +vt 0.469405 0.318740 +vt 0.440447 0.318743 +vt 0.469409 0.347699 +vt 0.440450 0.347702 +vt 0.469412 0.376657 +vt 0.440453 0.376661 +vt 0.469416 0.405616 +vt 0.440457 0.405620 +vt 0.469421 0.434575 +vt 0.440461 0.434580 +vt 0.469426 0.463534 +vt 0.440467 0.463540 +vt 0.000206 0.434543 +vt 0.000194 0.463503 +vt 0.000217 0.405584 +vt 0.000226 0.376625 +vt 0.000235 0.347667 +vt 0.000244 0.318709 +vt 0.000251 0.289752 +vt 0.000258 0.260795 +vt 0.000264 0.231838 +vt 0.000270 0.202882 +vt 0.000276 0.173926 +vt 0.000281 0.144971 +vt 0.000285 0.116015 +vt 0.000290 0.087060 +vt 0.000294 0.058105 +vt 0.000299 0.029149 +vt 0.000303 0.000194 +vt 0.666640 0.558125 +vt 0.637681 0.558127 +vt 0.604225 0.133183 +vt 0.639530 0.104225 +vt 0.639530 0.133183 +vt 0.604225 0.104225 +vt 0.661494 0.463564 +vt 0.680897 0.434607 +vt 0.680897 0.463565 +vt 0.724902 0.434608 +vt 0.724902 0.463566 +vt 0.661495 0.434607 +vt 0.749775 0.434608 +vt 0.749774 0.463567 +vt 0.683535 0.104225 +vt 0.683535 0.133183 +vt 0.781104 0.434608 +vt 0.781104 0.463567 +vt 0.855393 0.434608 +vt 0.855393 0.463567 +vt 0.666641 0.593430 +vt 0.637683 0.593431 +vt 0.666643 0.624759 +vt 0.637685 0.624760 +vt 0.666646 0.682031 +vt 0.637688 0.682033 +vt 0.604225 0.463561 +vt 0.604227 0.434604 +vt 0.757821 0.133183 +vt 0.782694 0.104225 +vt 0.782694 0.133183 +vt 0.757821 0.104225 +s off +f 1/1 2/2 3/3 +f 4/4 1/1 3/3 +f 4/4 3/3 5/5 +f 1/1 6/6 2/2 +f 6/6 7/7 2/2 +f 6/6 8/8 7/7 +f 8/8 9/9 7/7 +f 8/8 10/10 9/9 +f 10/10 11/11 9/9 +f 10/10 12/12 11/11 +f 13/13 4/4 5/5 +f 13/13 5/5 14/14 +f 15/15 13/13 14/14 +f 15/15 14/14 16/16 +f 17/17 15/15 16/16 +f 17/17 16/16 18/18 +f 19/19 17/17 18/18 +f 19/19 18/18 20/20 +f 21/21 19/19 20/20 +f 21/21 20/20 22/22 +f 23/23 21/21 22/22 +f 23/23 22/22 24/24 +f 25/25 23/23 24/24 +f 25/25 24/24 26/26 +f 27/27 25/25 26/26 +f 27/27 26/26 28/28 +f 29/29 27/27 28/28 +f 29/29 28/28 30/30 +f 31/31 29/29 30/30 +f 31/31 30/30 32/32 +f 33/33 31/31 32/32 +f 33/33 32/32 34/34 +f 35/35 36/36 37/37 +f 38/38 35/35 37/37 +f 38/38 37/37 39/39 +f 35/35 40/40 36/36 +f 40/40 41/41 36/36 +f 40/40 42/42 41/41 +f 42/42 43/43 41/41 +f 42/42 44/44 43/43 +f 44/44 45/45 43/43 +f 44/44 46/46 45/45 +f 46/46 47/47 45/45 +f 46/46 48/48 47/47 +f 48/48 49/49 47/47 +f 48/48 50/50 49/49 +f 50/50 51/51 49/49 +f 50/50 52/52 51/51 +f 52/52 53/53 51/51 +f 52/52 54/54 53/53 +f 54/54 55/55 53/53 +f 54/54 56/56 55/55 +f 56/56 57/57 55/55 +f 56/56 58/58 57/57 +f 58/58 59/59 57/57 +f 58/58 60/60 59/59 +f 60/60 61/61 59/59 +f 60/60 62/62 61/61 +f 62/62 63/63 61/61 +f 62/62 64/64 63/63 +f 64/64 65/65 63/63 +f 64/64 66/66 65/65 +f 66/66 67/67 65/65 +f 66/66 68/68 67/67 +f 69/69 70/70 71/71 +f 72/72 69/69 71/71 +f 72/72 71/71 73/73 +f 69/69 74/74 70/70 +f 74/74 75/75 70/70 +f 74/74 76/76 75/75 +f 76/76 77/77 75/75 +f 76/76 78/78 77/77 +f 79/79 72/72 73/73 +f 79/79 73/73 80/80 +f 81/81 79/79 80/80 +f 81/81 80/80 82/82 +f 83/83 81/81 82/82 +f 83/83 82/82 84/84 +f 85/85 83/83 84/84 +f 85/85 84/84 86/86 +f 87/87 85/85 86/86 +f 87/87 86/86 88/88 +f 89/89 87/87 88/88 +f 89/89 88/88 90/90 +f 91/91 89/89 90/90 +f 91/91 90/90 92/92 +f 93/93 91/91 92/92 +f 93/93 92/92 94/94 +f 95/95 93/93 94/94 +f 95/95 94/94 96/96 +f 97/97 95/95 96/96 +f 97/97 96/96 98/98 +f 99/99 97/97 98/98 +f 99/99 98/98 100/100 +f 101/101 99/99 100/100 +f 101/101 100/100 102/102 +f 103/103 104/104 105/105 +f 106/106 103/103 105/105 +f 106/106 105/105 107/107 +f 103/103 108/108 104/104 +f 108/108 109/109 104/104 +f 108/108 110/110 109/109 +f 110/110 111/111 109/109 +f 110/110 112/112 111/111 +f 112/112 113/113 111/111 +f 112/112 114/114 113/113 +f 114/114 115/115 113/113 +f 114/114 116/116 115/115 +f 117/117 106/106 107/107 +f 117/117 107/107 118/118 +f 119/119 117/117 118/118 +f 119/119 118/118 120/120 +f 121/121 119/119 120/120 +f 121/121 120/120 122/122 +f 123/123 121/121 122/122 +f 123/123 122/122 124/124 +f 125/125 123/123 124/124 +f 125/125 124/124 126/126 +f 127/127 125/125 126/126 +f 127/127 126/126 128/128 +f 129/129 127/127 128/128 +f 129/129 128/128 130/130 +f 131/131 129/129 130/130 +f 131/131 130/130 132/132 +f 133/133 131/131 132/132 +f 133/133 132/132 134/134 +f 135/135 133/133 134/134 +f 135/135 134/134 136/136 +f 137/137 138/138 139/139 +f 140/140 137/137 139/139 +f 140/140 139/139 141/141 +f 137/137 142/142 138/138 +f 142/142 143/143 138/138 +f 142/142 144/144 143/143 +f 145/145 140/140 141/141 +f 145/145 141/141 146/146 +f 147/147 145/145 146/146 +f 147/147 146/146 148/148 +f 149/149 147/147 148/148 +f 149/149 148/148 150/150 +f 151/151 149/149 150/150 +f 151/151 150/150 152/152 +f 153/153 151/151 152/152 +f 153/153 152/152 154/154 +f 155/155 153/153 154/154 +f 155/155 154/154 156/156 +f 157/157 155/155 156/156 +f 157/157 156/156 158/158 +f 159/159 157/157 158/158 +f 159/159 158/158 160/160 +f 161/161 159/159 160/160 +f 161/161 160/160 162/162 +f 163/163 161/161 162/162 +f 163/163 162/162 164/164 +f 165/165 163/163 164/164 +f 165/165 164/164 166/166 +f 167/167 165/165 166/166 +f 167/167 166/166 168/168 +f 169/169 167/167 168/168 +f 169/169 168/168 170/170 +f 171/171 172/172 173/173 +f 68/174 171/171 173/173 +f 68/174 173/173 67/175 +f 171/171 174/176 172/172 +f 174/176 136/177 172/172 +f 174/176 135/178 136/177 +f 174/176 171/171 175/179 +f 174/176 175/179 176/180 +f 135/178 174/176 176/180 +f 135/178 176/180 177/181 +f 178/182 135/178 177/181 +f 177/181 176/180 179/183 +f 176/180 175/179 180/184 +f 176/180 180/184 179/183 +f 175/179 181/185 182/186 +f 175/179 182/186 180/184 +f 171/171 181/185 175/179 +f 171/171 68/174 181/185 +f 68/174 183/187 181/185 +f 68/174 184/188 183/187 +f 177/181 179/183 185/189 +f 178/182 177/181 186/190 +f 187/191 186/190 188/192 +f 189/193 178/182 186/190 +f 189/193 186/190 187/191 +f 190/194 187/191 191/195 +f 187/191 188/192 191/195 +f 192/196 189/193 187/191 +f 192/196 187/191 190/194 +f 178/182 189/193 193/197 +f 189/193 192/196 194/198 +f 189/193 194/198 193/197 +f 178/182 193/197 195/199 +f 192/196 102/200 194/198 +f 192/196 101/201 102/200 +f 101/201 192/196 190/194 +f 144/202 101/201 196/203 +f 101/201 190/194 196/203 +f 144/202 197/204 198/205 +f 144/202 198/205 143/206 +f 197/204 144/202 199/207 +f 144/202 196/203 199/207 +f 196/203 190/194 200/208 +f 196/203 200/208 201/209 +f 190/194 191/195 200/208 +f 202/210 199/207 203/211 +f 197/204 199/207 202/210 +f 202/210 203/211 204/212 +f 205/213 202/210 204/212 +f 206/214 197/204 202/210 +f 206/214 202/210 205/213 +f 205/213 204/212 207/215 +f 208/216 205/213 207/215 +f 33/217 206/214 205/213 +f 33/217 205/213 208/216 +f 206/214 33/217 34/218 +f 206/214 34/218 209/219 +f 197/204 206/214 209/219 +f 197/204 209/219 198/205 +f 33/217 208/216 210/220 +f 33/217 210/220 211/221 +f 208/216 207/215 212/222 +f 213/223 214/224 215/225 +f 216/226 213/223 215/225 +f 216/226 215/225 217/227 +f 213/223 218/228 214/224 +f 218/228 219/229 214/224 +f 218/228 220/230 219/229 +f 220/230 221/231 219/229 +f 220/230 222/232 221/231 +f 222/232 223/233 221/231 +f 222/232 224/234 223/233 +f 224/234 225/235 223/233 +f 224/234 226/236 225/235 +f 226/236 195/237 225/235 +f 226/236 178/238 195/237 +f 227/239 216/226 217/227 +f 227/239 217/227 228/240 +f 229/241 227/239 228/240 +f 229/241 228/240 230/242 +f 231/243 229/241 230/242 +f 231/243 230/242 232/244 +f 233/245 231/243 232/244 +f 233/245 232/244 234/246 +f 235/247 233/245 234/246 +f 235/247 234/246 236/248 +f 237/249 235/247 236/248 +f 237/249 236/248 238/250 +f 239/251 237/249 238/250 +f 239/251 238/250 240/252 +f 241/253 239/251 240/252 +f 241/253 240/252 242/254 +f 243/255 241/253 242/254 +f 243/255 242/254 244/256 +f 116/257 245/258 115/259 +f 116/257 246/260 245/258 +f 246/260 116/257 247/261 +f 116/257 243/262 248/263 +f 116/257 248/263 247/261 +f 246/260 249/264 245/258 +f 246/260 250/265 249/264 +f 250/265 246/260 251/266 +f 246/260 247/261 251/266 +f 251/266 247/261 252/267 +f 253/268 251/266 254/269 +f 251/266 252/267 254/269 +f 250/265 251/266 253/268 +f 250/265 38/270 39/271 +f 250/265 39/271 249/264 +f 38/270 250/265 253/268 +f 253/268 254/269 255/272 +f 256/273 253/268 255/272 +f 38/270 253/268 256/273 +f 257/274 38/270 256/273 +f 256/273 255/272 258/275 +f 257/274 256/273 259/276 +f 248/263 260/277 261/278 +f 248/263 261/278 262/279 +f 243/262 260/277 248/263 +f 243/262 263/280 260/277 +f 263/280 243/262 244/281 +f 263/280 244/281 264/282 +f 265/283 263/280 264/282 +f 265/283 264/282 266/284 +f 78/285 265/283 266/284 +f 265/283 78/285 267/286 +f 265/283 267/286 268/287 +f 78/285 266/284 77/288 +f 78/285 169/289 269/290 +f 78/285 269/290 267/286 +f 268/287 267/286 270/291 +f 268/287 270/291 271/292 +f 269/290 272/293 273/294 +f 269/290 273/294 274/295 +f 169/289 272/293 269/290 +f 275/296 169/289 170/297 +f 169/289 275/296 272/293 +f 272/293 276/298 277/299 +f 272/293 277/299 273/294 +f 275/296 276/298 272/293 +f 278/300 275/296 279/301 +f 275/296 170/297 279/301 +f 275/296 278/300 276/298 +f 276/298 280/302 281/303 +f 276/298 281/303 277/299 +f 278/300 280/302 276/298 +f 278/300 279/301 282/304 +f 12/305 278/300 282/304 +f 278/300 12/305 280/302 +f 280/302 12/305 283/306 +f 280/302 283/306 284/307 +f 12/305 282/304 11/308 +f 133/133 178/238 226/236 +f 131/131 133/133 226/236 +f 131/131 226/236 224/234 +f 133/133 135/135 178/238 +f 129/129 131/131 224/234 +f 129/129 224/234 222/232 +f 127/127 129/129 222/232 +f 127/127 222/232 220/230 +f 125/125 127/127 220/230 +f 125/125 220/230 218/228 +f 123/123 125/125 218/228 +f 123/123 218/228 213/223 +f 121/121 123/123 213/223 +f 121/121 213/223 216/226 +f 119/119 121/121 216/226 +f 119/119 216/226 227/239 +f 117/117 119/119 227/239 +f 117/117 227/239 229/241 +f 106/106 117/117 229/241 +f 106/106 229/241 231/243 +f 103/103 106/106 231/243 +f 103/103 231/243 233/245 +f 108/108 103/103 233/245 +f 108/108 233/245 235/247 +f 110/110 108/108 235/247 +f 110/110 235/247 237/249 +f 112/112 110/110 237/249 +f 112/112 237/249 239/251 +f 114/114 112/112 239/251 +f 114/114 239/251 241/253 +f 116/116 114/114 241/253 +f 116/116 241/253 243/255 +f 99/99 144/144 142/142 +f 97/97 99/99 142/142 +f 97/97 142/142 137/137 +f 99/99 101/101 144/144 +f 95/95 97/97 137/137 +f 95/95 137/137 140/140 +f 93/93 95/95 140/140 +f 93/93 140/140 145/145 +f 91/91 93/93 145/145 +f 91/91 145/145 147/147 +f 89/89 91/91 147/147 +f 89/89 147/147 149/149 +f 87/87 89/89 149/149 +f 87/87 149/149 151/151 +f 85/85 87/87 151/151 +f 85/85 151/151 153/153 +f 83/83 85/85 153/153 +f 83/83 153/153 155/155 +f 81/81 83/83 155/155 +f 81/81 155/155 157/157 +f 79/79 81/81 157/157 +f 79/79 157/157 159/159 +f 72/72 79/79 159/159 +f 72/72 159/159 161/161 +f 69/69 72/72 161/161 +f 69/69 161/161 163/163 +f 74/74 69/69 163/163 +f 74/74 163/163 165/165 +f 76/76 74/74 165/165 +f 76/76 165/165 167/167 +f 78/78 76/76 167/167 +f 78/78 167/167 169/169 +f 285/309 68/68 66/66 +f 286/310 285/309 66/66 +f 286/310 66/66 64/64 +f 285/309 184/311 68/68 +f 287/312 286/310 64/64 +f 287/312 64/64 62/62 +f 288/313 287/312 62/62 +f 288/313 62/62 60/60 +f 289/314 288/313 60/60 +f 289/314 60/60 58/58 +f 290/315 289/314 58/58 +f 290/315 58/58 56/56 +f 291/316 290/315 56/56 +f 291/316 56/56 54/54 +f 292/317 291/316 54/54 +f 292/317 54/54 52/52 +f 293/318 292/317 52/52 +f 293/318 52/52 50/50 +f 294/319 293/318 50/50 +f 294/319 50/50 48/48 +f 295/320 294/319 48/48 +f 295/320 48/48 46/46 +f 296/321 295/320 46/46 +f 296/321 46/46 44/44 +f 297/322 296/321 44/44 +f 297/322 44/44 42/42 +f 298/323 297/322 42/42 +f 298/323 42/42 40/40 +f 299/324 298/323 40/40 +f 299/324 40/40 35/35 +f 257/325 299/324 35/35 +f 257/325 35/35 38/38 +f 300/326 22/22 20/20 +f 301/327 300/326 20/20 +f 301/327 20/20 18/18 +f 300/326 302/328 22/22 +f 302/328 24/24 22/22 +f 303/329 304/330 302/328 +f 302/328 304/330 24/24 +f 305/331 303/329 302/328 +f 305/331 302/328 300/326 +f 304/330 26/26 24/24 +f 304/330 306/332 26/26 +f 307/333 306/332 304/330 +f 303/329 307/333 304/330 +f 152/152 150/150 303/329 +f 152/152 303/329 305/331 +f 150/150 307/333 303/329 +f 154/154 152/152 305/331 +f 154/154 305/331 308/334 +f 308/334 305/331 300/326 +f 156/156 154/154 308/334 +f 156/156 308/334 309/335 +f 309/335 308/334 301/327 +f 308/334 300/326 301/327 +f 158/158 156/156 309/335 +f 158/158 309/335 310/336 +f 309/335 301/327 311/337 +f 310/336 309/335 311/337 +f 311/337 301/327 18/18 +f 311/337 18/18 16/16 +f 310/336 311/337 312/338 +f 312/338 311/337 16/16 +f 160/160 158/158 310/336 +f 160/160 310/336 313/339 +f 313/339 310/336 312/338 +f 314/340 312/338 14/14 +f 312/338 16/16 14/14 +f 313/339 312/338 314/340 +f 315/341 313/339 314/340 +f 162/162 160/160 313/339 +f 162/162 313/339 315/341 +f 314/340 14/14 5/5 +f 315/341 314/340 316/342 +f 316/342 314/340 5/5 +f 164/164 162/162 315/341 +f 164/164 315/341 317/343 +f 317/343 315/341 316/342 +f 318/344 316/342 3/3 +f 316/342 5/5 3/3 +f 317/343 316/342 318/344 +f 166/166 164/164 317/343 +f 166/166 317/343 319/345 +f 319/345 317/343 318/344 +f 318/344 3/3 2/2 +f 319/345 318/344 320/346 +f 320/346 318/344 2/2 +f 168/168 166/166 319/345 +f 168/168 319/345 321/347 +f 321/347 319/345 320/346 +f 322/348 320/346 7/7 +f 320/346 2/2 7/7 +f 321/347 320/346 322/348 +f 170/170 168/168 321/347 +f 170/170 321/347 279/349 +f 279/349 321/347 322/348 +f 322/348 7/7 9/9 +f 279/349 322/348 282/350 +f 282/350 322/348 9/9 +f 282/350 9/9 11/11 +f 148/148 323/351 307/333 +f 150/150 148/148 307/333 +f 307/333 323/351 306/332 +f 148/148 146/146 323/351 +f 323/351 324/352 325/353 +f 323/351 325/353 306/332 +f 146/146 324/352 323/351 +f 306/332 325/353 28/28 +f 306/332 28/28 26/26 +f 325/353 326/354 30/30 +f 325/353 30/30 28/28 +f 324/352 326/354 325/353 +f 141/141 327/355 324/352 +f 324/352 327/355 326/354 +f 146/146 141/141 324/352 +f 327/355 328/356 326/354 +f 326/354 328/356 32/32 +f 326/354 32/32 30/30 +f 141/141 139/139 327/355 +f 139/139 329/357 327/355 +f 327/355 329/357 328/356 +f 328/356 209/358 34/34 +f 328/356 34/34 32/32 +f 329/357 209/358 328/356 +f 138/138 198/359 329/357 +f 139/139 138/138 329/357 +f 329/357 198/359 209/358 +f 138/138 143/143 198/359 +f 330/360 90/90 88/88 +f 331/361 330/360 88/88 +f 331/361 88/88 86/86 +f 330/360 332/362 90/90 +f 332/362 92/92 90/90 +f 333/363 334/364 332/362 +f 332/362 334/364 92/92 +f 335/365 333/363 332/362 +f 335/365 332/362 330/360 +f 334/364 94/94 92/92 +f 334/364 336/366 94/94 +f 337/367 336/366 334/364 +f 333/363 337/367 334/364 +f 217/227 215/225 333/363 +f 217/227 333/363 335/365 +f 215/225 337/367 333/363 +f 338/368 335/365 330/360 +f 228/240 217/227 335/365 +f 228/240 335/365 338/368 +f 230/242 228/240 338/368 +f 230/242 338/368 339/369 +f 338/368 330/360 331/361 +f 339/369 338/368 331/361 +f 232/244 230/242 339/369 +f 232/244 339/369 340/370 +f 339/369 331/361 341/371 +f 340/370 339/369 341/371 +f 341/371 331/361 86/86 +f 341/371 86/86 84/84 +f 340/370 341/371 342/372 +f 342/372 341/371 84/84 +f 234/246 232/244 340/370 +f 234/246 340/370 343/373 +f 343/373 340/370 342/372 +f 344/374 342/372 82/82 +f 342/372 84/84 82/82 +f 343/373 342/372 344/374 +f 236/248 234/246 343/373 +f 236/248 343/373 345/375 +f 345/375 343/373 344/374 +f 344/374 82/82 80/80 +f 345/375 344/374 346/376 +f 346/376 344/374 80/80 +f 238/250 236/248 345/375 +f 238/250 345/375 347/377 +f 347/377 345/375 346/376 +f 348/378 346/376 73/73 +f 346/376 80/80 73/73 +f 347/377 346/376 348/378 +f 240/252 238/250 347/377 +f 240/252 347/377 349/379 +f 349/379 347/377 348/378 +f 348/378 73/73 71/71 +f 349/379 348/378 350/380 +f 350/380 348/378 71/71 +f 242/254 240/252 349/379 +f 242/254 349/379 351/381 +f 351/381 349/379 350/380 +f 352/382 350/380 70/70 +f 350/380 71/71 70/70 +f 351/381 350/380 352/382 +f 244/256 242/254 351/381 +f 244/256 351/381 264/383 +f 264/383 351/381 352/382 +f 352/382 70/70 75/75 +f 264/383 352/382 266/384 +f 266/384 352/382 75/75 +f 266/384 75/75 77/77 +f 214/224 353/385 337/367 +f 215/225 214/224 337/367 +f 337/367 353/385 336/366 +f 214/224 219/229 353/385 +f 219/229 354/386 353/385 +f 353/385 354/386 355/387 +f 353/385 355/387 336/366 +f 336/366 355/387 96/96 +f 336/366 96/96 94/94 +f 355/387 356/388 98/98 +f 355/387 98/98 96/96 +f 354/386 356/388 355/387 +f 221/231 357/389 354/386 +f 219/229 221/231 354/386 +f 354/386 357/389 356/388 +f 357/389 358/390 356/388 +f 356/388 358/390 100/100 +f 356/388 100/100 98/98 +f 221/231 223/233 357/389 +f 223/233 359/391 357/389 +f 357/389 359/391 358/390 +f 358/390 194/392 102/102 +f 358/390 102/102 100/100 +f 359/391 194/392 358/390 +f 225/235 193/393 359/391 +f 223/233 225/235 359/391 +f 359/391 193/393 194/392 +f 225/235 195/237 193/393 +f 360/394 107/107 105/105 +f 361/395 360/394 105/105 +f 361/395 105/105 104/104 +f 360/394 362/396 107/107 +f 362/396 118/118 107/107 +f 363/397 364/398 362/396 +f 362/396 364/398 118/118 +f 365/399 363/397 362/396 +f 365/399 362/396 360/394 +f 364/398 120/120 118/118 +f 364/398 366/400 120/120 +f 367/401 366/400 364/398 +f 363/397 367/401 364/398 +f 45/45 47/47 363/397 +f 45/45 363/397 365/399 +f 47/47 367/401 363/397 +f 368/402 365/399 360/394 +f 43/43 45/45 365/399 +f 43/43 365/399 368/402 +f 41/41 43/43 368/402 +f 41/41 368/402 369/403 +f 368/402 360/394 361/395 +f 369/403 368/402 361/395 +f 36/36 41/41 369/403 +f 36/36 369/403 370/404 +f 369/403 361/395 371/405 +f 370/404 369/403 371/405 +f 371/405 361/395 104/104 +f 371/405 104/104 109/109 +f 370/404 371/405 372/406 +f 372/406 371/405 109/109 +f 37/37 36/36 370/404 +f 37/37 370/404 373/407 +f 373/407 370/404 372/406 +f 374/408 372/406 111/111 +f 372/406 109/109 111/111 +f 373/407 372/406 374/408 +f 39/39 37/37 373/407 +f 39/39 373/407 249/409 +f 249/409 373/407 374/408 +f 374/408 111/111 113/113 +f 249/409 374/408 245/410 +f 245/410 374/408 113/113 +f 245/410 113/113 115/115 +f 49/49 375/411 367/401 +f 47/47 49/49 367/401 +f 367/401 375/411 366/400 +f 49/49 51/51 375/411 +f 51/51 376/412 375/411 +f 375/411 376/412 377/413 +f 375/411 377/413 366/400 +f 366/400 377/413 122/122 +f 366/400 122/122 120/120 +f 377/413 378/414 124/124 +f 377/413 124/124 122/122 +f 376/412 378/414 377/413 +f 53/53 379/415 376/412 +f 51/51 53/53 376/412 +f 376/412 379/415 378/414 +f 379/415 380/416 378/414 +f 378/414 380/416 126/126 +f 378/414 126/126 124/124 +f 53/53 55/55 379/415 +f 55/55 381/417 379/415 +f 379/415 381/417 380/416 +f 380/416 382/418 128/128 +f 380/416 128/128 126/126 +f 381/417 382/418 380/416 +f 57/57 383/419 381/417 +f 55/55 57/57 381/417 +f 381/417 383/419 382/418 +f 383/419 384/420 382/418 +f 382/418 384/420 130/130 +f 382/418 130/130 128/128 +f 57/57 59/59 383/419 +f 383/419 385/421 384/420 +f 59/59 385/421 383/419 +f 384/420 386/422 132/132 +f 384/420 132/132 130/130 +f 385/421 386/422 384/420 +f 61/61 387/423 385/421 +f 385/421 387/423 386/422 +f 59/59 61/61 385/421 +f 387/423 388/424 386/422 +f 386/422 388/424 134/134 +f 386/422 134/134 132/132 +f 61/61 63/63 387/423 +f 63/63 389/425 387/423 +f 387/423 389/425 388/424 +f 388/424 172/426 136/136 +f 388/424 136/136 134/134 +f 389/425 172/426 388/424 +f 65/65 173/427 389/425 +f 63/63 65/65 389/425 +f 389/425 173/427 172/426 +f 65/65 67/67 173/427 +f 390/428 391/429 392/430 +f 393/431 390/428 392/430 +f 393/431 392/430 394/432 +f 390/428 395/433 391/429 +f 395/433 396/434 391/429 +f 395/433 397/435 396/434 +f 397/435 398/436 396/434 +f 397/435 399/437 398/436 +f 399/437 400/438 398/436 +f 399/437 401/439 400/438 +f 401/439 402/440 400/438 +f 401/439 403/441 402/440 +f 403/441 404/442 402/440 +f 403/441 405/443 404/442 +f 405/443 406/444 404/442 +f 405/443 407/445 406/444 +f 407/445 408/446 406/444 +f 407/445 409/447 408/446 +f 409/447 410/448 408/446 +f 409/447 411/449 410/448 +f 411/449 201/450 410/448 +f 411/449 196/451 201/450 +f 412/452 393/431 394/432 +f 412/452 394/432 413/453 +f 414/454 412/452 413/453 +f 414/454 413/453 415/455 +f 416/456 414/454 415/455 +f 416/456 415/455 417/457 +f 418/458 416/456 417/457 +f 418/458 417/457 419/459 +f 267/460 418/458 419/459 +f 267/460 419/459 270/461 +f 420/462 421/463 422/464 +f 423/465 420/462 422/464 +f 423/465 422/464 424/466 +f 420/462 425/467 421/463 +f 425/467 426/468 421/463 +f 425/467 427/469 426/468 +f 427/469 428/470 426/468 +f 427/469 429/471 428/470 +f 429/471 185/472 428/470 +f 429/471 177/473 185/472 +f 430/474 423/465 424/466 +f 430/474 424/466 431/475 +f 432/476 430/474 431/475 +f 432/476 431/475 433/477 +f 434/478 432/476 433/477 +f 434/478 433/477 435/479 +f 436/480 434/478 435/479 +f 436/480 435/479 437/481 +f 438/482 436/480 437/481 +f 438/482 437/481 439/483 +f 440/484 438/482 439/483 +f 440/484 439/483 441/485 +f 442/486 440/484 441/485 +f 442/486 441/485 443/487 +f 444/488 442/486 443/487 +f 444/488 443/487 445/489 +f 446/490 444/488 445/489 +f 446/490 445/489 447/491 +f 448/492 446/490 447/491 +f 448/492 447/491 449/493 +f 247/494 448/492 449/493 +f 247/494 449/493 252/495 +f 450/496 451/497 452/498 +f 453/499 450/496 452/498 +f 453/499 452/498 454/500 +f 450/496 455/501 451/497 +f 455/501 212/502 451/497 +f 455/501 208/503 212/502 +f 456/504 453/499 454/500 +f 456/504 454/500 457/505 +f 458/506 456/504 457/505 +f 458/506 457/505 459/507 +f 460/508 458/506 459/507 +f 460/508 459/507 461/509 +f 462/510 460/508 461/509 +f 462/510 461/509 463/511 +f 464/512 462/510 463/511 +f 464/512 463/511 465/513 +f 466/514 464/512 465/513 +f 466/514 465/513 467/515 +f 468/516 466/514 467/515 +f 468/516 467/515 469/517 +f 470/518 468/516 469/517 +f 470/518 469/517 471/519 +f 472/520 470/518 471/519 +f 472/520 471/519 473/521 +f 474/522 472/520 473/521 +f 474/522 473/521 475/523 +f 476/524 474/522 475/523 +f 476/524 475/523 477/525 +f 478/526 476/524 477/525 +f 478/526 477/525 479/527 +f 280/528 478/526 479/527 +f 280/528 479/527 281/529 +f 480/530 481/531 482/532 +f 483/533 480/530 482/532 +f 483/533 482/532 484/534 +f 480/530 485/535 481/531 +f 485/535 262/536 481/531 +f 485/535 248/537 262/536 +f 486/538 483/533 484/534 +f 486/538 484/534 487/539 +f 488/540 486/538 487/539 +f 488/540 487/539 489/541 +f 490/542 488/540 489/541 +f 490/542 489/541 491/543 +f 492/544 490/542 491/543 +f 492/544 491/543 493/545 +f 494/546 492/544 493/545 +f 494/546 493/545 495/547 +f 496/548 494/546 495/547 +f 496/548 495/547 497/549 +f 498/550 496/548 497/549 +f 498/550 497/549 499/551 +f 500/552 498/550 499/551 +f 500/552 499/551 501/553 +f 502/554 500/552 501/553 +f 502/554 501/553 503/555 +f 504/556 502/554 503/555 +f 504/556 503/555 505/557 +f 506/558 504/556 505/557 +f 506/558 505/557 507/559 +f 508/560 506/558 507/559 +f 508/560 507/559 509/561 +f 186/562 508/560 509/561 +f 186/562 509/561 188/563 +f 510/564 511/565 512/566 +f 513/567 510/564 512/566 +f 513/567 512/566 514/568 +f 510/564 515/569 511/565 +f 515/569 516/570 511/565 +f 515/569 517/571 516/570 +f 517/571 518/572 516/570 +f 517/571 519/573 518/572 +f 519/573 520/574 518/572 +f 519/573 521/575 520/574 +f 521/575 522/576 520/574 +f 521/575 523/577 522/576 +f 523/577 524/578 522/576 +f 523/577 525/579 524/578 +f 525/579 526/580 524/578 +f 525/579 527/581 526/580 +f 527/581 528/582 526/580 +f 527/581 529/583 528/582 +f 529/583 530/584 528/582 +f 529/583 531/585 530/584 +f 531/585 532/586 530/584 +f 531/585 533/587 532/586 +f 533/587 258/588 532/586 +f 533/587 256/589 258/588 +f 534/590 513/567 514/568 +f 534/590 514/568 535/591 +f 536/592 534/590 535/591 +f 536/592 535/591 537/593 +f 538/594 536/592 537/593 +f 538/594 537/593 539/595 +f 181/596 538/594 539/595 +f 181/596 539/595 182/597 +f 199/598 540/599 203/600 +f 199/598 541/601 540/599 +f 541/601 542/602 540/599 +f 541/601 543/603 542/602 +f 543/603 544/604 542/602 +f 543/603 545/605 544/604 +f 545/605 546/606 544/604 +f 545/605 547/607 546/606 +f 547/607 548/608 546/606 +f 547/607 549/609 548/608 +f 549/609 550/610 548/608 +f 549/609 551/611 550/610 +f 551/611 552/612 550/610 +f 551/611 553/613 552/612 +f 553/613 554/614 552/612 +f 553/613 555/615 554/614 +f 555/615 556/616 554/614 +f 555/615 557/617 556/616 +f 557/617 558/618 556/616 +f 557/617 559/619 558/618 +f 559/619 560/620 558/618 +f 559/619 561/621 560/620 +f 561/621 562/622 560/620 +f 561/621 563/623 562/622 +f 563/623 564/624 562/622 +f 563/623 565/625 564/624 +f 565/625 566/626 564/624 +f 565/625 567/627 566/626 +f 567/627 568/628 566/626 +f 567/627 569/629 568/628 +f 569/629 274/630 568/628 +f 569/629 269/631 274/630 +f 429/471 186/562 177/473 +f 429/471 508/560 186/562 +f 427/469 508/560 429/471 +f 427/469 506/558 508/560 +f 425/467 506/558 427/469 +f 425/467 504/556 506/558 +f 420/462 504/556 425/467 +f 420/462 502/554 504/556 +f 423/465 502/554 420/462 +f 423/465 500/552 502/554 +f 430/474 500/552 423/465 +f 430/474 498/550 500/552 +f 432/476 498/550 430/474 +f 432/476 496/548 498/550 +f 434/478 496/548 432/476 +f 434/478 494/546 496/548 +f 436/480 494/546 434/478 +f 436/480 492/544 494/546 +f 438/482 492/544 436/480 +f 438/482 490/542 492/544 +f 440/484 490/542 438/482 +f 440/484 488/540 490/542 +f 442/486 488/540 440/484 +f 442/486 486/538 488/540 +f 444/488 486/538 442/486 +f 444/488 483/533 486/538 +f 446/490 483/533 444/488 +f 446/490 480/530 483/533 +f 448/492 480/530 446/490 +f 448/492 485/535 480/530 +f 247/494 485/535 448/492 +f 247/494 248/537 485/535 +f 411/449 199/598 196/451 +f 411/449 541/601 199/598 +f 409/447 541/601 411/449 +f 409/447 543/603 541/601 +f 407/445 543/603 409/447 +f 407/445 545/605 543/603 +f 405/443 545/605 407/445 +f 405/443 547/607 545/605 +f 403/441 547/607 405/443 +f 403/441 549/609 547/607 +f 401/439 549/609 403/441 +f 401/439 551/611 549/609 +f 399/437 551/611 401/439 +f 399/437 553/613 551/611 +f 397/435 553/613 399/437 +f 397/435 555/615 553/613 +f 395/433 555/615 397/435 +f 395/433 557/617 555/615 +f 390/428 557/617 395/433 +f 390/428 559/619 557/617 +f 393/431 559/619 390/428 +f 393/431 561/621 559/619 +f 412/452 561/621 393/431 +f 412/452 563/623 561/621 +f 414/454 563/623 412/452 +f 414/454 565/625 563/623 +f 416/456 565/625 414/454 +f 416/456 567/627 565/625 +f 418/458 567/627 416/456 +f 418/458 569/629 567/627 +f 267/460 569/629 418/458 +f 267/460 269/631 569/629 +f 570/632 181/596 183/633 +f 570/632 538/594 181/596 +f 571/634 538/594 570/632 +f 571/634 536/592 538/594 +f 572/635 536/592 571/634 +f 572/635 534/590 536/592 +f 573/636 534/590 572/635 +f 573/636 513/567 534/590 +f 574/637 513/567 573/636 +f 574/637 510/564 513/567 +f 575/638 510/564 574/637 +f 575/638 515/569 510/564 +f 576/639 515/569 575/638 +f 576/639 517/571 515/569 +f 577/640 517/571 576/639 +f 577/640 519/573 517/571 +f 578/641 519/573 577/640 +f 578/641 521/575 519/573 +f 579/642 521/575 578/641 +f 579/642 523/577 521/575 +f 580/643 523/577 579/642 +f 580/643 525/579 523/577 +f 581/644 525/579 580/643 +f 581/644 527/581 525/579 +f 582/645 527/581 581/644 +f 582/645 529/583 527/581 +f 583/646 529/583 582/645 +f 583/646 531/585 529/583 +f 584/647 531/585 583/646 +f 584/647 533/587 531/585 +f 259/648 533/587 584/647 +f 259/648 256/589 533/587 +f 265/649 585/650 586/651 +f 586/651 585/650 587/652 +f 586/651 587/652 588/653 +f 265/649 586/651 589/654 +f 586/651 588/653 590/655 +f 586/651 590/655 589/654 +f 265/649 268/656 585/650 +f 265/649 589/654 591/657 +f 268/656 271/658 592/659 +f 268/656 592/659 585/650 +f 585/650 592/659 593/660 +f 593/660 592/659 594/661 +f 585/650 593/660 587/652 +f 593/660 594/661 595/662 +f 596/663 594/661 597/664 +f 595/662 594/661 596/663 +f 595/662 596/663 598/665 +f 596/663 597/664 599/666 +f 588/653 587/652 600/667 +f 590/655 588/653 601/668 +f 588/653 600/667 601/668 +f 590/655 601/668 602/669 +f 603/670 604/671 605/672 +f 603/670 605/672 606/673 +f 603/670 607/674 604/671 +f 607/674 608/675 604/671 +f 260/676 263/677 607/674 +f 260/676 607/674 609/678 +f 609/678 607/674 603/670 +f 607/674 263/677 608/675 +f 261/679 260/676 609/678 +f 261/679 609/678 610/680 +f 610/680 609/678 611/681 +f 609/678 603/670 611/681 +f 610/680 611/681 612/682 +f 610/680 612/682 613/683 +f 610/680 613/683 614/684 +f 611/681 603/670 615/685 +f 611/681 615/685 616/686 +f 603/670 606/673 615/685 +f 614/684 613/683 617/687 +f 614/684 617/687 618/688 +f 614/684 618/688 619/689 +f 614/684 619/689 620/690 +f 288/691 574/637 573/636 +f 287/692 288/691 573/636 +f 287/692 573/636 572/635 +f 288/691 289/693 574/637 +f 289/693 575/638 574/637 +f 289/693 290/694 575/638 +f 290/694 576/639 575/638 +f 290/694 291/695 576/639 +f 291/695 577/640 576/639 +f 291/695 292/696 577/640 +f 292/696 578/641 577/640 +f 292/696 293/697 578/641 +f 293/697 579/642 578/641 +f 293/697 294/698 579/642 +f 294/698 580/643 579/642 +f 294/698 295/699 580/643 +f 295/699 581/644 580/643 +f 295/699 296/700 581/644 +f 296/700 582/645 581/644 +f 296/700 297/701 582/645 +f 297/701 583/646 582/645 +f 297/701 298/702 583/646 +f 298/702 584/647 583/646 +f 298/702 299/703 584/647 +f 299/703 259/648 584/647 +f 299/703 257/704 259/648 +f 286/705 287/692 572/635 +f 286/705 572/635 571/634 +f 285/706 286/705 571/634 +f 285/706 571/634 570/632 +f 184/707 285/706 570/632 +f 184/707 570/632 183/633 +f 12/12 621/708 283/709 +f 12/12 10/10 621/708 +f 10/10 622/710 621/708 +f 10/10 8/8 622/710 +f 8/8 623/711 622/710 +f 8/8 6/6 623/711 +f 6/6 624/712 623/711 +f 6/6 1/1 624/712 +f 1/1 625/713 624/712 +f 1/1 4/4 625/713 +f 4/4 626/714 625/713 +f 4/4 13/13 626/714 +f 13/13 627/715 626/714 +f 13/13 15/15 627/715 +f 15/15 628/716 627/715 +f 15/15 17/17 628/716 +f 17/17 629/717 628/716 +f 17/17 19/19 629/717 +f 19/19 630/718 629/717 +f 19/19 21/21 630/718 +f 21/21 631/719 630/718 +f 21/21 23/23 631/719 +f 23/23 632/720 631/719 +f 23/23 25/25 632/720 +f 25/25 633/721 632/720 +f 25/25 27/27 633/721 +f 27/27 634/722 633/721 +f 27/27 29/29 634/722 +f 29/29 635/723 634/722 +f 29/29 31/31 635/723 +f 31/31 211/724 635/723 +f 31/31 33/33 211/724 +f 456/504 636/725 637/726 +f 453/499 456/504 637/726 +f 453/499 637/726 638/727 +f 456/504 458/506 636/725 +f 458/506 639/728 636/725 +f 458/506 460/508 639/728 +f 460/508 640/729 639/728 +f 460/508 462/510 640/729 +f 462/510 641/730 640/729 +f 462/510 464/512 641/730 +f 464/512 642/731 641/730 +f 464/512 466/514 642/731 +f 466/514 643/732 642/731 +f 466/514 468/516 643/732 +f 468/516 644/733 643/732 +f 468/516 470/518 644/733 +f 470/518 645/734 644/733 +f 470/518 472/520 645/734 +f 472/520 646/735 645/734 +f 472/520 474/522 646/735 +f 474/522 647/736 646/735 +f 474/522 476/524 647/736 +f 476/524 648/737 647/736 +f 476/524 478/526 648/737 +f 478/526 284/738 648/737 +f 478/526 280/528 284/738 +f 450/496 453/499 638/727 +f 450/496 638/727 649/739 +f 455/501 450/496 649/739 +f 455/501 649/739 650/740 +f 208/503 455/501 650/740 +f 208/503 650/740 210/741 +f 509/561 191/742 188/563 +f 509/561 651/743 191/742 +f 507/559 651/743 509/561 +f 651/743 200/744 191/742 +f 507/559 652/745 651/743 +f 651/743 653/746 200/744 +f 652/745 653/746 651/743 +f 505/557 652/745 507/559 +f 505/557 654/747 652/745 +f 652/745 655/748 653/746 +f 654/747 655/748 652/745 +f 653/746 410/448 201/450 +f 653/746 201/450 200/744 +f 655/748 410/448 653/746 +f 656/749 408/446 655/748 +f 655/748 408/446 410/448 +f 654/747 656/749 655/748 +f 503/555 657/750 654/747 +f 503/555 654/747 505/557 +f 657/750 656/749 654/747 +f 656/749 406/444 408/446 +f 657/750 658/751 656/749 +f 658/751 406/444 656/749 +f 501/553 659/752 657/750 +f 501/553 657/750 503/555 +f 659/752 658/751 657/750 +f 660/753 404/442 658/751 +f 658/751 404/442 406/444 +f 659/752 660/753 658/751 +f 499/551 661/754 659/752 +f 499/551 659/752 501/553 +f 661/754 660/753 659/752 +f 660/753 402/440 404/442 +f 661/754 662/755 660/753 +f 662/755 402/440 660/753 +f 497/549 663/756 661/754 +f 497/549 661/754 499/551 +f 663/756 662/755 661/754 +f 664/757 400/438 662/755 +f 662/755 400/438 402/440 +f 663/756 664/757 662/755 +f 665/758 664/757 663/756 +f 495/547 665/758 663/756 +f 495/547 663/756 497/549 +f 664/757 398/436 400/438 +f 665/758 666/759 664/757 +f 666/759 398/436 664/757 +f 493/545 667/760 665/758 +f 493/545 665/758 495/547 +f 667/760 666/759 665/758 +f 668/761 396/434 666/759 +f 666/759 396/434 398/436 +f 667/760 668/761 666/759 +f 491/543 669/762 667/760 +f 491/543 667/760 493/545 +f 669/762 668/761 667/760 +f 668/761 391/429 396/434 +f 669/762 670/763 668/761 +f 670/763 391/429 668/761 +f 489/541 671/764 669/762 +f 489/541 669/762 491/543 +f 671/764 670/763 669/762 +f 672/765 392/430 670/763 +f 670/763 392/430 391/429 +f 671/764 672/765 670/763 +f 487/539 673/766 671/764 +f 487/539 671/764 489/541 +f 673/766 672/765 671/764 +f 672/765 394/432 392/430 +f 673/766 674/767 672/765 +f 674/767 394/432 672/765 +f 484/534 675/768 673/766 +f 484/534 673/766 487/539 +f 675/768 674/767 673/766 +f 676/769 413/453 674/767 +f 674/767 413/453 394/432 +f 675/768 676/769 674/767 +f 482/532 677/770 675/768 +f 482/532 675/768 484/534 +f 677/770 676/769 675/768 +f 676/769 415/455 413/453 +f 677/770 678/771 676/769 +f 678/771 415/455 676/769 +f 481/531 679/772 677/770 +f 481/531 677/770 482/532 +f 679/772 678/771 677/770 +f 680/773 417/457 678/771 +f 678/771 417/457 415/455 +f 679/772 680/773 678/771 +f 262/536 261/774 679/772 +f 262/536 679/772 481/531 +f 261/774 680/773 679/772 +f 680/773 419/459 417/457 +f 261/774 271/775 680/773 +f 271/775 419/459 680/773 +f 271/775 270/461 419/459 +f 540/599 204/776 203/600 +f 540/599 681/777 204/776 +f 542/602 681/777 540/599 +f 681/777 207/778 204/776 +f 542/602 682/779 681/777 +f 681/777 683/780 207/778 +f 682/779 683/780 681/777 +f 544/604 682/779 542/602 +f 544/604 684/781 682/779 +f 682/779 685/782 683/780 +f 684/781 685/782 682/779 +f 683/780 451/497 212/502 +f 683/780 212/502 207/778 +f 685/782 451/497 683/780 +f 686/783 452/498 685/782 +f 685/782 452/498 451/497 +f 684/781 686/783 685/782 +f 687/784 686/783 684/781 +f 546/606 687/784 684/781 +f 546/606 684/781 544/604 +f 686/783 454/500 452/498 +f 687/784 688/785 686/783 +f 688/785 454/500 686/783 +f 548/608 689/786 687/784 +f 548/608 687/784 546/606 +f 689/786 688/785 687/784 +f 690/787 457/505 688/785 +f 688/785 457/505 454/500 +f 689/786 690/787 688/785 +f 550/610 691/788 689/786 +f 550/610 689/786 548/608 +f 691/788 690/787 689/786 +f 690/787 459/507 457/505 +f 691/788 692/789 690/787 +f 692/789 459/507 690/787 +f 552/612 693/790 691/788 +f 552/612 691/788 550/610 +f 693/790 692/789 691/788 +f 694/791 461/509 692/789 +f 692/789 461/509 459/507 +f 693/790 694/791 692/789 +f 554/614 695/792 693/790 +f 554/614 693/790 552/612 +f 695/792 694/791 693/790 +f 694/791 463/511 461/509 +f 695/792 696/793 694/791 +f 696/793 463/511 694/791 +f 556/616 697/794 695/792 +f 556/616 695/792 554/614 +f 697/794 696/793 695/792 +f 698/795 465/513 696/793 +f 697/794 698/795 696/793 +f 696/793 465/513 463/511 +f 558/618 699/796 697/794 +f 558/618 697/794 556/616 +f 699/796 698/795 697/794 +f 698/795 467/515 465/513 +f 699/796 700/797 698/795 +f 700/797 467/515 698/795 +f 560/620 701/798 699/796 +f 560/620 699/796 558/618 +f 701/798 700/797 699/796 +f 702/799 469/517 700/797 +f 700/797 469/517 467/515 +f 701/798 702/799 700/797 +f 703/800 702/799 701/798 +f 562/622 703/800 701/798 +f 562/622 701/798 560/620 +f 702/799 471/519 469/517 +f 703/800 704/801 702/799 +f 704/801 471/519 702/799 +f 564/624 705/802 703/800 +f 564/624 703/800 562/622 +f 705/802 704/801 703/800 +f 706/803 473/521 704/801 +f 704/801 473/521 471/519 +f 705/802 706/803 704/801 +f 566/626 707/804 705/802 +f 566/626 705/802 564/624 +f 707/804 706/803 705/802 +f 706/803 475/523 473/521 +f 707/804 708/805 706/803 +f 708/805 475/523 706/803 +f 568/628 709/806 707/804 +f 568/628 707/804 566/626 +f 709/806 708/805 707/804 +f 710/807 477/525 708/805 +f 708/805 477/525 475/523 +f 709/806 710/807 708/805 +f 274/630 273/808 709/806 +f 274/630 709/806 568/628 +f 273/808 710/807 709/806 +f 710/807 479/527 477/525 +f 273/808 277/809 710/807 +f 277/809 479/527 710/807 +f 277/809 281/529 479/527 +f 539/595 180/810 182/597 +f 539/595 711/811 180/810 +f 537/593 711/811 539/595 +f 711/811 179/812 180/810 +f 537/593 712/813 711/811 +f 711/811 713/814 179/812 +f 712/813 713/814 711/811 +f 535/591 712/813 537/593 +f 535/591 714/815 712/813 +f 712/813 715/816 713/814 +f 714/815 715/816 712/813 +f 713/814 428/470 185/472 +f 713/814 185/472 179/812 +f 715/816 428/470 713/814 +f 716/817 426/468 715/816 +f 715/816 426/468 428/470 +f 714/815 716/817 715/816 +f 717/818 716/817 714/815 +f 514/568 717/818 714/815 +f 514/568 714/815 535/591 +f 716/817 421/463 426/468 +f 717/818 718/819 716/817 +f 718/819 421/463 716/817 +f 512/566 719/820 717/818 +f 512/566 717/818 514/568 +f 719/820 718/819 717/818 +f 720/821 422/464 718/819 +f 718/819 422/464 421/463 +f 719/820 720/821 718/819 +f 511/565 721/822 719/820 +f 511/565 719/820 512/566 +f 721/822 720/821 719/820 +f 720/821 424/466 422/464 +f 721/822 722/823 720/821 +f 722/823 424/466 720/821 +f 516/570 723/824 721/822 +f 516/570 721/822 511/565 +f 723/824 722/823 721/822 +f 724/825 431/475 722/823 +f 722/823 431/475 424/466 +f 723/824 724/825 722/823 +f 518/572 725/826 723/824 +f 518/572 723/824 516/570 +f 725/826 724/825 723/824 +f 724/825 433/477 431/475 +f 725/826 726/827 724/825 +f 726/827 433/477 724/825 +f 520/574 727/828 725/826 +f 520/574 725/826 518/572 +f 727/828 726/827 725/826 +f 728/829 435/479 726/827 +f 727/828 728/829 726/827 +f 726/827 435/479 433/477 +f 522/576 729/830 727/828 +f 522/576 727/828 520/574 +f 729/830 728/829 727/828 +f 728/829 437/481 435/479 +f 729/830 730/831 728/829 +f 730/831 437/481 728/829 +f 524/578 731/832 729/830 +f 524/578 729/830 522/576 +f 731/832 730/831 729/830 +f 732/833 439/483 730/831 +f 730/831 439/483 437/481 +f 731/832 732/833 730/831 +f 733/834 732/833 731/832 +f 526/580 733/834 731/832 +f 526/580 731/832 524/578 +f 732/833 441/485 439/483 +f 733/834 734/835 732/833 +f 734/835 441/485 732/833 +f 528/582 735/836 733/834 +f 528/582 733/834 526/580 +f 735/836 734/835 733/834 +f 736/837 443/487 734/835 +f 734/835 443/487 441/485 +f 735/836 736/837 734/835 +f 530/584 737/838 735/836 +f 530/584 735/836 528/582 +f 737/838 736/837 735/836 +f 736/837 445/489 443/487 +f 737/838 738/839 736/837 +f 738/839 445/489 736/837 +f 532/586 739/840 737/838 +f 532/586 737/838 530/584 +f 739/840 738/839 737/838 +f 740/841 447/491 738/839 +f 738/839 447/491 445/489 +f 739/840 740/841 738/839 +f 258/588 255/842 739/840 +f 258/588 739/840 532/586 +f 255/842 740/841 739/840 +f 740/841 449/493 447/491 +f 255/842 254/843 740/841 +f 254/843 449/493 740/841 +f 254/843 252/495 449/493 +f 621/844 647/736 648/737 +f 283/845 621/844 648/737 +f 283/845 648/737 284/738 +f 621/844 622/846 647/736 +f 622/846 646/735 647/736 +f 622/846 623/847 646/735 +f 623/847 645/734 646/735 +f 623/847 624/848 645/734 +f 624/848 644/733 645/734 +f 624/848 625/849 644/733 +f 625/849 643/732 644/733 +f 625/849 626/850 643/732 +f 626/850 642/731 643/732 +f 626/850 627/851 642/731 +f 627/851 641/730 642/731 +f 627/851 628/852 641/730 +f 628/852 640/729 641/730 +f 628/852 629/853 640/729 +f 629/853 639/728 640/729 +f 629/853 630/854 639/728 +f 630/854 636/725 639/728 +f 630/854 631/855 636/725 +f 631/855 637/726 636/725 +f 631/855 632/856 637/726 +f 632/856 638/727 637/726 +f 632/856 633/857 638/727 +f 633/857 649/739 638/727 +f 633/857 634/858 649/739 +f 634/858 650/740 649/739 +f 634/858 635/859 650/740 +f 635/859 210/741 650/740 +f 635/859 211/860 210/741 +f 263/280 591/861 608/862 +f 263/280 265/283 591/861 +f 271/863 610/864 592/865 +f 271/863 261/866 610/864 +f 611/867 593/868 612/869 +f 612/869 593/868 595/870 +f 612/869 595/870 613/871 +f 611/867 587/872 593/868 +f 613/871 595/870 598/873 +f 613/871 598/873 617/874 +f 592/865 614/875 594/876 +f 592/865 610/864 614/875 +f 596/877 617/874 598/873 +f 596/877 618/878 617/874 +f 618/878 596/877 599/879 +f 618/878 599/879 619/880 +f 608/862 589/881 604/882 +f 604/882 589/881 590/883 +f 604/882 590/883 605/884 +f 608/862 591/861 589/881 +f 605/884 590/883 602/885 +f 605/884 602/885 606/886 +f 615/685 600/667 616/686 +f 615/685 601/668 600/667 +f 601/668 615/685 606/673 +f 601/668 606/673 602/669 +f 587/872 616/887 600/888 +f 587/872 611/867 616/887 +f 597/889 619/890 599/891 +f 597/889 620/892 619/890 +f 594/876 620/892 597/889 +f 594/876 614/875 620/892 diff --git a/mods/boats/textures/boat_inventory.png b/mods/boats/textures/boat_inventory.png new file mode 100644 index 0000000..f9d082e Binary files /dev/null and b/mods/boats/textures/boat_inventory.png differ diff --git a/mods/boats/textures/boat_wield.png b/mods/boats/textures/boat_wield.png new file mode 100644 index 0000000..f998b5b Binary files /dev/null and b/mods/boats/textures/boat_wield.png differ diff --git a/mods/bobblocks/blocks.lua b/mods/bobblocks/blocks.lua new file mode 100644 index 0000000..97ecf07 --- /dev/null +++ b/mods/bobblocks/blocks.lua @@ -0,0 +1,844 @@ +-- BobBlocks mod by RabbiBob +-- State Changes + +local update_bobblock = function (pos, node) + local nodename="" + local param2="" + --Switch Block State + if + -- Start Blocks + node.name == 'bobblocks:redblock_off' then nodename = 'bobblocks:redblock' + elseif node.name == 'bobblocks:redblock' then nodename = 'bobblocks:redblock_off' + elseif node.name == 'bobblocks:orangeblock_off' then nodename = 'bobblocks:orangeblock' + elseif node.name == 'bobblocks:orangeblock' then nodename = 'bobblocks:orangeblock_off' + elseif node.name == 'bobblocks:yellowblock_off' then nodename = 'bobblocks:yellowblock' + elseif node.name == 'bobblocks:yellowblock' then nodename = 'bobblocks:yellowblock_off' + elseif node.name == 'bobblocks:greenblock_off' then nodename = 'bobblocks:greenblock' + elseif node.name == 'bobblocks:greenblock' then nodename = 'bobblocks:greenblock_off' + elseif node.name == 'bobblocks:blueblock_off' then nodename = 'bobblocks:blueblock' + elseif node.name == 'bobblocks:blueblock' then nodename = 'bobblocks:blueblock_off' + elseif node.name == 'bobblocks:indigoblock_off' then nodename = 'bobblocks:indigoblock' + elseif node.name == 'bobblocks:indigoblock' then nodename = 'bobblocks:indigoblock_off' + elseif node.name == 'bobblocks:violetblock_off' then nodename = 'bobblocks:violetblock' + elseif node.name == 'bobblocks:violetblock' then nodename = 'bobblocks:violetblock_off' + elseif node.name == 'bobblocks:whiteblock_off' then nodename = 'bobblocks:whiteblock' + elseif node.name == 'bobblocks:whiteblock' then nodename = 'bobblocks:whiteblock_off' + -- Start Poles + elseif node.name == 'bobblocks:redpole_off' then nodename = 'bobblocks:redpole' + elseif node.name == 'bobblocks:redpole' then nodename = 'bobblocks:redpole_off' + elseif node.name == 'bobblocks:orangepole_off' then nodename = 'bobblocks:orangepole' + elseif node.name == 'bobblocks:orangepole' then nodename = 'bobblocks:orangepole_off' + elseif node.name == 'bobblocks:yellowpole_off' then nodename = 'bobblocks:yellowpole' + elseif node.name == 'bobblocks:yellowpole' then nodename = 'bobblocks:yellowpole_off' + elseif node.name == 'bobblocks:greenpole_off' then nodename = 'bobblocks:greenpole' + elseif node.name == 'bobblocks:greenpole' then nodename = 'bobblocks:greenpole_off' + elseif node.name == 'bobblocks:bluepole_off' then nodename = 'bobblocks:bluepole' + elseif node.name == 'bobblocks:bluepole' then nodename = 'bobblocks:bluepole_off' + elseif node.name == 'bobblocks:indigopole_off' then nodename = 'bobblocks:indigopole' + elseif node.name == 'bobblocks:indigopole' then nodename = 'bobblocks:indigopole_off' + elseif node.name == 'bobblocks:violetpole_off' then nodename = 'bobblocks:violetpole' + elseif node.name == 'bobblocks:violetpole' then nodename = 'bobblocks:violetpole_off' + elseif node.name == 'bobblocks:whitepole_off' then nodename = 'bobblocks:whitepole' + elseif node.name == 'bobblocks:whitepole' then nodename = 'bobblocks:whitepole_off' + end + minetest.add_node(pos, {name = nodename}) + minetest.sound_play("bobblocks_glassblock", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) +end + + +-- Punch Blocks +local on_bobblock_punched = function (pos, node, puncher) + if + -- Start Blocks + node.name == 'bobblocks:redblock_off' or node.name == 'bobblocks:redblock' or + node.name == 'bobblocks:orangeblock_off' or node.name == 'bobblocks:orangeblock' or + node.name == 'bobblocks:yellowblock_off' or node.name == 'bobblocks:yellowblock' or + node.name == 'bobblocks:greenblock_off' or node.name == 'bobblocks:greenblock' or + node.name == 'bobblocks:blueblock_off' or node.name == 'bobblocks:blueblock' or + node.name == 'bobblocks:indigoblock_off' or node.name == 'bobblocks:indigoblock' or + node.name == 'bobblocks:violetblock_off' or node.name == 'bobblocks:violetblock' or + node.name == 'bobblocks:whiteblock_off' or node.name == 'bobblocks:whiteblock' or + --Start Poles + node.name == 'bobblocks:redpole_off' or node.name == 'bobblocks:redpole' or + node.name == 'bobblocks:orangepole_off' or node.name == 'bobblocks:orangepole' or + node.name == 'bobblocks:yellowpole_off' or node.name == 'bobblocks:yellowpole' or + node.name == 'bobblocks:greenpole_off' or node.name == 'bobblocks:greenpole' or + node.name == 'bobblocks:bluepole_off' or node.name == 'bobblocks:bluepole' or + node.name == 'bobblocks:indigopole_off' or node.name == 'bobblocks:indigopole' or + node.name == 'bobblocks:violetpole_off' or node.name == 'bobblocks:violetpole' or + node.name == 'bobblocks:whitepole_off' or node.name == 'bobblocks:whitepole' + then + update_bobblock(pos, node) + end +end + +minetest.register_on_punchnode(on_bobblock_punched) + +-- Nodes +-- Misc Node + +minetest.register_node("bobblocks:btm", { + description = "Bobs TransMorgifier v5", + tile_images = {"bobblocks_btm_sides.png", "bobblocks_btm_sides.png", "bobblocks_btm_sides.png", + "bobblocks_btm_sides.png", "bobblocks_btm_sides.png", "bobblocks_btm.png"}, + inventory_image = "bobblocks_btm.png", + paramtype2 = "facedir", + material = minetest.digprop_dirtlike(1.0), + legacy_facedir_simple = true, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + +}) + + +-- Start Block Nodes +minetest.register_node("bobblocks:redblock", { + description = "Red Block", + drawtype = "glasslike", + tile_images = {"bobblocks_redblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_redblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:redblock_off" + }} +}) + +minetest.register_node("bobblocks:redblock_off", { + description = "Red Block", + tile_images = {"bobblocks_redblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:redblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:redblock" + }} + +}) + +minetest.register_node("bobblocks:orangeblock", { + description = "Orange Block", + drawtype = "glasslike", + tile_images = {"bobblocks_orangeblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_orangeblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:orangeblock_off" + }} +}) + +minetest.register_node("bobblocks:orangeblock_off", { + description = "Orange Block", + tile_images = {"bobblocks_orangeblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:orangeblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:orangeblock" + }} + +}) + +minetest.register_node("bobblocks:yellowblock", { + description = "Yellow Block", + drawtype = "glasslike", + tile_images = {"bobblocks_yellowblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_yellowblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:yellowblock_off" + }} +}) + +minetest.register_node("bobblocks:yellowblock_off", { + description = "Yellow Block", + tile_images = {"bobblocks_yellowblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:yellowblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:yellowblock" + }} + +}) + +minetest.register_node("bobblocks:greenblock", { + description = "Green Block", + drawtype = "glasslike", + tile_images = {"bobblocks_greenblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_greenblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:greenblock_off" + }} +}) + +minetest.register_node("bobblocks:greenblock_off", { + description = "Green Block", + tile_images = {"bobblocks_greenblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:greenblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:greenblock" + }} + +}) + + +minetest.register_node("bobblocks:blueblock", { + description = "Blue Block", + drawtype = "glasslike", + tile_images = {"bobblocks_blueblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_blueblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:blueblock_off" + }} +}) + +minetest.register_node("bobblocks:blueblock_off", { + description = "Blue Block", + tile_images = {"bobblocks_blueblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:blueblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:blueblock" + }} + +}) + +minetest.register_node("bobblocks:indigoblock", { + description = "Indigo Block", + drawtype = "glasslike", + tile_images = {"bobblocks_indigoblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_indigoblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:indigoblock_off" + }} +}) + +minetest.register_node("bobblocks:indigoblock_off", { + description = "Indigo Block", + tile_images = {"bobblocks_indigoblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:indigoblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:indigoblock" + }} + +}) + + +minetest.register_node("bobblocks:violetblock", { + description = "Violet Block", + drawtype = "glasslike", + tile_images = {"bobblocks_violetblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_violetblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:violetblock_off" + }} +}) + +minetest.register_node("bobblocks:violetblock_off", { + description = "Violet Block", + tile_images = {"bobblocks_violetblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:violetblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:violetblock" + }} + +}) + +minetest.register_node("bobblocks:whiteblock", { + description = "White Block", + drawtype = "glasslike", + tile_images = {"bobblocks_whiteblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_whiteblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:whiteblock_off" + }} +}) + +minetest.register_node("bobblocks:whiteblock_off", { + description = "White Block", + tile_images = {"bobblocks_whiteblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:whiteblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:whiteblock" + }} + +}) + + +minetest.register_node("bobblocks:greyblock", { + description = "Grey Block", + drawtype = "glasslike", + tile_images = {"bobblocks_greyblock.png"}, + inventory_image = minetest.inventorycube("bobblocks_greyblock.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:greyblock_off" + }} +}) + +minetest.register_node("bobblocks:greyblock_off", { + description = "Grey Block", + tile_images = {"bobblocks_greyblock.png"}, + is_ground_content = true, + alpha = WATER_ALPHA, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:greyblock', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:greyblock" + }} + +}) + + +-- Block Poles +minetest.register_node("bobblocks:redpole", { + description = "Red Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_redblock.png"}, + inventory_image = ("bobblocks_invredpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:redpole_off" + }} +}) + +minetest.register_node("bobblocks:redpole_off", { + description = "Red Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_redblock.png"}, + inventory_image = ("bobblocks_invredpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:redpole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:redpole" + }} + +}) + +minetest.register_node("bobblocks:orangepole", { + description = "Orange Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_orangeblock.png"}, + inventory_image = ("bobblocks_invorangepole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:orangepole_off" + }} +}) + +minetest.register_node("bobblocks:orangepole_off", { + description = "Orange Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_orangeblock.png"}, + inventory_image = ("bobblocks_invorangepole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:orangepole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:orangepole" + }} + +}) + +minetest.register_node("bobblocks:yellowpole", { + description = "Yellow Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_yellowblock.png"}, + inventory_image = ("bobblocks_invyellowpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:yellowpole_off" + }} +}) + +minetest.register_node("bobblocks:yellowpole_off", { + description = "Yellow Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_yellowblock.png"}, + inventory_image = ("bobblocks_invyellowpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:yellowpole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:yellowpole" + }} + +}) + +minetest.register_node("bobblocks:greenpole", { + description = "Green Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_greenblock.png"}, + inventory_image = ("bobblocks_invgreenpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:greenpole_off" + }} +}) + +minetest.register_node("bobblocks:greenpole_off", { + description = "Green Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_greenblock.png"}, + inventory_image = ("bobblocks_invgreenpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:greenpole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:greenpole" + }} + +}) + +minetest.register_node("bobblocks:bluepole", { + description = "Blue Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_blueblock.png"}, + inventory_image = ("bobblocks_invbluepole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:bluepole_off" + }} +}) + +minetest.register_node("bobblocks:bluepole_off", { + description = "Blue Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_blueblock.png"}, + inventory_image = ("bobblocks_invbluepole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:bluepole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:bluepole" + }} + +}) + +minetest.register_node("bobblocks:indigopole", { + description = "Indigo Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_indigoblock.png"}, + inventory_image = ("bobblocks_invindigopole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:indigopole_off" + }} +}) + +minetest.register_node("bobblocks:indigopole_off", { + description = "Indigo Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_indigoblock.png"}, + inventory_image = ("bobblocks_invindigopole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:indigopole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:indigopole" + }} + +}) + +minetest.register_node("bobblocks:violetpole", { + description = "Violet Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_violetblock.png"}, + inventory_image = ("bobblocks_invvioletpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:violetpole_off" + }} +}) + +minetest.register_node("bobblocks:violetpole_off", { + description = "Violet Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_violetblock.png"}, + inventory_image = ("bobblocks_invvioletpole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:violetpole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:violetpole" + }} + +}) + +minetest.register_node("bobblocks:whitepole", { + description = "White Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_whiteblock.png"}, + inventory_image = ("bobblocks_invwhitepole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + foo = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:whitepole_off" + }} +}) + +minetest.register_node("bobblocks:whitepole_off", { + description = "White Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_whiteblock.png"}, + inventory_image = ("bobblocks_invwhitepole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + light_source = LIGHT_MAX-10, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3,not_in_creative_inventory=1}, + drop = 'bobblocks:whitepole', + foo = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:whitepole" + }} + +}) + +minetest.register_node("bobblocks:greypole", { + description = "Grey Pole", + drawtype = "fencelike", + tile_images = {"bobblocks_greyblock.png"}, + inventory_image = ("bobblocks_invgreypole.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = true, + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + --light_source = LIGHT_MAX-0, +}) + + + +-- Crafts +-- BTM +minetest.register_craft({ + output = 'NodeItem "bobblocks:btm" 1', + recipe = { + {'node "default:glass" 1', 'node "default:torch" 1', 'node "default:leaves" 1', + 'node "default:mese" 1','node "default:rat" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:greyblock" 2', + recipe = { + {'node "default:glass" 1', 'node "default:torch" 1', 'node "default:cobble" 1'}, + }, +}) + +-- Red / Yellow / Blue / White +-- Red / Yellow -> Orange +-- Red / Blue -> Violet +-- Blue / Yellow -> Green +-- Red / Yellow / White -> Indigo + +minetest.register_craft({ + output = 'NodeItem "bobblocks:redblock" 2', + recipe = { + {'node "default:glass" 1', 'node "default:torch" 1', 'node "default:brick" 1'}, + }, +}) +minetest.register_craft({ + output = 'NodeItem "bobblocks:yellowblock" 2', + recipe = { + {'node "default:glass" 1', 'node "default:torch" 1', 'node "default:sand" 1'}, + }, +}) +minetest.register_craft({ + output = 'NodeItem "bobblocks:blueblock" 2', + recipe = { + {'node "default:glass" 1', 'node "default:torch" 1', 'node "default:gravel" 1'}, + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:whiteblock" 2', + recipe = { + {'node "default:glass" 1', 'node "default:torch" 1', 'node "default:dirt" 1'}, + }, +}) + + +minetest.register_craft({ + output = 'NodeItem "bobblocks:orangeblock" 2', + recipe = { + {'node "bobblocks:redblock" 1', 'node "bobblocks:yellowblock" 1'}, + + }, +}) + + +minetest.register_craft({ + output = 'NodeItem "bobblocks:violetblock" 2', + recipe = { + {'node "bobblocks:redblock" 1', 'node "bobblocks:blueblock" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:greenblock" 2', + recipe = { + {'node "bobblocks:blueblock" 1', 'node "bobblocks:yellowblock" 1'}, + + }, +}) + + +minetest.register_craft({ + output = 'NodeItem "bobblocks:indigoblock" 3', + recipe = { + {'node "bobblocks:redblock" 1', 'node "bobblocks:blueblock" 1', 'node "bobblocks:whiteblock" 1'}, + + }, +}) + +-- Poles + +minetest.register_craft({ + output = 'NodeItem "bobblocks:redpole" 1', + recipe = { + {'node "bobblocks:redblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:yellowpole" 1', + recipe = { + {'node "bobblocks:yellowblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:bluepole" 1', + recipe = { + {'node "bobblocks:blueblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:whitepole" 1', + recipe = { + {'node "bobblocks:whiteblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:orangepole" 1', + recipe = { + {'node "bobblocks:orangeblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:violetpole" 1', + recipe = { + {'node "bobblocks:violetblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:greenpole" 1', + recipe = { + {'node "bobblocks:greenblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:indigopole" 1', + recipe = { + {'node "bobblocks:indigoblock" 1', 'node "default:stick" 1'}, + + }, +}) + +minetest.register_craft({ + output = 'NodeItem "bobblocks:greypole" 1', + recipe = { + {'node "bobblocks:greyblock" 1', 'node "default:stick" 1'}, + + }, +}) + + +-- MESECON +-- Add jeija to bobblocks\default.txt and paste the below in at the bottom of bobblocks\blocks.lua + diff --git a/mods/bobblocks/depends.txt b/mods/bobblocks/depends.txt new file mode 100644 index 0000000..aca967d --- /dev/null +++ b/mods/bobblocks/depends.txt @@ -0,0 +1,2 @@ +default +mesecons diff --git a/mods/bobblocks/health.lua b/mods/bobblocks/health.lua new file mode 100644 index 0000000..fdf5677 --- /dev/null +++ b/mods/bobblocks/health.lua @@ -0,0 +1,95 @@ +local is_healthpack = function(node) + if node.name == 'bobblocks:health_off' or node.name == 'health_on' then + return true + end + return false +end + +local update_healthpack = function (pos, node) + local nodename="" + local param2="" + --Switch HealthPack State + if node.name == 'bobblocks:health_off' then + nodename = 'bobblocks:health_on' + elseif node.name == 'bobblocks:health_on' then + nodename = 'bobblocks:health_off' + end + minetest.add_node(pos, {name = nodename}) +end + +local toggle_healthpack = function (pos, node) + if not is_healthgate(node) then return end + update_healthpack (pos, node, state) +end + +local on_healthpack_punched = function (pos, node, puncher) + if node.name == 'bobblocks:health_off' or node.name == 'bobblocks:health_on' then + update_healthpack(pos, node) + end +end + +-- Healing Node + +minetest.register_node("bobblocks:health_off", { + description = "Health Pack 1 Off", + tile_images = {"bobblocks_health_off.png"}, + inventory_image = "bobblocks_health_off.png", + paramtype2 = "facedir", + legacy_facedir_simple = true, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + is_ground_content = true, + walkable = false, + climbable = false, + mesecons = {conductor={ + state = mesecon.state.off, + onstate = "bobblocks:health_on" + }} +}) + +minetest.register_node("bobblocks:health_on", { + description = "Health Pack 1 On", + tile_images = {"bobblocks_health_on.png"}, + paramtype2 = "facedir", + legacy_facedir_simple = true, + light_source = LIGHT_MAX-0, + groups = {snappy=2,cracky=3,oddly_breakable_by_hand=3}, + is_ground_content = true, + walkable = false, + climbable = false, + drop = "bobblocks:health_off", + mesecons = {conductor={ + state = mesecon.state.on, + offstate = "bobblocks:health_off" + }} +}) + + +minetest.register_abm( + {nodenames = {"bobblocks:health_on"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local objs = minetest.get_objects_inside_radius(pos, 1) + for k, obj in pairs(objs) do + minetest.sound_play("bobblocks_health", + {pos = pos, gain = 1.0, max_hear_distance = 32,}) + obj:set_hp(obj:get_hp()+10) -- give 10HP + minetest.remove_node(pos) -- remove the node after use + end + end, + +}) + +--- Health + +minetest.register_craft({ + output = 'NodeItem "bobblocks:health_off" 1', + recipe = { + {'node "default:dirt" 1', 'node "default:paper" 1', 'node "default:apple" 2'}, + + }, +}) + + +minetest.register_on_punchnode(on_healthpack_punched) + diff --git a/mods/bobblocks/init.lua b/mods/bobblocks/init.lua new file mode 100644 index 0000000..3bcf03f --- /dev/null +++ b/mods/bobblocks/init.lua @@ -0,0 +1,11 @@ +print("[BobBlocks By minetest@rabbibob.com] Version 0.0.8 loading....") +print("[BobBlocks] loading Blocks") +dofile(minetest.get_modpath("bobblocks") .. "/blocks.lua") +print("[BobBlocks] loaded Blocks") +print("[BobBlocks] loading Health") +dofile(minetest.get_modpath("bobblocks") .. "/health.lua") +print("[BobBlocks] loaded Health") +print("[BobBlocks] loading Traps") +dofile(minetest.get_modpath("bobblocks") .. "/trap.lua") +print("[BobBlocks] loaded Traps") +print("[BobBlocks By minetest@rabbibob.com] Version 0.0.8 loaded!") \ No newline at end of file diff --git a/mods/bobblocks/readme.txt b/mods/bobblocks/readme.txt new file mode 100644 index 0000000..947ae5e --- /dev/null +++ b/mods/bobblocks/readme.txt @@ -0,0 +1,53 @@ +-- BobBlocks v0.0.8 +-- (Minetest 0.4.5 compatible 20130315) +-- http://forum.minetest.net/viewtopic.php?id=1274 +-------------------------------------------------------------------------- +-------------------------------------------------------------------------- +-- Requirements: Mesecons -- +-- http://forum.minetest.net/viewtopic.php?id=628 -- +-- -- +-- Does not support jeija or older version of Mesecons -- +-- before 1/20/2013 -- +-- http://forum.minetest.net/viewtopic.php?pid=64976#p64976 -- +-------------------------------------------------------------------------- +-------------------------------------------------------------------------- +-- Colored Lit Blocks +---- Default state = Solid lit block +---- Secondary state (punch) = transparent unlit block +---- Mesecons activation [CONDUCTOR] +-- Colored Lit Poles +---- Default state = Solid lit block +---- Secondary state (punch) = unlit block +---- Mesecons activation [CONDUCTOR] +-- Health Kit +---- Default state = health kit inactive +---- Secondary state (punch) = health kit active +10HP when walked through +---- Mesecons activation [CONDUCTOR] +-- Trap +---- Default Grass (walkable off) +---- Spike Minor (1HP per hit) +------ Spikes can be 'set' and activated when walked over +---- Spike Major (100HP per hit) +------ Spikes can be 'set' and activated when walked over + +# [ATTRIBUTION] +# Unless otherwise noted, all graphics & sounds +# created by Rabbi Bob +# Licensed under the GPLv2/later + +# [GRAPHICS] +# minor & major spikes by Death Dealer +# License: WTFPL +# http://minetest.net/forum/viewtopic.php?id=1582 + +# [SOUNDS] +# bobblocks_glass + # Author: Ch0cchi + # http://www.freesound.org/people/Ch0cchi/sounds/15285/ + # Edited by rabbibob +# bobblocks_trap_fall & bobblocks_trap_fall_major + # Author: Rock Savage + # http://www.freesound.org/people/Rock%20Savage/sounds/65924/# + # Edited by rabbibob +# bobblocks_health + # http://hamsterrepublic.com/ohrrpgce/Free_Sound_Effects.html \ No newline at end of file diff --git a/mods/bobblocks/sounds/bobblocks_glassblock.ogg b/mods/bobblocks/sounds/bobblocks_glassblock.ogg new file mode 100644 index 0000000..d60859f Binary files /dev/null and b/mods/bobblocks/sounds/bobblocks_glassblock.ogg differ diff --git a/mods/bobblocks/sounds/bobblocks_health.ogg b/mods/bobblocks/sounds/bobblocks_health.ogg new file mode 100644 index 0000000..4a0148b Binary files /dev/null and b/mods/bobblocks/sounds/bobblocks_health.ogg differ diff --git a/mods/bobblocks/sounds/bobblocks_trap_fall.ogg b/mods/bobblocks/sounds/bobblocks_trap_fall.ogg new file mode 100644 index 0000000..a49efb3 Binary files /dev/null and b/mods/bobblocks/sounds/bobblocks_trap_fall.ogg differ diff --git a/mods/bobblocks/sounds/bobblocks_trap_fall_major.ogg b/mods/bobblocks/sounds/bobblocks_trap_fall_major.ogg new file mode 100644 index 0000000..b6bdea6 Binary files /dev/null and b/mods/bobblocks/sounds/bobblocks_trap_fall_major.ogg differ diff --git a/mods/bobblocks/textures/bobblocks_blueblock.png b/mods/bobblocks/textures/bobblocks_blueblock.png new file mode 100644 index 0000000..df5d835 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_blueblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_btm.png b/mods/bobblocks/textures/bobblocks_btm.png new file mode 100644 index 0000000..7e14d08 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_btm.png differ diff --git a/mods/bobblocks/textures/bobblocks_btm_sides.png b/mods/bobblocks/textures/bobblocks_btm_sides.png new file mode 100644 index 0000000..0e1ca0d Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_btm_sides.png differ diff --git a/mods/bobblocks/textures/bobblocks_greenblock.png b/mods/bobblocks/textures/bobblocks_greenblock.png new file mode 100644 index 0000000..0acebc5 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_greenblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_greyblock.png b/mods/bobblocks/textures/bobblocks_greyblock.png new file mode 100644 index 0000000..c372878 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_greyblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_health_off.png b/mods/bobblocks/textures/bobblocks_health_off.png new file mode 100644 index 0000000..9f9aaac Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_health_off.png differ diff --git a/mods/bobblocks/textures/bobblocks_health_on.png b/mods/bobblocks/textures/bobblocks_health_on.png new file mode 100644 index 0000000..ec808c9 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_health_on.png differ diff --git a/mods/bobblocks/textures/bobblocks_health_one_sides.png b/mods/bobblocks/textures/bobblocks_health_one_sides.png new file mode 100644 index 0000000..ac24409 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_health_one_sides.png differ diff --git a/mods/bobblocks/textures/bobblocks_indigoblock.png b/mods/bobblocks/textures/bobblocks_indigoblock.png new file mode 100644 index 0000000..0dbf7fd Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_indigoblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_invbluepole.png b/mods/bobblocks/textures/bobblocks_invbluepole.png new file mode 100644 index 0000000..e60d3eb Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invbluepole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invgreenpole.png b/mods/bobblocks/textures/bobblocks_invgreenpole.png new file mode 100644 index 0000000..72b83c7 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invgreenpole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invgreypole.png b/mods/bobblocks/textures/bobblocks_invgreypole.png new file mode 100644 index 0000000..e9ad643 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invgreypole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invindigopole.png b/mods/bobblocks/textures/bobblocks_invindigopole.png new file mode 100644 index 0000000..8650912 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invindigopole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invorangepole.png b/mods/bobblocks/textures/bobblocks_invorangepole.png new file mode 100644 index 0000000..4f8cb97 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invorangepole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invredpole.png b/mods/bobblocks/textures/bobblocks_invredpole.png new file mode 100644 index 0000000..a6c9a65 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invredpole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invvioletpole.png b/mods/bobblocks/textures/bobblocks_invvioletpole.png new file mode 100644 index 0000000..3eeb60a Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invvioletpole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invwhitepole.png b/mods/bobblocks/textures/bobblocks_invwhitepole.png new file mode 100644 index 0000000..3f35401 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invwhitepole.png differ diff --git a/mods/bobblocks/textures/bobblocks_invyellowpole.png b/mods/bobblocks/textures/bobblocks_invyellowpole.png new file mode 100644 index 0000000..2b5c1ee Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_invyellowpole.png differ diff --git a/mods/bobblocks/textures/bobblocks_majorspike.png b/mods/bobblocks/textures/bobblocks_majorspike.png new file mode 100644 index 0000000..159ddc3 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_majorspike.png differ diff --git a/mods/bobblocks/textures/bobblocks_minorspike.png b/mods/bobblocks/textures/bobblocks_minorspike.png new file mode 100644 index 0000000..fd2e9f3 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_minorspike.png differ diff --git a/mods/bobblocks/textures/bobblocks_orangeblock.png b/mods/bobblocks/textures/bobblocks_orangeblock.png new file mode 100644 index 0000000..40e34f9 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_orangeblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_redblock.png b/mods/bobblocks/textures/bobblocks_redblock.png new file mode 100644 index 0000000..096d3f1 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_redblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_redblock_off.png b/mods/bobblocks/textures/bobblocks_redblock_off.png new file mode 100644 index 0000000..ca0bc5c Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_redblock_off.png differ diff --git a/mods/bobblocks/textures/bobblocks_trap_set.png b/mods/bobblocks/textures/bobblocks_trap_set.png new file mode 100644 index 0000000..55d1cf9 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_trap_set.png differ diff --git a/mods/bobblocks/textures/bobblocks_violetblock.png b/mods/bobblocks/textures/bobblocks_violetblock.png new file mode 100644 index 0000000..c1a98ca Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_violetblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_whiteblock.png b/mods/bobblocks/textures/bobblocks_whiteblock.png new file mode 100644 index 0000000..857fa47 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_whiteblock.png differ diff --git a/mods/bobblocks/textures/bobblocks_yellowblock.png b/mods/bobblocks/textures/bobblocks_yellowblock.png new file mode 100644 index 0000000..975ffe8 Binary files /dev/null and b/mods/bobblocks/textures/bobblocks_yellowblock.png differ diff --git a/mods/bobblocks/trap.lua b/mods/bobblocks/trap.lua new file mode 100644 index 0000000..e69de29 diff --git a/mods/bones/README.txt b/mods/bones/README.txt new file mode 100644 index 0000000..b0ebed8 --- /dev/null +++ b/mods/bones/README.txt @@ -0,0 +1,17 @@ +Minetest 0.4 mod: bones +======================= + +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 +---------------------- +Bad_Command_ diff --git a/mods/bones/depends.txt b/mods/bones/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/bones/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/bones/init.lua b/mods/bones/init.lua new file mode 100644 index 0000000..f35d519 --- /dev/null +++ b/mods/bones/init.lua @@ -0,0 +1,219 @@ +-- Minetest 0.4 mod: bones +-- See README.txt for licensing and other information. + +bones = {} + +local function is_owner(pos, name) + local owner = minetest.get_meta(pos):get_string("owner") + if owner == "" or owner == name then + return true + end + return false +end + +bones.bones_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + 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)) + +minetest.register_node("bones:bones", { + description = "Bones", + tiles = { + "bones_top.png", + "bones_bottom.png", + "bones_side.png", + "bones_side.png", + "bones_rear.png", + "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}, + }), + + can_dig = function(pos, player) + local inv = minetest.get_meta(pos):get_inventory() + return is_owner(pos, player:get_player_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 + 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 + local stk = inv:get_stack("main", i) + if player_inv:room_for_item("main", stk) then + inv:set_stack("main", i, nil) + player_inv:add_item("main", stk) + else + has_space = false + break + end + end + + -- remove bones if player emptied them + if has_space then + 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("owner", "") + else + meta:set_int("time", time) + return true + end + end, +}) + +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 not node_definition then + -- only replace nodes that are not protected + return not minetest.is_protected(pos, player:get_player_name()) + end + + -- allow replacing air and liquids + if node_name == "air" or node_definition.liquidtype ~= "none" then + return true + end + + -- don't replace filled chests and other nodes that don't allow it + local can_dig_func = node_definition.can_dig + if can_dig_func and not can_dig_func(pos, player) then + return false + end + + -- default to each nodes buildable_to; if a placed block would replace it, why shouldn't bones? + -- flowers being squished by bones are more realistical than a squished stone, too + -- exception are of course any protected buildable_to + return node_definition.buildable_to and not minetest.is_protected(pos, player:get_player_name()) +end + +minetest.register_on_dieplayer(function(player) + if minetest.setting_getbool("creative_mode") 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 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 + 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 + end + end + + 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_list("main", player_inv:get_list("main")) + + 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) + end + end + + player_inv:set_list("main", {}) + player_inv:set_list("craft", {}) + + meta:set_string("formspec", bones.bones_formspec) + meta:set_string("owner", player_name) + + if share_bones_time ~= 0 then + 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) + else + meta:set_int("time", (share_bones_time - share_bones_time_early)) + end + + minetest.get_node_timer(pos):start(10) + else + meta:set_string("infotext", player_name.."'s bones") + end +end) diff --git a/mods/bones/textures/bones_bottom.png b/mods/bones/textures/bones_bottom.png new file mode 100644 index 0000000..ada72ce Binary files /dev/null and b/mods/bones/textures/bones_bottom.png differ diff --git a/mods/bones/textures/bones_front.png b/mods/bones/textures/bones_front.png new file mode 100644 index 0000000..9dcbb97 Binary files /dev/null and b/mods/bones/textures/bones_front.png differ diff --git a/mods/bones/textures/bones_rear.png b/mods/bones/textures/bones_rear.png new file mode 100644 index 0000000..8e1ac10 Binary files /dev/null and b/mods/bones/textures/bones_rear.png differ diff --git a/mods/bones/textures/bones_side.png b/mods/bones/textures/bones_side.png new file mode 100644 index 0000000..3b4810c Binary files /dev/null and b/mods/bones/textures/bones_side.png differ diff --git a/mods/bones/textures/bones_top.png b/mods/bones/textures/bones_top.png new file mode 100644 index 0000000..6119864 Binary files /dev/null and b/mods/bones/textures/bones_top.png differ diff --git a/mods/bucket/README.txt b/mods/bucket/README.txt new file mode 100644 index 0000000..7dad641 --- /dev/null +++ b/mods/bucket/README.txt @@ -0,0 +1,26 @@ +Minetest 0.4 mod: bucket +========================= + +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 + + diff --git a/mods/bucket/depends.txt b/mods/bucket/depends.txt new file mode 100644 index 0000000..3a7daa1 --- /dev/null +++ b/mods/bucket/depends.txt @@ -0,0 +1,2 @@ +default + diff --git a/mods/bucket/init.lua b/mods/bucket/init.lua new file mode 100644 index 0000000..89730de --- /dev/null +++ b/mods/bucket/init.lua @@ -0,0 +1,192 @@ +-- Minetest 0.4 mod: bucket +-- See README.txt for licensing and other information. + +minetest.register_alias("bucket", "bucket:bucket_empty") +minetest.register_alias("bucket_water", "bucket:bucket_water") +minetest.register_alias("bucket_lava", "bucket:bucket_lava") + +minetest.register_craft({ + output = 'bucket:bucket_empty 1', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'', 'default:steel_ingot', ''}, + } +}) + +bucket = {} +bucket.liquids = {} + +local function check_protection(pos, name, text) + if minetest.is_protected(pos, name) then + minetest.log("action", (name ~= "" and name or "A mod") + .. " tried to " .. text + .. " at protected position " + .. minetest.pos_to_string(pos) + .. " with a bucket") + minetest.record_protection_violation(pos, name) + return true + end + return false +end + +-- Register a new liquid +-- source = name of the source node +-- flowing = name of the flowing node +-- itemname = name of the new bucket item (or nil if liquid is not takeable) +-- 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} +-- This function can be called from any mod (that depends on bucket). +function bucket.register_liquid(source, flowing, itemname, inventory_image, name, groups) + bucket.liquids[source] = { + source = source, + flowing = flowing, + itemname = itemname, + } + bucket.liquids[flowing] = bucket.liquids[source] + + if itemname ~= nil then + minetest.register_craftitem(itemname, { + description = name, + inventory_image = inventory_image, + 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 + -- 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 + 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 + + -- 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) + 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 + -- do not remove the bucket with the liquid + return + end + end + return {name="bucket:bucket_empty"} + end + }) + end +end + +minetest.register_craftitem("bucket:bucket_empty", { + description = "Empty Bucket", + inventory_image = "bucket.png", + stack_max = 99, + liquids_pointable = true, + on_use = function(itemstack, user, pointed_thing) + -- Must be pointing to node + if pointed_thing.type ~= "node" then + return + end + -- Check if pointing to a liquid source + local node = minetest.get_node(pointed_thing.under) + local liquiddef = bucket.liquids[node.name] + local item_count = user:get_wielded_item():get_count() + + if liquiddef ~= nil + and liquiddef.itemname ~= nil + and node.name == liquiddef.source then + if check_protection(pointed_thing.under, + user:get_player_name(), + "take ".. node.name) then + return + end + + -- default set to return filled bucket + local giving_back = liquiddef.itemname + + -- check if holding more than 1 empty bucket + if item_count > 1 then + + -- if space in inventory add filled bucked, otherwise drop as item + local inv = user:get_inventory() + if inv:room_for_item("main", {name=liquiddef.itemname}) then + inv:add_item("main", liquiddef.itemname) + else + local pos = user:getpos() + pos.y = math.floor(pos.y + 0.5) + core.add_item(pos, liquiddef.itemname) + end + + -- set to return empty buckets minus 1 + giving_back = "bucket:bucket_empty "..tostring(item_count-1) + + end + + minetest.add_node(pointed_thing.under, {name="air"}) + + return ItemStack(giving_back) + end + end, +}) + +bucket.register_liquid( + "default:water_source", + "default:water_flowing", + "bucket:bucket_water", + "bucket_water.png", + "Water Bucket", + {water_bucket = 1} +) + +bucket.register_liquid( + "default:river_water_source", + "default:river_water_flowing", + "bucket:bucket_river_water", + "bucket_river_water.png", + "River Water Bucket", + {water_bucket = 1} +) + +bucket.register_liquid( + "default:lava_source", + "default:lava_flowing", + "bucket:bucket_lava", + "bucket_lava.png", + "Lava Bucket" +) + +minetest.register_craft({ + type = "fuel", + recipe = "bucket:bucket_lava", + burntime = 60, + replacements = {{"bucket:bucket_lava", "bucket:bucket_empty"}}, +}) + diff --git a/mods/bucket/textures/bucket.png b/mods/bucket/textures/bucket.png new file mode 100644 index 0000000..6779528 Binary files /dev/null and b/mods/bucket/textures/bucket.png differ diff --git a/mods/bucket/textures/bucket_lava.png b/mods/bucket/textures/bucket_lava.png new file mode 100644 index 0000000..d2baeb9 Binary files /dev/null and b/mods/bucket/textures/bucket_lava.png differ diff --git a/mods/bucket/textures/bucket_river_water.png b/mods/bucket/textures/bucket_river_water.png new file mode 100644 index 0000000..1d9e62a Binary files /dev/null and b/mods/bucket/textures/bucket_river_water.png differ diff --git a/mods/bucket/textures/bucket_water.png b/mods/bucket/textures/bucket_water.png new file mode 100644 index 0000000..877692a Binary files /dev/null and b/mods/bucket/textures/bucket_water.png differ diff --git a/mods/carts/README.txt b/mods/carts/README.txt new file mode 100644 index 0000000..58673ce --- /dev/null +++ b/mods/carts/README.txt @@ -0,0 +1,25 @@ +Minetest 0.4 mod: carts +======================= +by PilzAdam + +License of source code: +----------------------- +WTFPL + +License of media (textures, sounds and models): +----------------------------------------------- +CC-0 + +Authors of media files: +----------------------- +kddekadenz: + cart_bottom.png + cart_side.png + cart_top.png + +Zeg9: + cart.x + cart.png + +rarkenin: + cart_rail_*.png 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..8a7da47 --- /dev/null +++ b/mods/carts/functions.lua @@ -0,0 +1,56 @@ + +-- +-- Helper functions +-- + +cart_func = {} + +function cart_func:get_sign(z) + if z == 0 then + return 0 + else + return z/math.abs(z) + end +end + +-- Returns the velocity as a unit vector +-- The smaller part of the vector will be turned to 0 +function cart_func:velocity_to_dir(v) + if math.abs(v.x) > math.abs(v.z) then + return {x=cart_func:get_sign(v.x), y=cart_func:get_sign(v.y), z=0} + else + return {x=0, y=cart_func:get_sign(v.y), z=cart_func:get_sign(v.z)} + end +end + +function cart_func:is_rail(p) + local nn = minetest.env:get_node(p).name + return minetest.get_item_group(nn, "rail") ~= 0 +end + +function cart_func:is_int(z) + z = math.abs(z) + return math.abs(math.floor(z+0.5)-z) <= 0.1 +end + +cart_func.v3 = {} + +function cart_func.v3:add(v1, v2) + return {x=v1.x+v2.x, y=v1.y+v2.y, z=v1.z+v2.z} +end + +function cart_func.v3:copy(v) + return {x=v.x, y=v.y, z=v.z} +end + +function cart_func.v3:round(v) + return { + x = math.floor(v.x+0.5), + y = math.floor(v.y+0.5), + z = math.floor(v.z+0.5), + } +end + +function cart_func.v3:equal(v1, v2) + return v1.x == v2.x and v1.y == v2.y and v1.z == v2.z +end diff --git a/mods/carts/init.lua b/mods/carts/init.lua new file mode 100644 index 0000000..a372203 --- /dev/null +++ b/mods/carts/init.lua @@ -0,0 +1,595 @@ + +dofile(minetest.get_modpath("carts").."/functions.lua") + +-- +-- Cart entity +-- + +local cart = { + physical = false, + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + visual = "mesh", + mesh = "cart.x", + visual_size = {x=1, y=1}, + textures = {"cart.png"}, + + driver = nil, + velocity = {x=0, y=0, z=0}, + old_pos = nil, + old_velocity = nil, + pre_stop_dir = nil, + MAX_V = 8, -- Limit of the velocity +} + +function cart:on_rightclick(clicker) + if not clicker or not clicker:is_player() then + return + end + if self.driver and clicker == self.driver then + self.driver = nil + clicker:set_detach() + elseif not self.driver then + self.driver = clicker + clicker:set_attach(self.object, "", {x=0,y=5,z=0}, {x=0,y=0,z=0}) + end +end + +function cart:on_activate(staticdata, dtime_s) + self.object:set_armor_groups({immortal=1}) + if staticdata then + local tmp = minetest.deserialize(staticdata) + if tmp then + self.velocity = tmp.velocity + end + if tmp and tmp.pre_stop_dir then + self.pre_stop_dir = tmp.pre_stop_dir + end + end + self.old_pos = self.object:getpos() + self.old_velocity = self.velocity +end + +function cart:get_staticdata() + return minetest.serialize({ + velocity = self.velocity, + pre_stop_dir = self.pre_stop_dir, + }) +end + +-- Remove the cart if holding a tool or accelerate it +function cart:on_punch(puncher, time_from_last_punch, tool_capabilities, direction) + if not puncher or not puncher:is_player() then + return + end + + if puncher:get_player_control().sneak then + self.object:remove() + local inv = puncher:get_inventory() + if minetest.setting_getbool("creative_mode") then + if not inv:contains_item("main", "carts:cart") then + inv:add_item("main", "carts:cart") + end + else + inv:add_item("main", "carts:cart") + end + return + end + + if puncher == self.driver then + return + end + + local d = cart_func:velocity_to_dir(direction) + local s = self.velocity + if time_from_last_punch > tool_capabilities.full_punch_interval then + time_from_last_punch = tool_capabilities.full_punch_interval + end + local f = 4*(time_from_last_punch/tool_capabilities.full_punch_interval) + local v = {x=s.x+d.x*f, y=s.y, z=s.z+d.z*f} + if math.abs(v.x) < 6 and math.abs(v.z) < 6 then + self.velocity = v + else + if math.abs(self.velocity.x) < 6 and math.abs(v.x) >= 6 then + self.velocity.x = 6*cart_func:get_sign(self.velocity.x) + end + if math.abs(self.velocity.z) < 6 and math.abs(v.z) >= 6 then + self.velocity.z = 6*cart_func:get_sign(self.velocity.z) + end + end +end + +-- Returns the direction as a unit vector +function cart:get_rail_direction(pos, dir) + local d = cart_func.v3:copy(dir) + + -- Check front + d.y = 0 + local p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + + -- Check downhill + d.y = -1 + p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + + -- Check uphill + d.y = 1 + p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + d.y = 0 + + -- Check left and right + local view_dir + local other_dir + local a + + if d.x == 0 and d.z ~= 0 then + view_dir = "z" + other_dir = "x" + if d.z < 0 then + a = {1, -1} + else + a = {-1, 1} + end + elseif d.z == 0 and d.x ~= 0 then + view_dir = "x" + other_dir = "z" + if d.x > 0 then + a = {1, -1} + else + a = {-1, 1} + end + else + return {x=0, y=0, z=0} + end + + d[view_dir] = 0 + d[other_dir] = a[1] + p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + d.y = -1 + p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + d.y = 0 + d[other_dir] = a[2] + p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + d.y = -1 + p = cart_func.v3:add(cart_func.v3:copy(pos), d) + if cart_func:is_rail(p) then + return d + end + d.y = 0 + + return {x=0, y=0, z=0} +end + +function cart:calc_rail_direction(pos, vel) + local velocity = cart_func.v3:copy(vel) + local p = cart_func.v3:copy(pos) + if cart_func:is_int(p.x) and cart_func:is_int(p.z) then + + local dir = cart_func:velocity_to_dir(velocity) + local dir_old = cart_func.v3:copy(dir) + + dir = self:get_rail_direction(cart_func.v3:round(p), dir) + + local v = math.max(math.abs(velocity.x), math.abs(velocity.z)) + velocity = { + x = v * dir.x, + y = v * dir.y, + z = v * dir.z, + } + + if cart_func.v3:equal(velocity, {x=0, y=0, z=0}) and not cart_func:is_rail(p) then + + -- First try this HACK + -- Move the cart on the rail if above or under it + if cart_func:is_rail(cart_func.v3:add(p, {x=0, y=1, z=0})) and vel.y >= 0 then + p = cart_func.v3:add(p, {x=0, y=1, z=0}) + return self:calc_rail_direction(p, vel) + end + if cart_func:is_rail(cart_func.v3:add(p, {x=0, y=-1, z=0})) and vel.y <= 0 then + p = cart_func.v3:add(p, {x=0, y=-1, z=0}) + return self:calc_rail_direction(p, vel) + end + -- Now the HACK gets really dirty + if cart_func:is_rail(cart_func.v3:add(p, {x=0, y=2, z=0})) and vel.y >= 0 then + p = cart_func.v3:add(p, {x=0, y=1, z=0}) + return self:calc_rail_direction(p, vel) + end + if cart_func:is_rail(cart_func.v3:add(p, {x=0, y=-2, z=0})) and vel.y <= 0 then + p = cart_func.v3:add(p, {x=0, y=-1, z=0}) + return self:calc_rail_direction(p, vel) + end + + return {x=0, y=0, z=0}, p + end + + if not cart_func.v3:equal(dir, dir_old) then + return velocity, cart_func.v3:round(p) + end + + end + return velocity, p +end + +function cart:on_step(dtime) + + local pos = self.object:getpos() + local dir = cart_func:velocity_to_dir(self.velocity) + + if not cart_func.v3:equal(self.velocity, {x=0,y=0,z=0}) then + self.pre_stop_dir = cart_func:velocity_to_dir(self.velocity) + end + + -- Stop the cart if the velocity is nearly 0 + -- Only if on a flat railway + if dir.y == 0 then + if math.abs(self.velocity.x) < 0.1 and math.abs(self.velocity.z) < 0.1 then + -- Start the cart if powered from mesecons + local a = tonumber(minetest.env:get_meta(pos):get_string("cart_acceleration")) + if a and a ~= 0 then + if self.pre_stop_dir and cart_func.v3:equal(self:get_rail_direction(self.object:getpos(), self.pre_stop_dir), self.pre_stop_dir) then + self.velocity = { + x = self.pre_stop_dir.x * 0.2, + y = self.pre_stop_dir.y * 0.2, + z = self.pre_stop_dir.z * 0.2, + } + self.old_velocity = self.velocity + return + end + for _,y in ipairs({0,-1,1}) do + for _,z in ipairs({1,-1}) do + if cart_func.v3:equal(self:get_rail_direction(self.object:getpos(), {x=0, y=y, z=z}), {x=0, y=y, z=z}) then + self.velocity = { + x = 0, + y = 0.2*y, + z = 0.2*z, + } + self.old_velocity = self.velocity + return + end + end + for _,x in ipairs({1,-1}) do + if cart_func.v3:equal(self:get_rail_direction(self.object:getpos(), {x=x, y=y, z=0}), {x=x, y=y, z=0}) then + self.velocity = { + x = 0.2*x, + y = 0.2*y, + z = 0, + } + self.old_velocity = self.velocity + return + end + end + end + end + + self.velocity = {x=0, y=0, z=0} + self.object:setvelocity(self.velocity) + self.old_velocity = self.velocity + self.old_pos = self.object:getpos() + return + end + end + + -- + -- Set the new moving direction + -- + + -- Recalcualte the rails that are passed since the last server step + local old_dir = cart_func:velocity_to_dir(self.old_velocity) + if old_dir.x ~= 0 then + local sign = cart_func:get_sign(pos.x-self.old_pos.x) + while true do + if sign ~= cart_func:get_sign(pos.x-self.old_pos.x) or pos.x == self.old_pos.x then + break + end + self.old_pos.x = self.old_pos.x + cart_func:get_sign(pos.x-self.old_pos.x)*0.1 + self.old_pos.y = self.old_pos.y + cart_func:get_sign(pos.x-self.old_pos.x)*0.1*old_dir.y + self.old_velocity, self.old_pos = self:calc_rail_direction(self.old_pos, self.old_velocity) + old_dir = cart_func:velocity_to_dir(self.old_velocity) + if not cart_func.v3:equal(cart_func:velocity_to_dir(self.old_velocity), dir) then + self.velocity = self.old_velocity + pos = self.old_pos + self.object:setpos(self.old_pos) + break + end + end + elseif old_dir.z ~= 0 then + local sign = cart_func:get_sign(pos.z-self.old_pos.z) + while true do + if sign ~= cart_func:get_sign(pos.z-self.old_pos.z) or pos.z == self.old_pos.z then + break + end + self.old_pos.z = self.old_pos.z + cart_func:get_sign(pos.z-self.old_pos.z)*0.1 + self.old_pos.y = self.old_pos.y + cart_func:get_sign(pos.z-self.old_pos.z)*0.1*old_dir.y + self.old_velocity, self.old_pos = self:calc_rail_direction(self.old_pos, self.old_velocity) + old_dir = cart_func:velocity_to_dir(self.old_velocity) + if not cart_func.v3:equal(cart_func:velocity_to_dir(self.old_velocity), dir) then + self.velocity = self.old_velocity + pos = self.old_pos + self.object:setpos(self.old_pos) + break + end + end + end + + -- Calculate the new step + self.velocity, pos = self:calc_rail_direction(pos, self.velocity) + self.object:setpos(pos) + dir = cart_func:velocity_to_dir(self.velocity) + + -- Accelerate or decelerate the cart according to the pitch and acceleration of the rail node + local a = tonumber(minetest.env:get_meta(pos):get_string("cart_acceleration")) + if not a then + a = 0 + end + if self.velocity.y < 0 then + self.velocity = { + x = self.velocity.x + (a+0.13)*cart_func:get_sign(self.velocity.x), + y = self.velocity.y + (a+0.13)*cart_func:get_sign(self.velocity.y), + z = self.velocity.z + (a+0.13)*cart_func:get_sign(self.velocity.z), + } + elseif self.velocity.y > 0 then + self.velocity = { + x = self.velocity.x + (a-0.1)*cart_func:get_sign(self.velocity.x), + y = self.velocity.y + (a-0.1)*cart_func:get_sign(self.velocity.y), + z = self.velocity.z + (a-0.1)*cart_func:get_sign(self.velocity.z), + } + else + self.velocity = { + x = self.velocity.x + (a-0.03)*cart_func:get_sign(self.velocity.x), + y = self.velocity.y + (a-0.03)*cart_func:get_sign(self.velocity.y), + z = self.velocity.z + (a-0.03)*cart_func:get_sign(self.velocity.z), + } + + -- Place the cart exactly on top of the rail + if cart_func:is_rail(cart_func.v3:round(pos)) then + self.object:setpos({x=pos.x, y=math.floor(pos.y+0.5), z=pos.z}) + pos = self.object:getpos() + end + end + + -- Dont switch moving direction + -- Only if on flat railway + if dir.y == 0 then + if cart_func:get_sign(dir.x) ~= cart_func:get_sign(self.velocity.x) then + self.velocity.x = 0 + end + if cart_func:get_sign(dir.y) ~= cart_func:get_sign(self.velocity.y) then + self.velocity.y = 0 + end + if cart_func:get_sign(dir.z) ~= cart_func:get_sign(self.velocity.z) then + self.velocity.z = 0 + end + end + + -- Allow only one moving direction (multiply the other one with 0) + dir = cart_func:velocity_to_dir(self.velocity) + self.velocity = { + x = math.abs(self.velocity.x) * dir.x, + y = self.velocity.y, + z = math.abs(self.velocity.z) * dir.z, + } + + -- Move cart exactly on the rail + if dir.x ~= 0 and not cart_func:is_int(pos.z) then + pos.z = math.floor(0.5+pos.z) + self.object:setpos(pos) + elseif dir.z ~= 0 and not cart_func:is_int(pos.x) then + pos.x = math.floor(0.5+pos.x) + self.object:setpos(pos) + end + + -- Limit the velocity + if math.abs(self.velocity.x) > self.MAX_V then + self.velocity.x = self.MAX_V*cart_func:get_sign(self.velocity.x) + end + if math.abs(self.velocity.y) > self.MAX_V then + self.velocity.y = self.MAX_V*cart_func:get_sign(self.velocity.y) + end + if math.abs(self.velocity.z) > self.MAX_V then + self.velocity.z = self.MAX_V*cart_func:get_sign(self.velocity.z) + end + + self.object:setvelocity(self.velocity) + + self.old_pos = self.object:getpos() + self.old_velocity = cart_func.v3:copy(self.velocity) + + if dir.x < 0 then + self.object:setyaw(math.pi/2) + elseif dir.x > 0 then + self.object:setyaw(3*math.pi/2) + elseif dir.z < 0 then + self.object:setyaw(math.pi) + elseif dir.z > 0 then + self.object:setyaw(0) + end + + if dir.y == -1 then + self.object:set_animation({x=1, y=1}, 1, 0) + elseif dir.y == 1 then + self.object:set_animation({x=2, y=2}, 1, 0) + else + self.object:set_animation({x=0, y=0}, 1, 0) + end + +end + +minetest.register_entity("carts:cart", cart) + + +minetest.register_craftitem("carts:cart", { + description = "Minecart", + inventory_image = minetest.inventorycube("cart_top.png", "cart_side.png", "cart_side.png"), + wield_image = "cart_side.png", + + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return + end + if cart_func:is_rail(pointed_thing.under) then + minetest.env:add_entity(pointed_thing.under, "carts:cart") + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + elseif cart_func:is_rail(pointed_thing.above) then + minetest.env:add_entity(pointed_thing.above, "carts:cart") + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end + end, +}) + +minetest.register_craft({ + output = "carts:cart", + recipe = { + {"", "", ""}, + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + }, +}) + +-- +-- Mesecon support +-- + +minetest.register_node(":default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1,rail=1,connect_to_raillike=1}, +}) + +minetest.register_node("carts:powerrail", { + description = "Powered Rail", + drawtype = "raillike", + tiles = {"carts_rail_pwr.png", "carts_rail_curved_pwr.png", "carts_rail_t_junction_pwr.png", "carts_rail_crossing_pwr.png"}, + inventory_image = "carts_rail_pwr.png", + wield_image = "carts_rail_pwr.png", + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1,rail=1,connect_to_raillike=1}, + + after_place_node = function(pos, placer, itemstack) + if not mesecon then + minetest.env:get_meta(pos):set_string("cart_acceleration", "0.5") + end + end, + + mesecons = { + effector = { + action_on = function(pos, node) + minetest.env:get_meta(pos):set_string("cart_acceleration", "0.5") + end, + + action_off = function(pos, node) + minetest.env:get_meta(pos):set_string("cart_acceleration", "0") + end, + }, + }, +}) + +minetest.register_node("carts:brakerail", { + description = "Brake Rail", + drawtype = "raillike", + tiles = {"carts_rail_brk.png", "carts_rail_curved_brk.png", "carts_rail_t_junction_brk.png", "carts_rail_crossing_brk.png"}, + inventory_image = "carts_rail_brk.png", + wield_image = "carts_rail_brk.png", + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,snappy=1,dig_immediate=2,attached_node=1,rail=1,connect_to_raillike=1}, + + after_place_node = function(pos, placer, itemstack) + if not mesecon then + minetest.env:get_meta(pos):set_string("cart_acceleration", "-0.2") + end + end, + + mesecons = { + effector = { + action_on = function(pos, node) + minetest.env:get_meta(pos):set_string("cart_acceleration", "-0.2") + end, + + action_off = function(pos, node) + minetest.env:get_meta(pos):set_string("cart_acceleration", "0") + end, + }, + }, +}) + +minetest.register_craft({ + output = "carts:powerrail 2", + recipe = { + {"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}, + {"default:steel_ingot", "default:stick", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "carts:powerrail 2", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:stick", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "carts:brakerail 2", + recipe = { + {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + {"default:steel_ingot", "default:stick", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "carts:brakerail 2", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:stick", "default:steel_ingot"}, + {"default:steel_ingot", "default:coal_lump", "default:steel_ingot"}, + } +}) diff --git a/mods/carts/models/cart.png b/mods/carts/models/cart.png new file mode 100644 index 0000000..1f9f568 Binary files /dev/null and b/mods/carts/models/cart.png differ diff --git a/mods/carts/models/cart.x b/mods/carts/models/cart.x new file mode 100644 index 0000000..3325aaf --- /dev/null +++ b/mods/carts/models/cart.x @@ -0,0 +1,339 @@ +xof 0303txt 0032 + +Frame Root { + FrameTransformMatrix { + 1.000000, 0.000000, 0.000000, 0.000000, + 0.000000, 0.000000, 1.000000, 0.000000, + 0.000000, 1.000000,-0.000000, 0.000000, + 0.000000, 0.000000, 0.000000, 1.000000;; + } + Frame Cube { + FrameTransformMatrix { + 5.000000, 0.000000,-0.000000, 0.000000, + -0.000000, 3.535534, 3.535534, 0.000000, + 0.000000,-3.535534, 3.535534, 0.000000, + 0.000000,-3.000000, 3.000000, 1.000000;; + } + Mesh { //Cube_001 Mesh + 72; + -1.000000; 1.000000;-1.000000;, + -1.000000;-1.000000;-1.000000;, + 1.000000;-1.000000;-1.000000;, + 1.000000; 1.000000;-1.000000;, + -0.833334;-1.000000; 1.000000;, + -1.000000;-1.000000; 1.000000;, + -1.000000;-0.833333; 1.000000;, + -0.833334;-0.833333; 1.000000;, + -1.000000;-1.000000;-1.000000;, + -1.000000;-1.000000; 1.000000;, + 0.999999;-1.000001; 1.000000;, + 1.000000;-1.000000;-1.000000;, + 0.999999;-1.000001; 1.000000;, + 0.833332;-1.000000; 1.000000;, + 0.833333;-0.833334; 1.000000;, + 1.000000;-0.833334; 1.000000;, + 0.833332;-1.000000; 1.000000;, + -0.833334;-1.000000; 1.000000;, + -0.833334;-0.833333; 1.000000;, + 0.833333;-0.833334; 1.000000;, + 1.000000; 0.833333; 1.000000;, + 0.833334; 0.833333; 1.000000;, + 0.833334; 1.000000; 1.000000;, + 1.000000; 0.999999; 1.000000;, + 1.000000;-0.833334; 1.000000;, + 0.833333;-0.833334; 1.000000;, + 0.833334; 0.833333; 1.000000;, + 1.000000; 0.833333; 1.000000;, + 0.833334; 0.833333; 1.000000;, + -0.833333; 0.833333; 1.000000;, + -0.833333; 1.000000; 1.000000;, + 0.833334; 1.000000; 1.000000;, + 0.833334; 0.833333;-0.800000;, + -0.833333; 0.833333;-0.800000;, + -0.833333; 0.833333; 1.000000;, + 0.833334; 0.833333; 1.000000;, + -0.833333; 0.833333; 1.000000;, + -1.000000; 0.833333; 1.000000;, + -1.000000; 1.000000; 1.000000;, + -0.833333; 1.000000; 1.000000;, + -0.833334;-0.833333; 1.000000;, + -1.000000;-0.833333; 1.000000;, + -1.000000; 0.833333; 1.000000;, + -0.833333; 0.833333; 1.000000;, + 0.833333;-0.833334;-0.800000;, + -0.833334;-0.833333;-0.800000;, + -0.833333; 0.833333;-0.800000;, + 0.833334; 0.833333;-0.800000;, + -0.833333; 0.833333;-0.800000;, + -0.833334;-0.833333;-0.800000;, + -0.833334;-0.833333; 1.000000;, + -0.833333; 0.833333; 1.000000;, + -0.833334;-0.833333;-0.800000;, + 0.833333;-0.833334;-0.800000;, + 0.833333;-0.833334; 1.000000;, + -0.833334;-0.833333; 1.000000;, + 0.833333;-0.833334;-0.800000;, + 0.833334; 0.833333;-0.800000;, + 0.833334; 0.833333; 1.000000;, + 0.833333;-0.833334; 1.000000;, + -1.000000; 1.000000;-1.000000;, + -1.000000; 1.000000; 1.000000;, + -1.000000;-1.000000; 1.000000;, + -1.000000;-1.000000;-1.000000;, + -1.000000; 1.000000; 1.000000;, + -1.000000; 1.000000;-1.000000;, + 1.000000; 1.000000;-1.000000;, + 1.000000; 0.999999; 1.000000;, + 1.000000;-1.000000;-1.000000;, + 0.999999;-1.000001; 1.000000;, + 1.000000; 0.999999; 1.000000;, + 1.000000; 1.000000;-1.000000;; + 18; + 4;0;1;2;3;, + 4;4;5;6;7;, + 4;8;9;10;11;, + 4;12;13;14;15;, + 4;16;17;18;19;, + 4;20;21;22;23;, + 4;24;25;26;27;, + 4;28;29;30;31;, + 4;32;33;34;35;, + 4;36;37;38;39;, + 4;40;41;42;43;, + 4;44;45;46;47;, + 4;48;49;50;51;, + 4;52;53;54;55;, + 4;56;57;58;59;, + 4;60;61;62;63;, + 4;64;65;66;67;, + 4;68;69;70;71;; + MeshNormals { //Cube_001 Normals + 72; + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000; 0.000000;-1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -0.000000;-1.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + -0.000000;-1.000000;-0.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + -0.000000;-1.000000; 0.000000;, + -0.000000;-1.000000; 0.000000;, + -0.000000;-1.000000; 0.000000;, + -0.000000;-1.000000; 0.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 0.000000;-0.000000; 1.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000; 0.000000;, + -1.000000; 0.000000;-0.000000;, + -1.000000; 0.000000;-0.000000;, + -1.000000; 0.000000;-0.000000;, + -1.000000; 0.000000;-0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 0.000000; 1.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;, + 1.000000;-0.000000; 0.000000;; + 18; + 4;0;1;2;3;, + 4;4;5;6;7;, + 4;8;9;10;11;, + 4;12;13;14;15;, + 4;16;17;18;19;, + 4;20;21;22;23;, + 4;24;25;26;27;, + 4;28;29;30;31;, + 4;32;33;34;35;, + 4;36;37;38;39;, + 4;40;41;42;43;, + 4;44;45;46;47;, + 4;48;49;50;51;, + 4;52;53;54;55;, + 4;56;57;58;59;, + 4;60;61;62;63;, + 4;64;65;66;67;, + 4;68;69;70;71;; + } //End of Cube_001 Normals + MeshMaterialList { //Cube_001 Material List + 1; + 18; + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0;; + Material Material { + 0.640000; 0.640000; 0.640000; 1.000000;; + 96.078431; + 0.500000; 0.500000; 0.500000;; + 0.000000; 0.000000; 0.000000;; + TextureFilename {"cart.png";} + } + } //End of Cube_001 Material List + MeshTextureCoords { //Cube_001 UV Coordinates + 72; + 0.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 1.000000;, + 0.000000; 1.000000;, + 0.031250; 0.500000;, + -0.000000; 0.500000;, + -0.000000; 0.468750;, + 0.031250; 0.468750;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.500000;, + 0.468750; 0.468750;, + 0.500000; 0.468750;, + 0.500000; 0.500000;, + 0.468750; 0.500000;, + 0.031250; 0.468750;, + 0.468750; 0.468750;, + 0.468750; 0.500000;, + 0.031250; 0.500000;, + 0.468750; 0.000000;, + 0.500000; 0.000000;, + 0.500000; 0.031250;, + 0.468750; 0.031250;, + 0.468750; 0.031250;, + 0.500000; 0.031250;, + 0.500000; 0.468750;, + 0.468750; 0.468750;, + 0.468750; 0.031250;, + 0.031250; 0.031250;, + 0.031250; 0.000000;, + 0.468750; 0.000000;, + 1.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 0.031250; 0.031250;, + 0.000000; 0.031250;, + 0.000000; 0.000000;, + 0.031250; 0.000000;, + 0.031250; 0.468750;, + -0.000000; 0.468750;, + 0.000000; 0.031250;, + 0.031250; 0.031250;, + 0.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 1.000000;, + 0.000000; 1.000000;, + 1.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.500000;, + 1.000000; 0.000000;, + 1.000000; 0.500000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 0.500000; 0.500000;, + 0.500000; 0.000000;, + 1.000000; 0.000000;, + 1.000000; 0.500000;; + } //End of Cube_001 UV Coordinates + } //End of Cube_001 Mesh + } //End of Cube +} //End of Root Frame +AnimationSet { + Animation { + {Cube} + AnimationKey { //Position + 2; + 4; + 0;3; 0.000000, 0.000000, 0.000000;;, + 1;3; 0.000000, 3.000000, 3.000000;;, + 2;3; 0.000000,-3.000000, 3.000000;;, + 3;3; 0.000000,-3.000000, 3.000000;;; + } + AnimationKey { //Rotation + 0; + 4; + 0;4; -1.000000, 0.000000, 0.000000, 0.000000;;, + 1;4; -0.923880,-0.382683,-0.000000, 0.000000;;, + 2;4; -0.923880, 0.382683, 0.000000, 0.000000;;, + 3;4; -0.923880, 0.382683, 0.000000, 0.000000;;; + } + AnimationKey { //Scale + 1; + 4; + 0;3; 5.000000, 5.000000, 5.000000;;, + 1;3; 5.000000, 5.000000, 5.000000;;, + 2;3; 5.000000, 5.000000, 5.000000;;, + 3;3; 5.000000, 5.000000, 5.000000;;; + } + } +} //End of AnimationSet diff --git a/mods/carts/textures/cart_bottom.png b/mods/carts/textures/cart_bottom.png new file mode 100644 index 0000000..f84b1ae Binary files /dev/null and b/mods/carts/textures/cart_bottom.png differ diff --git a/mods/carts/textures/cart_side.png b/mods/carts/textures/cart_side.png new file mode 100644 index 0000000..79f6c32 Binary files /dev/null and b/mods/carts/textures/cart_side.png differ diff --git a/mods/carts/textures/cart_top.png b/mods/carts/textures/cart_top.png new file mode 100644 index 0000000..8140fc7 Binary files /dev/null and b/mods/carts/textures/cart_top.png differ diff --git a/mods/carts/textures/carts_rail_brk.png b/mods/carts/textures/carts_rail_brk.png new file mode 100644 index 0000000..f3e0ff9 Binary files /dev/null and b/mods/carts/textures/carts_rail_brk.png differ diff --git a/mods/carts/textures/carts_rail_crossing_brk.png b/mods/carts/textures/carts_rail_crossing_brk.png new file mode 100644 index 0000000..3ace508 Binary files /dev/null and b/mods/carts/textures/carts_rail_crossing_brk.png differ diff --git a/mods/carts/textures/carts_rail_crossing_pwr.png b/mods/carts/textures/carts_rail_crossing_pwr.png new file mode 100644 index 0000000..d63f133 Binary files /dev/null and b/mods/carts/textures/carts_rail_crossing_pwr.png differ diff --git a/mods/carts/textures/carts_rail_curved_brk.png b/mods/carts/textures/carts_rail_curved_brk.png new file mode 100644 index 0000000..5a84918 Binary files /dev/null and b/mods/carts/textures/carts_rail_curved_brk.png differ 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 0000000..e2ac67a Binary files /dev/null and b/mods/carts/textures/carts_rail_curved_pwr.png differ diff --git a/mods/carts/textures/carts_rail_pwr.png b/mods/carts/textures/carts_rail_pwr.png new file mode 100644 index 0000000..95f33f6 Binary files /dev/null and b/mods/carts/textures/carts_rail_pwr.png differ diff --git a/mods/carts/textures/carts_rail_t_junction_brk.png b/mods/carts/textures/carts_rail_t_junction_brk.png new file mode 100644 index 0000000..0c2c1cb Binary files /dev/null and b/mods/carts/textures/carts_rail_t_junction_brk.png differ 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 0000000..7f97fc7 Binary files /dev/null and b/mods/carts/textures/carts_rail_t_junction_pwr.png differ diff --git a/mods/caverealms/README.md b/mods/caverealms/README.md new file mode 100644 index 0000000..87edf5f --- /dev/null +++ b/mods/caverealms/README.md @@ -0,0 +1,14 @@ +minetest-caverealms +=================== + +A mod for Minetest to add underground realms + +For more information, view the official forum topic at: +https://forum.minetest.net/viewtopic.php?f=9&t=9522 + +Contributors: +HeroOfTheWinds - everything +| +Zeno- - additional ideas and fine tuning + +Licensed under the WTFPL diff --git a/mods/caverealms/config.lua b/mods/caverealms/config.lua new file mode 100644 index 0000000..6b7c38c --- /dev/null +++ b/mods/caverealms/config.lua @@ -0,0 +1,45 @@ + +local CONFIG_FILE_PREFIX = "caverealms." + +caverealms.config = {} + +-- This function based on kaeza/minetest-irc/config.lua and used under the +-- terms of BSD 2-clause license. +local function setting(stype, name, default) + local value + if stype == "bool" then + value = minetest.setting_getbool(CONFIG_FILE_PREFIX..name) + elseif stype == "string" then + value = minetest.setting_get(CONFIG_FILE_PREFIX..name) + elseif stype == "number" then + value = tonumber(minetest.setting_get(CONFIG_FILE_PREFIX..name)) + end + if value == nil then + value = default + end + caverealms.config[name] = value +end + +--generation settings +setting("number", "ymin", -2000) --bottom realm limit +setting("number", "ymax", -300) --top realm limit +setting("number", "tcave", 0.5) --cave threshold + +--falling icicles +setting("bool", "falling_icicles", true) --enable/disable falling icicles +setting("number", "fallcha", 0.33) --chance of icicles falling when dug + +--decoration chances +setting("number", "stagcha", 0.002) --chance of stalagmites +setting("number", "stalcha", 0.003) --chance of stalactites +setting("number", "h_lag", 15) --max height for stalagmites +setting("number", "h_lac", 20) --...stalactites +setting("number", "crystal", 0.007) --chance of glow crystal formations +setting("number", "h_cry", 9) --max height of glow crystals +setting("number", "h_clac", 13) --max height of glow crystal stalactites +setting("number", "gemcha", 0.03) --chance of small glow gems +setting("number", "mushcha", 0.04) --chance of mushrooms +setting("number", "myccha", 0.03) --chance of mycena mushrooms +setting("number", "wormcha", 0.02) --chance of glow worms +setting("number", "giantcha", 0.001) --chance of giant mushrooms +setting("number", "icicha", 0.035) --chance of icicles diff --git a/mods/caverealms/crafting.lua b/mods/caverealms/crafting.lua new file mode 100644 index 0000000..e78da6e --- /dev/null +++ b/mods/caverealms/crafting.lua @@ -0,0 +1,43 @@ +--CaveRealms crafting.lua + +--CRAFT ITEMS-- + +--mycena powder +minetest.register_craftitem("caverealms:mycena_powder", { + description = "Mycena Powder", + inventory_image = "caverealms_mycena_powder.png", +}) + +--CRAFT RECIPES-- + +--mycena powder +minetest.register_craft({ + output = "caverealms:mycena_powder", + type = "shapeless", + recipe = {"caverealms:mycena"} +}) + + +--glow mese block +minetest.register_craft({ + output = "caverealms:glow_mese", + recipe = { + {"default:mese_crystal_fragment","default:mese_crystal_fragment","default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment","caverealms:mycena_powder","default:mese_crystal_fragment"}, + {"default:mese_crystal_fragment","default:mese_crystal_fragment","default:mese_crystal_fragment"} + } +}) + +--reverse craft for glow mese +minetest.register_craft({ + output = "default:mese_crystal_fragment 8", + type = "shapeless", + recipe = {"caverealms:glow_mese"} +}) + +--thin ice to water +minetest.register_craft({ + output = "default:water_source", + type = "shapeless", + recipe = {"caverealms:thin_ice"} +}) \ No newline at end of file diff --git a/mods/caverealms/depends.txt b/mods/caverealms/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/caverealms/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/caverealms/falling_ice.lua b/mods/caverealms/falling_ice.lua new file mode 100644 index 0000000..4e04b5f --- /dev/null +++ b/mods/caverealms/falling_ice.lua @@ -0,0 +1,210 @@ +-- CaveRealms: falling icicles +-- borrowed from base MineTest game's falling.lua + +-- +-- Falling ice +-- + +minetest.register_entity("caverealms:falling_ice", { + initial_properties = { + physical = true, + collide_with_objects = false, + collisionbox = {-0.5,-0.5,-0.5, 0.5,0.5,0.5}, + visual = "wielditem", + textures = {}, + visual_size = {x=0.667, y=0.667}, + }, + + node = {}, + + set_node = function(self, node) + self.node = node + local stack = ItemStack(node.name) + local itemtable = stack:to_table() + local itemname = nil + if itemtable then + itemname = stack:to_table().name + end + local item_texture = nil + local item_type = "" + if minetest.registered_items[itemname] then + item_texture = minetest.registered_items[itemname].inventory_image + item_type = minetest.registered_items[itemname].type + end + prop = { + is_visible = true, + textures = {node.name}, + } + self.object:set_properties(prop) + end, + + get_staticdata = function(self) + return self.node.name + end, + + on_activate = function(self, staticdata) + self.object:set_armor_groups({immortal=1}) + --self.object:setacceleration({x=0, y=-10, z=0}) + self:set_node({name=staticdata}) + end, + + on_step = function(self, dtime) + -- Set gravity + self.object:setacceleration({x=0, y=-10, z=0}) + -- Destroy when collides to ground or just move + local pos = self.object:getpos() + local bcp = {x=pos.x, y=pos.y-0.7, z=pos.z} -- Position of bottom center point + local bcn = minetest.get_node(bcp) + local bcd = minetest.registered_nodes[bcn.name] + --check for players next to this and hurt them >:D + local all_objects = minetest.get_objects_inside_radius(pos, 1) + local _,obj + for _,obj in ipairs(all_objects) do + if obj:is_player() then + obj:set_hp(obj:get_hp() - 8) + end + end + -- Note: walkable is in the node definition, not in item groups + if not bcd or + (bcd.walkable or + (minetest.get_item_group(self.node.name, "float") ~= 0 and + bcd.liquidtype ~= "none")) then + if bcd and bcd.leveled and + bcn.name == self.node.name then + local addlevel = self.node.level + if addlevel == nil or addlevel <= 0 then + addlevel = bcd.leveled + end + if minetest.add_node_level(bcp, addlevel) == 0 then + self.object:remove() + return + end + elseif bcd and bcd.buildable_to and + (minetest.get_item_group(self.node.name, "float") == 0 or + bcd.liquidtype == "none") then + minetest.remove_node(bcp) + return + end + local np = {x=bcp.x, y=bcp.y+1, z=bcp.z} + -- Check what's here + local n2 = minetest.get_node(np) + -- remove node and replace it with it's drops + local drops = minetest.get_node_drops(n2.name, "") + minetest.remove_node(np) + local _, dropped_item + for _, dropped_item in ipairs(drops) do + minetest.add_item(np, dropped_item) + end + -- Run script hook + local _, callback + for _, callback in ipairs(minetest.registered_on_dignodes) do + callback(np, n2, nil) + end + -- remove entity + --minetest.add_node(np, self.node) + self.object:remove() + caverealms:nodeupdate(np) + else + -- Do nothing + end + end +}) + +function caverealms:spawn_falling_node(p, node) + obj = minetest.add_entity(p, "caverealms:falling_ice") + obj:get_luaentity():set_node(node) +end + +function caverealms:drop_attached_node(p) + local nn = minetest.get_node(p).name + minetest.remove_node(p) + for _,item in ipairs(minetest.get_node_drops(nn, "")) do + local pos = { + x = p.x + math.random()/2 - 0.25, + y = p.y + math.random()/2 - 0.25, + z = p.z + math.random()/2 - 0.25, + } + minetest.add_item(pos, item) + end +end + +function caverealms:check_attached_node(p, n) + local def = minetest.registered_nodes[n.name] + local d = {x=0, y=0, z=0} + if def.paramtype2 == "wallmounted" then + if n.param2 == 0 then + d.y = 1 + elseif n.param2 == 1 then + d.y = -1 + elseif n.param2 == 2 then + d.x = 1 + elseif n.param2 == 3 then + d.x = -1 + elseif n.param2 == 4 then + d.z = 1 + elseif n.param2 == 5 then + d.z = -1 + end + else + d.y = -1 + end + local p2 = {x=p.x+d.x, y=p.y+d.y, z=p.z+d.z} + local nn = minetest.get_node(p2).name + local def2 = minetest.registered_nodes[nn] + if def2 and not def2.walkable then + return false + end + return true +end + +-- +-- Some common functions +-- + +function caverealms:nodeupdate_single(p, delay) + n = minetest.get_node(p) + if minetest.get_item_group(n.name, "falling_node") ~= 0 then + p_bottom = {x=p.x, y=p.y-1, z=p.z} + n_bottom = minetest.get_node(p_bottom) + -- Note: walkable is in the node definition, not in item groups + if minetest.registered_nodes[n_bottom.name] and + (minetest.get_item_group(n.name, "float") == 0 or + minetest.registered_nodes[n_bottom.name].liquidtype == "none") and + (n.name ~= n_bottom.name or (minetest.registered_nodes[n_bottom.name].leveled and + minetest.get_node_level(p_bottom) < minetest.get_node_max_level(p_bottom))) and + (not minetest.registered_nodes[n_bottom.name].walkable or + minetest.registered_nodes[n_bottom.name].buildable_to) then + if delay then + minetest.after(0.1, caverealms.nodeupdate_single, {x=p.x, y=p.y, z=p.z}, false) + else + n.level = minetest.env:get_node_level(p) + minetest.remove_node(p) + caverealms:spawn_falling_node(p, n) + caverealms:nodeupdate(p) + end + end + end + + if minetest.get_item_group(n.name, "attached_node") ~= 0 then + if not check_attached_node(p, n) then + caverealms:drop_attached_node(p) + caverealms:nodeupdate(p) + end + end +end + +function caverealms:nodeupdate(p, delay) + -- Round p to prevent falling entities to get stuck + p.x = math.floor(p.x+0.5) + p.y = math.floor(p.y+0.5) + p.z = math.floor(p.z+0.5) + + for x = -1,1 do + for y = -1,1 do + for z = -1,1 do + caverealms:nodeupdate_single({x=p.x+x, y=p.y+y, z=p.z+z}, delay or not (x==0 and y==0 and z==0)) + end + end + end +end + diff --git a/mods/caverealms/functions.lua b/mods/caverealms/functions.lua new file mode 100644 index 0000000..6c62a93 --- /dev/null +++ b/mods/caverealms/functions.lua @@ -0,0 +1,378 @@ +--CaveRealms functions.lua + +--FUNCTIONS-- + +local H_LAG = caverealms.config.h_lag --15 --max height for stalagmites +local H_LAC = caverealms.config.h_lac --20 --...stalactites +local H_CRY = caverealms.config.h_cry --9 --max height of glow crystals +local H_CLAC = caverealms.config.h_clac --13 --max height of glow crystal stalactites + +function caverealms:above_solid(x,y,z,area,data) + local c_air = minetest.get_content_id("air") + local ai = area:index(x,y+1,z-3) + if data[ai] == c_air then + return false + else + return true + end +end +function caverealms:below_solid(x,y,z,area,data) + local c_air = minetest.get_content_id("air") + local ai = area:index(x,y-1,z-3) + if data[ai] == c_air then + return false + else + return true + end +end + +--stalagmite spawner +function caverealms:stalagmite(x,y,z, area, data) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + + local top = math.random(6,H_LAG) --grab a random height for the stalagmite + for j = 0, top do --y + for k = -3, 3 do + for l = -3, 3 do + if j == 0 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j <= top/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j <= top/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = c_stone + end + end + end + end +end + +--stalactite spawner +function caverealms:stalactite(x,y,z, area, data) + + if not caverealms:above_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone")--("caverealms:limestone") + + local bot = math.random(-H_LAC, -6) --grab a random height for the stalagmite + for j = bot, 0 do --y + for k = -3, 3 do + for l = -3, 3 do + if j >= -1 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j >= bot/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + elseif j >= bot/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = c_stone + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = c_stone + end + end + end + end +end + +--glowing crystal stalagmite spawner +function caverealms:crystal_stalagmite(x,y,z, area, data, biome) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + local c_crystal = minetest.get_content_id("caverealms:glow_crystal") + local c_crystore = minetest.get_content_id("caverealms:glow_ore") + local c_emerald = minetest.get_content_id("caverealms:glow_emerald") + local c_emore = minetest.get_content_id("caverealms:glow_emerald_ore") + local c_mesecry = minetest.get_content_id("caverealms:glow_mese") + local c_meseore = minetest.get_content_id("default:stone_with_mese") + local c_ice = minetest.get_content_id("default:ice") + local c_thinice = minetest.get_content_id("caverealms:thin_ice") + + --for randomness + local mode = 1 + if math.random(15) == 1 then + mode = 2 + end + if biome == 3 then + if math.random(25) == 1 then + mode = 2 + else + mode = 1 + end + end + if biome == 4 or biome == 5 then + if math.random(3) == 1 then + mode = 2 + end + end + + local stalids = { + { {c_crystore, c_crystal}, {c_emore, c_emerald} }, + { {c_emore, c_emerald}, {c_crystore, c_crystal} }, + { {c_emore, c_emerald}, {c_meseore, c_mesecry} }, + { {c_ice, c_thinice}, {c_crystore, c_crystal}} + } + + local nid_a + local nid_b + local nid_s = c_stone --stone base, will be rewritten to ice in certain biomes + + if biome > 3 then + if mode == 1 then + nid_a = c_ice + nid_b = c_thinice + nid_s = c_ice + else + nid_a = c_crystore + nid_b = c_crystal + end + elseif mode == 1 then + nid_a = stalids[biome][1][1] + nid_b = stalids[biome][1][2] + else + nid_a = stalids[biome][2][1] + nid_b = stalids[biome][2][2] + end + + local top = math.random(5,H_CRY) --grab a random height for the stalagmite + for j = 0, top do --y + for k = -3, 3 do + for l = -3, 3 do + if j == 0 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_s + end + elseif j <= top/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_a + end + elseif j <= top/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_b + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = nid_b + end + end + end + end +end + +--crystal stalactite spawner +function caverealms:crystal_stalactite(x,y,z, area, data, biome) + + if not caverealms:above_solid(x,y,z,area,data) then + return + end + + --contest ids + local c_stone = minetest.get_content_id("default:stone") + local c_crystore = minetest.get_content_id("caverealms:glow_ore") + local c_crystal = minetest.get_content_id("caverealms:glow_crystal") + local c_emerald = minetest.get_content_id("caverealms:glow_emerald") + local c_emore = minetest.get_content_id("caverealms:glow_emerald_ore") + local c_mesecry = minetest.get_content_id("caverealms:glow_mese") + local c_meseore = minetest.get_content_id("default:stone_with_mese") + local c_ice = minetest.get_content_id("default:ice") + local c_thinice = minetest.get_content_id("caverealms:hanging_thin_ice") + + --for randomness + local mode = 1 + if math.random(15) == 1 then + mode = 2 + end + if biome == 3 then + if math.random(25) == 1 then + mode = 2 + else + mode = 1 + end + end + if biome == 4 or biome == 5 then + if math.random(3) == 1 then + mode = 2 + end + end + + local stalids = { + { {c_crystore, c_crystal}, {c_emore, c_emerald} }, + { {c_emore, c_emerald}, {c_crystore, c_crystal} }, + { {c_emore, c_emerald}, {c_meseore, c_mesecry} }, + { {c_ice, c_thinice}, {c_crystore, c_crystal}} + } + + local nid_a + local nid_b + local nid_s = c_stone --stone base, will be rewritten to ice in certain biomes + + if biome > 3 then + if mode == 1 then + nid_a = c_ice + nid_b = c_thinice + nid_s = c_ice + else + nid_a = c_crystore + nid_b = c_crystal + end + elseif mode == 1 then + nid_a = stalids[biome][1][1] + nid_b = stalids[biome][1][2] + else + nid_a = stalids[biome][2][1] + nid_b = stalids[biome][2][2] + end + + local bot = math.random(-H_CLAC, -6) --grab a random height for the stalagmite + for j = bot, 0 do --y + for k = -3, 3 do + for l = -3, 3 do + if j >= -1 then + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_s + end + elseif j >= bot/5 then + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_a + end + elseif j >= bot/5 * 3 then + if k*k + l*l <= 1 then + local vi = area:index(x+k, y+j, z+l-3) + data[vi] = nid_b + end + else + local vi = area:index(x, y+j, z-3) + data[vi] = nid_b + end + end + end + end +end + +--function to create giant 'shrooms +function caverealms:giant_shroom(x, y, z, area, data) + + if not caverealms:below_solid(x,y,z,area,data) then + return + end + + --as usual, grab the content ID's + local c_stem = minetest.get_content_id("caverealms:mushroom_stem") + local c_cap = minetest.get_content_id("caverealms:mushroom_cap") + local c_gills = minetest.get_content_id("caverealms:mushroom_gills") + + z = z - 5 + --cap + for k = -5, 5 do + for l = -5, 5 do + if k*k + l*l <= 25 then + local vi = area:index(x+k, y+5, z+l) + data[vi] = c_cap + end + if k*k + l*l <= 16 then + local vi = area:index(x+k, y+6, z+l) + data[vi] = c_cap + vi = area:index(x+k, y+5, z+l) + data[vi] = c_gills + end + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+7, z+l) + data[vi] = c_cap + end + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+8, z+l) + data[vi] = c_cap + end + end + end + --stem + for j = 0, 5 do + for k = -1,1 do + local vi = area:index(x+k, y+j, z) + data[vi] = c_stem + if k == 0 then + local ai = area:index(x, y+j, z+1) + data[ai] = c_stem + ai = area:index(x, y+j, z-1) + data[ai] = c_stem + end + end + end +end + +function caverealms:legacy_giant_shroom(x, y, z, area, data) --leftovers :P + --as usual, grab the content ID's + local c_stem = minetest.get_content_id("caverealms:mushroom_stem") + local c_cap = minetest.get_content_id("caverealms:mushroom_cap") + + z = z - 4 + --cap + for k = -4, 4 do + for l = -4, 4 do + if k*k + l*l <= 16 then + local vi = area:index(x+k, y+5, z+l) + data[vi] = c_cap + end + if k*k + l*l <= 9 then + local vi = area:index(x+k, y+4, z+l) + data[vi] = c_cap + vi = area:index(x+k, y+6, z+l) + data[vi] = c_cap + end + if k*k + l*l <= 4 then + local vi = area:index(x+k, y+7, z+l) + data[vi] = c_cap + end + end + end + --stem + for j = 0, 4 do + for k = -1,1 do + local vi = area:index(x+k, y+j, z) + data[vi] = c_stem + if k == 0 then + local ai = area:index(x, y+j, z+1) + data[ai] = c_stem + ai = area:index(x, y+j, z-1) + data[ai] = c_stem + end + end + end +end \ No newline at end of file diff --git a/mods/caverealms/init.lua b/mods/caverealms/init.lua new file mode 100644 index 0000000..c13671b --- /dev/null +++ b/mods/caverealms/init.lua @@ -0,0 +1,297 @@ +-- caverealms v.0.3 by HeroOfTheWinds +-- original cave code modified from paramat's subterrain +-- For Minetest 0.4.8 stable +-- Depends default +-- License: code WTFPL + + +caverealms = {} --create a container for functions and constants + +--grab a shorthand for the filepath of the mod +local modpath = minetest.get_modpath(minetest.get_current_modname()) + +--load companion lua files +dofile(modpath.."/config.lua") --configuration file; holds various constants +dofile(modpath.."/crafting.lua") --crafting recipes +dofile(modpath.."/nodes.lua") --node definitions +dofile(modpath.."/functions.lua") --function definitions + +if caverealms.config.falling_icicles == true then + dofile(modpath.."/falling_ice.lua") --complicated function for falling icicles + print("[caverealms] falling icicles enabled.") +end + +-- Parameters + +local YMIN = caverealms.config.ymin -- Approximate realm limits. +local YMAX = caverealms.config.ymax +local TCAVE = caverealms.config.tcave --0.5 -- Cave threshold. 1 = small rare caves, 0.5 = 1/3rd ground volume, 0 = 1/2 ground volume +local BLEND = 128 -- Cave blend distance near YMIN, YMAX + +local STAGCHA = caverealms.config.stagcha --0.002 --chance of stalagmites +local STALCHA = caverealms.config.stalcha --0.003 --chance of stalactites +local CRYSTAL = caverealms.config.crystal --0.007 --chance of glow crystal formations +local GEMCHA = caverealms.config.gemcha --0.03 --chance of small glow gems +local MUSHCHA = caverealms.config.mushcha --0.04 --chance of mushrooms +local MYCCHA = caverealms.config.myccha --0.03 --chance of mycena mushrooms +local WORMCHA = caverealms.config.wormcha --0.03 --chance of glow worms +local GIANTCHA = caverealms.config.giantcha --0.001 -- chance of giant mushrooms +local ICICHA = caverealms.config.icicha --0.035 -- chance of icicles + +-- 3D noise for caves + +local np_cave = { + offset = 0, + scale = 1, + spread = {x=512, y=256, z=512}, -- squashed 2:1 + seed = 59033, + octaves = 6, + persist = 0.63 +} + +-- 3D noise for wave + +local np_wave = { + offset = 0, + scale = 1, + spread = {x=256, y=256, z=256}, + seed = -400000000089, + octaves = 3, + persist = 0.67 +} + +-- 2D noise for biome + +local np_biome = { + offset = 0, + scale = 1, + spread = {x=250, y=250, z=250}, + seed = 9130, + octaves = 3, + persist = 0.5 +} + +-- Stuff + +subterrain = {} + +local yblmin = YMIN + BLEND * 1.5 +local yblmax = YMAX - BLEND * 1.5 + +-- On generated function + +minetest.register_on_generated(function(minp, maxp, seed) + --if out of range of caverealms limits + if minp.y > YMAX or maxp.y < YMIN then + return --quit; otherwise, you'd have stalagmites all over the place + end + + --easy reference to commonly used values + local t1 = os.clock() + local x1 = maxp.x + local y1 = maxp.y + local z1 = maxp.z + local x0 = minp.x + local y0 = minp.y + local z0 = minp.z + + print ("[caverealms] chunk minp ("..x0.." "..y0.." "..z0..")") --tell people you are generating a chunk + + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + local data = vm:get_data() + + --grab content IDs + local c_air = minetest.get_content_id("air") + local c_stone = minetest.get_content_id("default:stone") + local c_water = minetest.get_content_id("default:water_source") + local c_lava = minetest.get_content_id("default:lava_source") + local c_ice = minetest.get_content_id("default:ice") + local c_thinice = minetest.get_content_id("caverealms:thin_ice") + local c_crystal = minetest.get_content_id("caverealms:glow_crystal") + local c_gem1 = minetest.get_content_id("caverealms:glow_gem") + local c_gem2 = minetest.get_content_id("caverealms:glow_gem_2") + local c_gem3 = minetest.get_content_id("caverealms:glow_gem_3") + local c_gem4 = minetest.get_content_id("caverealms:glow_gem_4") + local c_gem5 = minetest.get_content_id("caverealms:glow_gem_5") + local c_moss = minetest.get_content_id("caverealms:stone_with_moss") + local c_lichen = minetest.get_content_id("caverealms:stone_with_lichen") + local c_algae = minetest.get_content_id("caverealms:stone_with_algae") + local c_fungus = minetest.get_content_id("caverealms:fungus") + local c_mycena = minetest.get_content_id("caverealms:mycena") + local c_worm = minetest.get_content_id("caverealms:glow_worm") + local c_iciu = minetest.get_content_id("caverealms:icicle_up") + local c_icid = minetest.get_content_id("caverealms:icicle_down") + + --mandatory values + local sidelen = x1 - x0 + 1 --length of a mapblock + local chulens = {x=sidelen, y=sidelen, z=sidelen} --table of chunk edges + local minposxyz = {x=x0, y=y0, z=z0} --bottom corner + local minposxz = {x=x0, y=z0} --2D bottom corner + + local nvals_cave = minetest.get_perlin_map(np_cave, chulens):get3dMap_flat(minposxyz) --cave noise for structure + local nvals_wave = minetest.get_perlin_map(np_wave, chulens):get3dMap_flat(minposxyz) --wavy structure of cavern ceilings and floors + local nvals_biome = minetest.get_perlin_map(np_biome, chulens):get2dMap_flat({x=x0+150, y=z0+50}) --2D noise for biomes (will be 3D humidity/temp later) + + local nixyz = 1 --3D node index + local nixz = 1 --2D node index + local nixyz2 = 1 --second 3D index for second loop + + for z = z0, z1 do -- for each xy plane progressing northwards + --structure loop + for y = y0, y1 do -- for each x row progressing upwards + local tcave --declare variable + --determine the overal cave threshold + if y < yblmin then + tcave = TCAVE + ((yblmin - y) / BLEND) ^ 2 + elseif y > yblmax then + tcave = TCAVE + ((y - yblmax) / BLEND) ^ 2 + else + tcave = TCAVE + end + local vi = area:index(x0, y, z) --current node index + for x = x0, x1 do -- for each node do + if (nvals_cave[nixyz] + nvals_wave[nixyz])/2 > tcave then --if node falls within cave threshold + data[vi] = c_air --hollow it out to make the cave + end + --increment indices + nixyz = nixyz + 1 + vi = vi + 1 + end + end + + --decoration loop + for y = y0, y1 do -- for each x row progressing upwards + local tcave --same as above + if y < yblmin then + tcave = TCAVE + ((yblmin - y) / BLEND) ^ 2 + elseif y > yblmax then + tcave = TCAVE + ((y - yblmax) / BLEND) ^ 2 + else + tcave = TCAVE + end + local vi = area:index(x0, y, z) + for x = x0, x1 do -- for each node do + + --determine biome + local biome = false --preliminary declaration + n_biome = nvals_biome[nixz] --make an easier reference to the noise + --compare noise values to determine a biome + if n_biome >= 0 and n_biome < 0.5 then + biome = 1 --moss + elseif n_biome <= -0.5 then + biome = 2 --fungal + elseif n_biome >= 0.5 then + if n_biome >= 0.7 then + biome = 5 --deep glaciated + else + biome = 4 --glaciated + end + else + biome = 3 --algae + end + + if math.floor(((nvals_cave[nixyz2] + nvals_wave[nixyz2])/2)*100) == math.floor(tcave*100) then + --ceiling + local ai = area:index(x,y+1,z) --above index + if data[ai] == c_stone and data[vi] == c_air then --ceiling + if math.random() < ICICHA and (biome == 4 or biome == 5) then + data[vi] = c_icid + end + if math.random() < WORMCHA then + data[vi] = c_worm + local bi = area:index(x,y-1,z) + data[bi] = c_worm + if math.random(2) == 1 then + local bbi = area:index(x,y-2,z) + data[bbi] = c_worm + if math.random(2) ==1 then + local bbbi = area:index(x,y-3,z) + data[bbbi] = c_worm + end + end + end + if math.random() < STALCHA then + caverealms:stalactite(x,y,z, area, data) + end + if math.random() < CRYSTAL then + caverealms:crystal_stalactite(x,y,z, area, data, biome) + end + end + --ground + local bi = area:index(x,y-1,z) --below index + if data[bi] == c_stone and data[vi] == c_air then --ground + local ai = area:index(x,y+1,z) + --place floor material, add plants/decorations + if biome == 1 then + data[vi] = c_moss + if math.random() < GEMCHA then + -- gems of random size + local gems = { c_gem1, c_gem2, c_gem3, c_gem4, c_gem5 } + local gidx = math.random(1, 12) + if gidx > 5 then + gidx = 1 + end + data[ai] = gems[gidx] + end + elseif biome == 2 then + data[vi] = c_lichen + if math.random() < MUSHCHA then --mushrooms + data[ai] = c_fungus + end + if math.random() < MYCCHA then --mycena mushrooms + data[ai] = c_mycena + end + if math.random() < GIANTCHA then --giant mushrooms + caverealms:giant_shroom(x, y, z, area, data) + end + elseif biome == 3 then + data[vi] = c_algae + elseif biome == 4 then + data[vi] = c_thinice + local bi = area:index(x,y-1,z) + data[bi] = c_thinice + if math.random() < ICICHA then --if glaciated, place icicles + data[ai] = c_iciu + end + elseif biome == 5 then + data[vi] = c_ice + local bi = area:index(x,y-1,z) + data[bi] = c_ice + if math.random() < ICICHA then --if glaciated, place icicles + data[ai] = c_iciu + end + end + + if math.random() < STAGCHA then + caverealms:stalagmite(x,y,z, area, data) + end + if math.random() < CRYSTAL then + caverealms:crystal_stalagmite(x,y,z, area, data, biome) + end + end + + end + nixyz2 = nixyz2 + 1 + nixz = nixz + 1 + vi = vi + 1 + end + nixz = nixz - sidelen --shift the 2D index back + end + nixz = nixz + sidelen --shift the 2D index up a layer + end + + --send data back to voxelmanip + vm:set_data(data) + --calc lighting + vm:set_lighting({day=0, night=0}) + vm:calc_lighting() + --write it to world + vm:write_to_map(data) + + local chugent = math.ceil((os.clock() - t1) * 1000) --grab how long it took + print ("[caverealms] "..chugent.." ms") --tell people how long +end) + + +print("[caverealms] loaded!") diff --git a/mods/caverealms/nodes.lua b/mods/caverealms/nodes.lua new file mode 100644 index 0000000..7588234 --- /dev/null +++ b/mods/caverealms/nodes.lua @@ -0,0 +1,325 @@ +-- CaveRealms nodes.lua + +--NODES-- + +local FALLING_ICICLES = caverealms.config.falling_icicles --true --toggle to turn on or off falling icicles in glaciated biome +local FALLCHA = caverealms.config.fallcha --0.33 --chance of causing the structure to fall + + +--glowing crystal +minetest.register_node("caverealms:glow_crystal", { + description = "Glow Crystal", + tiles = {"caverealms_glow_crystal.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing emerald +minetest.register_node("caverealms:glow_emerald", { + description = "Glow Emerald", + tiles = {"caverealms_glow_emerald.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--glowing mese crystal blocks +minetest.register_node("caverealms:glow_mese", { + description = "Mese Crystal Block", + tiles = {"caverealms_glow_mese.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + light_source = 13, + paramtype = "light", + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, +}) + +--embedded crystal +minetest.register_node("caverealms:glow_ore", { + description = "Glow Crystal Ore", + tiles = {"caverealms_glow_ore.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 10, + paramtype = "light", +}) + +--embedded emerald +minetest.register_node("caverealms:glow_emerald_ore", { + description = "Glow Emerald Ore", + tiles = {"caverealms_glow_emerald_ore.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_glass_defaults(), + light_source = 10, + paramtype = "light", +}) + +--thin (transparent) ice +minetest.register_node("caverealms:thin_ice", { + description = "Thin Ice", + tiles = {"caverealms_thin_ice.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, + freezemelt = "default:water_source", + paramtype = "light", +}) + +--alternate version for stalactites +minetest.register_node("caverealms:hanging_thin_ice", { + description = "Thin Ice", + tiles = {"caverealms_thin_ice.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), + use_texture_alpha = true, + drawtype = "glasslike", + sunlight_propagates = true, + drop = "caverealms:thin_ice", + freezemelt = "default:water_flowing", + paramtype = "light", + after_dig_node = function(pos, oldnode, oldmetadata, digger) + if FALLING_ICICLES then + if math.random() <= FALLCHA then + obj = minetest.add_entity(pos, "caverealms:falling_ice") + obj:get_luaentity():set_node(oldnode) + for y = -13, 13 do + for x = -3, 3 do + for z = -3, 3 do + local npos = {x=pos.x+x, y=pos.y+y, z=pos.z+z} + if minetest.get_node(npos).name == "caverealms:hanging_thin_ice" then + nobj = minetest.add_entity(npos, "caverealms:falling_ice") + nobj:get_luaentity():set_node(oldnode) + minetest.remove_node(npos) + end + end + end + end + minetest.remove_node(pos) + else + return 1 + end + else + return 1 + end + end, +}) + +--glowing crystal gem +local glow_gem_size = { 1.0, 1.2, 1.4, 1.6, 1.7 } + +for i in ipairs(glow_gem_size) do + if i == 1 then + nodename = "caverealms:glow_gem" + else + nodename = "caverealms:glow_gem_"..i + end + + vs = glow_gem_size[i] + + minetest.register_node(nodename, { + description = "Glow Gem", + tiles = {"caverealms_glow_gem.png"}, + inventory_image = "caverealms_glow_gem.png", + wield_image = "caverealms_glow_gem.png", + is_ground_content = true, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 11, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = vs, + selection_box = { + type = "fixed", + fixed = {-0.5*vs, -0.5*vs, -0.5*vs, 0.5*vs, -5/16*vs, 0.5*vs}, + } + }) +end + +--upward pointing icicle +minetest.register_node("caverealms:icicle_up", { + description = "Icicle", + tiles = {"caverealms_icicle_up.png"}, + inventory_image = "caverealms_icicle_up.png", + wield_image = "caverealms_icicle_up.png", + is_ground_content = true, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 8, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +--downward pointing icicle +minetest.register_node("caverealms:icicle_down", { + description = "Icicle", + tiles = {"caverealms_icicle_down.png"}, + inventory_image = "caverealms_icicle_down.png", + wield_image = "caverealms_icicle_down.png", + is_ground_content = true, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), + light_source = 8, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +--cave mossy cobble - bluish? +minetest.register_node("caverealms:stone_with_moss", { + description = "Cave Stone with Moss", + tiles = {"default_cobble.png^caverealms_moss.png", "default_cobble.png", "default_cobble.png^caverealms_moss_side.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +--cave lichen-covered cobble - purple-ish +minetest.register_node("caverealms:stone_with_lichen", { + description = "Cave Stone with Lichen", + tiles = {"default_cobble.png^caverealms_lichen.png", "default_cobble.png", "default_cobble.png^caverealms_lichen_side.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +--cave algae-covered cobble - yellow-ish +minetest.register_node("caverealms:stone_with_algae", { + description = "Cave Stone with Algae", + tiles = {"default_cobble.png^caverealms_algae.png", "default_cobble.png", "default_cobble.png^caverealms_algae_side.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:cobble', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +--glow worms +minetest.register_node("caverealms:glow_worm", { + description = "Glow Worms", + tiles = {"caverealms_glow_worm.png"}, + inventory_image = "caverealms_glow_worm.png", + wield_image = "caverealms_glow_worm.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand=3}, + light_source = 9, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.5, 0.5}, + }, +}) + +--cave plants go here + +--glowing fungi +minetest.register_node("caverealms:fungus", { + description = "Glowing Fungus", + tiles = {"caverealms_fungi.png"}, + inventory_image = "caverealms_fungi.png", + wield_image = "caverealms_fungi.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand=3}, + light_source = 5, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +--mycena mushroom +minetest.register_node("caverealms:mycena", { + description = "Mycena Mushroom", + tiles = {"caverealms_mycena.png"}, + inventory_image = "caverealms_mycena.png", + wield_image = "caverealms_mycena.png", + is_ground_content = true, + groups = {oddly_breakable_by_hand=3}, + light_source = 6, + paramtype = "light", + drawtype = "plantlike", + walkable = false, + buildable_to = true, + visual_scale = 1.0, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +--giant mushroom +--stem +minetest.register_node("caverealms:mushroom_stem", { + description = "Giant Mushroom Stem", + tiles = {"caverealms_mushroom_stem.png"}, + is_ground_content = true, + groups = {oddly_breakable_by_hand=1}, +}) + +--cap +minetest.register_node("caverealms:mushroom_cap", { + description = "Giant Mushroom Cap", + tiles = {"caverealms_mushroom_cap.png"}, + is_ground_content = true, + groups = {oddly_breakable_by_hand=1}, +}) + +--gills +minetest.register_node("caverealms:mushroom_gills", { + description = "Giant Mushroom Gills", + tiles = {"caverealms_mushroom_gills.png"}, + is_ground_content = true, + groups = {oddly_breakable_by_hand=1}, + drawtype = "plantlike", + paramtype = "light", +}) diff --git a/mods/caverealms/textures/caverealms_algae.png b/mods/caverealms/textures/caverealms_algae.png new file mode 100644 index 0000000..da130aa Binary files /dev/null and b/mods/caverealms/textures/caverealms_algae.png differ diff --git a/mods/caverealms/textures/caverealms_algae_side.png b/mods/caverealms/textures/caverealms_algae_side.png new file mode 100644 index 0000000..c857c65 Binary files /dev/null and b/mods/caverealms/textures/caverealms_algae_side.png differ diff --git a/mods/caverealms/textures/caverealms_fungi.png b/mods/caverealms/textures/caverealms_fungi.png new file mode 100644 index 0000000..2785308 Binary files /dev/null and b/mods/caverealms/textures/caverealms_fungi.png differ diff --git a/mods/caverealms/textures/caverealms_glow_crystal.png b/mods/caverealms/textures/caverealms_glow_crystal.png new file mode 100644 index 0000000..63ebb5c Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_crystal.png differ diff --git a/mods/caverealms/textures/caverealms_glow_emerald.png b/mods/caverealms/textures/caverealms_glow_emerald.png new file mode 100644 index 0000000..6d5c157 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_emerald.png differ diff --git a/mods/caverealms/textures/caverealms_glow_emerald_ore.png b/mods/caverealms/textures/caverealms_glow_emerald_ore.png new file mode 100644 index 0000000..0e008a7 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_emerald_ore.png differ diff --git a/mods/caverealms/textures/caverealms_glow_gem.png b/mods/caverealms/textures/caverealms_glow_gem.png new file mode 100644 index 0000000..a18de24 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_gem.png differ diff --git a/mods/caverealms/textures/caverealms_glow_mese.png b/mods/caverealms/textures/caverealms_glow_mese.png new file mode 100644 index 0000000..f48fbe0 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_mese.png differ diff --git a/mods/caverealms/textures/caverealms_glow_ore.png b/mods/caverealms/textures/caverealms_glow_ore.png new file mode 100644 index 0000000..4ce9165 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_ore.png differ diff --git a/mods/caverealms/textures/caverealms_glow_worm.png b/mods/caverealms/textures/caverealms_glow_worm.png new file mode 100644 index 0000000..37d8966 Binary files /dev/null and b/mods/caverealms/textures/caverealms_glow_worm.png differ diff --git a/mods/caverealms/textures/caverealms_icicle_down.png b/mods/caverealms/textures/caverealms_icicle_down.png new file mode 100644 index 0000000..2663c7a Binary files /dev/null and b/mods/caverealms/textures/caverealms_icicle_down.png differ diff --git a/mods/caverealms/textures/caverealms_icicle_up.png b/mods/caverealms/textures/caverealms_icicle_up.png new file mode 100644 index 0000000..ff9ee25 Binary files /dev/null and b/mods/caverealms/textures/caverealms_icicle_up.png differ diff --git a/mods/caverealms/textures/caverealms_lichen.png b/mods/caverealms/textures/caverealms_lichen.png new file mode 100644 index 0000000..f38fe76 Binary files /dev/null and b/mods/caverealms/textures/caverealms_lichen.png differ diff --git a/mods/caverealms/textures/caverealms_lichen_side.png b/mods/caverealms/textures/caverealms_lichen_side.png new file mode 100644 index 0000000..024de44 Binary files /dev/null and b/mods/caverealms/textures/caverealms_lichen_side.png differ diff --git a/mods/caverealms/textures/caverealms_moss.png b/mods/caverealms/textures/caverealms_moss.png new file mode 100644 index 0000000..2d8a27b Binary files /dev/null and b/mods/caverealms/textures/caverealms_moss.png differ diff --git a/mods/caverealms/textures/caverealms_moss_side.png b/mods/caverealms/textures/caverealms_moss_side.png new file mode 100644 index 0000000..277bb54 Binary files /dev/null and b/mods/caverealms/textures/caverealms_moss_side.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_cap.png b/mods/caverealms/textures/caverealms_mushroom_cap.png new file mode 100644 index 0000000..0514fff Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_cap.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_cap_legacy.png b/mods/caverealms/textures/caverealms_mushroom_cap_legacy.png new file mode 100644 index 0000000..7967ee9 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_cap_legacy.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_gills.png b/mods/caverealms/textures/caverealms_mushroom_gills.png new file mode 100644 index 0000000..92b28a8 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_gills.png differ diff --git a/mods/caverealms/textures/caverealms_mushroom_stem.png b/mods/caverealms/textures/caverealms_mushroom_stem.png new file mode 100644 index 0000000..d4e5601 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mushroom_stem.png differ diff --git a/mods/caverealms/textures/caverealms_mycena.png b/mods/caverealms/textures/caverealms_mycena.png new file mode 100644 index 0000000..7ab3ad8 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mycena.png differ diff --git a/mods/caverealms/textures/caverealms_mycena_powder.png b/mods/caverealms/textures/caverealms_mycena_powder.png new file mode 100644 index 0000000..22e3537 Binary files /dev/null and b/mods/caverealms/textures/caverealms_mycena_powder.png differ diff --git a/mods/caverealms/textures/caverealms_thin_ice.png b/mods/caverealms/textures/caverealms_thin_ice.png new file mode 100644 index 0000000..0d0820f Binary files /dev/null and b/mods/caverealms/textures/caverealms_thin_ice.png differ diff --git a/mods/charcoal/LICENSE b/mods/charcoal/LICENSE new file mode 100644 index 0000000..eb930e9 --- /dev/null +++ b/mods/charcoal/LICENSE @@ -0,0 +1,17 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +---------- + +This license is commonly known as "WTFPL". diff --git a/mods/charcoal/README.txt b/mods/charcoal/README.txt new file mode 100644 index 0000000..b554c5a --- /dev/null +++ b/mods/charcoal/README.txt @@ -0,0 +1,58 @@ +Charcoal +==================== + +Adds renewable coal : charcoal. + +Version: 0.2.1 +License: WTFPL + +Dependencies: default mod (found in minetest_game) + +Report bugs or request help here: +https://github.com/vlkolak/charcoal + +Installation +------------ + +Unzip the archive, rename the folder to to modfoldername and +place it in minetest/mods/minetest/ + +( GNU/Linux: If you use a system-wide installation place + it in ~/.minetest/mods/minetest/. ) + +( If you only want this to be used in a single world, place + the folder in worldmods/ in your worlddirectory. ) + +For further information or help see: +http://wiki.minetest.com/wiki/Installing_Mods + +Settings +-------- +In settings.txt per default and charcoal_settings.txt in any world. +charcoal.separate_node allow to use charcoal as a separate node from coal, enabling +it as an item (charcoal lump), its recipes (charcoal bloc, torches, tnt's gunpowder), +and charcoal as a fuel, with the same properties as coal. +It also enables using charcoal to make some black dye - the default recipe already uses +group:coal, which is good. + +If charcoal.separate_node = false, then charcoal IS coal, and you won't see any difference, +except for the ability to char group:wood and group:tree - which should be any tree and wood - +in your furnace, to gain some lumps. + +charcoal.cooking_time is charcoal cooking time in seconds. +charcoal.lump_per_tree is how many lumps you get per tree - below 4, the wood planks +to charcoal recipe is disabled. + +Recipes +------- +Cook wood and tree in furnace to get charcoal lump. +Everything else IS coal's recipes, but with charcoal. + + +Authors of media files +---------------------- +This mod uses default textures and sounds. +Credits for those files go to the authors cited in minetest_game/default/README.txt : +Zeg9 for default_coal_block.png, +Gambit for default_coal.png, +and Mito551 for the bloc sound(s). diff --git a/mods/charcoal/depends.txt b/mods/charcoal/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/charcoal/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/charcoal/description.txt b/mods/charcoal/description.txt new file mode 100644 index 0000000..5162350 --- /dev/null +++ b/mods/charcoal/description.txt @@ -0,0 +1 @@ +Adds charcoal, a coal-like fuel craftable from wood, and related recipes : torches, blocs, gunpowder, charcoal block. diff --git a/mods/charcoal/init.lua b/mods/charcoal/init.lua new file mode 100644 index 0000000..afaa2c0 --- /dev/null +++ b/mods/charcoal/init.lua @@ -0,0 +1,46 @@ +-- Charcoal mod by vlkolak - 2015 +-- +-- This mod supplies various charcoal related recipes. +-- +-- License: WTFPL +-- + +print("MOD: charcoal loading") + +charcoal = {} +charcoal.version = "0.2.1" +charcoal.lump = "charcoal:charcoal_lump" + +charcoal.worldpath = minetest.get_worldpath() +charcoal.modpath = minetest.get_modpath("charcoal") + +dofile(charcoal.modpath .. "/settings.txt") +-- Read the external config file if it exists. +if io.open(charcoal.worldpath .. "/charcoal_settings.txt", "r") then + dofile(charcoal.worldpath .. "/charcoal_settings.txt") + io.close() +end + +if not charcoal.separate_node then + charcoal.lump = "default:coal_lump" +else + dofile(charcoal.modpath .. "/separate_node_crafts.lua") +end + +-- char some tree to get some charcoal +if charcoal.lump_per_tree >= 4 then + minetest.register_craft({ + type = "cooking", + cooktime = charcoal.cooking_time, + output = charcoal.lump .. " " .. tostring(math.floor(charcoal.lump_per_tree / 4)), + recipe = "group:wood", + }) +end +minetest.register_craft({ + type = "cooking", + cooktime = charcoal.cooking_time, + output = charcoal.lump .. " " .. tostring(charcoal.lump_per_tree), + recipe = "group:tree", +}) + +print("MOD: charcoal " .. charcoal.version .. " loaded!") diff --git a/mods/charcoal/separate_node_crafts.lua b/mods/charcoal/separate_node_crafts.lua new file mode 100644 index 0000000..d93c2ff --- /dev/null +++ b/mods/charcoal/separate_node_crafts.lua @@ -0,0 +1,72 @@ +-- separate file to avoid cluttering the init.lua +-- here goes all crafts if charcoal is a separate node from coal + +-- ITEMS +minetest.register_craftitem("charcoal:charcoal_lump", { + description = "Charcoal Lump", + inventory_image = "default_coal_lump.png", + groups = {coal = 1} +}) + +minetest.register_node("charcoal:charcoal_block", { + description = "Charcoal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- CRAFTS +minetest.register_craft({ + output = "default:torch 4", + recipe = { + {"charcoal:charcoal_lump"}, + {"group:stick"}, + } +}) + +minetest.register_craft({ + output = "charcoal:charcoal_block", + recipe = { + {"charcoal:charcoal_lump", "charcoal:charcoal_lump", "charcoal:charcoal_lump"}, + {"charcoal:charcoal_lump", "charcoal:charcoal_lump", "charcoal:charcoal_lump"}, + {"charcoal:charcoal_lump", "charcoal:charcoal_lump", "charcoal:charcoal_lump"}, + } +}) + +minetest.register_craft({ + output = "charcoal:charcoal_lump 9", + recipe = { + {"charcoal:charcoal_block"}, + } +}) + +-- the dye ALREADY uses group:coal ! + +-- if module tnt exists and is set to active then you get your daily destruction +-- use the check from the tnt module itself +local singleplayer = minetest.is_singleplayer() +local setting = minetest.setting_getbool("enable_tnt") +if minetest.get_modpath("tnt") and + (singleplayer and minetest.setting_getbool("enable_tnt") ~= false or + not singleplayer and minetest.setting_getbool("enable_tnt")) then + minetest.register_craft({ + output = "tnt:gunpowder", + type = "shapeless", + recipe = {"charcoal:charcoal_lump", "default:gravel"} + }) +end + +-- FUELS +minetest.register_craft({ + type = "fuel", + recipe = "charcoal:charcoal_lump", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "charcoal:charcoal_block", + burntime = 370, +}) + diff --git a/mods/charcoal/settings.txt b/mods/charcoal/settings.txt new file mode 100644 index 0000000..a790f28 --- /dev/null +++ b/mods/charcoal/settings.txt @@ -0,0 +1,5 @@ +-- charcoal as a separate node +-- false does not "clutter" your server +charcoal.separate_node = true +charcoal.cooking_time = 30 +charcoal.lump_per_tree = 2 diff --git a/mods/coloredglass/init - Copy.lua b/mods/coloredglass/init - Copy.lua new file mode 100644 index 0000000..df9271b --- /dev/null +++ b/mods/coloredglass/init - Copy.lua @@ -0,0 +1,73 @@ +--[[ +dye = {} +dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} +--]] + +local coloredglass = {} + +function coloredglass.node_sound_glass(table) + table = table or {} + table.footstep = table.footstep or + {name="coloredglass_footstep", gain=0.5} + table.dug = table.dug or + {name="coloredglass_break", gain=1.0} + table.place = table.place or + {name="coloredglass_footstep", gain=1.0} + return table +end + +--[[ works fucking perfect bitch +minetest.register_node("coloredglass:blue", { + description = "Colored Glass Blue", + drawtype = "glasslike", + tiles = {"coloredglass_blue.png"}, + alpha = 50, + inventory_image = minetest.inventorycube("coloredglass_blue.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = coloredglass.node_sound_glass(), +}) +--]] + +coloredglass.colors = { + {"white", "White", "basecolor_white"}, + {"grey", "Grey", "basecolor_grey"}, + {"black", "Black", "basecolor_black"}, + {"red", "Red", "basecolor_red"}, + {"yellow", "Yellow", "basecolor_yellow"}, + {"green", "Green", "basecolor_green"}, + {"cyan", "Cyan", "basecolor_cyan"}, + {"blue", "Blue", "basecolor_blue"}, + {"magenta", "Magenta", "basecolor_magenta"}, + {"orange", "Orange", "excolor_orange"}, + {"brown", "Brown", "unicolor_dark_orange"}, +} + +for _, row in ipairs(coloredglass.colors) do + local name = row[1] + local desc = row[2] + local craft_color_group = row[3] + minetest.register_node("coloredglass:"..name, { + description = "Colored Glass "..desc, + drawtype = "glasslike", + tiles = {"coloredglass_"..name..".png"}, + alpha = 50, + inventory_image = minetest.inventorycube("coloredglass_"..name..".png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = coloredglass.node_sound_glass(), + }) + if craft_color_group then + minetest.register_craft({ + type = "shapeless", + output = 'coloredglass:'..name.." 4", + recipe = {'group:dye,'..craft_color_group, 'group:coloredglass'}, + }) + end +end + +print("[Colored Glass] Loaded!") diff --git a/mods/coloredglass/init.lua b/mods/coloredglass/init.lua new file mode 100644 index 0000000..197ea60 --- /dev/null +++ b/mods/coloredglass/init.lua @@ -0,0 +1,69 @@ +local coloredglass = {} + +function coloredglass.node_sound_glass(table) + table = table or {} + table.footstep = table.footstep or + {name="coloredglass_footstep", gain=0.5} + table.dug = table.dug or + {name="coloredglass_break", gain=1.0} + table.place = table.place or + {name="coloredglass_footstep", gain=1.0} + return table +end + +--[[ works fucking perfect bitch +minetest.register_node("coloredglass:blue", { + description = "Colored Glass Blue", + drawtype = "glasslike", + tiles = {"coloredglass_blue.png"}, + alpha = 50, + inventory_image = minetest.inventorycube("coloredglass_blue.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = coloredglass.node_sound_glass(), +}) +--]] + +coloredglass.colors = { + {"white", "White", "basecolor_white"}, + {"grey", "Grey", "basecolor_grey"}, + {"black", "Black", "basecolor_black"}, + {"red", "Red", "basecolor_red"}, + {"yellow", "Yellow", "basecolor_yellow"}, + {"green", "Green", "basecolor_green"}, + {"cyan", "Cyan", "basecolor_cyan"}, + {"blue", "Blue", "basecolor_blue"}, + {"magenta", "Magenta", "basecolor_magenta"}, + {"orange", "Orange", "excolor_orange"}, + {"brown", "Brown", "unicolor_dark_orange"}, +} + +for _, row in ipairs(coloredglass.colors) do + local name = row[1] + local desc = row[2] + local craft_color_group = row[3] + minetest.register_node("coloredglass:"..name, { + description = "Colored Glass "..desc, + drawtype = "glasslike", + tiles = {"coloredglass_"..name..".png"}, + alpha = 50, + inventory_image = minetest.inventorycube("coloredglass_"..name..".png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = coloredglass.node_sound_glass(), + }) + if craft_color_group then + minetest.register_craft({ + type = "shapeless", + output = 'coloredglass:'..name.." 4", +-- recipe = {'group:dye,'..craft_color_group, 'group:coloredglass'}, + recipe = {'group:dye,'..craft_color_group, 'default:glass'}, + }) + end +end + +print("[Colored Glass] Loaded!") diff --git a/mods/coloredglass/init.lua.fuk b/mods/coloredglass/init.lua.fuk new file mode 100644 index 0000000..ad300ab --- /dev/null +++ b/mods/coloredglass/init.lua.fuk @@ -0,0 +1,62 @@ +local coloredglass_sound = "default.node_sound_glass_defaults()" + +minetest.register_node(":default:glass", { + description = "Glass", + drawtype = "glasslike", + tiles = {"glass.png"}, + inventory_image = minetest.inventorycube("glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = coloredglass_sound, +}) + +minetest.register_alias("coloredglass:dark_blue", "coloredglass:blue") +minetest.register_alias("coloredglass:gold", "coloredglass:yellow") +local coloredglass = {} +-- This uses a trick: you can first define the recipes using all of the base +-- colors, and then some recipes using more specific colors for a few non-base +-- colors available. When crafting, the last recipes will be checked first. +coloredglass.dyes = { + {"white", "White", "basecolor_white"}, + {"grey", "Grey", "basecolor_grey"}, + {"black", "Black", "basecolor_black"}, + {"red", "Red", "basecolor_red"}, + {"yellow", "Yellow", "basecolor_yellow"}, + {"green", "Green", "basecolor_green"}, + {"cyan", "Cyan", "basecolor_cyan"}, + {"blue", "Blue", "basecolor_blue"}, + {"magenta", "Magenta", "basecolor_magenta"}, + {"orange", "Orange", "excolor_orange"}, + {"brown", "Brown", "unicolor_dark_orange"}, +} + + +for _, row in ipairs(coloredglass.dyes) do + local name = row[1] + local desc = row[2] + local craft_color_group = row[3] + -- Node Definition + minetest.register_node("coloredglass:"..name, { + description = desc.." Glass", + drawtype = "glasslike", + tiles = {"glass_"..name..".png"}, + inventory_image = minetest.inventorycube("glass_"..name..".png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = coloredglass_sound, + }) + if craft_color_group then + -- Crafting from dye and white wool + minetest.register_craft({ + type = "shapeless", + output = 'coloredglass:'..name, + recipe = {'group:dye,'..craft_color_group, 'group:coloredglass'}, + }) + end +end + +print("[Colored Glass] Loaded!") diff --git a/mods/coloredglass/sounds/coloredglass_break.1.ogg b/mods/coloredglass/sounds/coloredglass_break.1.ogg new file mode 100644 index 0000000..b1ccc5f Binary files /dev/null and b/mods/coloredglass/sounds/coloredglass_break.1.ogg differ diff --git a/mods/coloredglass/sounds/coloredglass_break.2.ogg b/mods/coloredglass/sounds/coloredglass_break.2.ogg new file mode 100644 index 0000000..b6cc9e8 Binary files /dev/null and b/mods/coloredglass/sounds/coloredglass_break.2.ogg differ diff --git a/mods/coloredglass/sounds/coloredglass_break.3.ogg b/mods/coloredglass/sounds/coloredglass_break.3.ogg new file mode 100644 index 0000000..ae6a6bf Binary files /dev/null and b/mods/coloredglass/sounds/coloredglass_break.3.ogg differ diff --git a/mods/coloredglass/sounds/coloredglass_footstep.ogg b/mods/coloredglass/sounds/coloredglass_footstep.ogg new file mode 100644 index 0000000..191287a Binary files /dev/null and b/mods/coloredglass/sounds/coloredglass_footstep.ogg differ diff --git a/mods/coloredglass/textures/coloredglass_black.png b/mods/coloredglass/textures/coloredglass_black.png new file mode 100644 index 0000000..2ea217c Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_black.png differ diff --git a/mods/coloredglass/textures/coloredglass_blue.png b/mods/coloredglass/textures/coloredglass_blue.png new file mode 100644 index 0000000..e4d775f Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_blue.png differ diff --git a/mods/coloredglass/textures/coloredglass_brown.png b/mods/coloredglass/textures/coloredglass_brown.png new file mode 100644 index 0000000..121c00e Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_brown.png differ diff --git a/mods/coloredglass/textures/coloredglass_cg.png b/mods/coloredglass/textures/coloredglass_cg.png new file mode 100644 index 0000000..39aab3f Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_cg.png differ diff --git a/mods/coloredglass/textures/coloredglass_cyan.png b/mods/coloredglass/textures/coloredglass_cyan.png new file mode 100644 index 0000000..4e66cba Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_cyan.png differ diff --git a/mods/coloredglass/textures/coloredglass_green.png b/mods/coloredglass/textures/coloredglass_green.png new file mode 100644 index 0000000..705769d Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_green.png differ diff --git a/mods/coloredglass/textures/coloredglass_grey.png b/mods/coloredglass/textures/coloredglass_grey.png new file mode 100644 index 0000000..ca1ed8f Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_grey.png differ diff --git a/mods/coloredglass/textures/coloredglass_light_blue.png b/mods/coloredglass/textures/coloredglass_light_blue.png new file mode 100644 index 0000000..8548334 Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_light_blue.png differ diff --git a/mods/coloredglass/textures/coloredglass_lime.png b/mods/coloredglass/textures/coloredglass_lime.png new file mode 100644 index 0000000..c6de4b9 Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_lime.png differ diff --git a/mods/coloredglass/textures/coloredglass_magenta.png b/mods/coloredglass/textures/coloredglass_magenta.png new file mode 100644 index 0000000..2b8f2b4 Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_magenta.png differ diff --git a/mods/coloredglass/textures/coloredglass_orange.png b/mods/coloredglass/textures/coloredglass_orange.png new file mode 100644 index 0000000..30e027d Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_orange.png differ diff --git a/mods/coloredglass/textures/coloredglass_red.png b/mods/coloredglass/textures/coloredglass_red.png new file mode 100644 index 0000000..a0b37d4 Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_red.png differ diff --git a/mods/coloredglass/textures/coloredglass_white.png b/mods/coloredglass/textures/coloredglass_white.png new file mode 100644 index 0000000..2b2677d Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_white.png differ diff --git a/mods/coloredglass/textures/coloredglass_yellow.png b/mods/coloredglass/textures/coloredglass_yellow.png new file mode 100644 index 0000000..b38d511 Binary files /dev/null and b/mods/coloredglass/textures/coloredglass_yellow.png differ diff --git a/mods/commands/LICENSE b/mods/commands/LICENSE new file mode 100644 index 0000000..2c4afab --- /dev/null +++ b/mods/commands/LICENSE @@ -0,0 +1,117 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + + diff --git a/mods/commands/aliases.lua b/mods/commands/aliases.lua new file mode 100644 index 0000000..4117214 --- /dev/null +++ b/mods/commands/aliases.lua @@ -0,0 +1,32 @@ +local minecraftaliases = true + +local function register_chatcommand_alias(alias, cmd, def) + def = def or {} + local chatcommand = minetest.chatcommands[cmd] + minetest.register_chatcommand(alias, { + params = def.params or chatcommand.params, + description = def.description or chatcommand.description, + privs = def.privs or chatcommand.privs, + func = def.func or chatcommand.func, + }) +end + +if minecraftaliases then + register_chatcommand_alias("?", "help") + register_chatcommand_alias("list", "status") + register_chatcommand_alias("pardon", "unban") + register_chatcommand_alias("setblock", "setnode") + register_chatcommand_alias("stop", "shutdown") + register_chatcommand_alias("summon", "spawnentity") + register_chatcommand_alias("tell", "msg") + register_chatcommand_alias("w", "msg") + register_chatcommand_alias("tp", "teleport") + + minetest.register_chatcommand("banlist", { + description = "List bans", + privs = minetest.chatcommands["ban"].privs, + func = function(name) + return true, "Ban list: " .. core.get_ban_list() + end, + }) +end diff --git a/mods/commands/init.lua b/mods/commands/init.lua new file mode 100644 index 0000000..6095b55 --- /dev/null +++ b/mods/commands/init.lua @@ -0,0 +1,115 @@ +local function handle_clear_command(giver, receiver) + local receiverref = minetest.get_player_by_name(receiver) + if receiverref == nil then + return false, ("Player %q does not exist."):format(receiver) + end + if receiverref:get_inventory():is_empty("main") then + if giver == receiver then + return false, ("Your inventory is already clear.") + else + minetest.log("action", ("%s attempted to clear %s's inventory"):format(giver, receiver)) + return false, ("%s's inventory is already clear.") + end + end + if not giver == receiver then + minetest.log("action", ("%s cleared %s's inventory"):format(giver, receiver)) + end + for i=0,receiverref:get_inventory():get_size("main") do + receiverref:get_inventory():set_stack("main", i, nil) + end + if giver == receiver then + return true, ("Your inventory was cleared.") + else + minetest.chat_send_player(receiver, ("Your inventory was cleared.")) + return true, ("%s's inventory was cleared.") + end +end + +local function handle_kill_command(suspect, victim) + local victimref = minetest.get_player_by_name(victim) + if victimref == nil then + return false, ("Player %q does not exist."):format(victim) + elseif victimref:get_hp() <= 0 then + if suspect == victim then + return false, "You are already dead" + else + return false, ("%s is already dead"):format(victim) + end + end + if not suspect == victim then + minetest.log("action", ("%s allegedly killed %s"):format(suspect, victim)) + end + victimref:set_hp(0) +end + +minetest.register_privilege("clear", "Can use /clear") +minetest.register_privilege("kill", "Can use /kill") +minetest.register_privilege("announce", "Can use /say") + +minetest.register_chatcommand("clear", { + params = "", + description = "Clear inventory of player", + privs = {clear=true}, + func = function(name, param) + return handle_clear_command(name, param) + end, +}) + +minetest.register_chatcommand("clearme", { + description = "Clear your inventory", + func = function(name) + return handle_clear_command(name, name) + end, +}) + +minetest.register_chatcommand("kill", { + params = "", + description = "Kill player", + privs = {kill=true}, + func = function(name, param) + return handle_kill_command(name, param) + end, +}) + +minetest.register_chatcommand("killme", { + description = "Kill yourself", + func = function(name) + return handle_kill_command(name, name) + end, +}) + +minetest.register_chatcommand("say", { + params = "", + description = "Send a message to every player", + privs = {announce=true}, + func = function(name, param) + if not param then + return false, "Invalid usage, see /help say." + end + minetest.chat_send_all(("[%s] %s"):format(name, param)) + return true + end, +}) + +minetest.register_chatcommand("setnode", { + params = ",, ", + description = "Set node at given position", + privs = {give=true, interact=true}, + func = function(name, param) + local p = {} + local nodestring = nil + p.x, p.y, p.z, nodestring = param:match("^([%d.-]+)[, ] *([%d.-]+)[, ] *([%d.-]+) +(.+)$") + p.x, p.y, p.z = tonumber(p.x), tonumber(p.y), tonumber(p.z) + if p.x and p.y and p.z and nodestring then + local itemstack = ItemStack(nodestring) + if itemstack:is_empty() or not minetest.registered_nodes[itemstack:get_name()] then + return false, 'Invalid node' + end + minetest.set_node(p, {name=nodestring}) + return true, ("%q spawned."):format(nodestring) + end + return false, 'Invalid parameters (see /help setnode)' + end, +}) + +dofile(minetest.get_modpath("commands").."/aliases.lua") diff --git a/mods/compass/README.md b/mods/compass/README.md new file mode 100644 index 0000000..6401d85 --- /dev/null +++ b/mods/compass/README.md @@ -0,0 +1,14 @@ +This creates a simple passive node that acts as a compass. + +"North" is assumed to be where the z-coordinate gets larger. +"East" is assumed to be where the x-coordinate gets larger. + +The compass does emit light and has a description which bears +the coordinates the compass is placed at. + + +Craft: (nothing) steel ingot (nothing) +
(nothing) torch (nothing) +
(nothing) wood (nothing) + +Liszence for code and textures: WTFPL diff --git a/mods/compass/init.lua b/mods/compass/init.lua new file mode 100644 index 0000000..1d345f3 --- /dev/null +++ b/mods/compass/init.lua @@ -0,0 +1,35 @@ +-- liszence: WTFPL +minetest.register_node("compass:compass", { + + description = "Compass", + tiles = {"compass_side_top.png", "compass_side_bottom.png", "compass_side_w.png", + "compass_side_e.png", "compass_side_s.png", "compass_side_n.png"}, + groups = {snappy=3,choppy=3,oddly_breakable_by_hand=3}, + + light_source = 14, -- so that you can see it in the dark + + after_place_node = function(pos, placer) + local meta = minetest.env:get_meta(pos); + meta:set_string("infotext", "Compass at ".. + tostring( math.floor( pos.x ))..",".. + tostring( math.floor( pos.y ))..",".. + tostring( math.floor( pos.z )).." or ".. + + tostring( math.floor( pos.z )).."N ".. + tostring( math.floor( pos.x )).."E ".. + tostring( math.floor( pos.y )).."H ".. + "(".. + (placer:get_player_name() or "")..")") + end, + +}) + + +minetest.register_craft({ + output = "compass:compass", + recipe = { { "default:steel_ingot" }, + { "default:torch" }, + { "default:wood" }, + } }); + + diff --git a/mods/compass/textures/compass_side_bottom.png b/mods/compass/textures/compass_side_bottom.png new file mode 100644 index 0000000..19d7800 Binary files /dev/null and b/mods/compass/textures/compass_side_bottom.png differ diff --git a/mods/compass/textures/compass_side_e.png b/mods/compass/textures/compass_side_e.png new file mode 100644 index 0000000..c19779a Binary files /dev/null and b/mods/compass/textures/compass_side_e.png differ diff --git a/mods/compass/textures/compass_side_n.png b/mods/compass/textures/compass_side_n.png new file mode 100644 index 0000000..175ec88 Binary files /dev/null and b/mods/compass/textures/compass_side_n.png differ diff --git a/mods/compass/textures/compass_side_s.png b/mods/compass/textures/compass_side_s.png new file mode 100644 index 0000000..456deb0 Binary files /dev/null and b/mods/compass/textures/compass_side_s.png differ diff --git a/mods/compass/textures/compass_side_top.png b/mods/compass/textures/compass_side_top.png new file mode 100644 index 0000000..3c87c57 Binary files /dev/null and b/mods/compass/textures/compass_side_top.png differ diff --git a/mods/compass/textures/compass_side_w.png b/mods/compass/textures/compass_side_w.png new file mode 100644 index 0000000..616e97d Binary files /dev/null and b/mods/compass/textures/compass_side_w.png differ diff --git a/mods/creative/README.txt b/mods/creative/README.txt new file mode 100644 index 0000000..7d49b98 --- /dev/null +++ b/mods/creative/README.txt @@ -0,0 +1,22 @@ +Minetest 0.4 mod: creative +========================== + +Implements creative mode. + +Switch on by using the "creative_mode" setting. + +Registered items that +- have a description, and +- do not have the group not_in_creative_inventory +are added to the creative inventory. + +License of source code and media files: +--------------------------------------- +Copyright (C) 2012 Perttu Ahola (celeron55) + +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. + diff --git a/mods/creative/depends.txt b/mods/creative/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/creative/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/creative/init.lua b/mods/creative/init.lua new file mode 100644 index 0000000..68d5180 --- /dev/null +++ b/mods/creative/init.lua @@ -0,0 +1,177 @@ +-- minetest/creative/init.lua + +creative_inventory = {} +creative_inventory.creative_inventory_size = 0 + +-- Create detached creative inventory after loading all mods +minetest.after(0, function() + local inv = minetest.create_detached_inventory("creative", { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + if minetest.setting_getbool("creative_mode") 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 minetest.setting_getbool("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) + --print(player:get_player_name().." takes item from creative inventory; listname="..dump(listname)..", index="..dump(index)..", stack="..dump(stack)) + if stack then + minetest.log("action", player:get_player_name().." takes "..dump(stack:get_name()).." from creative inventory") + --print("stack:get_name()="..dump(stack:get_name())..", stack:get_count()="..dump(stack:get_count())) + end + end, + }) + local creative_list = {} + for name,def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) + and def.description and def.description ~= "" then + table.insert(creative_list, name) + end + end + table.sort(creative_list) + inv:set_size("main", #creative_list) + for _,itemstring in ipairs(creative_list) do + inv:add_item("main", ItemStack(itemstring)) + end + creative_inventory.creative_inventory_size = #creative_list + --print("creative inventory size: "..dump(creative_inventory.creative_inventory_size)) +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 minetest.setting_getbool("creative_mode") then + return stack:get_count() + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + inv:set_stack(listname, index, "") + end, +}) +trash:set_size("main", 1) + + +creative_inventory.set_creative_formspec = function(player, start_i, pagenum) + pagenum = math.floor(pagenum) + local pagemax = math.floor((creative_inventory.creative_inventory_size-1) / (6*4) + 1) + player:set_inventory_formspec( + "size[13,7.5]".. + --"image[6,0.6;1,2;player.png]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_player;main;5,3.5;8,1;]".. + "list[current_player;main;5,4.75;8,3;8]".. + "list[current_player;craft;8,0;3,3;]".. + "list[current_player;craftpreview;12,1;1,1;]".. + "image[11,1;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[detached:creative;main;0.3,0.5;4,6;"..tostring(start_i).."]".. + "label[2.0,6.55;"..tostring(pagenum).."/"..tostring(pagemax).."]".. + "button[0.3,6.5;1.6,1;creative_prev;<<]".. + "button[2.7,6.5;1.6,1;creative_next;>>]".. + "listring[current_player;main]".. + "listring[current_player;craft]".. + "listring[current_player;main]".. + "listring[detached:creative;main]".. + "label[5,1.5;Trash:]".. + "list[detached:creative_trash;main;5,2;1,1;]".. + default.get_hotbar_bg(5,3.5) + ) +end +minetest.register_on_joinplayer(function(player) + -- If in creative mode, modify player's inventory forms + if not minetest.setting_getbool("creative_mode") then + return + end + creative_inventory.set_creative_formspec(player, 0, 1) +end) +minetest.register_on_player_receive_fields(function(player, formname, fields) + if not minetest.setting_getbool("creative_mode") then + return + end + -- Figure out current page from formspec + local current_page = 0 + local formspec = player:get_inventory_formspec() + local start_i = string.match(formspec, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]") + start_i = tonumber(start_i) or 0 + + if fields.creative_prev then + start_i = start_i - 4*6 + end + if fields.creative_next then + start_i = start_i + 4*6 + end + + if start_i < 0 then + start_i = start_i + 4*6 + end + if start_i >= creative_inventory.creative_inventory_size then + start_i = start_i - 4*6 + end + + if start_i < 0 or start_i >= creative_inventory.creative_inventory_size then + start_i = 0 + end + + creative_inventory.set_creative_formspec(player, start_i, start_i / (6*4) + 1) +end) + +if minetest.setting_getbool("creative_mode") then + local digtime = 0.5 + minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x=1,y=1,z=2.5}, + range = 10, + tool_capabilities = { + full_punch_interval = 0.5, + max_drop_level = 3, + groupcaps = { + crumbly = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, + cracky = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, + snappy = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, + choppy = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, + oddly_breakable_by_hand = {times={[1]=digtime, [2]=digtime, [3]=digtime}, uses=0, maxlevel=3}, + }, + damage_groups = {fleshy = 10}, + } + }) + + minetest.register_on_placenode(function(pos, newnode, placer, oldnode, itemstack) + return true + 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 + end + end + end + +end diff --git a/mods/datastorage/README.md b/mods/datastorage/README.md new file mode 100644 index 0000000..b15b07a --- /dev/null +++ b/mods/datastorage/README.md @@ -0,0 +1,22 @@ +datastorage +=========== + +Helper mod to manage players data. +All the mods can acces a single file (container) and easily have the data saved/loaded for them. + +Usage +----- + + local data = datastorage.get(id, ...) + +Returns a reference to a data container. The id is normally a player name. +Following arguments are keys to recurse into, normally only one, a string +describing the type of data, is used. If the container doesn't exist it will +be created, otherwise it will contain all previously stored data. The table +can store any data. Player's containers will be saved to disk when the player +leaves, and all references to the player's data should be dropped. All of the +containers will be saved on server shutdown. To forcibly save a container's +data use: + + datastorage.save(id) + diff --git a/mods/datastorage/depends.txt b/mods/datastorage/depends.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/mods/datastorage/depends.txt @@ -0,0 +1 @@ + diff --git a/mods/datastorage/init.lua b/mods/datastorage/init.lua new file mode 100644 index 0000000..93e7619 --- /dev/null +++ b/mods/datastorage/init.lua @@ -0,0 +1,94 @@ +datastorage = {data = {}} + +local DIR_DELIM = DIR_DELIM or "/" +local data_path = minetest.get_worldpath()..DIR_DELIM.."datastorage"..DIR_DELIM + +function datastorage.save(id) + local data = datastorage.data[id] + -- Check if the container is empty + if not data or not next(data) then return end + for _, sub_data in pairs(data) do + if not next(sub_data) then return end + end + + local file = io.open(data_path..id, "w") + if not file then + -- Most likely the data directory doesn't exist, create it + -- and try again. + -- Using os.execute like this is not very platform independent + -- or safe; but most platforms name their directory + -- creation utility mkdir, and the data path is unlikely to + -- contain special characters and is only mutabable by the + -- admin. + os.execute('mkdir "'..data_path..'"') + file = io.open(data_path..id, "w") + if not file then return end + end + + local datastr = minetest.serialize(data) + if not datastr then return end + + file:write(datastr) + file:close() + return true +end + +function datastorage.load(id) + local file = io.open(data_path..id, "r") + if not file then return end + + local data = minetest.deserialize(file:read("*all")) + datastorage.data[id] = data + + file:close() + return data +end + +-- Compatability +function datastorage.get_container(player, id) + return datastorage.get(player:get_player_name(), id) +end + +-- Retrieves a value from the data storage +function datastorage.get(id, ...) + local last = datastorage.data[id] + if last == nil then last = datastorage.load(id) end + if last == nil then + last = {} + datastorage.data[id] = last + end + local cur = last + for _, sub_id in ipairs({...}) do + last = cur + cur = cur[sub_id] + if cur == nil then + cur = {} + last[sub_id] = cur + end + end + return cur +end + +-- Saves a container and reomves it from memory +function datastorage.finish(id) + datastorage.save(id) + datastorage.data[id] = nil +end + +-- Compatability +function datastorage.save_container(player) + return datastorage.save(player:get_player_name()) +end + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + datastorage.save(player_name) + datastorage.data[player_name] = nil +end) + +minetest.register_on_shutdown(function() + for id in pairs(datastorage.data) do + datastorage.save(id) + end +end) + diff --git a/mods/default/README.txt b/mods/default/README.txt new file mode 100644 index 0000000..5e726ee --- /dev/null +++ b/mods/default/README.txt @@ -0,0 +1,204 @@ +Minetest 0.4 mod: default +========================== + +License of source code: +----------------------- +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.1 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 + +Cisoun's WTFPL texture pack: + default_jungletree.png + default_jungletree_top.png + default_lava.png + default_leaves.png + default_sapling.png + default_sign_wall.png + default_stone.png + default_tree.png + default_tree_top.png + default_water.png + +Cisoun's conifers mod (WTFPL): + default_pine_needles.png + +Originating from G4JC's Almost MC Texture Pack: + default_torch.png + default_torch_on_ceiling.png + default_torch_on_floor.png + +VanessaE's animated torches (WTFPL): + default_torch_animated.png + default_torch_on_ceiling_animated.png + default_torch_on_floor_animated.png + default_torch_on_floor.png + +RealBadAngel's animated water (WTFPL): + default_water_source_animated.png + default_water_flowing_animated.png + +VanessaE (WTFPL): + default_nc_back.png + default_nc_front.png + default_nc_rb.png + default_nc_side.png + default_grass_*.png + default_desert_sand.png + default_desert_stone.png + default_desert_stone_brick.png + default_sand.png + +Calinou (CC BY-SA): + default_brick.png + default_papyrus.png + default_mineral_copper.png + default_glass_detail.png + +MirceaKitsune (WTFPL): + character.x + +Jordach (CC BY-SA 3.0): + character.png + +PilzAdam (WTFPL): + default_jungleleaves.png + default_junglesapling.png + default_junglewood.png + default_obsidian_glass.png + default_obsidian_shard.png + default_mineral_gold.png + default_snowball.png + +jojoa1997 (WTFPL): + default_obsidian.png + +InfinityProject (WTFPL): + default_mineral_diamond.png + +Splizard (CC BY-SA 3.0): + default_snow.png + default_snow_side.png + default_ice.png + default_pine_sapling.png + +Zeg9 (CC BY-SA 3.0): + default_coal_block.png + default_steel_block.png + default_copper_block.png + default_bronze_block.png + default_gold_block.png + +paramat (CC BY-SA 3.0): + wieldhand.png, based on character.png by Jordach (CC BY-SA 3.0) + default_pinetree.png + default_pinetree_top.png + default_pinewood.png + default_sandstone_brick.png + default_obsidian_brick.png + default_river_water.png + default_river_water_source_animated.png + default_river_water_flowing_animated.png + +brunob.santos (CC BY-SA 4.0): + default_desert_cobble.png + +BlockMen (CC BY-SA 3.0): + default_stone_brick.png + default_wood.png + default_clay_brick.png + default_iron_ingot.png + default_gold_ingot.png + default_tool_steelsword.png + default_diamond.png + default_diamond_block.png + default_book.png + default_tool_*.png + default_lava_source_animated.png + default_lava_flowing_animated.png + default_stick.png + default_chest_front.png + default_chest_lock.png + default_chest_side.png + default_chest_top.png + default_mineral_mese.png + default_meselamp.png + bubble.png + heart.png + gui_*.png + +Neuromancer (CC BY-SA 2.0): + default_cobble.png, based on texture by Brane praefect + default_mossycobble.png, based on texture by Brane praefect +Neuromancer (CC BY-SA 3.0): + default_dirt.png + default_furnace_*.png + +Philipbenr (CC BY-SA 3.0): + default_grass.png + default_grass_side.png + +Glass breaking sounds (CC BY 3.0): + 1: http://www.freesound.org/people/cmusounddesign/sounds/71947/ + 2: http://www.freesound.org/people/Tomlija/sounds/97669/ + 3: http://www.freesound.org/people/lsprice/sounds/88808/ + +Mito551 (sounds) (CC BY-SA): + default_dig_choppy.ogg + default_dig_cracky.ogg + default_dig_crumbly.1.ogg + default_dig_crumbly.2.ogg + default_dig_dig_immediate.ogg + default_dig_oddly_breakable_by_hand.ogg + default_dug_node.1.ogg + default_dug_node.2.ogg + default_grass_footstep.1.ogg + default_grass_footstep.2.ogg + default_grass_footstep.3.ogg + default_gravel_footstep.1.ogg + default_gravel_footstep.2.ogg + default_gravel_footstep.3.ogg + default_gravel_footstep.4.ogg + default_grass_footstep.1.ogg + default_place_node.1.ogg + default_place_node.2.ogg + default_place_node.3.ogg + default_place_node_hard.1.ogg + default_place_node_hard.2.ogg + default_snow_footstep.1.ogg + default_snow_footstep.2.ogg + default_hard_footstep.1.ogg + default_hard_footstep.2.ogg + default_hard_footstep.3.ogg + default_sand_footstep.1.ogg + default_sand_footstep.2.ogg + default_wood_footstep.1.ogg + default_wood_footstep.2.ogg + default_dirt_footstep.1.ogg + default_dirt_footstep.2.ogg + default_glass_footstep.ogg + +Gambit (WTFPL): + default_bronze_ingot.png + default_copper_ingot.png + default_copper_lump.png + default_iron_lump.png + default_gold_lump.png + default_clay_lump.png + default_coal.png + default_grass_*.png + default_paper.png diff --git a/mods/default/aliases.lua b/mods/default/aliases.lua new file mode 100644 index 0000000..7247751 --- /dev/null +++ b/mods/default/aliases.lua @@ -0,0 +1,72 @@ +-- mods/default/aliases.lua + +-- Aliases to support loading worlds using nodes following the old naming convention +-- These can also be helpful when using chat commands, for example /giveme +minetest.register_alias("stone", "default:stone") +minetest.register_alias("stone_with_coal", "default:stone_with_coal") +minetest.register_alias("stone_with_iron", "default:stone_with_iron") +minetest.register_alias("dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("dirt_with_grass_footsteps", "default:dirt_with_grass_footsteps") +minetest.register_alias("dirt", "default:dirt") +minetest.register_alias("sand", "default:sand") +minetest.register_alias("gravel", "default:gravel") +minetest.register_alias("sandstone", "default:sandstone") +minetest.register_alias("clay", "default:clay") +minetest.register_alias("brick", "default:brick") +minetest.register_alias("tree", "default:tree") +minetest.register_alias("jungletree", "default:jungletree") +minetest.register_alias("junglegrass", "default:junglegrass") +minetest.register_alias("leaves", "default:leaves") +minetest.register_alias("cactus", "default:cactus") +minetest.register_alias("papyrus", "default:papyrus") +minetest.register_alias("bookshelf", "default:bookshelf") +minetest.register_alias("glass", "default:glass") +minetest.register_alias("wooden_fence", "default:fence_wood") +minetest.register_alias("rail", "default:rail") +minetest.register_alias("ladder", "default:ladder") +minetest.register_alias("wood", "default:wood") +minetest.register_alias("mese", "default:mese") +minetest.register_alias("cloud", "default:cloud") +minetest.register_alias("water_flowing", "default:water_flowing") +minetest.register_alias("water_source", "default:water_source") +minetest.register_alias("lava_flowing", "default:lava_flowing") +minetest.register_alias("lava_source", "default:lava_source") +minetest.register_alias("torch", "default:torch") +minetest.register_alias("sign_wall", "default:sign_wall") +minetest.register_alias("furnace", "default:furnace") +minetest.register_alias("chest", "default:chest") +minetest.register_alias("locked_chest", "default:chest_locked") +minetest.register_alias("cobble", "default:cobble") +minetest.register_alias("mossycobble", "default:mossycobble") +minetest.register_alias("steelblock", "default:steelblock") +minetest.register_alias("nyancat", "default:nyancat") +minetest.register_alias("nyancat_rainbow", "default:nyancat_rainbow") +minetest.register_alias("sapling", "default:sapling") +minetest.register_alias("apple", "default:apple") + +minetest.register_alias("WPick", "default:pick_wood") +minetest.register_alias("STPick", "default:pick_stone") +minetest.register_alias("SteelPick", "default:pick_steel") +minetest.register_alias("MesePick", "default:pick_mese") +minetest.register_alias("WShovel", "default:shovel_wood") +minetest.register_alias("STShovel", "default:shovel_stone") +minetest.register_alias("SteelShovel", "default:shovel_steel") +minetest.register_alias("WAxe", "default:axe_wood") +minetest.register_alias("STAxe", "default:axe_stone") +minetest.register_alias("SteelAxe", "default:axe_steel") +minetest.register_alias("WSword", "default:sword_wood") +minetest.register_alias("STSword", "default:sword_stone") +minetest.register_alias("SteelSword", "default:sword_steel") + +minetest.register_alias("Stick", "default:stick") +minetest.register_alias("paper", "default:paper") +minetest.register_alias("book", "default:book") +minetest.register_alias("lump_of_coal", "default:coal_lump") +minetest.register_alias("lump_of_iron", "default:iron_lump") +minetest.register_alias("lump_of_clay", "default:clay_lump") +minetest.register_alias("steel_ingot", "default:steel_ingot") +minetest.register_alias("clay_brick", "default:clay_brick") +minetest.register_alias("snow", "default:snow") + +-- Mese now comes in the form of blocks, ore, crystal and fragments +minetest.register_alias("default:mese", "default:mese_block") diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua new file mode 100644 index 0000000..354efa4 --- /dev/null +++ b/mods/default/crafting.lua @@ -0,0 +1,838 @@ +-- mods/default/crafting.lua + +minetest.register_craft({ + output = 'default:wood 4', + recipe = { + {'default:tree'}, + } +}) + +minetest.register_craft({ + output = 'default:junglewood 4', + recipe = { + {'default:jungletree'}, + } +}) + +minetest.register_craft({ + output = 'default:pinewood 4', + recipe = { + {'default:pinetree'}, + } +}) + +minetest.register_craft({ + output = 'default:stick 4', + recipe = { + {'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:fence_wood 2', + recipe = { + {'group:stick', 'group:stick', 'group:stick'}, + {'group:stick', 'group:stick', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sign_wall', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:torch 4', + recipe = { + {'default:coal_lump'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:pick_wood', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_stone', + recipe = { + {'group:stone', 'group:stone', 'group:stone'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_bronze', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:pick_diamond', + recipe = { + {'default:diamond', 'default:diamond', 'default:diamond'}, + {'', 'group:stick', ''}, + {'', 'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_wood', + recipe = { + {'group:wood'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_stone', + recipe = { + {'group:stone'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_steel', + recipe = { + {'default:steel_ingot'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_bronze', + recipe = { + {'default:bronze_ingot'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_mese', + recipe = { + {'default:mese_crystal'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:shovel_diamond', + recipe = { + {'default:diamond'}, + {'group:stick'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_wood', + recipe = { + {'group:wood', 'group:wood'}, + {'group:wood', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_stone', + recipe = { + {'group:stone', 'group:stone'}, + {'group:stone', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_bronze', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_diamond', + recipe = { + {'default:diamond', 'default:diamond'}, + {'default:diamond', 'group:stick'}, + {'', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:axe_wood', + recipe = { + {'group:wood', 'group:wood'}, + {'group:stick', 'group:wood'}, + {'group:stick',''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_stone', + recipe = { + {'group:stone', 'group:stone'}, + {'group:stick', 'group:stone'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_steel', + recipe = { + {'default:steel_ingot', 'default:steel_ingot'}, + {'group:stick', 'default:steel_ingot'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_bronze', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot'}, + {'group:stick', 'default:bronze_ingot'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal'}, + {'group:stick', 'default:mese_crystal'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:axe_diamond', + recipe = { + {'default:diamond', 'default:diamond'}, + {'group:stick', 'default:diamond'}, + {'group:stick', ''}, + } +}) + +minetest.register_craft({ + output = 'default:sword_wood', + recipe = { + {'group:wood'}, + {'group:wood'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_stone', + recipe = { + {'group:stone'}, + {'group:stone'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_steel', + recipe = { + {'default:steel_ingot'}, + {'default:steel_ingot'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_bronze', + recipe = { + {'default:bronze_ingot'}, + {'default:bronze_ingot'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_mese', + recipe = { + {'default:mese_crystal'}, + {'default:mese_crystal'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:sword_diamond', + recipe = { + {'default:diamond'}, + {'default:diamond'}, + {'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:rail 24', + recipe = { + {'default:steel_ingot', '', 'default:steel_ingot'}, + {'default:steel_ingot', 'group:stick', 'default:steel_ingot'}, + {'default:steel_ingot', '', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:chest', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', '', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:chest_locked', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'default:steel_ingot', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:furnace', + recipe = { + {'group:stone', 'group:stone', 'group:stone'}, + {'group:stone', '', 'group:stone'}, + {'group:stone', 'group:stone', 'group:stone'}, + } +}) + +minetest.register_craft({ + type = "shapeless", + output = "default:bronze_ingot", + recipe = {"default:steel_ingot", "default:copper_ingot"}, +}) + +minetest.register_craft({ + output = 'default:coalblock', + recipe = { + {'default:coal_lump', 'default:coal_lump', 'default:coal_lump'}, + {'default:coal_lump', 'default:coal_lump', 'default:coal_lump'}, + {'default:coal_lump', 'default:coal_lump', 'default:coal_lump'}, + } +}) + +minetest.register_craft({ + output = 'default:coal_lump 9', + recipe = { + {'default:coalblock'}, + } +}) + +minetest.register_craft({ + output = 'default:steelblock', + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:steel_ingot 9', + recipe = { + {'default:steelblock'}, + } +}) + +minetest.register_craft({ + output = 'default:copperblock', + recipe = { + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + {'default:copper_ingot', 'default:copper_ingot', 'default:copper_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:copper_ingot 9', + recipe = { + {'default:copperblock'}, + } +}) + +minetest.register_craft({ + output = 'default:bronzeblock', + recipe = { + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + {'default:bronze_ingot', 'default:bronze_ingot', 'default:bronze_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:bronze_ingot 9', + recipe = { + {'default:bronzeblock'}, + } +}) + +minetest.register_craft({ + output = 'default:goldblock', + recipe = { + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + {'default:gold_ingot', 'default:gold_ingot', 'default:gold_ingot'}, + } +}) + +minetest.register_craft({ + output = 'default:gold_ingot 9', + recipe = { + {'default:goldblock'}, + } +}) + +minetest.register_craft({ + output = 'default:diamondblock', + recipe = { + {'default:diamond', 'default:diamond', 'default:diamond'}, + {'default:diamond', 'default:diamond', 'default:diamond'}, + {'default:diamond', 'default:diamond', 'default:diamond'}, + } +}) + +minetest.register_craft({ + output = 'default:diamond 9', + recipe = { + {'default:diamondblock'}, + } +}) + +minetest.register_craft({ + output = 'default:sandstone', + recipe = { + {'group:sand', 'group:sand'}, + {'group:sand', 'group:sand'}, + } +}) + +minetest.register_craft({ + output = 'default:sand 4', + recipe = { + {'default:sandstone'}, + } +}) + +minetest.register_craft({ + output = 'default:sandstonebrick 4', + recipe = { + {'default:sandstone', 'default:sandstone'}, + {'default:sandstone', 'default:sandstone'}, + } +}) + +minetest.register_craft({ + output = 'default:clay', + recipe = { + {'default:clay_lump', 'default:clay_lump'}, + {'default:clay_lump', 'default:clay_lump'}, + } +}) + +minetest.register_craft({ + output = 'default:brick', + recipe = { + {'default:clay_brick', 'default:clay_brick'}, + {'default:clay_brick', 'default:clay_brick'}, + } +}) + +minetest.register_craft({ + output = 'default:clay_brick 4', + recipe = { + {'default:brick'}, + } +}) + +minetest.register_craft({ + output = 'default:paper', + recipe = { + {'default:papyrus', 'default:papyrus', 'default:papyrus'}, + } +}) + +minetest.register_craft({ + output = 'default:book', + recipe = { + {'default:paper'}, + {'default:paper'}, + {'default:paper'}, + } +}) + +minetest.register_craft({ + output = 'default:bookshelf', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'default:book', 'default:book', 'default:book'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_craft({ + output = 'default:ladder', + recipe = { + {'group:stick', '', 'group:stick'}, + {'group:stick', 'group:stick', 'group:stick'}, + {'group:stick', '', 'group:stick'}, + } +}) + +minetest.register_craft({ + output = 'default:mese', + recipe = { + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + {'default:mese_crystal', 'default:mese_crystal', 'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = 'default:mese_crystal 9', + recipe = { + {'default:mese'}, + } +}) + +minetest.register_craft({ + output = 'default:mese_crystal_fragment 9', + recipe = { + {'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = 'default:meselamp 1', + recipe = { + {'', 'default:mese_crystal',''}, + {'default:mese_crystal', 'default:glass', 'default:mese_crystal'}, + } +}) + +minetest.register_craft({ + output = 'default:obsidian_shard 9', + recipe = { + {'default:obsidian'} + } +}) + +minetest.register_craft({ + output = 'default:obsidian', + recipe = { + {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'}, + {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'}, + {'default:obsidian_shard', 'default:obsidian_shard', 'default:obsidian_shard'}, + } +}) + +minetest.register_craft({ + output = 'default:obsidianbrick 4', + recipe = { + {'default:obsidian', 'default:obsidian'}, + {'default:obsidian', 'default:obsidian'} + } +}) + +minetest.register_craft({ + output = 'default:stonebrick 4', + recipe = { + {'default:stone', 'default:stone'}, + {'default:stone', 'default:stone'}, + } +}) + +minetest.register_craft({ + output = 'default:desert_stonebrick 4', + recipe = { + {'default:desert_stone', 'default:desert_stone'}, + {'default:desert_stone', 'default:desert_stone'}, + } +}) + +minetest.register_craft({ + output = 'default:snowblock', + recipe = { + {'default:snow', 'default:snow', 'default:snow'}, + {'default:snow', 'default:snow', 'default:snow'}, + {'default:snow', 'default:snow', 'default:snow'}, + } +}) + +minetest.register_craft({ + output = 'default:snow 9', + recipe = { + {'default:snowblock'}, + } +}) + +-- +-- Crafting (tool repair) +-- +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.02, +}) + +-- +-- Cooking recipes +-- + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "group:sand", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:obsidian_glass", + recipe = "default:obsidian_shard", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:stone", + recipe = "default:mossycobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:desert_stone", + recipe = "default:desert_cobble", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:steel_ingot", + recipe = "default:iron_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:copper_ingot", + recipe = "default:copper_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:gold_ingot", + recipe = "default:gold_lump", +}) + +minetest.register_craft({ + type = "cooking", + output = "default:clay_brick", + recipe = "default:clay_lump", +}) + +-- +-- Fuels +-- + +minetest.register_craft({ + type = "fuel", + recipe = "group:tree", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglegrass", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:leaves", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:cactus", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:papyrus", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:bookshelf", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:fence_wood", + burntime = 15, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:ladder", + burntime = 5, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:wood", + burntime = 7, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:lava_source", + burntime = 60, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:torch", + burntime = 4, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sign_wall", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:chest_locked", + burntime = 30, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:nyancat", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:nyancat_rainbow", + burntime = 1, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:sapling", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:apple", + burntime = 3, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coal_lump", + burntime = 40, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:coalblock", + burntime = 370, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:junglesapling", + burntime = 10, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:grass_1", + burntime = 2, +}) + +minetest.register_craft({ + type = "fuel", + recipe = "default:pine_sapling", + burntime = 10, +}) + diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua new file mode 100644 index 0000000..facff57 --- /dev/null +++ b/mods/default/craftitems.lua @@ -0,0 +1,159 @@ +-- mods/default/craftitems.lua + +minetest.register_craftitem("default:stick", { + description = "Stick", + inventory_image = "default_stick.png", + groups = {stick=1}, +}) + +minetest.register_craftitem("default:paper", { + description = "Paper", + inventory_image = "default_paper.png", +}) + +local function book_on_use(itemstack, user, pointed_thing) + local player_name = user:get_player_name() + local data = minetest.deserialize(itemstack:get_metadata()) + local title, text, owner = "", "", player_name + if data then + title, text, owner = data.title, data.text, data.owner + end + local formspec + if owner == player_name then + formspec = "size[8,8]"..default.gui_bg.. + "field[0.5,1;7.5,0;title;Title:;".. + minetest.formspec_escape(title).."]".. + "textarea[0.5,1.5;7.5,7;text;Contents:;".. + minetest.formspec_escape(text).."]".. + "button_exit[2.5,7.5;3,1;save;Save]" + else + formspec = "size[8,8]"..default.gui_bg.. + "label[0.5,0.5;by "..owner.."]".. + "label[0.5,0;"..minetest.formspec_escape(title).."]".. + "textarea[0.5,1.5;7.5,7;;"..minetest.formspec_escape(text)..";]" + end + minetest.show_formspec(user:get_player_name(), "default:book", formspec) +end + +minetest.register_on_player_receive_fields(function(player, form_name, fields) + if form_name ~= "default:book" or not fields.save or + fields.title == "" or fields.text == "" then + return + end + local inv = player:get_inventory() + local stack = player:get_wielded_item() + local new_stack, data + if stack:get_name() ~= "default:book_written" then + local count = stack:get_count() + if count == 1 then + stack:set_name("default:book_written") + else + stack:set_count(count - 1) + new_stack = ItemStack("default:book_written") + end + else + data = minetest.deserialize(stack:get_metadata()) + end + if not data then data = {} end + data.title = fields.title + data.text = fields.text + data.owner = player:get_player_name() + local data_str = minetest.serialize(data) + if new_stack then + new_stack:set_metadata(data_str) + if inv:room_for_item("main", new_stack) then + inv:add_item("main", new_stack) + else + minetest.add_item(player:getpos(), new_stack) + end + else + stack:set_metadata(data_str) + end + player:set_wielded_item(stack) +end) + +minetest.register_craftitem("default:book", { + description = "Book", + inventory_image = "default_book.png", + groups = {book=1}, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:book_written", { + description = "Book With Text", + inventory_image = "default_book.png", + groups = {book=1, not_in_creative_inventory=1}, + stack_max = 1, + on_use = book_on_use, +}) + +minetest.register_craftitem("default:coal_lump", { + description = "Coal Lump", + inventory_image = "default_coal_lump.png", + groups = {coal = 1} +}) + +minetest.register_craftitem("default:iron_lump", { + description = "Iron Lump", + inventory_image = "default_iron_lump.png", +}) + +minetest.register_craftitem("default:copper_lump", { + description = "Copper Lump", + inventory_image = "default_copper_lump.png", +}) + +minetest.register_craftitem("default:mese_crystal", { + description = "Mese Crystal", + inventory_image = "default_mese_crystal.png", +}) + +minetest.register_craftitem("default:gold_lump", { + description = "Gold Lump", + inventory_image = "default_gold_lump.png", +}) + +minetest.register_craftitem("default:diamond", { + description = "Diamond", + inventory_image = "default_diamond.png", +}) + +minetest.register_craftitem("default:clay_lump", { + description = "Clay Lump", + inventory_image = "default_clay_lump.png", +}) + +minetest.register_craftitem("default:steel_ingot", { + description = "Steel Ingot", + inventory_image = "default_steel_ingot.png", +}) + +minetest.register_craftitem("default:copper_ingot", { + description = "Copper Ingot", + inventory_image = "default_copper_ingot.png", +}) + +minetest.register_craftitem("default:bronze_ingot", { + description = "Bronze Ingot", + inventory_image = "default_bronze_ingot.png", +}) + +minetest.register_craftitem("default:gold_ingot", { + description = "Gold Ingot", + inventory_image = "default_gold_ingot.png" +}) + +minetest.register_craftitem("default:mese_crystal_fragment", { + description = "Mese Crystal Fragment", + inventory_image = "default_mese_crystal_fragment.png", +}) + +minetest.register_craftitem("default:clay_brick", { + description = "Clay Brick", + inventory_image = "default_clay_brick.png", +}) + +minetest.register_craftitem("default:obsidian_shard", { + description = "Obsidian Shard", + inventory_image = "default_obsidian_shard.png", +}) diff --git a/mods/default/functions.lua b/mods/default/functions.lua new file mode 100644 index 0000000..426e27c --- /dev/null +++ b/mods/default/functions.lua @@ -0,0 +1,345 @@ +-- mods/default/functions.lua + +-- +-- Sounds +-- + +function default.node_sound_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "", gain = 1.0} + table.dug = table.dug or + {name = "default_dug_node", gain = 0.25} + table.place = table.place or + {name = "default_place_node_hard", gain = 1.0} + return table +end + +function default.node_sound_stone_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_hard_footstep", gain = 0.5} + table.dug = table.dug or + {name = "default_hard_footstep", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_dirt_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_dirt_footstep", gain = 1.0} + table.dug = table.dug or + {name = "default_dirt_footstep", gain = 1.5} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_sand_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_sand_footstep", gain = 0.2} + table.dug = table.dug or + {name = "default_sand_footstep", gain = 0.4} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_wood_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_wood_footstep", gain = 0.5} + table.dug = table.dug or + {name = "default_wood_footstep", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_leaves_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_grass_footstep", gain = 0.35} + table.dug = table.dug or + {name = "default_grass_footstep", gain = 0.7} + table.dig = table.dig or + {name = "default_dig_crumbly", gain = 0.4} + table.place = table.place or + {name = "default_place_node", gain = 1.0} + default.node_sound_defaults(table) + return table +end + +function default.node_sound_glass_defaults(table) + table = table or {} + table.footstep = table.footstep or + {name = "default_glass_footstep", gain = 0.5} + table.dug = table.dug or + {name = "default_break_glass", gain = 1.0} + default.node_sound_defaults(table) + return table +end + + +-- +-- Lavacooling +-- + +default.cool_lava_source = function(pos) + minetest.set_node(pos, {name = "default:obsidian"}) + minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) +end + +default.cool_lava_flowing = function(pos) + minetest.set_node(pos, {name = "default:stone"}) + minetest.sound_play("default_cool_lava", {pos = pos, gain = 0.25}) +end + +minetest.register_abm({ + nodenames = {"default:lava_flowing"}, + neighbors = {"group:water"}, + interval = 1, + chance = 1, + action = function(...) + default.cool_lava_flowing(...) + end, +}) + +minetest.register_abm({ + nodenames = {"default:lava_source"}, + neighbors = {"group:water"}, + interval = 1, + chance = 1, + action = function(...) + default.cool_lava_source(...) + end, +}) + + +-- +-- Papyrus and cactus growing +-- + +-- wrapping the functions in abm action is necessary to make overriding them possible + +function default.grow_cactus(pos, node) + if node.param2 >= 4 then + return + end + pos.y = pos.y - 1 + if minetest.get_item_group(minetest.get_node(pos).name, "sand") == 0 then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:cactus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + minetest.set_node(pos, {name = "default:cactus"}) + return true +end + +function default.grow_papyrus(pos, node) + pos.y = pos.y - 1 + local name = minetest.get_node(pos).name + if name ~= "default:dirt_with_grass" and name ~= "default:dirt" then + return + end + if not minetest.find_node_near(pos, 3, {"group:water"}) then + return + end + pos.y = pos.y + 1 + local height = 0 + while node.name == "default:papyrus" and height < 4 do + height = height + 1 + pos.y = pos.y + 1 + node = minetest.get_node(pos) + end + if height == 4 or node.name ~= "air" then + return + end + minetest.set_node(pos, {name = "default:papyrus"}) + return true +end + +minetest.register_abm({ + nodenames = {"default:cactus"}, + neighbors = {"group:sand"}, + interval = 50, + chance = 20, + action = function(...) + default.grow_cactus(...) + end +}) + +minetest.register_abm({ + nodenames = {"default:papyrus"}, + neighbors = {"default:dirt", "default:dirt_with_grass"}, + interval = 50, + chance = 20, + action = function(...) + default.grow_papyrus(...) + end +}) + + +-- +-- dig upwards +-- + +function default.dig_up(pos, node, digger) + if digger == nil then return end + local np = {x = pos.x, y = pos.y + 1, z = pos.z} + local nn = minetest.get_node(np) + if nn.name == node.name then + minetest.node_dig(np, nn, digger) + end +end + + +-- +-- Leafdecay +-- + +default.leafdecay_trunk_cache = {} +default.leafdecay_enable_cache = true +-- Spread the load of finding trunks +default.leafdecay_trunk_find_allow_accumulator = 0 + +minetest.register_globalstep(function(dtime) + local finds_per_second = 5000 + default.leafdecay_trunk_find_allow_accumulator = + math.floor(dtime * finds_per_second) +end) + +default.after_place_leaves = function(pos, placer, itemstack, pointed_thing) + local node = minetest.get_node(pos) + node.param2 = 1 + minetest.set_node(pos, node) +end + +minetest.register_abm({ + nodenames = {"group:leafdecay"}, + neighbors = {"air", "group:liquid"}, + -- A low interval and a high inverse chance spreads the load + interval = 2, + chance = 5, + + action = function(p0, node, _, _) + --print("leafdecay ABM at "..p0.x..", "..p0.y..", "..p0.z..")") + local do_preserve = false + local d = minetest.registered_nodes[node.name].groups.leafdecay + if not d or d == 0 then + --print("not groups.leafdecay") + return + end + local n0 = minetest.get_node(p0) + if n0.param2 ~= 0 then + --print("param2 ~= 0") + return + end + local p0_hash = nil + if default.leafdecay_enable_cache then + p0_hash = minetest.hash_node_position(p0) + local trunkp = default.leafdecay_trunk_cache[p0_hash] + if trunkp then + local n = minetest.get_node(trunkp) + local reg = minetest.registered_nodes[n.name] + -- Assume ignore is a trunk, to make the thing + -- work at the border of the active area + if n.name == "ignore" or (reg and reg.groups.tree and + reg.groups.tree ~= 0) then + --print("cached trunk still exists") + return + end + --print("cached trunk is invalid") + -- Cache is invalid + table.remove(default.leafdecay_trunk_cache, p0_hash) + end + end + if default.leafdecay_trunk_find_allow_accumulator <= 0 then + return + end + default.leafdecay_trunk_find_allow_accumulator = + default.leafdecay_trunk_find_allow_accumulator - 1 + -- Assume ignore is a trunk, to make the thing + -- work at the border of the active area + local p1 = minetest.find_node_near(p0, d, {"ignore", "group:tree"}) + if p1 then + do_preserve = true + if default.leafdecay_enable_cache then + --print("caching trunk") + -- Cache the trunk + default.leafdecay_trunk_cache[p0_hash] = p1 + end + end + if not do_preserve then + -- Drop stuff other than the node itself + local itemstacks = minetest.get_node_drops(n0.name) + for _, itemname in ipairs(itemstacks) do + if minetest.get_item_group(n0.name, "leafdecay_drop") ~= 0 or + itemname ~= n0.name then + local p_drop = { + x = p0.x - 0.5 + math.random(), + y = p0.y - 0.5 + math.random(), + z = p0.z - 0.5 + math.random(), + } + minetest.add_item(p_drop, itemname) + end + end + -- Remove node + minetest.remove_node(p0) + nodeupdate(p0) + end + end +}) + + +-- +-- Grass growing +-- + +minetest.register_abm({ + nodenames = {"default:dirt"}, + interval = 2, + chance = 200, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if nodedef and (nodedef.sunlight_propagates or nodedef.paramtype == "light") and + nodedef.liquidtype == "none" and + (minetest.get_node_light(above) or 0) >= 13 then + if name == "default:snow" or name == "default:snowblock" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + else + minetest.set_node(pos, {name = "default:dirt_with_grass"}) + end + end + end +}) + +minetest.register_abm({ + nodenames = {"default:dirt_with_grass"}, + interval = 2, + chance = 20, + action = function(pos, node) + local above = {x = pos.x, y = pos.y + 1, z = pos.z} + local name = minetest.get_node(above).name + local nodedef = minetest.registered_nodes[name] + if name ~= "ignore" and nodedef and not ((nodedef.sunlight_propagates or + nodedef.paramtype == "light") and + nodedef.liquidtype == "none") then + minetest.set_node(pos, {name = "default:dirt"}) + end + end +}) + diff --git a/mods/default/furnace.lua b/mods/default/furnace.lua new file mode 100644 index 0000000..6d89aae --- /dev/null +++ b/mods/default/furnace.lua @@ -0,0 +1,291 @@ + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + local formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + return formspec +end + +local inactive_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[current_name;dst]".. + "listring[current_player;main]".. + "listring[current_name;src]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0, 4.25) + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", "Furnace is empty") + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +-- +-- Node definitions +-- + +minetest.register_node("default:furnace", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +minetest.register_node("default:furnace_active", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +-- +-- ABM +-- + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +minetest.register_abm({ + nodenames = {"default:furnace", "default:furnace_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + -- + -- Inizialize inventory + -- + local inv = meta:get_inventory() + for listname, size in pairs({ + src = 1, + fuel = 1, + dst = 4, + }) do + if inv:get_size(listname) ~= size then + inv:set_size(listname, size) + end + end + local srclist = inv:get_list("src") + local fuellist = inv:get_list("fuel") + local dstlist = inv:get_list("dst") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + local cookable = true + + if cooked.time == 0 then + cookable = false + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + 1 + + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + 1 + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = 0 + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + + fuel_totaltime = fuel.time + fuel_time = 0 + + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + end + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state = "" + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + item_state = item_percent .. "%" + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "default:furnace") + end + + local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + end, +}) diff --git a/mods/default/furnace.lua.WG b/mods/default/furnace.lua.WG new file mode 100644 index 0000000..cf38606 --- /dev/null +++ b/mods/default/furnace.lua.WG @@ -0,0 +1,285 @@ + +-- +-- Formspecs +-- + +local function active_formspec(fuel_percent, item_percent) + local formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + (100-fuel_percent)..":default_furnace_fire_fg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[lowpart:".. + (item_percent)..":gui_furnace_arrow_fg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[]" + default.get_hotbar_bg(0, 4.25) + return formspec +end + +local inactive_formspec = + "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;dst;4.75,0.96;2,2;]".. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "listring[]" + default.get_hotbar_bg(0, 4.25) + +-- +-- Node callback functions that are the same for active and inactive furnace +-- + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("fuel") and inv:is_empty("dst") and inv:is_empty("src") +end + +local function allow_metadata_inventory_put(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if listname == "fuel" then + if minetest.get_craft_result({method="fuel", width=1, items={stack}}).time ~= 0 then + if inv:is_empty("src") then + meta:set_string("infotext", "Furnace is empty") + end + return stack:get_count() + else + return 0 + end + elseif listname == "src" then + return stack:get_count() + elseif listname == "dst" then + return 0 + end +end + +local function allow_metadata_inventory_move(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + return allow_metadata_inventory_put(pos, to_list, to_index, stack, player) +end + +local function allow_metadata_inventory_take(pos, listname, index, stack, player) + if minetest.is_protected(pos, player:get_player_name()) then + return 0 + end + return stack:get_count() +end + +-- +-- Node definitions +-- + +minetest.register_node("default:furnace", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_front.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +minetest.register_node("default:furnace_active", { + description = "Furnace", + tiles = { + "default_furnace_top.png", "default_furnace_bottom.png", + "default_furnace_side.png", "default_furnace_side.png", + "default_furnace_side.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2, not_in_creative_inventory=1}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + + can_dig = can_dig, + + allow_metadata_inventory_put = allow_metadata_inventory_put, + allow_metadata_inventory_move = allow_metadata_inventory_move, + allow_metadata_inventory_take = allow_metadata_inventory_take, +}) + +-- +-- ABM +-- + +local function swap_node(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + return + end + node.name = name + minetest.swap_node(pos, node) +end + +minetest.register_abm({ + nodenames = {"default:furnace", "default:furnace_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + -- + -- Inizialize metadata + -- + local meta = minetest.get_meta(pos) + local fuel_time = meta:get_float("fuel_time") or 0 + local src_time = meta:get_float("src_time") or 0 + local fuel_totaltime = meta:get_float("fuel_totaltime") or 0 + + -- + -- Inizialize inventory + -- + local inv = meta:get_inventory() + for listname, size in pairs({ + src = 1, + fuel = 1, + dst = 4, + }) do + if inv:get_size(listname) ~= size then + inv:set_size(listname, size) + end + end + local srclist = inv:get_list("src") + local fuellist = inv:get_list("fuel") + local dstlist = inv:get_list("dst") + + -- + -- Cooking + -- + + -- Check if we have cookable content + local cooked, aftercooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + local cookable = true + + if cooked.time == 0 then + cookable = false + end + + -- Check if we have enough fuel to burn + if fuel_time < fuel_totaltime then + -- The furnace is currently active and has enough fuel + fuel_time = fuel_time + 1 + + -- If there is a cookable item then check if it is ready yet + if cookable then + src_time = src_time + 1 + if src_time >= cooked.time then + -- Place result in dst list if possible + if inv:room_for_item("dst", cooked.item) then + inv:add_item("dst", cooked.item) + inv:set_stack("src", 1, aftercooked.items[1]) + src_time = 0 + end + end + end + else + -- Furnace ran out of fuel + if cookable then + -- We need to get new fuel + local fuel, afterfuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + + if fuel.time == 0 then + -- No valid fuel in fuel list + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + else + -- Take fuel from fuel list + inv:set_stack("fuel", 1, afterfuel.items[1]) + + fuel_totaltime = fuel.time + fuel_time = 0 + + end + else + -- We don't need to get new fuel since there is no cookable item + fuel_totaltime = 0 + fuel_time = 0 + src_time = 0 + end + end + + -- + -- Update formspec, infotext and node + -- + local formspec = inactive_formspec + local item_state = "" + local item_percent = 0 + if cookable then + item_percent = math.floor(src_time / cooked.time * 100) + item_state = item_percent .. "%" + else + if srclist[1]:is_empty() then + item_state = "Empty" + else + item_state = "Not cookable" + end + end + + local fuel_state = "Empty" + local active = "inactive " + if fuel_time <= fuel_totaltime and fuel_totaltime ~= 0 then + active = "active " + local fuel_percent = math.floor(fuel_time / fuel_totaltime * 100) + fuel_state = fuel_percent .. "%" + formspec = active_formspec(fuel_percent, item_percent) + swap_node(pos, "default:furnace_active") + else + if not fuellist[1]:is_empty() then + fuel_state = "0%" + end + swap_node(pos, "default:furnace") + end + + local infotext = "Furnace " .. active .. "(Item: " .. item_state .. "; Fuel: " .. fuel_state .. ")" + + -- + -- Set meta values + -- + meta:set_float("fuel_totaltime", fuel_totaltime) + meta:set_float("fuel_time", fuel_time) + meta:set_float("src_time", src_time) + meta:set_string("formspec", formspec) + meta:set_string("infotext", infotext) + end, +}) diff --git a/mods/default/init.lua b/mods/default/init.lua new file mode 100644 index 0000000..3f0efea --- /dev/null +++ b/mods/default/init.lua @@ -0,0 +1,46 @@ +-- Minetest 0.4 mod: default +-- See README.txt for licensing and other information. + +-- The API documentation in here was moved into game_api.txt + +-- Definitions made by this mod that other mods can use too +default = {} + +default.LIGHT_MAX = 14 + +-- GUI related stuff +default.gui_bg = "bgcolor[#080808BB;true]" +default.gui_bg_img = "background[5,5;1,1;gui_formbg.png;true]" +default.gui_slots = "listcolors[#00000069;#5A5A5A;#141318;#30434C;#FFF]" + +function default.get_hotbar_bg(x,y) + local out = "" + for i=0,7,1 do + out = out .."image["..x+i..","..y..";1,1;gui_hb_bg.png]" + end + return out +end + +default.gui_survival_form = "size[8,8.5]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_player;main;0,4.25;8,1;]".. + "list[current_player;main;0,5.5;8,3;8]".. + "list[current_player;craft;1.75,0.5;3,3;]".. + "list[current_player;craftpreview;5.75,1.5;1,1;]".. + "image[4.75,1.5;1,1;gui_furnace_arrow_bg.png^[transformR270]".. + default.get_hotbar_bg(0,4.25) + +-- Load files +dofile(minetest.get_modpath("default").."/functions.lua") +dofile(minetest.get_modpath("default").."/nodes.lua") +dofile(minetest.get_modpath("default").."/furnace.lua") +dofile(minetest.get_modpath("default").."/tools.lua") +dofile(minetest.get_modpath("default").."/craftitems.lua") +dofile(minetest.get_modpath("default").."/crafting.lua") +dofile(minetest.get_modpath("default").."/mapgen.lua") +dofile(minetest.get_modpath("default").."/player.lua") +dofile(minetest.get_modpath("default").."/trees.lua") +dofile(minetest.get_modpath("default").."/aliases.lua") +dofile(minetest.get_modpath("default").."/legacy.lua") diff --git a/mods/default/legacy.lua b/mods/default/legacy.lua new file mode 100644 index 0000000..76fcc8e --- /dev/null +++ b/mods/default/legacy.lua @@ -0,0 +1,25 @@ +-- mods/default/legacy.lua + +-- Horrible crap to support old code registering falling nodes +-- Don't use this and never do what this does, it's completely wrong! +-- (More specifically, the client and the C++ code doesn't get the group) +function default.register_falling_node(nodename, texture) + minetest.log("error", debug.traceback()) + minetest.log('error', "WARNING: default.register_falling_node is deprecated") + if minetest.registered_nodes[nodename] then + minetest.registered_nodes[nodename].groups.falling_node = 1 + end +end + +function default.spawn_falling_node(p, nodename) + spawn_falling_node(p, nodename) +end + +-- Liquids +WATER_ALPHA = minetest.registered_nodes["default:water_source"].alpha +WATER_VISC = minetest.registered_nodes["default:water_source"].liquid_viscosity +LAVA_VISC = minetest.registered_nodes["default:lava_source"].liquid_viscosity +LIGHT_MAX = default.LIGHT_MAX + +-- Formspecs +default.gui_suvival_form = default.gui_survival_form diff --git a/mods/default/mapgen - Copy.lua b/mods/default/mapgen - Copy.lua new file mode 100644 index 0000000..378614e --- /dev/null +++ b/mods/default/mapgen - Copy.lua @@ -0,0 +1,711 @@ +-- +-- Aliases for map generator outputs +-- + + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") +minetest.register_alias("mapgen_sandstone", "default:sandstone") + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pinetree", "default:pinetree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") +minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick") + + +-- +-- Register ores +-- + + +-- Blob ore first to avoid other ores inside blobs + +function default.register_ores() + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -15, + y_max = 0, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=-316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 4, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=2316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=17676, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -31000, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=766, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 8, + clust_size = 3, + y_min = -31000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 3, + clust_size = 2, + y_min = -15, + y_max = 2, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -63, + y_max = -16, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7*7*7, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18*18*18, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14*14*14, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36*36*36, + clust_num_ores = 3, + clust_size = 2, + y_min = -31000, + y_max = -1024, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13*13*13, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17*17*17, + clust_num_ores = 4, + clust_size = 3, + y_min = -255, + y_max = -128, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 4, + clust_size = 3, + y_min = -63, + y_max = -16, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) +end + + +-- +-- Register biomes +-- + + +function default.register_biomes() + minetest.clear_registered_biomes() + + minetest.register_biome({ + name = "default:grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = 5, + y_max = 31000, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "default:grassland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = -31000, + y_max = 4, + heat_point = 50, + humidity_point = 50, + }) +end + + +-- +-- Register mgv6 decorations +-- + + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 8, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x=100, y=100, z=100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_min = 1, + y_max = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x=100, y=100, z=100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Grasses + + for length = 1, 5 do + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:dry_shrub", + }) +end + + +-- +-- Register decorations +-- + + +function default.register_decorations() + + -- Flowers + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:rose", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = 33, + y_max = 31000, + decoration = "flowers:tulip", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_yellow", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 36662, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:geranium", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:viola", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 73133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_white", + }) + + -- Grasses + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.04, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_1", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.06, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_2", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.08, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_3", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.10, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_4", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.12, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_5", + }) +end + + +-- +-- Detect mapgen to select functions +-- + + +-- Mods using singlenode mapgen can call these functions to enable +-- the use of minetest.generate_ores or minetest.generate_decorations + +local mg_params = minetest.get_mapgen_params() +if mg_params.mgname == "v6" then + default.register_ores() + default.register_mgv6_decorations() +elseif mg_params.mgname ~= "singlenode" then + default.register_ores() + default.register_biomes() + default.register_decorations() +end + + +-- +-- Generate nyan cats in all mapgens +-- + + +-- facedir: 0/1/2/3 (head node facedir value) +-- length: length of rainbow tail +function default.make_nyancat(pos, facedir, length) + local tailvec = {x=0, y=0, z=0} + if facedir == 0 then + tailvec.z = 1 + elseif facedir == 1 then + tailvec.x = 1 + elseif facedir == 2 then + tailvec.z = -1 + elseif facedir == 3 then + tailvec.x = -1 + else + --print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) + facedir = 0 + tailvec.z = 1 + end + local p = {x=pos.x, y=pos.y, z=pos.z} + minetest.set_node(p, {name="default:nyancat", param2=facedir}) + for i=1,length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name="default:nyancat_rainbow", param2=facedir}) + end +end + + +function default.generate_nyancats(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed + 9324342) + local max_num_nyancats = math.floor(volume / (16*16*16)) + for i=1,max_num_nyancats do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x=x0, y=y0, z=z0} + default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) + end + end +end + + +minetest.register_on_generated(default.generate_nyancats) diff --git a/mods/default/mapgen.lua b/mods/default/mapgen.lua new file mode 100644 index 0000000..9dadb37 --- /dev/null +++ b/mods/default/mapgen.lua @@ -0,0 +1,689 @@ +-- +-- Aliases for map generator outputs +-- + + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") +minetest.register_alias("mapgen_sandstone", "default:sandstone") + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pinetree", "default:pinetree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") +minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick") + + +-- +-- Register ores +-- + + +-- Blob ore first to avoid other ores inside blobs + +function default.register_ores() + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -15, + y_max = 0, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=-316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 64, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=2316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -64, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=17676, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -31000, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=766, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 95, + clust_size = 5, + y_min = -1000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 95, + clust_size = 5, + y_min = -1000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) +--[[ + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 31, + clust_size = 4, + y_min = -1000, + y_max = 0, + }) +]]-- + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 95, + clust_size = 5, + y_min = -1000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 95, + clust_size = 5, + y_min = -1000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + y_min = -1000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 95, + clust_size = 5, + y_min = -1000, + y_max = 0, + }) +end + + +-- +-- Register biomes +-- + + +function default.register_biomes() + minetest.clear_registered_biomes() + + minetest.register_biome({ + name = "default:grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = 5, + y_max = 31000, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "default:grassland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = -31000, + y_max = 4, + heat_point = 50, + humidity_point = 50, + }) +end + + +-- +-- Register mgv6 decorations +-- + + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 8, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x=100, y=100, z=100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_min = 1, + y_max = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x=100, y=100, z=100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Grasses + + for length = 1, 5 do + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:dry_shrub", + }) +end + + +-- +-- Register decorations +-- + + +function default.register_decorations() + + -- Flowers + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:rose", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = 33, + y_max = 31000, + decoration = "flowers:tulip", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_yellow", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 36662, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:geranium", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:viola", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 73133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_white", + }) + + -- Grasses + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.04, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_1", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.06, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_2", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.08, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_3", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.10, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_4", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.12, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_5", + }) +end + + +-- +-- Detect mapgen to select functions +-- + + +-- Mods using singlenode mapgen can call these functions to enable +-- the use of minetest.generate_ores or minetest.generate_decorations + +local mg_params = minetest.get_mapgen_params() +if mg_params.mgname == "v6" then + default.register_ores() + default.register_mgv6_decorations() +elseif mg_params.mgname ~= "singlenode" then + default.register_ores() + default.register_biomes() + default.register_decorations() +end + + +-- +-- Generate nyan cats in all mapgens +-- + + +-- facedir: 0/1/2/3 (head node facedir value) +-- length: length of rainbow tail +function default.make_nyancat(pos, facedir, length) + local tailvec = {x=0, y=0, z=0} + if facedir == 0 then + tailvec.z = 1 + elseif facedir == 1 then + tailvec.x = 1 + elseif facedir == 2 then + tailvec.z = -1 + elseif facedir == 3 then + tailvec.x = -1 + else + --print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) + facedir = 0 + tailvec.z = 1 + end + local p = {x=pos.x, y=pos.y, z=pos.z} + minetest.set_node(p, {name="default:nyancat", param2=facedir}) + for i=1,length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name="default:nyancat_rainbow", param2=facedir}) + end +end + + +function default.generate_nyancats(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed + 9324342) + local max_num_nyancats = math.floor(volume / (16*16*16)) + for i=1,max_num_nyancats do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x=x0, y=y0, z=z0} + default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) + end + end +end + + +minetest.register_on_generated(default.generate_nyancats) diff --git a/mods/default/models/character.b3d b/mods/default/models/character.b3d new file mode 100644 index 0000000..bc9d927 Binary files /dev/null and b/mods/default/models/character.b3d differ diff --git a/mods/default/models/character.blend b/mods/default/models/character.blend new file mode 100644 index 0000000..34c5624 Binary files /dev/null and b/mods/default/models/character.blend differ diff --git a/mods/default/models/character.png b/mods/default/models/character.png new file mode 100644 index 0000000..0502178 Binary files /dev/null and b/mods/default/models/character.png differ diff --git a/mods/default/nodes - Copy.lua b/mods/default/nodes - Copy.lua new file mode 100644 index 0000000..31d61b5 --- /dev/null +++ b/mods/default/nodes - Copy.lua @@ -0,0 +1,1612 @@ +-- mods/default/nodes.lua + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) + +default:stone +default:cobble +default:stonebrick +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick + +default:sandstone +default:sandstonebrick + +default:obsidian +default:obsidianbrick + +Soft / Non-Stone +---------------- +(1. Material [2. Modified forms]) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_snow + +default:sand +default:desert_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pinetree +default:pinewood +default:pine_needles +default:pine_sapling + +Ores +---- +(1. In stone 2. Block) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife (non-cubic) +--------------------- +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- +default:torch + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall +default:ladder +default:fence_wood + +default:glass +default:obsidian_glass + +default:rail + +default:brick + +default:meselamp + +Misc +---- +default:cloud +default:nyancat +default:nyancat_rainbow + +--]] + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = "Stone Brick", + tiles = {"default_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = "Desert Stone Brick", + tiles = {"default_desert_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + is_ground_content = true, + groups = {crumbly=2,cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + tiles = {"default_sandstone_brick.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = "Dirt with Snow", + tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + }), +}) + + + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + + + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + is_ground_content = true, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), +}) + + + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults(), +}) + + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + is_ground_content = true, + paramtype = "light", + buildable_to = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, + }, + }, + groups = {crumbly=3,falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end, +}) + + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + is_ground_content = true, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), +}) + + + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="default:apple", param2=1}) + end + end, +}) + + + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = "Junglewood Planks", + tiles = {"default_junglewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_jungleleaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:junglesapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:jungleleaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = "Jungle Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + + + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:pine_sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:pine_needles"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), + light_source = 1, +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 3, +}) + + + + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + is_ground_content = true, + groups = {cracky=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + paramtype2 = "facedir", + is_ground_content = true, + groups = {snappy=1,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.3, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = {snappy=3,flammable=2,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:grass_1", { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, +}) + +for i=2,5 do + minetest.register_node("default:grass_"..i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_"..i..".png"}, + inventory_image = "default_grass_"..i..".png", + wield_image = "default_grass_"..i..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = "default:grass_1", + groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "torchlike", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_on_ceiling_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + }, + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + light_source = default.LIGHT_MAX - 1, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, + }, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), +}) + + + +local chest_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + +local function get_locked_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," ..pos.z + local formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + return formspec +end + +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest", { + description = "Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if has_locked_chest_privilege(meta, clicker) then + minetest.show_formspec( + clicker:get_player_name(), + "default:chest_locked", + get_locked_chest_formspec(pos) + ) + end + end, + on_blast = function() end, +}) + + + +local bookshelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;books;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bookshelf_formspec) + local inv = meta:get_inventory() + inv:set_size("books", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("books") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "books" then + if stack:get_name() == "default:book" and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "nodebox", + tiles = {"default_sign.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +}) + +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + + + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = "Obsidian Glass", + drawtype = "glasslike", + tiles = {"default_obsidian_glass.png"}, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + + + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")}, +}) + + + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("default:nyancat", { + description = "Nyan Cat", + tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", + "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + legacy_facedir_simple = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:nyancat_rainbow", { + description = "Nyan Cat Rainbow", + tiles = { + "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", + "default_nc_rb.png", "default_nc_rb.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_defaults(), +}) diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua new file mode 100644 index 0000000..3558e35 --- /dev/null +++ b/mods/default/nodes.lua @@ -0,0 +1,1742 @@ +-- mods/default/nodes.lua + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) + +default:stone +default:cobble +default:stonebrick +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick + +default:sandstone +default:sandstonebrick + +default:obsidian +default:obsidianbrick + +Soft / Non-Stone +---------------- +(1. Material [2. Modified forms]) + +default:dirt +default:dirt_with_grass +default:dirt_with_dry_grass +default:dirt_with_grass_footsteps +default:dirt_with_snow + +default:sand +default:desert_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pinetree +default:pinewood +default:pine_needles +default:pine_sapling + +default:acacia_tree +default:acacia_wood +default:acacia_leaves +default:acacia_sapling + +Ores +---- +(1. In stone 2. Block) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife (non-cubic) +--------------------- +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass + +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +default:dry_grass_1 +default:dry_grass_2 +default:dry_grass_3 +default:dry_grass_4 +default:dry_grass_5 + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- +default:torch + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall +default:ladder +default:fence_wood + +default:glass +default:obsidian_glass + +default:rail + +default:brick + +default:meselamp + +Misc +---- +default:cloud +default:nyancat +default:nyancat_rainbow + +--]] + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + groups = {cracky=3, stone=1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = false, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = "Stone Brick", + tiles = {"default_stone_brick.png"}, + is_ground_content = false, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = false, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + groups = {cracky=3, stone=1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = false, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = "Desert Stone Brick", + tiles = {"default_desert_stone_brick.png"}, + is_ground_content = false, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + groups = {crumbly=2,cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + tiles = {"default_sandstone_brick.png"}, + is_ground_content = false, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + is_ground_content = false, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + groups = {crumbly=3,soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_dry_grass", { + description = "Dirt with Dry Grass", + tiles = {"default_dry_grass.png", + "default_dirt.png", + "default_dirt.png^default_dry_grass_side.png" + }, + groups = {crumbly = 3, soil = 1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_grass_footstep", gain = 0.4}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = "Dirt with Snow", + tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + }), +}) + + + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + + + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), +}) + + + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + groups = {crumbly=3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults(), +}) + + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + paramtype = "light", + buildable_to = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + }, + }, + groups = {crumbly = 3, falling_node = 1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name = "default_snow_footstep", gain = 0.25}, + dug = {name = "default_snow_footstep", gain = 0.75}, + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name = "default:dirt_with_snow"}) + end + end, +}) + + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), +}) + + + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + special_tiles = {"default_leaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {dig_immediate=3,snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="default:apple", param2=1}) + end + end, +}) + + + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = "Junglewood Planks", + tiles = {"default_junglewood.png"}, + is_ground_content = false, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_jungleleaves.png"}, + special_tiles = {"default_jungleleaves_simple.png"}, + paramtype = "light", + is_ground_content = false, + groups = {dig_immediate=3,snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:junglesapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:jungleleaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = "Jungle Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + + + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = { + "default_pinetree_top.png", + "default_pinetree_top.png", + "default_pinetree.png" + }, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {dig_immediate=3,snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:pine_sapling"}, rarity = 20}, + {items = {"default:pine_needles"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = { + snappy = 2, + dig_immediate = 3, + flammable = 2, + attached_node = 1, + sapling = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:acacia_tree", { + description = "Acacia Tree", + tiles = { + "default_acacia_tree_top.png", + "default_acacia_tree_top.png", + "default_acacia_tree.png" + }, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:acacia_wood", { + description = "Acacia Wood Planks", + tiles = {"default_acacia_wood.png"}, + is_ground_content = false, + groups = {choppy = 2, oddly_breakable_by_hand = 2, flammable = 3, wood = 1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:acacia_leaves", { + description = "Acacia Leaves", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_acacia_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {dig_immediate=3,snappy = 3, leafdecay = 3, flammable = 2, leaves = 1}, + drop = { + max_items = 1, + items = { + {items = {"default:acacia_sapling"}, rarity = 20}, + {items = {"default:acacia_leaves"}} + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:acacia_sapling", { + description = "Acacia Tree Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_acacia_sapling.png"}, + inventory_image = "default_acacia_sapling.png", + wield_image = "default_acacia_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = { + snappy = 2, + dig_immediate = 3, + flammable = 2, + attached_node = 1, + sapling = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + groups = {cracky=2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = false, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + groups = {cracky=2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = false, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = false, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + paramtype = "light", + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), + light_source = 6, +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + paramtype = "light", + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 11, +}) + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + groups = {cracky=2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + is_ground_content = false, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + paramtype = "light", + light_source = 3, + groups = {cracky=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + paramtype = "light", + light_source = 6, + is_ground_content = false, + groups = {cracky=1,level=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + paramtype2 = "facedir", + groups = {dig_immediate=3,snappy=1,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {dig_immediate=3,snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {dig_immediate=3,snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.3, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {dig_immediate=3,snappy=3,flammable=2,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:grass_1", { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {dig_immediate=3,snappy=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, +}) + +for i=2,5 do + minetest.register_node("default:grass_"..i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_"..i..".png"}, + inventory_image = "default_grass_"..i..".png", + wield_image = "default_grass_"..i..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "default:grass_1", + groups = {dig_immediate=3,snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +minetest.register_node("default:dry_grass_1", { + description = "Dry Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_1.png"}, + inventory_image = "default_dry_grass_3.png", + wield_image = "default_dry_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {dig_immediate=3,snappy=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random dry grass node + local stack = ItemStack("default:dry_grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:dry_grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, +}) + +for i=2,5 do + minetest.register_node("default:dry_grass_"..i, { + description = "Dry Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_dry_grass_"..i..".png"}, + inventory_image = "default_dry_grass_"..i..".png", + wield_image = "default_dry_grass_"..i..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + groups = {dig_immediate=3,snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + drop = "default:dry_grass_1", + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "torchlike", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_on_ceiling_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + }, + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + light_source = default.LIGHT_MAX - 1, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, + }, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), +}) + + + +local chest_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listring[current_name;main]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0,4.85) + +local function get_locked_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," ..pos.z + local formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listring[nodemeta:".. spos .. ";main]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0,4.85) + return formspec +end + +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest", { + description = "Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if has_locked_chest_privilege(meta, clicker) then + minetest.show_formspec( + clicker:get_player_name(), + "default:chest_locked", + get_locked_chest_formspec(pos) + ) + end + end, + on_blast = function() end, +}) + + + +local bookshelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;books;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + "listring[context;books]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bookshelf_formspec) + local inv = meta:get_inventory() + inv:set_size("books", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("books") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "nodebox", + tiles = {"default_sign.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +}) + +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + + + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {dig_immediate=3,cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = "Obsidian Glass", + drawtype = "glasslike", + tiles = {"default_obsidian_glass.png"}, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + + + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")}, +}) + + + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + is_ground_content = false, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("default:nyancat", { + description = "Nyan Cat", + tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", + "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + legacy_facedir_simple = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:nyancat_rainbow", { + description = "Nyan Cat Rainbow", + tiles = { + "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", + "default_nc_rb.png", "default_nc_rb.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_defaults(), +}) diff --git a/mods/default/nodes.lua.WG b/mods/default/nodes.lua.WG new file mode 100644 index 0000000..6c4b3a6 --- /dev/null +++ b/mods/default/nodes.lua.WG @@ -0,0 +1,1621 @@ +-- mods/default/nodes.lua + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) + +default:stone +default:cobble +default:stonebrick +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick + +default:sandstone +default:sandstonebrick + +default:obsidian +default:obsidianbrick + +Soft / Non-Stone +---------------- +(1. Material [2. Modified forms]) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_snow + +default:sand +default:desert_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pinetree +default:pinewood +default:pine_needles +default:pine_sapling + +Ores +---- +(1. In stone 2. Block) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife (non-cubic) +--------------------- +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- +default:torch + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall +default:ladder +default:fence_wood + +default:glass +default:obsidian_glass + +default:rail + +default:brick + +default:meselamp + +Misc +---- +default:cloud +default:nyancat +default:nyancat_rainbow + +--]] + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = "Stone Brick", + tiles = {"default_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = "Desert Stone Brick", + tiles = {"default_desert_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + is_ground_content = true, + groups = {crumbly=2,cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + tiles = {"default_sandstone_brick.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = "Dirt with Snow", + tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + }), +}) + + + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + + + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + is_ground_content = true, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), +}) + + + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults(), +}) + + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + is_ground_content = true, + paramtype = "light", + buildable_to = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, + }, + }, + groups = {crumbly=3,falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end, +}) + + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + is_ground_content = true, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), +}) + + + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {dig_immediate=3,snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="default:apple", param2=1}) + end + end, +}) + + + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = "Junglewood Planks", + tiles = {"default_junglewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_jungleleaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:junglesapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:jungleleaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = "Jungle Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + + + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:pine_sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:pine_needles"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), + light_source = 5, +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 6, +}) + + + + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + paramtype = "light", + light_source = 1, + is_ground_content = true, + groups = {cracky=2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + paramtype = "light", + light_source = 2, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + paramtype = "light", + light_source = 3, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + paramtype = "light", + light_source = 4, + is_ground_content = true, + groups = {cracky=1,level=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + paramtype2 = "facedir", + is_ground_content = true, + groups = {snappy=1,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.3, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = {snappy=3,flammable=2,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:grass_1", { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {dig_immediate=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, +}) + +for i=2,5 do + minetest.register_node("default:grass_"..i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_"..i..".png"}, + inventory_image = "default_grass_"..i..".png", + wield_image = "default_grass_"..i..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = "default:grass_1", + groups = {dig_immediate=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "torchlike", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_on_ceiling_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + }, + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + light_source = default.LIGHT_MAX - 1, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, + }, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), +}) + +local chest_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listring[]" + default.get_hotbar_bg(0,4.85) + +local function get_locked_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," ..pos.z + local formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listring[]" + default.get_hotbar_bg(0,4.85) + return formspec +end + +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest", { + description = "Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if has_locked_chest_privilege(meta, clicker) then + minetest.show_formspec( + clicker:get_player_name(), + "default:chest_locked", + get_locked_chest_formspec(pos) + ) + end + end, + on_blast = function() end, +}) + + + +local bookshelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;books;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bookshelf_formspec) + local inv = meta:get_inventory() + inv:set_size("books", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("books") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "books" then + if stack:get_name() == "default:book" and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "nodebox", + tiles = {"default_sign.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +}) + +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + + + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = "Obsidian Glass", + drawtype = "glasslike", + tiles = {"default_obsidian_glass.png"}, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + + + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")}, +}) + + + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("default:nyancat", { + description = "Nyan Cat", + tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", + "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + legacy_facedir_simple = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:nyancat_rainbow", { + description = "Nyan Cat Rainbow", + tiles = { + "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", + "default_nc_rb.png", "default_nc_rb.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_defaults(), +}) diff --git a/mods/default/player.lua b/mods/default/player.lua new file mode 100644 index 0000000..e4fb2ad --- /dev/null +++ b/mods/default/player.lua @@ -0,0 +1,159 @@ +-- Minetest 0.4 mod: player +-- See README.txt for licensing and other information. + +-- Player animation blending +-- Note: This is currently broken due to a bug in Irrlicht, leave at 0 +local animation_blend = 0 + +default.registered_player_models = { } + +-- Local for speed. +local models = default.registered_player_models + +function default.player_register_model(name, def) + models[name] = def +end + +-- Default player appearance +default.player_register_model("character.b3d", { + animation_speed = 30, + textures = {"character.png", }, + animations = { + -- Standard animations. + stand = { x= 0, y= 79, }, + lay = { x=162, y=166, }, + walk = { x=168, y=187, }, + mine = { x=189, y=198, }, + walk_mine = { x=200, y=219, }, + -- Extra animations (not currently used by the game). + sit = { x= 81, y=160, }, + }, +}) + +-- Player stats and animations +local player_model = {} +local player_textures = {} +local player_anim = {} +local player_sneak = {} +default.player_attached = {} + +function default.player_get_animation(player) + local name = player:get_player_name() + return { + model = player_model[name], + textures = player_textures[name], + animation = player_anim[name], + } +end + +-- Called when a player's appearance needs to be updated +function default.player_set_model(player, model_name) + local name = player:get_player_name() + local model = models[model_name] + if model then + if player_model[name] == model_name then + return + end + player:set_properties({ + mesh = model_name, + textures = player_textures[name] or model.textures, + visual = "mesh", + visual_size = model.visual_size or {x=1, y=1}, + }) + default.player_set_animation(player, "stand") + else + player:set_properties({ + textures = { "player.png", "player_back.png", }, + visual = "upright_sprite", + }) + end + player_model[name] = model_name +end + +function default.player_set_textures(player, textures) + local name = player:get_player_name() + player_textures[name] = textures + player:set_properties({textures = textures,}) +end + +function default.player_set_animation(player, anim_name, speed) + local name = player:get_player_name() + if player_anim[name] == anim_name then + return + end + local model = player_model[name] and models[player_model[name]] + if not (model and model.animations[anim_name]) then + return + end + local anim = model.animations[anim_name] + player_anim[name] = anim_name + player:set_animation(anim, speed or model.animation_speed, animation_blend) +end + +-- Update appearance when the player joins +minetest.register_on_joinplayer(function(player) + default.player_attached[player:get_player_name()] = false + default.player_set_model(player, "character.b3d") + player:set_local_animation({x=0, y=79}, {x=168, y=187}, {x=189, y=198}, {x=200, y=219}, 30) + + -- set GUI + if not minetest.setting_getbool("creative_mode") then + player:set_inventory_formspec(default.gui_survival_form) + end + player:hud_set_hotbar_image("gui_hotbar.png") + player:hud_set_hotbar_selected_image("gui_hotbar_selected.png") +end) + +minetest.register_on_leaveplayer(function(player) + local name = player:get_player_name() + player_model[name] = nil + player_anim[name] = nil + player_textures[name] = nil +end) + +-- Localize for better performance. +local player_set_animation = default.player_set_animation +local player_attached = default.player_attached + +-- Check each player and apply animations +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local name = player:get_player_name() + local model_name = player_model[name] + local model = model_name and models[model_name] + if model and not player_attached[name] then + local controls = player:get_player_control() + local walking = false + local animation_speed_mod = model.animation_speed or 30 + + -- Determine if the player is walking + if controls.up or controls.down or controls.left or controls.right then + walking = true + end + + -- Determine if the player is sneaking, and reduce animation speed if so + if controls.sneak then + animation_speed_mod = animation_speed_mod / 2 + end + + -- Apply animations based on what the player is doing + if player:get_hp() == 0 then + player_set_animation(player, "lay") + elseif walking then + if player_sneak[name] ~= controls.sneak then + player_anim[name] = nil + player_sneak[name] = controls.sneak + end + if controls.LMB then + player_set_animation(player, "walk_mine", animation_speed_mod) + else + player_set_animation(player, "walk", animation_speed_mod) + end + elseif controls.LMB then + player_set_animation(player, "mine") + else + player_set_animation(player, "stand", animation_speed_mod) + end + end + end +end) diff --git a/mods/default/sounds/default_break_glass.1.ogg b/mods/default/sounds/default_break_glass.1.ogg new file mode 100644 index 0000000..b1ccc5f Binary files /dev/null and b/mods/default/sounds/default_break_glass.1.ogg differ diff --git a/mods/default/sounds/default_break_glass.2.ogg b/mods/default/sounds/default_break_glass.2.ogg new file mode 100644 index 0000000..b6cc9e8 Binary files /dev/null and b/mods/default/sounds/default_break_glass.2.ogg differ diff --git a/mods/default/sounds/default_break_glass.3.ogg b/mods/default/sounds/default_break_glass.3.ogg new file mode 100644 index 0000000..ae6a6bf Binary files /dev/null and b/mods/default/sounds/default_break_glass.3.ogg differ diff --git a/mods/default/sounds/default_cool_lava.1.ogg b/mods/default/sounds/default_cool_lava.1.ogg new file mode 100644 index 0000000..42506dd Binary files /dev/null and b/mods/default/sounds/default_cool_lava.1.ogg differ diff --git a/mods/default/sounds/default_cool_lava.2.ogg b/mods/default/sounds/default_cool_lava.2.ogg new file mode 100644 index 0000000..2747ab8 Binary files /dev/null and b/mods/default/sounds/default_cool_lava.2.ogg differ diff --git a/mods/default/sounds/default_cool_lava.3.ogg b/mods/default/sounds/default_cool_lava.3.ogg new file mode 100644 index 0000000..8baeac3 Binary files /dev/null and b/mods/default/sounds/default_cool_lava.3.ogg differ diff --git a/mods/default/sounds/default_dig_choppy.ogg b/mods/default/sounds/default_dig_choppy.ogg new file mode 100644 index 0000000..e2ecd84 Binary files /dev/null and b/mods/default/sounds/default_dig_choppy.ogg differ diff --git a/mods/default/sounds/default_dig_cracky.ogg b/mods/default/sounds/default_dig_cracky.ogg new file mode 100644 index 0000000..da11679 Binary files /dev/null and b/mods/default/sounds/default_dig_cracky.ogg differ diff --git a/mods/default/sounds/default_dig_crumbly.ogg b/mods/default/sounds/default_dig_crumbly.ogg new file mode 100644 index 0000000..a0b2a1f Binary files /dev/null and b/mods/default/sounds/default_dig_crumbly.ogg differ diff --git a/mods/default/sounds/default_dig_dig_immediate.ogg b/mods/default/sounds/default_dig_dig_immediate.ogg new file mode 100644 index 0000000..e65d766 Binary files /dev/null and b/mods/default/sounds/default_dig_dig_immediate.ogg differ diff --git a/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg b/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg new file mode 100644 index 0000000..ef4d7b1 Binary files /dev/null and b/mods/default/sounds/default_dig_oddly_breakable_by_hand.ogg differ diff --git a/mods/default/sounds/default_dirt_footstep.1.ogg b/mods/default/sounds/default_dirt_footstep.1.ogg new file mode 100644 index 0000000..84a197d Binary files /dev/null and b/mods/default/sounds/default_dirt_footstep.1.ogg differ diff --git a/mods/default/sounds/default_dirt_footstep.2.ogg b/mods/default/sounds/default_dirt_footstep.2.ogg new file mode 100644 index 0000000..2e23b8a Binary files /dev/null and b/mods/default/sounds/default_dirt_footstep.2.ogg differ diff --git a/mods/default/sounds/default_dug_node.1.ogg b/mods/default/sounds/default_dug_node.1.ogg new file mode 100644 index 0000000..c04975d Binary files /dev/null and b/mods/default/sounds/default_dug_node.1.ogg differ diff --git a/mods/default/sounds/default_dug_node.2.ogg b/mods/default/sounds/default_dug_node.2.ogg new file mode 100644 index 0000000..9f20926 Binary files /dev/null and b/mods/default/sounds/default_dug_node.2.ogg differ diff --git a/mods/default/sounds/default_glass_footstep.ogg b/mods/default/sounds/default_glass_footstep.ogg new file mode 100644 index 0000000..191287a Binary files /dev/null and b/mods/default/sounds/default_glass_footstep.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.1.ogg b/mods/default/sounds/default_grass_footstep.1.ogg new file mode 100644 index 0000000..22d1ad6 Binary files /dev/null and b/mods/default/sounds/default_grass_footstep.1.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.2.ogg b/mods/default/sounds/default_grass_footstep.2.ogg new file mode 100644 index 0000000..4ccd8a0 Binary files /dev/null and b/mods/default/sounds/default_grass_footstep.2.ogg differ diff --git a/mods/default/sounds/default_grass_footstep.3.ogg b/mods/default/sounds/default_grass_footstep.3.ogg new file mode 100644 index 0000000..20db84e Binary files /dev/null and b/mods/default/sounds/default_grass_footstep.3.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.1.ogg b/mods/default/sounds/default_gravel_footstep.1.ogg new file mode 100644 index 0000000..8d260ce Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.1.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.2.ogg b/mods/default/sounds/default_gravel_footstep.2.ogg new file mode 100644 index 0000000..2aba2c6 Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.2.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.3.ogg b/mods/default/sounds/default_gravel_footstep.3.ogg new file mode 100644 index 0000000..1bcd8a1 Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.3.ogg differ diff --git a/mods/default/sounds/default_gravel_footstep.4.ogg b/mods/default/sounds/default_gravel_footstep.4.ogg new file mode 100644 index 0000000..696c9ff Binary files /dev/null and b/mods/default/sounds/default_gravel_footstep.4.ogg differ diff --git a/mods/default/sounds/default_hard_footstep.1.ogg b/mods/default/sounds/default_hard_footstep.1.ogg new file mode 100644 index 0000000..1748bc5 Binary files /dev/null and b/mods/default/sounds/default_hard_footstep.1.ogg differ diff --git a/mods/default/sounds/default_hard_footstep.2.ogg b/mods/default/sounds/default_hard_footstep.2.ogg new file mode 100644 index 0000000..fe39fd7 Binary files /dev/null and b/mods/default/sounds/default_hard_footstep.2.ogg differ diff --git a/mods/default/sounds/default_hard_footstep.3.ogg b/mods/default/sounds/default_hard_footstep.3.ogg new file mode 100644 index 0000000..5030e06 Binary files /dev/null and b/mods/default/sounds/default_hard_footstep.3.ogg differ diff --git a/mods/default/sounds/default_place_node.1.ogg b/mods/default/sounds/default_place_node.1.ogg new file mode 100644 index 0000000..46b9756 Binary files /dev/null and b/mods/default/sounds/default_place_node.1.ogg differ diff --git a/mods/default/sounds/default_place_node.2.ogg b/mods/default/sounds/default_place_node.2.ogg new file mode 100644 index 0000000..d34c01a Binary files /dev/null and b/mods/default/sounds/default_place_node.2.ogg differ diff --git a/mods/default/sounds/default_place_node.3.ogg b/mods/default/sounds/default_place_node.3.ogg new file mode 100644 index 0000000..fc29365 Binary files /dev/null and b/mods/default/sounds/default_place_node.3.ogg differ diff --git a/mods/default/sounds/default_place_node_hard.1.ogg b/mods/default/sounds/default_place_node_hard.1.ogg new file mode 100644 index 0000000..76eecf9 Binary files /dev/null and b/mods/default/sounds/default_place_node_hard.1.ogg differ diff --git a/mods/default/sounds/default_place_node_hard.2.ogg b/mods/default/sounds/default_place_node_hard.2.ogg new file mode 100644 index 0000000..1d3b3de Binary files /dev/null and b/mods/default/sounds/default_place_node_hard.2.ogg differ diff --git a/mods/default/sounds/default_sand_footstep.1.ogg b/mods/default/sounds/default_sand_footstep.1.ogg new file mode 100644 index 0000000..65b68c7 Binary files /dev/null and b/mods/default/sounds/default_sand_footstep.1.ogg differ diff --git a/mods/default/sounds/default_sand_footstep.2.ogg b/mods/default/sounds/default_sand_footstep.2.ogg new file mode 100644 index 0000000..57f35f3 Binary files /dev/null and b/mods/default/sounds/default_sand_footstep.2.ogg differ diff --git a/mods/default/sounds/default_snow_footstep.1.ogg b/mods/default/sounds/default_snow_footstep.1.ogg new file mode 100644 index 0000000..3260b91 Binary files /dev/null and b/mods/default/sounds/default_snow_footstep.1.ogg differ diff --git a/mods/default/sounds/default_snow_footstep.2.ogg b/mods/default/sounds/default_snow_footstep.2.ogg new file mode 100644 index 0000000..4aac1e7 Binary files /dev/null and b/mods/default/sounds/default_snow_footstep.2.ogg differ diff --git a/mods/default/sounds/default_snow_footstep.3.ogg b/mods/default/sounds/default_snow_footstep.3.ogg new file mode 100644 index 0000000..cf4235b Binary files /dev/null and b/mods/default/sounds/default_snow_footstep.3.ogg differ diff --git a/mods/default/sounds/default_wood_footstep.1.ogg b/mods/default/sounds/default_wood_footstep.1.ogg new file mode 100644 index 0000000..34f63a1 Binary files /dev/null and b/mods/default/sounds/default_wood_footstep.1.ogg differ diff --git a/mods/default/sounds/default_wood_footstep.2.ogg b/mods/default/sounds/default_wood_footstep.2.ogg new file mode 100644 index 0000000..124fc29 Binary files /dev/null and b/mods/default/sounds/default_wood_footstep.2.ogg differ diff --git a/mods/default/textures/bubble.png b/mods/default/textures/bubble.png new file mode 100644 index 0000000..100fe15 Binary files /dev/null and b/mods/default/textures/bubble.png differ diff --git a/mods/default/textures/crack_anylength.png b/mods/default/textures/crack_anylength.png new file mode 100644 index 0000000..297eced Binary files /dev/null and b/mods/default/textures/crack_anylength.png differ diff --git a/mods/default/textures/default_acacia_leaves.png b/mods/default/textures/default_acacia_leaves.png new file mode 100644 index 0000000..626e1b3 Binary files /dev/null and b/mods/default/textures/default_acacia_leaves.png differ diff --git a/mods/default/textures/default_acacia_sapling.png b/mods/default/textures/default_acacia_sapling.png new file mode 100644 index 0000000..07170a0 Binary files /dev/null and b/mods/default/textures/default_acacia_sapling.png differ diff --git a/mods/default/textures/default_acacia_tree.png b/mods/default/textures/default_acacia_tree.png new file mode 100644 index 0000000..169823d Binary files /dev/null and b/mods/default/textures/default_acacia_tree.png differ diff --git a/mods/default/textures/default_acacia_tree_top.png b/mods/default/textures/default_acacia_tree_top.png new file mode 100644 index 0000000..2cf5ef0 Binary files /dev/null and b/mods/default/textures/default_acacia_tree_top.png differ diff --git a/mods/default/textures/default_acacia_wood.png b/mods/default/textures/default_acacia_wood.png new file mode 100644 index 0000000..b5abf1e Binary files /dev/null and b/mods/default/textures/default_acacia_wood.png differ diff --git a/mods/default/textures/default_apple.png b/mods/default/textures/default_apple.png new file mode 100644 index 0000000..7549bfd Binary files /dev/null and b/mods/default/textures/default_apple.png differ diff --git a/mods/default/textures/default_book.png b/mods/default/textures/default_book.png new file mode 100644 index 0000000..15af2b6 Binary files /dev/null and b/mods/default/textures/default_book.png differ diff --git a/mods/default/textures/default_bookshelf.png b/mods/default/textures/default_bookshelf.png new file mode 100644 index 0000000..10d6483 Binary files /dev/null and b/mods/default/textures/default_bookshelf.png differ diff --git a/mods/default/textures/default_brick.png b/mods/default/textures/default_brick.png new file mode 100644 index 0000000..ab19121 Binary files /dev/null and b/mods/default/textures/default_brick.png differ diff --git a/mods/default/textures/default_brick_normal.png b/mods/default/textures/default_brick_normal.png new file mode 100644 index 0000000..9947439 Binary files /dev/null and b/mods/default/textures/default_brick_normal.png differ diff --git a/mods/default/textures/default_bronze_block.png b/mods/default/textures/default_bronze_block.png new file mode 100644 index 0000000..1d0c9d5 Binary files /dev/null and b/mods/default/textures/default_bronze_block.png differ diff --git a/mods/default/textures/default_bronze_ingot.png b/mods/default/textures/default_bronze_ingot.png new file mode 100644 index 0000000..6cccdf6 Binary files /dev/null and b/mods/default/textures/default_bronze_ingot.png differ diff --git a/mods/default/textures/default_cactus_side.png b/mods/default/textures/default_cactus_side.png new file mode 100644 index 0000000..8d6c40c Binary files /dev/null and b/mods/default/textures/default_cactus_side.png differ diff --git a/mods/default/textures/default_cactus_top.png b/mods/default/textures/default_cactus_top.png new file mode 100644 index 0000000..cf46aa2 Binary files /dev/null and b/mods/default/textures/default_cactus_top.png differ diff --git a/mods/default/textures/default_chest_front.png b/mods/default/textures/default_chest_front.png new file mode 100644 index 0000000..85227d8 Binary files /dev/null and b/mods/default/textures/default_chest_front.png differ diff --git a/mods/default/textures/default_chest_lock.png b/mods/default/textures/default_chest_lock.png new file mode 100644 index 0000000..73f46c7 Binary files /dev/null and b/mods/default/textures/default_chest_lock.png differ diff --git a/mods/default/textures/default_chest_side.png b/mods/default/textures/default_chest_side.png new file mode 100644 index 0000000..44a65a4 Binary files /dev/null and b/mods/default/textures/default_chest_side.png differ diff --git a/mods/default/textures/default_chest_top.png b/mods/default/textures/default_chest_top.png new file mode 100644 index 0000000..f1a5cb5 Binary files /dev/null and b/mods/default/textures/default_chest_top.png differ diff --git a/mods/default/textures/default_clay.png b/mods/default/textures/default_clay.png new file mode 100644 index 0000000..76e5a40 Binary files /dev/null and b/mods/default/textures/default_clay.png differ diff --git a/mods/default/textures/default_clay_brick.png b/mods/default/textures/default_clay_brick.png new file mode 100644 index 0000000..dc7a431 Binary files /dev/null and b/mods/default/textures/default_clay_brick.png differ diff --git a/mods/default/textures/default_clay_lump.png b/mods/default/textures/default_clay_lump.png new file mode 100644 index 0000000..c1d0220 Binary files /dev/null and b/mods/default/textures/default_clay_lump.png differ diff --git a/mods/default/textures/default_cloud.png b/mods/default/textures/default_cloud.png new file mode 100644 index 0000000..faf0ec1 Binary files /dev/null and b/mods/default/textures/default_cloud.png differ diff --git a/mods/default/textures/default_coal_block.png b/mods/default/textures/default_coal_block.png new file mode 100644 index 0000000..6fe9ed9 Binary files /dev/null and b/mods/default/textures/default_coal_block.png differ diff --git a/mods/default/textures/default_coal_lump.png b/mods/default/textures/default_coal_lump.png new file mode 100644 index 0000000..792961d Binary files /dev/null and b/mods/default/textures/default_coal_lump.png differ diff --git a/mods/default/textures/default_cobble.png b/mods/default/textures/default_cobble.png new file mode 100644 index 0000000..d379840 Binary files /dev/null and b/mods/default/textures/default_cobble.png differ diff --git a/mods/default/textures/default_cobble_normal.png b/mods/default/textures/default_cobble_normal.png new file mode 100644 index 0000000..37de21e Binary files /dev/null and b/mods/default/textures/default_cobble_normal.png differ diff --git a/mods/default/textures/default_copper_block.png b/mods/default/textures/default_copper_block.png new file mode 100644 index 0000000..8533754 Binary files /dev/null and b/mods/default/textures/default_copper_block.png differ diff --git a/mods/default/textures/default_copper_ingot.png b/mods/default/textures/default_copper_ingot.png new file mode 100644 index 0000000..bcad9c0 Binary files /dev/null and b/mods/default/textures/default_copper_ingot.png differ diff --git a/mods/default/textures/default_copper_lump.png b/mods/default/textures/default_copper_lump.png new file mode 100644 index 0000000..998c592 Binary files /dev/null and b/mods/default/textures/default_copper_lump.png differ diff --git a/mods/default/textures/default_desert_cobble.png b/mods/default/textures/default_desert_cobble.png new file mode 100644 index 0000000..f914c98 Binary files /dev/null and b/mods/default/textures/default_desert_cobble.png differ diff --git a/mods/default/textures/default_desert_sand.png b/mods/default/textures/default_desert_sand.png new file mode 100644 index 0000000..371b8c7 Binary files /dev/null and b/mods/default/textures/default_desert_sand.png differ diff --git a/mods/default/textures/default_desert_sand_normal.png b/mods/default/textures/default_desert_sand_normal.png new file mode 100644 index 0000000..b0b7932 Binary files /dev/null and b/mods/default/textures/default_desert_sand_normal.png differ diff --git a/mods/default/textures/default_desert_stone.png b/mods/default/textures/default_desert_stone.png new file mode 100644 index 0000000..5d3aded Binary files /dev/null and b/mods/default/textures/default_desert_stone.png differ diff --git a/mods/default/textures/default_desert_stone_brick.png b/mods/default/textures/default_desert_stone_brick.png new file mode 100644 index 0000000..cc0f04a Binary files /dev/null and b/mods/default/textures/default_desert_stone_brick.png differ diff --git a/mods/default/textures/default_desert_stone_normal.png b/mods/default/textures/default_desert_stone_normal.png new file mode 100644 index 0000000..e245682 Binary files /dev/null and b/mods/default/textures/default_desert_stone_normal.png differ diff --git a/mods/default/textures/default_diamond.png b/mods/default/textures/default_diamond.png new file mode 100644 index 0000000..a8dac74 Binary files /dev/null and b/mods/default/textures/default_diamond.png differ diff --git a/mods/default/textures/default_diamond_block.png b/mods/default/textures/default_diamond_block.png new file mode 100644 index 0000000..69e10ee Binary files /dev/null and b/mods/default/textures/default_diamond_block.png differ diff --git a/mods/default/textures/default_dirt.png b/mods/default/textures/default_dirt.png new file mode 100644 index 0000000..ca7e4ae Binary files /dev/null and b/mods/default/textures/default_dirt.png differ diff --git a/mods/default/textures/default_dry_grass.png b/mods/default/textures/default_dry_grass.png new file mode 100644 index 0000000..03455c3 Binary files /dev/null and b/mods/default/textures/default_dry_grass.png differ diff --git a/mods/default/textures/default_dry_grass_1.png b/mods/default/textures/default_dry_grass_1.png new file mode 100644 index 0000000..5cf68a3 Binary files /dev/null and b/mods/default/textures/default_dry_grass_1.png differ diff --git a/mods/default/textures/default_dry_grass_2.png b/mods/default/textures/default_dry_grass_2.png new file mode 100644 index 0000000..c925ace Binary files /dev/null and b/mods/default/textures/default_dry_grass_2.png differ diff --git a/mods/default/textures/default_dry_grass_3.png b/mods/default/textures/default_dry_grass_3.png new file mode 100644 index 0000000..4e4d84e Binary files /dev/null and b/mods/default/textures/default_dry_grass_3.png differ diff --git a/mods/default/textures/default_dry_grass_4.png b/mods/default/textures/default_dry_grass_4.png new file mode 100644 index 0000000..d315849 Binary files /dev/null and b/mods/default/textures/default_dry_grass_4.png differ diff --git a/mods/default/textures/default_dry_grass_5.png b/mods/default/textures/default_dry_grass_5.png new file mode 100644 index 0000000..871d04c Binary files /dev/null and b/mods/default/textures/default_dry_grass_5.png differ diff --git a/mods/default/textures/default_dry_grass_side.png b/mods/default/textures/default_dry_grass_side.png new file mode 100644 index 0000000..27f4d96 Binary files /dev/null and b/mods/default/textures/default_dry_grass_side.png differ diff --git a/mods/default/textures/default_dry_shrub.png b/mods/default/textures/default_dry_shrub.png new file mode 100644 index 0000000..e8a7f27 Binary files /dev/null and b/mods/default/textures/default_dry_shrub.png differ diff --git a/mods/default/textures/default_fence_overlay.png b/mods/default/textures/default_fence_overlay.png new file mode 100644 index 0000000..718184c Binary files /dev/null and b/mods/default/textures/default_fence_overlay.png differ diff --git a/mods/default/textures/default_furnace_bottom.png b/mods/default/textures/default_furnace_bottom.png new file mode 100644 index 0000000..b79ed06 Binary files /dev/null and b/mods/default/textures/default_furnace_bottom.png differ diff --git a/mods/default/textures/default_furnace_fire_bg.png b/mods/default/textures/default_furnace_fire_bg.png new file mode 100644 index 0000000..126204a Binary files /dev/null and b/mods/default/textures/default_furnace_fire_bg.png differ diff --git a/mods/default/textures/default_furnace_fire_fg.png b/mods/default/textures/default_furnace_fire_fg.png new file mode 100644 index 0000000..63888f3 Binary files /dev/null and b/mods/default/textures/default_furnace_fire_fg.png differ diff --git a/mods/default/textures/default_furnace_front.png b/mods/default/textures/default_furnace_front.png new file mode 100644 index 0000000..8c1798e Binary files /dev/null and b/mods/default/textures/default_furnace_front.png differ diff --git a/mods/default/textures/default_furnace_front_active.png b/mods/default/textures/default_furnace_front_active.png new file mode 100644 index 0000000..ea43ed9 Binary files /dev/null and b/mods/default/textures/default_furnace_front_active.png differ diff --git a/mods/default/textures/default_furnace_side.png b/mods/default/textures/default_furnace_side.png new file mode 100644 index 0000000..33408cf Binary files /dev/null and b/mods/default/textures/default_furnace_side.png differ diff --git a/mods/default/textures/default_furnace_top.png b/mods/default/textures/default_furnace_top.png new file mode 100644 index 0000000..b79ed06 Binary files /dev/null and b/mods/default/textures/default_furnace_top.png differ diff --git a/mods/default/textures/default_glass.png b/mods/default/textures/default_glass.png new file mode 100644 index 0000000..2a052cc Binary files /dev/null and b/mods/default/textures/default_glass.png differ diff --git a/mods/default/textures/default_glass_detail.png b/mods/default/textures/default_glass_detail.png new file mode 100644 index 0000000..6ef9834 Binary files /dev/null and b/mods/default/textures/default_glass_detail.png differ diff --git a/mods/default/textures/default_gold_block.png b/mods/default/textures/default_gold_block.png new file mode 100644 index 0000000..170d50b Binary files /dev/null and b/mods/default/textures/default_gold_block.png differ diff --git a/mods/default/textures/default_gold_ingot.png b/mods/default/textures/default_gold_ingot.png new file mode 100644 index 0000000..ba66471 Binary files /dev/null and b/mods/default/textures/default_gold_ingot.png differ diff --git a/mods/default/textures/default_gold_lump.png b/mods/default/textures/default_gold_lump.png new file mode 100644 index 0000000..d5a1be7 Binary files /dev/null and b/mods/default/textures/default_gold_lump.png differ diff --git a/mods/default/textures/default_grass.png b/mods/default/textures/default_grass.png new file mode 100644 index 0000000..7c17c6f Binary files /dev/null and b/mods/default/textures/default_grass.png differ diff --git a/mods/default/textures/default_grass_1.png b/mods/default/textures/default_grass_1.png new file mode 100644 index 0000000..5052930 Binary files /dev/null and b/mods/default/textures/default_grass_1.png differ diff --git a/mods/default/textures/default_grass_2.png b/mods/default/textures/default_grass_2.png new file mode 100644 index 0000000..9d99a6a Binary files /dev/null and b/mods/default/textures/default_grass_2.png differ diff --git a/mods/default/textures/default_grass_3.png b/mods/default/textures/default_grass_3.png new file mode 100644 index 0000000..4833df4 Binary files /dev/null and b/mods/default/textures/default_grass_3.png differ diff --git a/mods/default/textures/default_grass_4.png b/mods/default/textures/default_grass_4.png new file mode 100644 index 0000000..1496fb1 Binary files /dev/null and b/mods/default/textures/default_grass_4.png differ diff --git a/mods/default/textures/default_grass_5.png b/mods/default/textures/default_grass_5.png new file mode 100644 index 0000000..a212535 Binary files /dev/null and b/mods/default/textures/default_grass_5.png differ diff --git a/mods/default/textures/default_grass_footsteps.png b/mods/default/textures/default_grass_footsteps.png new file mode 100644 index 0000000..3741a0b Binary files /dev/null and b/mods/default/textures/default_grass_footsteps.png differ diff --git a/mods/default/textures/default_grass_side.png b/mods/default/textures/default_grass_side.png new file mode 100644 index 0000000..87ae3ca Binary files /dev/null and b/mods/default/textures/default_grass_side.png differ diff --git a/mods/default/textures/default_gravel.png b/mods/default/textures/default_gravel.png new file mode 100644 index 0000000..ad48fa4 Binary files /dev/null and b/mods/default/textures/default_gravel.png differ diff --git a/mods/default/textures/default_ice.png b/mods/default/textures/default_ice.png new file mode 100644 index 0000000..2046eac Binary files /dev/null and b/mods/default/textures/default_ice.png differ diff --git a/mods/default/textures/default_iron_lump.png b/mods/default/textures/default_iron_lump.png new file mode 100644 index 0000000..db61a94 Binary files /dev/null and b/mods/default/textures/default_iron_lump.png differ diff --git a/mods/default/textures/default_junglegrass.png b/mods/default/textures/default_junglegrass.png new file mode 100644 index 0000000..25abb71 Binary files /dev/null and b/mods/default/textures/default_junglegrass.png differ diff --git a/mods/default/textures/default_jungleleaves.png b/mods/default/textures/default_jungleleaves.png new file mode 100644 index 0000000..870b4bb Binary files /dev/null and b/mods/default/textures/default_jungleleaves.png differ diff --git a/mods/default/textures/default_jungleleaves_simple.png b/mods/default/textures/default_jungleleaves_simple.png new file mode 100644 index 0000000..689195f Binary files /dev/null and b/mods/default/textures/default_jungleleaves_simple.png differ diff --git a/mods/default/textures/default_junglesapling.png b/mods/default/textures/default_junglesapling.png new file mode 100644 index 0000000..05e1e50 Binary files /dev/null and b/mods/default/textures/default_junglesapling.png differ diff --git a/mods/default/textures/default_jungletree.png b/mods/default/textures/default_jungletree.png new file mode 100644 index 0000000..bf0403e Binary files /dev/null and b/mods/default/textures/default_jungletree.png differ diff --git a/mods/default/textures/default_jungletree_top.png b/mods/default/textures/default_jungletree_top.png new file mode 100644 index 0000000..e3a3ccc Binary files /dev/null and b/mods/default/textures/default_jungletree_top.png differ diff --git a/mods/default/textures/default_junglewood.png b/mods/default/textures/default_junglewood.png new file mode 100644 index 0000000..6198d26 Binary files /dev/null and b/mods/default/textures/default_junglewood.png differ diff --git a/mods/default/textures/default_ladder.png b/mods/default/textures/default_ladder.png new file mode 100644 index 0000000..c167fff Binary files /dev/null and b/mods/default/textures/default_ladder.png differ diff --git a/mods/default/textures/default_lava.png b/mods/default/textures/default_lava.png new file mode 100644 index 0000000..b0d429e Binary files /dev/null and b/mods/default/textures/default_lava.png differ diff --git a/mods/default/textures/default_lava_flowing_animated.png b/mods/default/textures/default_lava_flowing_animated.png new file mode 100644 index 0000000..2ec0746 Binary files /dev/null and b/mods/default/textures/default_lava_flowing_animated.png differ diff --git a/mods/default/textures/default_lava_source_animated.png b/mods/default/textures/default_lava_source_animated.png new file mode 100644 index 0000000..32267a6 Binary files /dev/null and b/mods/default/textures/default_lava_source_animated.png differ diff --git a/mods/default/textures/default_leaves.png b/mods/default/textures/default_leaves.png new file mode 100644 index 0000000..e39535c Binary files /dev/null and b/mods/default/textures/default_leaves.png differ diff --git a/mods/default/textures/default_leaves_simple.png b/mods/default/textures/default_leaves_simple.png new file mode 100644 index 0000000..e492a32 Binary files /dev/null and b/mods/default/textures/default_leaves_simple.png differ diff --git a/mods/default/textures/default_mese_block.png b/mods/default/textures/default_mese_block.png new file mode 100644 index 0000000..2e6895d Binary files /dev/null and b/mods/default/textures/default_mese_block.png differ diff --git a/mods/default/textures/default_mese_crystal.png b/mods/default/textures/default_mese_crystal.png new file mode 100644 index 0000000..f1d71f1 Binary files /dev/null and b/mods/default/textures/default_mese_crystal.png differ diff --git a/mods/default/textures/default_mese_crystal_fragment.png b/mods/default/textures/default_mese_crystal_fragment.png new file mode 100644 index 0000000..d5416ab Binary files /dev/null and b/mods/default/textures/default_mese_crystal_fragment.png differ diff --git a/mods/default/textures/default_meselamp.png b/mods/default/textures/default_meselamp.png new file mode 100644 index 0000000..b227a25 Binary files /dev/null and b/mods/default/textures/default_meselamp.png differ diff --git a/mods/default/textures/default_mineral_coal.png b/mods/default/textures/default_mineral_coal.png new file mode 100644 index 0000000..f0c6d4d Binary files /dev/null and b/mods/default/textures/default_mineral_coal.png differ diff --git a/mods/default/textures/default_mineral_coal_normal.png b/mods/default/textures/default_mineral_coal_normal.png new file mode 100644 index 0000000..8d685f9 Binary files /dev/null and b/mods/default/textures/default_mineral_coal_normal.png differ diff --git a/mods/default/textures/default_mineral_copper.png b/mods/default/textures/default_mineral_copper.png new file mode 100644 index 0000000..c4c518e Binary files /dev/null and b/mods/default/textures/default_mineral_copper.png differ diff --git a/mods/default/textures/default_mineral_copper_normal.png b/mods/default/textures/default_mineral_copper_normal.png new file mode 100644 index 0000000..a6d1795 Binary files /dev/null and b/mods/default/textures/default_mineral_copper_normal.png differ diff --git a/mods/default/textures/default_mineral_diamond.png b/mods/default/textures/default_mineral_diamond.png new file mode 100644 index 0000000..4f4c764 Binary files /dev/null and b/mods/default/textures/default_mineral_diamond.png differ diff --git a/mods/default/textures/default_mineral_diamond_normal.png b/mods/default/textures/default_mineral_diamond_normal.png new file mode 100644 index 0000000..8d685f9 Binary files /dev/null and b/mods/default/textures/default_mineral_diamond_normal.png differ diff --git a/mods/default/textures/default_mineral_gold.png b/mods/default/textures/default_mineral_gold.png new file mode 100644 index 0000000..35276a9 Binary files /dev/null and b/mods/default/textures/default_mineral_gold.png differ diff --git a/mods/default/textures/default_mineral_gold_normal.png b/mods/default/textures/default_mineral_gold_normal.png new file mode 100644 index 0000000..8d685f9 Binary files /dev/null and b/mods/default/textures/default_mineral_gold_normal.png differ diff --git a/mods/default/textures/default_mineral_iron.png b/mods/default/textures/default_mineral_iron.png new file mode 100644 index 0000000..b95b5e3 Binary files /dev/null and b/mods/default/textures/default_mineral_iron.png differ diff --git a/mods/default/textures/default_mineral_iron_normal.png b/mods/default/textures/default_mineral_iron_normal.png new file mode 100644 index 0000000..72fc6c1 Binary files /dev/null and b/mods/default/textures/default_mineral_iron_normal.png differ diff --git a/mods/default/textures/default_mineral_mese.png b/mods/default/textures/default_mineral_mese.png new file mode 100644 index 0000000..9d603d7 Binary files /dev/null and b/mods/default/textures/default_mineral_mese.png differ diff --git a/mods/default/textures/default_mineral_mese_normal.png b/mods/default/textures/default_mineral_mese_normal.png new file mode 100644 index 0000000..8229c68 Binary files /dev/null and b/mods/default/textures/default_mineral_mese_normal.png differ diff --git a/mods/default/textures/default_mossycobble.png b/mods/default/textures/default_mossycobble.png new file mode 100644 index 0000000..1ae7c91 Binary files /dev/null and b/mods/default/textures/default_mossycobble.png differ diff --git a/mods/default/textures/default_nc_back.png b/mods/default/textures/default_nc_back.png new file mode 100644 index 0000000..e479ace Binary files /dev/null and b/mods/default/textures/default_nc_back.png differ diff --git a/mods/default/textures/default_nc_front.png b/mods/default/textures/default_nc_front.png new file mode 100644 index 0000000..c9dd6a3 Binary files /dev/null and b/mods/default/textures/default_nc_front.png differ diff --git a/mods/default/textures/default_nc_rb.png b/mods/default/textures/default_nc_rb.png new file mode 100644 index 0000000..685a22c Binary files /dev/null and b/mods/default/textures/default_nc_rb.png differ diff --git a/mods/default/textures/default_nc_side.png b/mods/default/textures/default_nc_side.png new file mode 100644 index 0000000..3152c33 Binary files /dev/null and b/mods/default/textures/default_nc_side.png differ diff --git a/mods/default/textures/default_obsidian.png b/mods/default/textures/default_obsidian.png new file mode 100644 index 0000000..8f4a49c Binary files /dev/null and b/mods/default/textures/default_obsidian.png differ diff --git a/mods/default/textures/default_obsidian_brick.png b/mods/default/textures/default_obsidian_brick.png new file mode 100644 index 0000000..30c67ca Binary files /dev/null and b/mods/default/textures/default_obsidian_brick.png differ diff --git a/mods/default/textures/default_obsidian_glass.png b/mods/default/textures/default_obsidian_glass.png new file mode 100644 index 0000000..d5ac83d Binary files /dev/null and b/mods/default/textures/default_obsidian_glass.png differ diff --git a/mods/default/textures/default_obsidian_shard.png b/mods/default/textures/default_obsidian_shard.png new file mode 100644 index 0000000..a988d8c Binary files /dev/null and b/mods/default/textures/default_obsidian_shard.png differ diff --git a/mods/default/textures/default_paper.png b/mods/default/textures/default_paper.png new file mode 100644 index 0000000..8f23924 Binary files /dev/null and b/mods/default/textures/default_paper.png differ diff --git a/mods/default/textures/default_papyrus.png b/mods/default/textures/default_papyrus.png new file mode 100644 index 0000000..a85e809 Binary files /dev/null and b/mods/default/textures/default_papyrus.png differ diff --git a/mods/default/textures/default_pine_needles.png b/mods/default/textures/default_pine_needles.png new file mode 100644 index 0000000..1a32f63 Binary files /dev/null and b/mods/default/textures/default_pine_needles.png differ diff --git a/mods/default/textures/default_pine_sapling.png b/mods/default/textures/default_pine_sapling.png new file mode 100644 index 0000000..c30131d Binary files /dev/null and b/mods/default/textures/default_pine_sapling.png differ diff --git a/mods/default/textures/default_pinetree.png b/mods/default/textures/default_pinetree.png new file mode 100644 index 0000000..4a5328f Binary files /dev/null and b/mods/default/textures/default_pinetree.png differ diff --git a/mods/default/textures/default_pinetree_top.png b/mods/default/textures/default_pinetree_top.png new file mode 100644 index 0000000..8705710 Binary files /dev/null and b/mods/default/textures/default_pinetree_top.png differ diff --git a/mods/default/textures/default_pinewood.png b/mods/default/textures/default_pinewood.png new file mode 100644 index 0000000..6844ceb Binary files /dev/null and b/mods/default/textures/default_pinewood.png differ diff --git a/mods/default/textures/default_rail.png b/mods/default/textures/default_rail.png new file mode 100644 index 0000000..26fed02 Binary files /dev/null and b/mods/default/textures/default_rail.png differ diff --git a/mods/default/textures/default_rail_crossing.png b/mods/default/textures/default_rail_crossing.png new file mode 100644 index 0000000..ba66e01 Binary files /dev/null and b/mods/default/textures/default_rail_crossing.png differ diff --git a/mods/default/textures/default_rail_curved.png b/mods/default/textures/default_rail_curved.png new file mode 100644 index 0000000..9084ac2 Binary files /dev/null and b/mods/default/textures/default_rail_curved.png differ diff --git a/mods/default/textures/default_rail_t_junction.png b/mods/default/textures/default_rail_t_junction.png new file mode 100644 index 0000000..486c416 Binary files /dev/null and b/mods/default/textures/default_rail_t_junction.png differ diff --git a/mods/default/textures/default_river_water.png b/mods/default/textures/default_river_water.png new file mode 100644 index 0000000..3b55c5f Binary files /dev/null and b/mods/default/textures/default_river_water.png differ diff --git a/mods/default/textures/default_river_water_flowing_animated.png b/mods/default/textures/default_river_water_flowing_animated.png new file mode 100644 index 0000000..536acc5 Binary files /dev/null and b/mods/default/textures/default_river_water_flowing_animated.png differ diff --git a/mods/default/textures/default_river_water_source_animated.png b/mods/default/textures/default_river_water_source_animated.png new file mode 100644 index 0000000..daa5653 Binary files /dev/null and b/mods/default/textures/default_river_water_source_animated.png differ diff --git a/mods/default/textures/default_sand.png b/mods/default/textures/default_sand.png new file mode 100644 index 0000000..645a300 Binary files /dev/null and b/mods/default/textures/default_sand.png differ diff --git a/mods/default/textures/default_sand_normal.png b/mods/default/textures/default_sand_normal.png new file mode 100644 index 0000000..0258dec Binary files /dev/null and b/mods/default/textures/default_sand_normal.png differ diff --git a/mods/default/textures/default_sandstone.png b/mods/default/textures/default_sandstone.png new file mode 100644 index 0000000..16e3d13 Binary files /dev/null and b/mods/default/textures/default_sandstone.png differ diff --git a/mods/default/textures/default_sandstone_brick.png b/mods/default/textures/default_sandstone_brick.png new file mode 100644 index 0000000..e7150e5 Binary files /dev/null and b/mods/default/textures/default_sandstone_brick.png differ diff --git a/mods/default/textures/default_sandstone_brick_normal.png b/mods/default/textures/default_sandstone_brick_normal.png new file mode 100644 index 0000000..9ef5865 Binary files /dev/null and b/mods/default/textures/default_sandstone_brick_normal.png differ diff --git a/mods/default/textures/default_sapling.png b/mods/default/textures/default_sapling.png new file mode 100644 index 0000000..3fd64f0 Binary files /dev/null and b/mods/default/textures/default_sapling.png differ diff --git a/mods/default/textures/default_sign.png b/mods/default/textures/default_sign.png new file mode 100644 index 0000000..912a372 Binary files /dev/null and b/mods/default/textures/default_sign.png differ diff --git a/mods/default/textures/default_sign_wall.png b/mods/default/textures/default_sign_wall.png new file mode 100644 index 0000000..56a7d2e Binary files /dev/null and b/mods/default/textures/default_sign_wall.png differ diff --git a/mods/default/textures/default_snow.png b/mods/default/textures/default_snow.png new file mode 100644 index 0000000..2a2439f Binary files /dev/null and b/mods/default/textures/default_snow.png differ diff --git a/mods/default/textures/default_snow_side.png b/mods/default/textures/default_snow_side.png new file mode 100644 index 0000000..3e98915 Binary files /dev/null and b/mods/default/textures/default_snow_side.png differ diff --git a/mods/default/textures/default_snowball.png b/mods/default/textures/default_snowball.png new file mode 100644 index 0000000..ecdba9a Binary files /dev/null and b/mods/default/textures/default_snowball.png differ diff --git a/mods/default/textures/default_steel_block.png b/mods/default/textures/default_steel_block.png new file mode 100644 index 0000000..7f49f61 Binary files /dev/null and b/mods/default/textures/default_steel_block.png differ diff --git a/mods/default/textures/default_steel_ingot.png b/mods/default/textures/default_steel_ingot.png new file mode 100644 index 0000000..8100b01 Binary files /dev/null and b/mods/default/textures/default_steel_ingot.png differ diff --git a/mods/default/textures/default_stick.png b/mods/default/textures/default_stick.png new file mode 100644 index 0000000..0378d07 Binary files /dev/null and b/mods/default/textures/default_stick.png differ diff --git a/mods/default/textures/default_stone.png b/mods/default/textures/default_stone.png new file mode 100644 index 0000000..63cb7c4 Binary files /dev/null and b/mods/default/textures/default_stone.png differ diff --git a/mods/default/textures/default_stone_brick.png b/mods/default/textures/default_stone_brick.png new file mode 100644 index 0000000..c254cc6 Binary files /dev/null and b/mods/default/textures/default_stone_brick.png differ diff --git a/mods/default/textures/default_stone_brick_normal.png b/mods/default/textures/default_stone_brick_normal.png new file mode 100644 index 0000000..893714f Binary files /dev/null and b/mods/default/textures/default_stone_brick_normal.png differ diff --git a/mods/default/textures/default_stone_normal.png b/mods/default/textures/default_stone_normal.png new file mode 100644 index 0000000..03665bd Binary files /dev/null and b/mods/default/textures/default_stone_normal.png differ diff --git a/mods/default/textures/default_tnt_bottom.png b/mods/default/textures/default_tnt_bottom.png new file mode 100644 index 0000000..4eda060 Binary files /dev/null and b/mods/default/textures/default_tnt_bottom.png differ diff --git a/mods/default/textures/default_tnt_side.png b/mods/default/textures/default_tnt_side.png new file mode 100644 index 0000000..947f862 Binary files /dev/null and b/mods/default/textures/default_tnt_side.png differ diff --git a/mods/default/textures/default_tnt_top.png b/mods/default/textures/default_tnt_top.png new file mode 100644 index 0000000..473c8fd Binary files /dev/null and b/mods/default/textures/default_tnt_top.png differ diff --git a/mods/default/textures/default_tool_bronzeaxe.png b/mods/default/textures/default_tool_bronzeaxe.png new file mode 100644 index 0000000..8ae43b5 Binary files /dev/null and b/mods/default/textures/default_tool_bronzeaxe.png differ diff --git a/mods/default/textures/default_tool_bronzepick.png b/mods/default/textures/default_tool_bronzepick.png new file mode 100644 index 0000000..c88a5f0 Binary files /dev/null and b/mods/default/textures/default_tool_bronzepick.png differ diff --git a/mods/default/textures/default_tool_bronzeshovel.png b/mods/default/textures/default_tool_bronzeshovel.png new file mode 100644 index 0000000..d7d800e Binary files /dev/null and b/mods/default/textures/default_tool_bronzeshovel.png differ diff --git a/mods/default/textures/default_tool_bronzesword.png b/mods/default/textures/default_tool_bronzesword.png new file mode 100644 index 0000000..cdab898 Binary files /dev/null and b/mods/default/textures/default_tool_bronzesword.png differ diff --git a/mods/default/textures/default_tool_diamondaxe.png b/mods/default/textures/default_tool_diamondaxe.png new file mode 100644 index 0000000..e32a0bf Binary files /dev/null and b/mods/default/textures/default_tool_diamondaxe.png differ diff --git a/mods/default/textures/default_tool_diamondpick.png b/mods/default/textures/default_tool_diamondpick.png new file mode 100644 index 0000000..f9883c6 Binary files /dev/null and b/mods/default/textures/default_tool_diamondpick.png differ diff --git a/mods/default/textures/default_tool_diamondshovel.png b/mods/default/textures/default_tool_diamondshovel.png new file mode 100644 index 0000000..d0fe24d Binary files /dev/null and b/mods/default/textures/default_tool_diamondshovel.png differ diff --git a/mods/default/textures/default_tool_diamondsword.png b/mods/default/textures/default_tool_diamondsword.png new file mode 100644 index 0000000..dbccd0e Binary files /dev/null and b/mods/default/textures/default_tool_diamondsword.png differ diff --git a/mods/default/textures/default_tool_meseaxe.png b/mods/default/textures/default_tool_meseaxe.png new file mode 100644 index 0000000..c01fb4f Binary files /dev/null and b/mods/default/textures/default_tool_meseaxe.png differ diff --git a/mods/default/textures/default_tool_mesepick.png b/mods/default/textures/default_tool_mesepick.png new file mode 100644 index 0000000..1b2e25b Binary files /dev/null and b/mods/default/textures/default_tool_mesepick.png differ diff --git a/mods/default/textures/default_tool_meseshovel.png b/mods/default/textures/default_tool_meseshovel.png new file mode 100644 index 0000000..00813a2 Binary files /dev/null and b/mods/default/textures/default_tool_meseshovel.png differ diff --git a/mods/default/textures/default_tool_mesesword.png b/mods/default/textures/default_tool_mesesword.png new file mode 100644 index 0000000..d395d3a Binary files /dev/null and b/mods/default/textures/default_tool_mesesword.png differ diff --git a/mods/default/textures/default_tool_steelaxe.png b/mods/default/textures/default_tool_steelaxe.png new file mode 100644 index 0000000..1528cad Binary files /dev/null and b/mods/default/textures/default_tool_steelaxe.png differ diff --git a/mods/default/textures/default_tool_steelpick.png b/mods/default/textures/default_tool_steelpick.png new file mode 100644 index 0000000..a7543a1 Binary files /dev/null and b/mods/default/textures/default_tool_steelpick.png differ diff --git a/mods/default/textures/default_tool_steelshovel.png b/mods/default/textures/default_tool_steelshovel.png new file mode 100644 index 0000000..65e4045 Binary files /dev/null and b/mods/default/textures/default_tool_steelshovel.png differ diff --git a/mods/default/textures/default_tool_steelsword.png b/mods/default/textures/default_tool_steelsword.png new file mode 100644 index 0000000..630a339 Binary files /dev/null and b/mods/default/textures/default_tool_steelsword.png differ diff --git a/mods/default/textures/default_tool_stoneaxe.png b/mods/default/textures/default_tool_stoneaxe.png new file mode 100644 index 0000000..cc36054 Binary files /dev/null and b/mods/default/textures/default_tool_stoneaxe.png differ diff --git a/mods/default/textures/default_tool_stonepick.png b/mods/default/textures/default_tool_stonepick.png new file mode 100644 index 0000000..237d739 Binary files /dev/null and b/mods/default/textures/default_tool_stonepick.png differ diff --git a/mods/default/textures/default_tool_stoneshovel.png b/mods/default/textures/default_tool_stoneshovel.png new file mode 100644 index 0000000..11711bd Binary files /dev/null and b/mods/default/textures/default_tool_stoneshovel.png differ diff --git a/mods/default/textures/default_tool_stonesword.png b/mods/default/textures/default_tool_stonesword.png new file mode 100644 index 0000000..1a493ac Binary files /dev/null and b/mods/default/textures/default_tool_stonesword.png differ diff --git a/mods/default/textures/default_tool_woodaxe.png b/mods/default/textures/default_tool_woodaxe.png new file mode 100644 index 0000000..68f1fd8 Binary files /dev/null and b/mods/default/textures/default_tool_woodaxe.png differ diff --git a/mods/default/textures/default_tool_woodpick.png b/mods/default/textures/default_tool_woodpick.png new file mode 100644 index 0000000..0aed583 Binary files /dev/null and b/mods/default/textures/default_tool_woodpick.png differ diff --git a/mods/default/textures/default_tool_woodshovel.png b/mods/default/textures/default_tool_woodshovel.png new file mode 100644 index 0000000..dcef2b5 Binary files /dev/null and b/mods/default/textures/default_tool_woodshovel.png differ diff --git a/mods/default/textures/default_tool_woodsword.png b/mods/default/textures/default_tool_woodsword.png new file mode 100644 index 0000000..c78ba50 Binary files /dev/null and b/mods/default/textures/default_tool_woodsword.png differ diff --git a/mods/default/textures/default_torch.png b/mods/default/textures/default_torch.png new file mode 100644 index 0000000..e21aac3 Binary files /dev/null and b/mods/default/textures/default_torch.png differ diff --git a/mods/default/textures/default_torch_animated.png b/mods/default/textures/default_torch_animated.png new file mode 100644 index 0000000..cdf33ef Binary files /dev/null and b/mods/default/textures/default_torch_animated.png differ diff --git a/mods/default/textures/default_torch_on_ceiling.png b/mods/default/textures/default_torch_on_ceiling.png new file mode 100644 index 0000000..89f41f5 Binary files /dev/null and b/mods/default/textures/default_torch_on_ceiling.png differ diff --git a/mods/default/textures/default_torch_on_ceiling_animated.png b/mods/default/textures/default_torch_on_ceiling_animated.png new file mode 100644 index 0000000..3a8b5ad Binary files /dev/null and b/mods/default/textures/default_torch_on_ceiling_animated.png differ diff --git a/mods/default/textures/default_torch_on_floor.png b/mods/default/textures/default_torch_on_floor.png new file mode 100644 index 0000000..bc4bdd6 Binary files /dev/null and b/mods/default/textures/default_torch_on_floor.png differ diff --git a/mods/default/textures/default_torch_on_floor_animated.png b/mods/default/textures/default_torch_on_floor_animated.png new file mode 100644 index 0000000..ad51c03 Binary files /dev/null and b/mods/default/textures/default_torch_on_floor_animated.png differ diff --git a/mods/default/textures/default_tree.png b/mods/default/textures/default_tree.png new file mode 100644 index 0000000..10e297b Binary files /dev/null and b/mods/default/textures/default_tree.png differ diff --git a/mods/default/textures/default_tree_top.png b/mods/default/textures/default_tree_top.png new file mode 100644 index 0000000..da99bce Binary files /dev/null and b/mods/default/textures/default_tree_top.png differ diff --git a/mods/default/textures/default_water.png b/mods/default/textures/default_water.png new file mode 100644 index 0000000..00500e9 Binary files /dev/null and b/mods/default/textures/default_water.png differ diff --git a/mods/default/textures/default_water_flowing_animated.png b/mods/default/textures/default_water_flowing_animated.png new file mode 100644 index 0000000..070d797 Binary files /dev/null and b/mods/default/textures/default_water_flowing_animated.png differ diff --git a/mods/default/textures/default_water_source_animated.png b/mods/default/textures/default_water_source_animated.png new file mode 100644 index 0000000..7e7f9ff Binary files /dev/null and b/mods/default/textures/default_water_source_animated.png differ diff --git a/mods/default/textures/default_wood.png b/mods/default/textures/default_wood.png new file mode 100644 index 0000000..af56d6c Binary files /dev/null and b/mods/default/textures/default_wood.png differ diff --git a/mods/default/textures/gui_formbg.png b/mods/default/textures/gui_formbg.png new file mode 100644 index 0000000..c543466 Binary files /dev/null and b/mods/default/textures/gui_formbg.png differ diff --git a/mods/default/textures/gui_furnace_arrow_bg.png b/mods/default/textures/gui_furnace_arrow_bg.png new file mode 100644 index 0000000..046d8cd Binary files /dev/null and b/mods/default/textures/gui_furnace_arrow_bg.png differ diff --git a/mods/default/textures/gui_furnace_arrow_fg.png b/mods/default/textures/gui_furnace_arrow_fg.png new file mode 100644 index 0000000..8d3c396 Binary files /dev/null and b/mods/default/textures/gui_furnace_arrow_fg.png differ diff --git a/mods/default/textures/gui_hb_bg.png b/mods/default/textures/gui_hb_bg.png new file mode 100644 index 0000000..99248e1 Binary files /dev/null and b/mods/default/textures/gui_hb_bg.png differ diff --git a/mods/default/textures/gui_hotbar.png b/mods/default/textures/gui_hotbar.png new file mode 100644 index 0000000..73fb3ca Binary files /dev/null and b/mods/default/textures/gui_hotbar.png differ diff --git a/mods/default/textures/gui_hotbar_selected.png b/mods/default/textures/gui_hotbar_selected.png new file mode 100644 index 0000000..40bafe6 Binary files /dev/null and b/mods/default/textures/gui_hotbar_selected.png differ diff --git a/mods/default/textures/heart.png b/mods/default/textures/heart.png new file mode 100644 index 0000000..fb8dcc7 Binary files /dev/null and b/mods/default/textures/heart.png differ diff --git a/mods/default/textures/player.png b/mods/default/textures/player.png new file mode 100644 index 0000000..6d61c43 Binary files /dev/null and b/mods/default/textures/player.png differ diff --git a/mods/default/textures/player_back.png b/mods/default/textures/player_back.png new file mode 100644 index 0000000..5e9ef05 Binary files /dev/null and b/mods/default/textures/player_back.png differ diff --git a/mods/default/textures/wieldhand.png b/mods/default/textures/wieldhand.png new file mode 100644 index 0000000..69f4b7b Binary files /dev/null and b/mods/default/textures/wieldhand.png differ diff --git a/mods/default/tools.lua b/mods/default/tools.lua new file mode 100644 index 0000000..aed45e9 --- /dev/null +++ b/mods/default/tools.lua @@ -0,0 +1,332 @@ +-- mods/default/tools.lua + +-- The hand +minetest.register_item(":", { + type = "none", + wield_image = "wieldhand.png", + wield_scale = {x=1,y=1,z=2.5}, + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level = 0, + groupcaps = { + crumbly = {times={[2]=3.00, [3]=0.70}, uses=0, maxlevel=1}, + snappy = {times={[3]=0.40}, uses=0, maxlevel=1}, + oddly_breakable_by_hand = {times={[1]=3.50,[2]=2.00,[3]=0.70}, uses=0} + }, + damage_groups = {fleshy=1}, + } +}) + +-- +-- Picks +-- + +minetest.register_tool("default:pick_wood", { + description = "Wooden Pickaxe", + inventory_image = "default_tool_woodpick.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + cracky = {times={[3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, +}) +minetest.register_tool("default:pick_stone", { + description = "Stone Pickaxe", + inventory_image = "default_tool_stonepick.png", + tool_capabilities = { + full_punch_interval = 1.3, + max_drop_level=0, + groupcaps={ + cracky = {times={[2]=2.0, [3]=1.00}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, +}) +minetest.register_tool("default:pick_steel", { + description = "Steel Pickaxe", + inventory_image = "default_tool_steelpick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, +}) +minetest.register_tool("default:pick_bronze", { + description = "Bronze Pickaxe", + inventory_image = "default_tool_bronzepick.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, +}) +minetest.register_tool("default:pick_mese", { + description = "Mese Pickaxe", + inventory_image = "default_tool_mesepick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, +}) +minetest.register_tool("default:pick_diamond", { + description = "Diamond Pickaxe", + inventory_image = "default_tool_diamondpick.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=3, + groupcaps={ + cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=5}, + }, +}) + +-- +-- Shovels +-- + +minetest.register_tool("default:shovel_wood", { + description = "Wooden Shovel", + inventory_image = "default_tool_woodshovel.png", + wield_image = "default_tool_woodshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=3.00, [2]=1.60, [3]=0.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, +}) +minetest.register_tool("default:shovel_stone", { + description = "Stone Shovel", + inventory_image = "default_tool_stoneshovel.png", + wield_image = "default_tool_stoneshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.4, + max_drop_level=0, + groupcaps={ + crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, +}) +minetest.register_tool("default:shovel_steel", { + description = "Steel Shovel", + inventory_image = "default_tool_steelshovel.png", + wield_image = "default_tool_steelshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, +}) +minetest.register_tool("default:shovel_bronze", { + description = "Bronze Shovel", + inventory_image = "default_tool_bronzeshovel.png", + wield_image = "default_tool_bronzeshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.1, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40, maxlevel=2}, + }, + damage_groups = {fleshy=3}, + }, +}) +minetest.register_tool("default:shovel_mese", { + description = "Mese Shovel", + inventory_image = "default_tool_meseshovel.png", + wield_image = "default_tool_meseshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=3, + groupcaps={ + crumbly = {times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, +}) +minetest.register_tool("default:shovel_diamond", { + description = "Diamond Shovel", + inventory_image = "default_tool_diamondshovel.png", + wield_image = "default_tool_diamondshovel.png^[transformR90", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + crumbly = {times={[1]=1.10, [2]=0.50, [3]=0.30}, uses=30, maxlevel=3}, + }, + damage_groups = {fleshy=4}, + }, +}) + +-- +-- Axes +-- + +minetest.register_tool("default:axe_wood", { + description = "Wooden Axe", + inventory_image = "default_tool_woodaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=0, + groupcaps={ + choppy = {times={[2]=3.00, [3]=1.60}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + }, +}) +minetest.register_tool("default:axe_stone", { + description = "Stone Axe", + inventory_image = "default_tool_stoneaxe.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + choppy={times={[1]=3.00, [2]=2.00, [3]=1.30}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=3}, + }, +}) +minetest.register_tool("default:axe_steel", { + description = "Steel Axe", + inventory_image = "default_tool_steelaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, +}) +minetest.register_tool("default:axe_bronze", { + description = "Bronze Axe", + inventory_image = "default_tool_bronzeaxe.png", + tool_capabilities = { + full_punch_interval = 1.0, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=4}, + }, +}) +minetest.register_tool("default:axe_mese", { + description = "Mese Axe", + inventory_image = "default_tool_meseaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.20, [2]=1.00, [3]=0.60}, uses=20, maxlevel=3}, + }, + damage_groups = {fleshy=6}, + }, +}) +minetest.register_tool("default:axe_diamond", { + description = "Diamond Axe", + inventory_image = "default_tool_diamondaxe.png", + tool_capabilities = { + full_punch_interval = 0.9, + max_drop_level=1, + groupcaps={ + choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=7}, + }, +}) + +-- +-- Swords +-- + +minetest.register_tool("default:sword_wood", { + description = "Wooden Sword", + inventory_image = "default_tool_woodsword.png", + tool_capabilities = { + full_punch_interval = 1, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.6, [3]=0.40}, uses=10, maxlevel=1}, + }, + damage_groups = {fleshy=2}, + } +}) +minetest.register_tool("default:sword_stone", { + description = "Stone Sword", + inventory_image = "default_tool_stonesword.png", + tool_capabilities = { + full_punch_interval = 1.2, + max_drop_level=0, + groupcaps={ + snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1}, + }, + damage_groups = {fleshy=4}, + } +}) +minetest.register_tool("default:sword_steel", { + description = "Steel Sword", + inventory_image = "default_tool_steelsword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + } +}) +minetest.register_tool("default:sword_bronze", { + description = "Bronze Sword", + inventory_image = "default_tool_bronzesword.png", + tool_capabilities = { + full_punch_interval = 0.8, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40, maxlevel=2}, + }, + damage_groups = {fleshy=6}, + } +}) +minetest.register_tool("default:sword_mese", { + description = "Mese Sword", + inventory_image = "default_tool_mesesword.png", + tool_capabilities = { + full_punch_interval = 0.1, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=0.5, [2]=0.3, [3]=0.1}, uses=30000, maxlevel=3}, + }, + damage_groups = {fleshy=10}, + } +}) +minetest.register_tool("default:sword_diamond", { + description = "Diamond Sword", + inventory_image = "default_tool_diamondsword.png", + tool_capabilities = { + full_punch_interval = 0.7, + max_drop_level=1, + groupcaps={ + snappy={times={[1]=0.5, [2]=0.30, [3]=0.1}, uses=40000, maxlevel=3}, + }, + damage_groups = {fleshy=20}, + } +}) diff --git a/mods/default/trees.lua b/mods/default/trees.lua new file mode 100644 index 0000000..eaf85f9 --- /dev/null +++ b/mods/default/trees.lua @@ -0,0 +1,344 @@ +-- +-- Grow trees +-- + +local random = math.random + +local function can_grow(pos) + local node_under = minetest.get_node_or_nil({x = pos.x, y = pos.y - 1, z = pos.z}) + if not node_under then + return false + end + local name_under = node_under.name + local is_soil = minetest.get_item_group(name_under, "soil") + if is_soil == 0 then + return false + end + return true +end + +-- Sapling ABMs + +minetest.register_abm({ + nodenames = {"default:sapling"}, + interval = 10, + chance = 50, + action = function(pos, node) + if not can_grow(pos) then + return + end + + minetest.log("action", "A sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_tree(pos, random(1, 4) == 1) + end +}) + +minetest.register_abm({ + nodenames = {"default:junglesapling"}, + interval = 11, + chance = 50, + action = function(pos, node) + if not can_grow(pos) then + return + end + + minetest.log("action", "A jungle sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_jungle_tree(pos) + end +}) + +minetest.register_abm({ + nodenames = {"default:pine_sapling"}, + interval = 12, + chance = 50, + action = function(pos, node) + if not can_grow(pos) then + return + end + + minetest.log("action", "A pine sapling grows into a tree at ".. + minetest.pos_to_string(pos)) + default.grow_pine_tree(pos) + end +}) + +-- Appletree, jungletree function + +local function add_trunk_and_leaves(data, a, pos, tree_cid, leaves_cid, + height, size, iters, is_apple_tree) + local x, y, z = pos.x, pos.y, pos.z + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_apple = minetest.get_content_id("default:apple") + + -- Trunk + for y_dist = 0, height - 1 do + local vi = a:index(x, y + y_dist, z) + local node_id = data[vi] + if y_dist == 0 or node_id == c_air or node_id == c_ignore + or node_id == leaves_cid then + data[vi] = tree_cid + end + end + + -- Force leaves near the trunk + for z_dist = -1, 1 do + for y_dist = -size, 1 do + local vi = a:index(x - 1, y + height + y_dist, z + z_dist) + for x_dist = -1, 1 do + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + vi = vi + 1 + end + end + end + + -- Randomly add leaves in 2x2x2 clusters. + for i = 1, iters do + local clust_x = x + random(-size, size - 1) + local clust_y = y + height + random(-size, 0) + local clust_z = z + random(-size, size - 1) + + for xi = 0, 1 do + for yi = 0, 1 do + for zi = 0, 1 do + local vi = a:index(clust_x + xi, clust_y + yi, clust_z + zi) + if data[vi] == c_air or data[vi] == c_ignore then + if is_apple_tree and random(1, 8) == 1 then + data[vi] = c_apple + else + data[vi] = leaves_cid + end + end + end + end + end + end +end + +-- Appletree + +function default.grow_tree(pos, is_apple_tree, bad) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(4, 5) + local c_tree = minetest.get_content_id("default:tree") + local c_leaves = minetest.get_content_id("default:leaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = pos.x - 2, y = pos.y, z = pos.z - 2}, + {x = pos.x + 2, y = pos.y + height + 1, z = pos.z + 2} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_tree, c_leaves, height, 2, 8, is_apple_tree) + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +-- Jungletree + +function default.grow_jungle_tree(pos, bad) + --[[ + NOTE: Jungletree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + --]] + if bad then + error("Deprecated use of default.grow_jungle_tree") + end + + local x, y, z = pos.x, pos.y, pos.z + local height = random(8, 12) + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_jungletree = minetest.get_content_id("default:jungletree") + local c_jungleleaves = minetest.get_content_id("default:jungleleaves") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = pos.x - 3, y = pos.y - 1, z = pos.z - 3}, + {x = pos.x + 3, y = pos.y + height + 1, z = pos.z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + add_trunk_and_leaves(data, a, pos, c_jungletree, c_jungleleaves, height, 3, 30, false) + + -- Roots + for z_dist = -1, 1 do + local vi_1 = a:index(x - 1, y - 1, z + z_dist) + local vi_2 = a:index(x - 1, y, z + z_dist) + for x_dist = -1, 1 do + if random(1, 3) >= 2 then + if data[vi_1] == c_air or data[vi_1] == c_ignore then + data[vi_1] = c_jungletree + elseif data[vi_2] == c_air or data[vi_2] == c_ignore then + data[vi_2] = c_jungletree + end + end + vi_1 = vi_1 + 1 + vi_2 = vi_2 + 1 + end + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + +-- Pinetree from mg mapgen mod, design by sfan5, pointy top added by paramat + +local function add_pine_needles(data, vi, c_air, c_ignore, c_snow, c_pine_needles) + if data[vi] == c_air or data[vi] == c_ignore or data[vi] == c_snow then + data[vi] = c_pine_needles + end +end + +local function add_snow(data, vi, c_air, c_ignore, c_snow) + if data[vi] == c_air or data[vi] == c_ignore then + data[vi] = c_snow + end +end + +function default.grow_pine_tree(pos) + local x, y, z = pos.x, pos.y, pos.z + local maxy = y + random(9, 13) -- Trunk top + + local c_air = minetest.get_content_id("air") + local c_ignore = minetest.get_content_id("ignore") + local c_pinetree = minetest.get_content_id("default:pinetree") + local c_pine_needles = minetest.get_content_id("default:pine_needles") + local c_snow = minetest.get_content_id("default:snow") + local c_snowblock = minetest.get_content_id("default:snowblock") + local c_dirtsnow = minetest.get_content_id("default:dirt_with_snow") + + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map( + {x = x - 3, y = y - 1, z = z - 3}, + {x = x + 3, y = maxy + 3, z = z + 3} + ) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + -- Scan for snow nodes near sapling + local snow = false + for yy = y - 1, y + 1 do + for zz = z - 1, z + 1 do + local vi = a:index(x - 1, yy, zz) + for xx = x - 1, x + 1 do + local nodid = data[vi] + if nodid == c_snow + or nodid == c_snowblock + or nodid == c_dirtsnow then + snow = true + end + vi = vi + 1 + end + end + end + + -- Upper branches layer + local dev = 3 + for yy = maxy - 1, maxy + 1 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Centre top nodes + add_pine_needles(data, a:index(x, maxy + 1, z), c_air, c_ignore, c_snow, + c_pine_needles) + add_pine_needles(data, a:index(x, maxy + 2, z), c_air, c_ignore, c_snow, + c_pine_needles) -- Paramat added a pointy top node + if snow then + add_snow(data, a:index(x, maxy + 3, z), c_air, c_ignore, c_snow) + end + + -- Lower branches layer + local my = 0 + for i = 1, 20 do -- Random 2x2 squares of needles + local xi = x + random(-3, 2) + local yy = maxy + random(-6, -5) + local zi = z + random(-3, 2) + if yy > my then + my = yy + end + for zz = zi, zi+1 do + local vi = a:index(xi, yy, zz) + local via = a:index(xi, yy + 1, zz) + for xx = xi, xi + 1 do + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + vi = vi + 1 + via = via + 1 + end + end + end + + local dev = 2 + for yy = my + 1, my + 2 do + for zz = z - dev, z + dev do + local vi = a:index(x - dev, yy, zz) + local via = a:index(x - dev, yy + 1, zz) + for xx = x - dev, x + dev do + if random() < 0.95 - dev * 0.05 then + add_pine_needles(data, vi, c_air, c_ignore, c_snow, + c_pine_needles) + if snow then + add_snow(data, via, c_air, c_ignore, c_snow) + end + end + vi = vi + 1 + via = via + 1 + end + end + dev = dev - 1 + end + + -- Trunk + for yy = y, maxy do + local vi = a:index(x, yy, z) + data[vi] = c_pinetree + end + + vm:set_data(data) + vm:write_to_map() + vm:update_map() +end + diff --git a/mods/doors/README.txt b/mods/doors/README.txt new file mode 100644 index 0000000..146af8e --- /dev/null +++ b/mods/doors/README.txt @@ -0,0 +1,46 @@ +Minetest 0.4 mod: doors +======================= +version: 1.3 + +License of source code: +----------------------- +Copyright (C) 2012 PilzAdam +modified by BlockMen (added sounds, glassdoors[glass, obsidian glass], trapdoor) + +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. + +License of 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): + door_trapdoor.png + door_obsidian_glass_side.png + +following textures created by celeron55 (CC BY-SA 3.0): + door_trapdoor_side.png + door_glass_a.png + door_glass_b.png + +following Textures created by PenguinDad (CC BY-SA 4.0): + door_glass.png + door_obsidian_glass.png + +All other textures (created by PilzAdam): WTFPL + + +License of 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 diff --git a/mods/doors/depends.txt b/mods/doors/depends.txt new file mode 100644 index 0000000..5e28bee --- /dev/null +++ b/mods/doors/depends.txt @@ -0,0 +1,2 @@ +default +screwdriver? diff --git a/mods/doors/init.lua b/mods/doors/init.lua new file mode 100644 index 0000000..a553565 --- /dev/null +++ b/mods/doors/init.lua @@ -0,0 +1,502 @@ +doors = {} + +-- Registers a door +function doors.register_door(name, def) + def.groups.not_in_creative_inventory = 1 + + local box = {{-0.5, -0.5, -0.5, 0.5, 0.5, -0.5+1.5/16}} + + if not def.node_box_bottom then + def.node_box_bottom = box + end + if not def.node_box_top then + def.node_box_top = box + end + if not def.selection_box_bottom then + def.selection_box_bottom= box + end + if not def.selection_box_top then + def.selection_box_top = box + end + + if not def.sound_close_door then + def.sound_close_door = "doors_door_close" + end + if not def.sound_open_door then + def.sound_open_door = "doors_door_open" + end + + + minetest.register_craftitem(name, { + description = def.description, + inventory_image = def.inventory_image, + + on_place = function(itemstack, placer, pointed_thing) + if not pointed_thing.type == "node" then + return itemstack + end + + local ptu = pointed_thing.under + local nu = minetest.get_node(ptu) + if minetest.registered_nodes[nu.name].on_rightclick then + return minetest.registered_nodes[nu.name].on_rightclick(ptu, nu, placer, itemstack) + end + + local pt = pointed_thing.above + local pt2 = {x=pt.x, y=pt.y, z=pt.z} + pt2.y = pt2.y+1 + if + not minetest.registered_nodes[minetest.get_node(pt).name].buildable_to or + not minetest.registered_nodes[minetest.get_node(pt2).name].buildable_to or + not placer or + not placer:is_player() + then + return itemstack + end + + if minetest.is_protected(pt, placer:get_player_name()) or + minetest.is_protected(pt2, placer:get_player_name()) then + minetest.record_protection_violation(pt, placer:get_player_name()) + return itemstack + end + + local p2 = minetest.dir_to_facedir(placer:get_look_dir()) + local pt3 = {x=pt.x, y=pt.y, z=pt.z} + if p2 == 0 then + pt3.x = pt3.x-1 + elseif p2 == 1 then + pt3.z = pt3.z+1 + elseif p2 == 2 then + pt3.x = pt3.x+1 + elseif p2 == 3 then + pt3.z = pt3.z-1 + end + if minetest.get_item_group(minetest.get_node(pt3).name, "door") == 0 then + minetest.set_node(pt, {name=name.."_b_1", param2=p2}) + minetest.set_node(pt2, {name=name.."_t_1", param2=p2}) + else + minetest.set_node(pt, {name=name.."_b_2", param2=p2}) + minetest.set_node(pt2, {name=name.."_t_2", param2=p2}) + minetest.get_meta(pt):set_int("right", 1) + minetest.get_meta(pt2):set_int("right", 1) + end + + if def.only_placer_can_open then + local pn = placer:get_player_name() + local meta = minetest.get_meta(pt) + meta:set_string("doors_owner", pn) + meta:set_string("infotext", "Owned by "..pn) + meta = minetest.get_meta(pt2) + meta:set_string("doors_owner", pn) + meta:set_string("infotext", "Owned by "..pn) + end + + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end, + }) + + local tt = def.tiles_top + local tb = def.tiles_bottom + + local function after_dig_node(pos, name, digger) + local node = minetest.get_node(pos) + if node.name == name then + minetest.node_dig(pos, node, digger) + end + end + + local function check_and_blast(pos, name) + local node = minetest.get_node(pos) + if node.name == name then + minetest.remove_node(pos) + end + end + + local function make_on_blast(base_name, dir, door_type, other_door_type) + if def.only_placer_can_open then + return function() end + else + return function(pos, intensity) + check_and_blast(pos, base_name .. door_type) + pos.y = pos.y + dir + check_and_blast(pos, base_name .. other_door_type) + end + end + end + + local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) + pos.y = pos.y+dir + if not minetest.get_node(pos).name == check_name then + return + end + local p2 = minetest.get_node(pos).param2 + p2 = params[p2+1] + + minetest.swap_node(pos, {name=replace_dir, param2=p2}) + + pos.y = pos.y-dir + minetest.swap_node(pos, {name=replace, param2=p2}) + + local snd_1 = def.sound_close_door + local snd_2 = def.sound_open_door + if params[1] == 3 then + snd_1 = def.sound_open_door + snd_2 = def.sound_close_door + end + + if minetest.get_meta(pos):get_int("right") ~= 0 then + minetest.sound_play(snd_1, {pos = pos, gain = 0.3, max_hear_distance = 10}) + else + minetest.sound_play(snd_2, {pos = pos, gain = 0.3, max_hear_distance = 10}) + end + end + + local function check_player_priv(pos, player) + if not def.only_placer_can_open then + return true + end + local meta = minetest.get_meta(pos) + local pn = player:get_player_name() + return meta:get_string("doors_owner") == pn + end + + local function on_rotate(pos, node, dir, user, check_name, mode, new_param2) + if not check_player_priv(pos, user) then + return false + end + if mode ~= screwdriver.ROTATE_FACE then + return false + end + + pos.y = pos.y + dir + if not minetest.get_node(pos).name == check_name then + return false + end + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return false + end + + local node2 = minetest.get_node(pos) + node2.param2 = (node2.param2 + 1) % 4 + minetest.swap_node(pos, node2) + + pos.y = pos.y - dir + node.param2 = (node.param2 + 1) % 4 + minetest.swap_node(pos, node) + return true + end + + minetest.register_node(name.."_b_1", { + tiles = {tb[2], tb[2], tb[2], tb[2], tb[1], tb[1].."^[transformfx"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = name, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_bottom + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_bottom + }, + groups = def.groups, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + pos.y = pos.y+1 + after_dig_node(pos, name.."_t_1", digger) + end, + + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + end + end, + + on_rotate = function(pos, node, user, mode, new_param2) + return on_rotate(pos, node, 1, user, name.."_t_1", mode) + end, + + can_dig = check_player_priv, + sounds = def.sounds, + sunlight_propagates = def.sunlight, + on_blast = make_on_blast(name, 1, "_b_1", "_t_1") + }) + + minetest.register_node(name.."_t_1", { + tiles = {tt[2], tt[2], tt[2], tt[2], tt[1], tt[1].."^[transformfx"}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = "", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_top + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_top + }, + groups = def.groups, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + pos.y = pos.y-1 + after_dig_node(pos, name.."_b_1", digger) + end, + + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_rightclick(pos, -1, name.."_b_1", name.."_t_2", name.."_b_2", {1,2,3,0}) + end + end, + + on_rotate = function(pos, node, user, mode, new_param2) + return on_rotate(pos, node, -1, user, name.."_b_1", mode) + end, + + can_dig = check_player_priv, + sounds = def.sounds, + sunlight_propagates = def.sunlight, + on_blast = make_on_blast(name, -1, "_t_1", "_b_1") + }) + + minetest.register_node(name.."_b_2", { + tiles = {tb[2], tb[2], tb[2], tb[2], tb[1].."^[transformfx", tb[1]}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = name, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_bottom + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_bottom + }, + groups = def.groups, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + pos.y = pos.y+1 + after_dig_node(pos, name.."_t_2", digger) + end, + + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + end + end, + + on_rotate = function(pos, node, user, mode, new_param2) + return on_rotate(pos, node, 1, user, name.."_t_2", mode) + end, + + can_dig = check_player_priv, + sounds = def.sounds, + sunlight_propagates = def.sunlight, + on_blast = make_on_blast(name, 1, "_b_2", "_t_2") + }) + + minetest.register_node(name.."_t_2", { + tiles = {tt[2], tt[2], tt[2], tt[2], tt[1].."^[transformfx", tt[1]}, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + drop = "", + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = def.node_box_top + }, + selection_box = { + type = "fixed", + fixed = def.selection_box_top + }, + groups = def.groups, + + after_dig_node = function(pos, oldnode, oldmetadata, digger) + pos.y = pos.y-1 + after_dig_node(pos, name.."_b_2", digger) + end, + + on_rightclick = function(pos, node, clicker) + if check_player_priv(pos, clicker) then + on_rightclick(pos, -1, name.."_b_2", name.."_t_1", name.."_b_1", {3,0,1,2}) + end + end, + + on_rotate = function(pos, node, user, mode, new_param2) + return on_rotate(pos, node, -1, user, name.."_b_2", mode) + end, + + can_dig = check_player_priv, + sounds = def.sounds, + sunlight_propagates = def.sunlight, + on_blast = make_on_blast(name, -1, "_t_2", "_b_2") + }) + +end + +doors.register_door("doors:door_wood", { + description = "Wooden Door", + inventory_image = "doors_wood.png", + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=2,door=1}, + tiles_bottom = {"doors_wood_b.png", "doors_brown.png"}, + tiles_top = {"doors_wood_a.png", "doors_brown.png"}, + sounds = default.node_sound_wood_defaults(), + sunlight = false, +}) + +minetest.register_craft({ + output = "doors:door_wood", + recipe = { + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"}, + {"group:wood", "group:wood"} + } +}) + +doors.register_door("doors:door_steel", { + description = "Steel Door", + inventory_image = "doors_steel.png", + groups = {snappy=1,bendy=2,cracky=1,melty=2,level=2,door=1}, + tiles_bottom = {"doors_steel_b.png", "doors_grey.png"}, + tiles_top = {"doors_steel_a.png", "doors_grey.png"}, + only_placer_can_open = true, + sounds = default.node_sound_wood_defaults(), + sunlight = false, +}) + +minetest.register_craft({ + output = "doors:door_steel", + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot"} + } +}) + +doors.register_door("doors:door_glass", { + description = "Glass Door", + inventory_image = "doors_glass.png", + groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, + tiles_bottom = {"doors_glass_b.png", "doors_glass_side.png"}, + tiles_top = {"doors_glass_a.png", "doors_glass_side.png"}, + sounds = default.node_sound_glass_defaults(), + sunlight = true, +}) + +minetest.register_craft({ + output = "doors:door_glass", + recipe = { + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"}, + {"default:glass", "default:glass"} + } +}) + +doors.register_door("doors:door_obsidian_glass", { + description = "Obsidian Glass Door", + inventory_image = "doors_obsidian_glass.png", + groups = {snappy=1,cracky=1,oddly_breakable_by_hand=3,door=1}, + tiles_bottom = {"doors_obsidian_glass_b.png", "doors_obsidian_glass_side.png"}, + tiles_top = {"doors_obsidian_glass_a.png", "doors_obsidian_glass_side.png"}, + sounds = default.node_sound_glass_defaults(), + sunlight = true, +}) + +minetest.register_craft({ + output = "doors:door_obsidian_glass", + recipe = { + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"}, + {"default:obsidian_glass", "default:obsidian_glass"} + } +}) + + +----trapdoor---- + +function doors.register_trapdoor(name, def) + local name_closed = name + local name_opened = name.."_open" + + def.on_rightclick = function (pos, node) + local newname = node.name == name_closed and name_opened or name_closed + local sound = false + if node.name == name_closed then sound = def.sound_open end + if node.name == name_opened then sound = def.sound_close end + if sound then + minetest.sound_play(sound, {pos = pos, gain = 0.3, max_hear_distance = 10}) + end + minetest.set_node(pos, {name = newname, param1 = node.param1, param2 = node.param2}) + end + + def.on_rotate = minetest.get_modpath("screwdriver") and screwdriver.rotate_simple + + -- Common trapdoor configuration + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.is_ground_content = false + + local def_opened = table.copy(def) + local def_closed = table.copy(def) + + def_closed.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} + } + def_closed.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.4, 0.5} + } + def_closed.tiles = { def.tile_front, def.tile_front, def.tile_side, def.tile_side, + def.tile_side, def.tile_side } + + def_opened.node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} + } + def_opened.selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0.4, 0.5, 0.5, 0.5} + } + def_opened.tiles = { def.tile_side, def.tile_side, def.tile_side, def.tile_side, + def.tile_front, def.tile_front } + def_opened.drop = name_closed + def_opened.groups.not_in_creative_inventory = 1 + + minetest.register_node(name_opened, def_opened) + minetest.register_node(name_closed, def_closed) +end + + + +doors.register_trapdoor("doors:trapdoor", { + description = "Trapdoor", + inventory_image = "doors_trapdoor.png", + 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}, + sounds = default.node_sound_wood_defaults(), + sound_open = "doors_door_open", + sound_close = "doors_door_close" +}) + +minetest.register_craft({ + output = 'doors:trapdoor 2', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:wood', 'group:wood', 'group:wood'}, + {'', '', ''}, + } +}) diff --git a/mods/doors/sounds/doors_door_close.ogg b/mods/doors/sounds/doors_door_close.ogg new file mode 100644 index 0000000..a39452b Binary files /dev/null and b/mods/doors/sounds/doors_door_close.ogg differ diff --git a/mods/doors/sounds/doors_door_open.ogg b/mods/doors/sounds/doors_door_open.ogg new file mode 100644 index 0000000..7ec7f48 Binary files /dev/null and b/mods/doors/sounds/doors_door_open.ogg differ diff --git a/mods/doors/textures/doors_brown.png b/mods/doors/textures/doors_brown.png new file mode 100644 index 0000000..8c8e3d8 Binary files /dev/null and b/mods/doors/textures/doors_brown.png differ diff --git a/mods/doors/textures/doors_glass.png b/mods/doors/textures/doors_glass.png new file mode 100644 index 0000000..49ec245 Binary files /dev/null and b/mods/doors/textures/doors_glass.png differ diff --git a/mods/doors/textures/doors_glass_a.png b/mods/doors/textures/doors_glass_a.png new file mode 100644 index 0000000..da25402 Binary files /dev/null and b/mods/doors/textures/doors_glass_a.png differ diff --git a/mods/doors/textures/doors_glass_b.png b/mods/doors/textures/doors_glass_b.png new file mode 100644 index 0000000..da25402 Binary files /dev/null and b/mods/doors/textures/doors_glass_b.png differ diff --git a/mods/doors/textures/doors_glass_side.png b/mods/doors/textures/doors_glass_side.png new file mode 100644 index 0000000..755672b Binary files /dev/null and b/mods/doors/textures/doors_glass_side.png differ diff --git a/mods/doors/textures/doors_grey.png b/mods/doors/textures/doors_grey.png new file mode 100644 index 0000000..ad110c7 Binary files /dev/null and b/mods/doors/textures/doors_grey.png differ diff --git a/mods/doors/textures/doors_obsidian_glass.png b/mods/doors/textures/doors_obsidian_glass.png new file mode 100644 index 0000000..c327720 Binary files /dev/null and b/mods/doors/textures/doors_obsidian_glass.png differ diff --git a/mods/doors/textures/doors_obsidian_glass_a.png b/mods/doors/textures/doors_obsidian_glass_a.png new file mode 100644 index 0000000..d5ac83d Binary files /dev/null and b/mods/doors/textures/doors_obsidian_glass_a.png differ diff --git a/mods/doors/textures/doors_obsidian_glass_b.png b/mods/doors/textures/doors_obsidian_glass_b.png new file mode 100644 index 0000000..d5ac83d Binary files /dev/null and b/mods/doors/textures/doors_obsidian_glass_b.png differ diff --git a/mods/doors/textures/doors_obsidian_glass_side.png b/mods/doors/textures/doors_obsidian_glass_side.png new file mode 100644 index 0000000..aa4c63a Binary files /dev/null and b/mods/doors/textures/doors_obsidian_glass_side.png differ diff --git a/mods/doors/textures/doors_steel.png b/mods/doors/textures/doors_steel.png new file mode 100644 index 0000000..042a1bc Binary files /dev/null and b/mods/doors/textures/doors_steel.png differ diff --git a/mods/doors/textures/doors_steel_a.png b/mods/doors/textures/doors_steel_a.png new file mode 100644 index 0000000..84ff11d Binary files /dev/null and b/mods/doors/textures/doors_steel_a.png differ diff --git a/mods/doors/textures/doors_steel_b.png b/mods/doors/textures/doors_steel_b.png new file mode 100644 index 0000000..77ffbe3 Binary files /dev/null and b/mods/doors/textures/doors_steel_b.png differ diff --git a/mods/doors/textures/doors_trapdoor.png b/mods/doors/textures/doors_trapdoor.png new file mode 100644 index 0000000..e92c8b2 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor.png differ diff --git a/mods/doors/textures/doors_trapdoor_side.png b/mods/doors/textures/doors_trapdoor_side.png new file mode 100644 index 0000000..c860523 Binary files /dev/null and b/mods/doors/textures/doors_trapdoor_side.png differ diff --git a/mods/doors/textures/doors_wood.png b/mods/doors/textures/doors_wood.png new file mode 100644 index 0000000..d3a62ab Binary files /dev/null and b/mods/doors/textures/doors_wood.png differ diff --git a/mods/doors/textures/doors_wood_a.png b/mods/doors/textures/doors_wood_a.png new file mode 100644 index 0000000..86a747a Binary files /dev/null and b/mods/doors/textures/doors_wood_a.png differ diff --git a/mods/doors/textures/doors_wood_b.png b/mods/doors/textures/doors_wood_b.png new file mode 100644 index 0000000..9665098 Binary files /dev/null and b/mods/doors/textures/doors_wood_b.png differ diff --git a/mods/dye/README.txt b/mods/dye/README.txt new file mode 100644 index 0000000..d414c2c --- /dev/null +++ b/mods/dye/README.txt @@ -0,0 +1,15 @@ +Minetest 0.4 mod: dye +====================== + +See init.lua for documentation. + +License of source code and media files: +--------------------------------------- +Copyright (C) 2012 Perttu Ahola (celeron55) + +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. + diff --git a/mods/dye/depends.txt b/mods/dye/depends.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/dye/init.lua b/mods/dye/init.lua new file mode 100644 index 0000000..d7d18f7 --- /dev/null +++ b/mods/dye/init.lua @@ -0,0 +1,87 @@ +-- minetest/dye/init.lua + +-- Other mods can use these for looping through available colors +dye = {} +dye.basecolors = {"white", "grey", "black", "red", "yellow", "green", "cyan", "blue", "magenta"} +dye.excolors = {"white", "lightgrey", "grey", "darkgrey", "black", "red", "orange", "yellow", "lime", "green", "aqua", "cyan", "sky_blue", "blue", "violet", "magenta", "red_violet"} + +-- Local stuff +local dyelocal = {} + +-- This collection of colors is partly a historic thing, partly something else. +dyelocal.dyes = { + {"white", "White dye", {dye=1, basecolor_white=1, excolor_white=1, unicolor_white=1}}, + {"grey", "Grey dye", {dye=1, basecolor_grey=1, excolor_grey=1, unicolor_grey=1}}, + {"dark_grey", "Dark grey dye", {dye=1, basecolor_grey=1, excolor_darkgrey=1, unicolor_darkgrey=1}}, + {"black", "Black dye", {dye=1, basecolor_black=1, excolor_black=1, unicolor_black=1}}, + {"violet", "Violet dye", {dye=1, basecolor_magenta=1, excolor_violet=1, unicolor_violet=1}}, + {"blue", "Blue dye", {dye=1, basecolor_blue=1, excolor_blue=1, unicolor_blue=1}}, + {"cyan", "Cyan dye", {dye=1, basecolor_cyan=1, excolor_cyan=1, unicolor_cyan=1}}, + {"dark_green", "Dark green dye",{dye=1, basecolor_green=1, excolor_green=1, unicolor_dark_green=1}}, + {"green", "Green dye", {dye=1, basecolor_green=1, excolor_green=1, unicolor_green=1}}, + {"yellow", "Yellow dye", {dye=1, basecolor_yellow=1, excolor_yellow=1, unicolor_yellow=1}}, + {"brown", "Brown dye", {dye=1, basecolor_brown=1, excolor_orange=1, unicolor_dark_orange=1}}, + {"orange", "Orange dye", {dye=1, basecolor_orange=1, excolor_orange=1, unicolor_orange=1}}, + {"red", "Red dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_red=1}}, + {"magenta", "Magenta dye", {dye=1, basecolor_magenta=1, excolor_red_violet=1,unicolor_red_violet=1}}, + {"pink", "Pink dye", {dye=1, basecolor_red=1, excolor_red=1, unicolor_light_red=1}}, +} + +-- Define items +for _, row in ipairs(dyelocal.dyes) do + local name = row[1] + local description = row[2] + local groups = row[3] + local item_name = "dye:"..name + local item_image = "dye_"..name..".png" + minetest.register_craftitem(item_name, { + inventory_image = item_image, + description = description, + groups = groups + }) + minetest.register_craft({ + type = "shapeless", + output = item_name.." 4", + recipe = {"group:flower,color_"..name}, + }) +end +-- manually add coal->black dye +minetest.register_craft({ + type = "shapeless", + output = "dye:black 4", + recipe = {"group:coal"}, +}) + +-- Mix recipes +-- Just mix everything to everything somehow sanely + +dyelocal.mixbases = {"magenta", "red", "orange", "brown", "yellow", "green", "dark_green", "cyan", "blue", "violet", "black", "dark_grey", "grey", "white"} + +dyelocal.mixes = { + -- magenta, red, orange, brown, yellow, green, dark_green, cyan, blue, violet, black, dark_grey, grey, white + white = {"pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "violet", "grey", "grey", "white", "white"}, + grey = {"pink", "pink", "orange", "orange", "yellow", "green", "green", "grey", "cyan", "pink", "dark_grey","grey", "grey"}, + dark_grey={"brown","brown", "brown", "brown", "brown","dark_green","dark_green","blue","blue","violet","black", "black"}, + black = {"black", "black", "black", "black", "black", "black", "black", "black", "black", "black", "black"}, + violet= {"magenta","magenta","red", "brown", "red", "cyan", "brown", "blue", "violet","violet"}, + blue = {"violet", "magenta","brown","brown","dark_green","cyan","cyan", "cyan", "blue"}, + cyan = {"blue","brown","dark_green","dark_grey","green","cyan","dark_green","cyan"}, + dark_green={"brown","brown","brown", "brown", "green", "green", "dark_green"}, + green = {"brown", "yellow","yellow","dark_green","green","green"}, + yellow= {"red", "orange", "yellow","orange", "yellow"}, + brown = {"brown", "brown","orange", "brown"}, + orange= {"red", "orange","orange"}, + red = {"magenta","red"}, + magenta={"magenta"}, +} + +for one,results in pairs(dyelocal.mixes) do + for i,result in ipairs(results) do + local another = dyelocal.mixbases[i] + minetest.register_craft({ + type = "shapeless", + output = 'dye:'..result..' 2', + recipe = {'dye:'..one, 'dye:'..another}, + }) + end +end diff --git a/mods/dye/textures/dye_black.png b/mods/dye/textures/dye_black.png new file mode 100644 index 0000000..1055b6c Binary files /dev/null and b/mods/dye/textures/dye_black.png differ diff --git a/mods/dye/textures/dye_blue.png b/mods/dye/textures/dye_blue.png new file mode 100644 index 0000000..d1377c6 Binary files /dev/null and b/mods/dye/textures/dye_blue.png differ diff --git a/mods/dye/textures/dye_brown.png b/mods/dye/textures/dye_brown.png new file mode 100644 index 0000000..77d475c Binary files /dev/null and b/mods/dye/textures/dye_brown.png differ diff --git a/mods/dye/textures/dye_cyan.png b/mods/dye/textures/dye_cyan.png new file mode 100644 index 0000000..239d66c Binary files /dev/null and b/mods/dye/textures/dye_cyan.png differ diff --git a/mods/dye/textures/dye_dark_green.png b/mods/dye/textures/dye_dark_green.png new file mode 100644 index 0000000..9606ccf Binary files /dev/null and b/mods/dye/textures/dye_dark_green.png differ diff --git a/mods/dye/textures/dye_dark_grey.png b/mods/dye/textures/dye_dark_grey.png new file mode 100644 index 0000000..060737b Binary files /dev/null and b/mods/dye/textures/dye_dark_grey.png differ diff --git a/mods/dye/textures/dye_green.png b/mods/dye/textures/dye_green.png new file mode 100644 index 0000000..0d99ee1 Binary files /dev/null and b/mods/dye/textures/dye_green.png differ diff --git a/mods/dye/textures/dye_grey.png b/mods/dye/textures/dye_grey.png new file mode 100644 index 0000000..5efb028 Binary files /dev/null and b/mods/dye/textures/dye_grey.png differ diff --git a/mods/dye/textures/dye_magenta.png b/mods/dye/textures/dye_magenta.png new file mode 100644 index 0000000..c84df62 Binary files /dev/null and b/mods/dye/textures/dye_magenta.png differ diff --git a/mods/dye/textures/dye_orange.png b/mods/dye/textures/dye_orange.png new file mode 100644 index 0000000..0844907 Binary files /dev/null and b/mods/dye/textures/dye_orange.png differ diff --git a/mods/dye/textures/dye_pink.png b/mods/dye/textures/dye_pink.png new file mode 100644 index 0000000..c3dec22 Binary files /dev/null and b/mods/dye/textures/dye_pink.png differ diff --git a/mods/dye/textures/dye_red.png b/mods/dye/textures/dye_red.png new file mode 100644 index 0000000..14eafbf Binary files /dev/null and b/mods/dye/textures/dye_red.png differ diff --git a/mods/dye/textures/dye_violet.png b/mods/dye/textures/dye_violet.png new file mode 100644 index 0000000..600cbb4 Binary files /dev/null and b/mods/dye/textures/dye_violet.png differ diff --git a/mods/dye/textures/dye_white.png b/mods/dye/textures/dye_white.png new file mode 100644 index 0000000..2a840a4 Binary files /dev/null and b/mods/dye/textures/dye_white.png differ diff --git a/mods/dye/textures/dye_yellow.png b/mods/dye/textures/dye_yellow.png new file mode 100644 index 0000000..fe75775 Binary files /dev/null and b/mods/dye/textures/dye_yellow.png differ diff --git a/mods/farming/README.txt b/mods/farming/README.txt new file mode 100644 index 0000000..d10ad53 --- /dev/null +++ b/mods/farming/README.txt @@ -0,0 +1,146 @@ +Farming Redo Mod +by TenPlus1 + +https://forum.minetest.net/viewtopic.php?id=9019 + +Farming Redo is a simplified version of the built-in farming mod in minetest and comes with wheat, cotton, carrot, cucumber, potato and tomato to start out with which spawn throughout the map... new foods need only be planted on tilled soil so no seeds are required, original wheat and cotton will require seeds which are found inside normal and jungle grass... + +This mod works by adding your new plant to the {growing=1} group and numbering the stages from _1 to as many stages as you like, but the underscore MUST be used only once in the node name to separate plant from stage number e.g. + +"farming:cotton_1" through to "farming:cotton_8" +"farming:wheat_1" through to "farming:wheat_8" +"farming:cucumber_4" through to "farming:cucumber_4" + +Changelog: + +1.20 - NEW growing routine added that allows crops to grow while player is away doing other things (thanks prestidigitator) +1.14 - Added Green Beans from Crops mod (thanks sofar), little bushels in the wild but need to be grown using beanpoles crafted with 4 sticks (2 either side) +1.13 - Fixed seed double-placement glitch. Mapgen now uses 0.4.12+ for plant generation +1.12 - Player cannot place seeds in protected area, also growing speeds changed to match defaults +1.11 - Added Straw Bale, streamlined growing abm a little, fixed melon rotation bug with screwdriver +1.10 - Added Blueberry Bush and Blueberry Muffins, also Pumpkin/Melon easier to pick up, added check for unloaded map +1.09 - Corn now uses single nodes instead of 1 ontop of the other, Ethanol recipe is more expensive (requires 5 corn) and some code cleanup. +1.08 - Added Farming Plus compatibility, plus can be removed and no more missing nodes +1.07 - Added Rhubarb and Rhubarb Pie +1.06 - register_hoe and register_plant added for compatibility with default farming mod, although any plants registered will use farming redo to grow +1.05 - Added Raspberry Bushels and Raspberry Smoothie +1.04 - Added Donuts... normal, chocolate and apple... and a few code cleanups and now compatible with jungletree's from MoreTrees mod +1.03 - Bug fixes and more compatibility as drop-in replacement for built-in farming mod +1.02 - Added farming.mod string to help other mods identify which farming mod is running, if it returns "redo" then you're using this one, "" empty is built-in mod +1.01 - Crafting coffee or ethanol returns empty bucket/bottle, also Cocoa spawns a little rarer +1.0 - Added Cocoa which randomly grows on jungle tree's, pods give cocoa beans which can be used to farm more pods on a jungle trunk or make Cookies which have been added (or other treats) +0.9 - Added Pumpkin, Jack 'O Lantern, Pumpkin Slice and Sugar +(a huge thanks to painterly.net for allowing me to use their textures) +0.8 - Added Watermelon and Melon Slice +0.7 - Added Coffee, Coffee Beans, Drinking Cup, Cold and Hot Cup of Coffee +0.6 - Added Corn, Corn on the Cob... Also reworked Abm +0.5 - Added Carrot, Cucumber, Potato (and Baked Potato), Tomato +0.4 - Checks for Protection, also performance changes +0.3 - Added Diamond and Mese hoe +0.2 - Fixed check for wet soil +0.1 - Fixed growing bug +0.0 - Initial release + +License of media (textures): +---------------------------- +Created by PilzAdam (License: WTFPL): + farming_bread.png + farming_soil.png + farming_soil_wet.png + farming_soil_wet_side.png + farming_string.png + +Created by Calinou (License: CC BY-SA): + farming_tool_bronzehoe.png + farming_tool_steelhoe.png + farming_tool_stonehoe.png + farming_tool_woodhoe.png + farming_tool_mesehoe.png + farming_tool_diamondhoe.png + +Created by VanessaE (License: WTFPL): + farming_cotton_seed.png + farming_wheat_seed.png + farming_flour.png + farming_wheat.png + farming_wheat_1.png + farming_wheat_2.png + farming_wheat_3.png + farming_wheat_4.png + farming_wheat_5.png + farming_wheat_5.png + farming_wheat_7.png + farming_wheat_8.png + farming_cotton_1.png + farming_cotton_2.png + farming_cotton_3.png + farming_cotton_4.png + farming_cotton_5.png + farming_cotton_6.png + farming_cotton_7.png + farming_cotton_8.png + +Created by Doc (License: WTFPL): + farming_cucumber.png + farming_cucumber_1.png + farming_cucumber_2.png + farming_cucumber_3.png + farming_cucumber_4.png + farming_potato.png + farming_potato_1.png + farming_potato_2.png + farming_potato_3.png + farming_potato_4.png + farming_raspberries.png + farming_raspberry_1.png + farming_raspberry_2.png + farming_raspberry_3.png + farming_raspberry_4.png + +Created by Gambit: + default_junglegrass.png + farming_carrot.png + farming_carrot_1.png + farming_carrot_2.png + farming_carrot_3.png + farming_carrot_4.png + farming_carrot_5.png + farming_carrot_6.png + farming_carrot_7.png + farming_carrot_8.png + +Created by JoseTheCrafter and edited by TenPlus1: + farming_tomato.png + farming_tomato_1.png + farming_tomato_2.png + farming_tomato_3.png + farming_tomato_4.png + farming_tomato_5.png + farming_tomato_6.png + farming_tomato_7.png + farming_tomato_8.png + +Created by GeMinecraft and edited by TenPlus1: + farming_corn.png + farming_corn_cob.png + farming_corn_1.png + farming_corn_2.png + farming_corn_3.png + farming_corn_4.png + farming_corn_5.png + farming_corn_6.png + farming_corn_7.png + farming_corn_8.png + +Created by TenPlus1 + farming_cocoa_1.png + farming_cocoa_2.png + farming_cocoa_3.png + farming_cocoa_beans.png + farming_cookie.png + farming_raspberry_smoothie.png + farming_rhubarb_1.png + farming_rhubarb_2.png + farming_rhubarb_3.png + farming_rhubarb.png + farming_rhubarb_pie.png \ No newline at end of file diff --git a/mods/farming/beanpole.lua b/mods/farming/beanpole.lua new file mode 100644 index 0000000..f9ba132 --- /dev/null +++ b/mods/farming/beanpole.lua @@ -0,0 +1,221 @@ +--[[ + All textures by + (C) Auke Kok + CC-BY-SA-3.0 +--]] + +minetest.register_craftitem("farming:beans", { + description = "Green Beans", + inventory_image = "farming_beans.png", + on_use = minetest.item_eat(1), + on_place = function(itemstack, placer, pointed_thing) + local nod = minetest.get_node_or_nil(pointed_thing.under) + if nod and nod.name == "farming:beanpole" then + minetest.set_node(pointed_thing.under, {name="farming:beanpole_1"}) + else + return + end + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end +}) + +-- Beans can be used for green dye +minetest.register_craft({ + output = "dye:green", + recipe = { + {'farming:beans'}, + } +}) + +-- Beanpole + +minetest.register_node("farming:beanpole", { + description = "Bean Pole (place on soil before planting beans)", + drawtype = "plantlike", + tiles = {"farming_beanpole.png"}, + inventory_image = "farming_beanpole.png", + visual_scale = 1.45, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beanpole'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), + on_place = function(itemstack, placer, pointed_thing) + local nod = minetest.get_node_or_nil(pointed_thing.under) + if nod and minetest.get_item_group(nod.name, "soil") < 2 then + return + end + local top = { + x = pointed_thing.above.x, + y = pointed_thing.above.y + 1, + z = pointed_thing.above.z + } + nod = minetest.get_node_or_nil(top) + if nod and nod.name ~= "air" then return end + minetest.set_node(pointed_thing.above, {name = "farming:beanpole"}) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end +}) + +minetest.register_craft({ + output = "farming:beanpole", + recipe = { + {'', '', ''}, + {'default:stick', '', 'default:stick'}, + {'default:stick', '', 'default:stick'}, + } +}) + +-- Define Green Bean growth stages + +minetest.register_node("farming:beanpole_1", { + drawtype = "plantlike", + tiles = {"farming_beanpole_1.png"}, + visual_scale = 1.45, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beanpole'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 3, not_in_creative_inventory = 1, + attached_node = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:beanpole_2", { + drawtype = "plantlike", + tiles = {"farming_beanpole_2.png"}, + visual_scale = 1.45, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beanpole'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:beanpole_3", { + drawtype = "plantlike", + tiles = {"farming_beanpole_3.png"}, + visual_scale = 1.45, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beanpole'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + + +minetest.register_node("farming:beanpole_4", { + drawtype = "plantlike", + tiles = {"farming_beanpole_4.png"}, + visual_scale = 1.45, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beanpole'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:beanpole_5", { + drawtype = "plantlike", + tiles = {"farming_beanpole_5.png"}, + visual_scale = 1.45, + paramtype = "light", + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beanpole'}, rarity = 1}, + {items = {'farming:beans 3'}, rarity = 1}, + {items = {'farming:beans 2'}, rarity = 2}, + {items = {'farming:beans 2'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Wild Green Bean Bush (this is what you find on the map) + +minetest.register_node("farming:beanbush", { + drawtype = "plantlike", + tiles = {"farming_beanbush.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + sunlight_propagates = true, + drop = { + items = { + {items = {'farming:beans 1'}, rarity = 1}, + {items = {'farming:beans 1'}, rarity = 2}, + {items = {'farming:beans 1'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory=1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/blueberry.lua b/mods/farming/blueberry.lua new file mode 100644 index 0000000..f785c23 --- /dev/null +++ b/mods/farming/blueberry.lua @@ -0,0 +1,103 @@ + +--= Blueberries + +minetest.register_craftitem("farming:blueberries", { + description = "Blueberries", + inventory_image = "farming_blueberries.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:blueberry_1") + end, + on_use = minetest.item_eat(1), +}) + +-- Blueberry Muffin (Thanks to sosogirl123 for muffin image in deviantart.com) + +minetest.register_craftitem("farming:muffin_blueberry", { + description = "Blueberry Muffin", + inventory_image = "farming_blueberry_muffin.png", + on_use = minetest.item_eat(2), +}) + +minetest.register_craft({ + output = "farming:muffin_blueberry 2", + recipe = { + {"farming:blueberries", "farming:bread", "farming:blueberries"}, + } +}) + +-- Define Blueberry growth stages + +minetest.register_node("farming:blueberry_1", { + drawtype = "plantlike", + tiles = {"farming_blueberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:blueberry_2", { + drawtype = "plantlike", + tiles = {"farming_blueberry_2.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:blueberry_3", { + drawtype = "plantlike", + tiles = {"farming_blueberry_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:blueberry_4", { + drawtype = "plantlike", + tiles = {"farming_blueberry_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:blueberries 2'}, rarity = 1}, + {items = {'farming:blueberries'}, rarity = 2}, + {items = {'farming:blueberries'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory=1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/carrot.lua b/mods/farming/carrot.lua new file mode 100644 index 0000000..19bb3ec --- /dev/null +++ b/mods/farming/carrot.lua @@ -0,0 +1,175 @@ + +--= Carrot (Original textures from PixelBox texture pack) +-- https://forum.minetest.net/viewtopic.php?id=4990 + +minetest.register_craftitem("farming:carrot", { + description = "Carrot", + inventory_image = "farming_carrot.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:carrot_1") + end, + on_use = minetest.item_eat(4), +}) + +-- Golden Carrot + +minetest.register_craftitem("farming:carrot_gold", { + description = "Golden Carrot", + inventory_image = "farming_carrot_gold.png", + on_use = minetest.item_eat(6), +}) + +minetest.register_craft({ + output = "farming:carrot_gold", + recipe = { + {"", "default:gold_lump", ""}, + {"default:gold_lump", "farming:carrot", "default:gold_lump"}, + {"", "default:gold_lump", ""}, + } +}) + +-- Define Carrot growth stages + +minetest.register_node("farming:carrot_1", { + drawtype = "plantlike", + tiles = {"farming_carrot_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:carrot_2", { + drawtype = "plantlike", + tiles = {"farming_carrot_2.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:carrot_3", { + drawtype = "plantlike", + tiles = {"farming_carrot_3.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:carrot_4", { + drawtype = "plantlike", + tiles = {"farming_carrot_4.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:carrot_5", { + drawtype = "plantlike", + tiles = {"farming_carrot_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:carrot_6", { + drawtype = "plantlike", + tiles = {"farming_carrot_6.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:carrot_7", { + drawtype = "plantlike", + tiles = {"farming_carrot_7.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:carrot'}, rarity = 1}, + {items = {'farming:carrot 2'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:carrot_8", { + drawtype = "plantlike", + tiles = {"farming_carrot_8.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:carrot 2'}, rarity = 1}, + {items = {'farming:carrot 3'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/cocoa.lua b/mods/farming/cocoa.lua new file mode 100644 index 0000000..c68a0d3 --- /dev/null +++ b/mods/farming/cocoa.lua @@ -0,0 +1,176 @@ + +-- Place Cocoa + +function place_cocoa(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + + -- check if pointing at a node + if not pt and pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] then + return + end + + -- check if pointing at jungletree + if under.name ~= "default:jungletree" then + return + end + + -- add the node and remove 1 item from the itemstack + minetest.add_node(pt.above, {name = plantname}) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack +end + +--= Cocoa + +minetest.register_craftitem("farming:cocoa_beans", { + description = "Cocoa Beans", + inventory_image = "farming_cocoa_beans.png", + on_place = function(itemstack, placer, pointed_thing) + return place_cocoa(itemstack, placer, pointed_thing, "farming:cocoa_1") + end, +}) + +minetest.register_craft( { + output = "dye:brown 2", + recipe = { + { "farming:cocoa_beans" }, + } +}) + +-- Cookie + +minetest.register_craftitem("farming:cookie", { + description = "Cookie", + inventory_image = "farming_cookie.png", + on_use = minetest.item_eat(2), +}) + +minetest.register_craft( { + output = "farming:cookie 8", + recipe = { + { "farming:wheat", "farming:cocoa_beans", "farming:wheat" }, + } +}) + +-- Bar of Dark Chocolate (Thanks to Ice Pandora for her deviantart.com chocolate tutorial) + +minetest.register_craftitem("farming:chocolate_dark", { + description = "Bar of Dark Chocolate", + inventory_image = "farming_chocolate_dark.png", + on_use = minetest.item_eat(3), +}) + +minetest.register_craft( { + output = "farming:chocolate_dark", + recipe = { + { "farming:cocoa_beans", "farming:cocoa_beans", "farming:cocoa_beans" }, + } +}) + +-- Define Coffee growth stages + +minetest.register_node("farming:cocoa_1", { + drawtype = "plantlike", + tiles = {"farming_cocoa_1.png"}, + paramtype = "light", + walkable = true, + drop = { + items = { + {items = {'farming:cocoa_beans 1'}, rarity = 2}, + } + }, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = { + snappy = 3, flammable = 2, plant = 1, growing = 1, + not_in_creative_inventory=1, leafdecay = 1, leafdecay_drop = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cocoa_2", { + drawtype = "plantlike", + tiles = {"farming_cocoa_2.png"}, + paramtype = "light", + walkable = true, + drop = { + items = { + {items = {'farming:cocoa_beans 1'}, rarity = 1}, + } + }, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = { + snappy = 3, flammable = 2, plant = 1, growing = 1, + not_in_creative_inventory=1, leafdecay = 1, leafdecay_drop = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of Cocoa growth does not have growing=1 so abm never has to check these + +minetest.register_node("farming:cocoa_3", { + drawtype = "plantlike", + tiles = {"farming_cocoa_3.png"}, + paramtype = "light", + walkable = true, + drop = { + items = { + {items = {'farming:cocoa_beans 2'}, rarity = 1}, + {items = {'farming:cocoa_beans 1'}, rarity = 2}, + } + }, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = { + snappy = 3, flammable = 2, plant = 1, + not_in_creative_inventory = 1, leafdecay = 1, leafdecay_drop = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Abm to add random Cocoa Pod to Jungle Tree trunks + +minetest.register_abm({ + nodenames = {"default:jungletree"}, + neighbors = {"default:jungleleaves", "moretrees:jungletree_leaves_green"}, + interval = 80, + chance = 20, + action = function(pos, node) + + local dir = math.random(1,50) + + if dir == 1 then pos.x = pos.x + 1 + elseif dir == 2 then pos.x = pos.x - 1 + elseif dir == 3 then pos.z = pos.z + 1 + elseif dir == 4 then pos.z = pos.z -1 + else return + end + + local nod = minetest.get_node_or_nil(pos) + if nod then nod = nod.name else return end + + if nod == "air" + and minetest.get_node_light(pos) > 12 then +-- print ("COCOA", pos.x, pos.y, pos.z) + minetest.set_node(pos, { + name = "farming:cocoa_"..tostring(math.random(1, 3)) + }) + end + end, +}) \ No newline at end of file diff --git a/mods/farming/coffee.lua b/mods/farming/coffee.lua new file mode 100644 index 0000000..19c3f7f --- /dev/null +++ b/mods/farming/coffee.lua @@ -0,0 +1,199 @@ + +--= Coffee + +minetest.register_craftitem("farming:coffee_beans", { + description = "Coffee Beans", + inventory_image = "farming_coffee_beans.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:coffee_1") + end, +}) + +--= Glass Cup +--minetest.register_craftitem("farming:drinking_cup", { +-- description = "Drinking Cup", +-- inventory_image = "vessels_drinking_cup.png", +--}) + +minetest.register_node("farming:drinking_cup", { + description = "Drinking Cup (empty)", + drawtype = "plantlike", + tiles = {"vessels_drinking_cup.png"}, + inventory_image = "vessels_drinking_cup.png", + wield_image = "vessels_drinking_cup.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "farming:drinking_cup 5", + recipe = { + { "default:glass", "", "default:glass" }, + {"", "default:glass",""}, + } +}) + +--= Cold Cup of Coffee +--minetest.register_craftitem("farming:coffee_cup", { +-- description = "Cold Cup of Coffee", +-- inventory_image = "farming_coffee_cup.png", +-- on_use = minetest.item_eat(2, "farming:drinking_cup"), +--}) + +minetest.register_node("farming:coffee_cup", { + description = "Cup of Coffee (cold)", + drawtype = "plantlike", + tiles = {"farming_coffee_cup.png"}, + inventory_image = "farming_coffee_cup.png", + wield_image = "farming_coffee_cup.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + on_use = minetest.item_eat(2, "farming:drinking_cup"), + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "farming:coffee_cup", + recipe = { + {"farming:drinking_cup", "farming:coffee_beans","bucket:bucket_water"}, + {"","",""}, + {"","",""} + }, + replacements = {{"bucket:bucket_water", "bucket:bucket_empty"}} +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 5, + output = "farming:coffee_cup_hot", + recipe = "farming:coffee_cup" +}) + +--= Hot Cup of Coffee +--minetest.register_craftitem("farming:coffee_cup_hot", { +-- description = "Hot Cup of Coffee", +-- inventory_image = "farming_coffee_cup_hot.png", +-- on_use = minetest.item_eat(3, "farming:drinking_cup"), +--}) + +minetest.register_node("farming:coffee_cup_hot", { + description = "Cup of Coffee (hot)", + drawtype = "plantlike", + tiles = {"farming_coffee_cup_hot.png"}, + inventory_image = "farming_coffee_cup_hot.png", + wield_image = "farming_coffee_cup_hot.png", + paramtype = "light", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.25, 0.25} + }, + groups = {vessel = 1, dig_immediate = 3, attached_node = 1}, + on_use = minetest.item_eat(3, "farming:drinking_cup"), + sounds = default.node_sound_glass_defaults(), +}) + +-- Define Coffee growth stages + +minetest.register_node("farming:coffee_1", { + drawtype = "plantlike", + tiles = {"farming_coffee_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:coffee_2", { + drawtype = "plantlike", + tiles = {"farming_coffee_2.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:coffee_3", { + drawtype = "plantlike", + tiles = {"farming_coffee_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:coffee_4", { + drawtype = "plantlike", + tiles = {"farming_coffee_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth doesn not have growing group so abm never checks these + +minetest.register_node("farming:coffee_5", { + drawtype = "plantlike", + tiles = {"farming_coffee_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:coffee_beans 2'}, rarity = 1}, + {items = {'farming:coffee_beans 2'}, rarity = 2}, + {items = {'farming:coffee_beans 2'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory=1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/compatibility.lua b/mods/farming/compatibility.lua new file mode 100644 index 0000000..708b54e --- /dev/null +++ b/mods/farming/compatibility.lua @@ -0,0 +1,97 @@ +-- is Ethereal mod installed? +local eth = minetest.get_modpath("ethereal") or nil + +-- Banana +if eth then + minetest.register_alias("farming_plus:banana_sapling", "ethereal:banana_tree_sapling") + minetest.register_alias("farming_plus:banana_leaves", "ethereal:bananaleaves") + minetest.register_alias("farming_plus:banana", "ethereal:banana") +else + minetest.register_alias("farming_plus:banana_sapling", "default:sapling") + minetest.register_alias("farming_plus:banana_leaves", "default:leaves") + minetest.register_alias("farming_plus:banana", "default:apple") +end + +-- Carrot +minetest.register_alias("farming_plus:carrot_seed", "farming:carrot") +minetest.register_alias("farming_plus:carrot_1", "farming:carrot_1") +minetest.register_alias("farming_plus:carrot_2", "farming:carrot_4") +minetest.register_alias("farming_plus:carrot_3", "farming:carrot_6") +minetest.register_alias("farming_plus:carrot", "farming:carrot_8") + +-- Cocoa + +minetest.register_alias("farming_plus:cocoa_sapling", "farming:cocoa_beans") +minetest.register_alias("farming_plus:cocoa_leaves", "default:leaves") +minetest.register_alias("farming_plus:cocoa", "default:apple") +minetest.register_alias("farming_plus:cocoa_bean", "farming:cocoa_beans") + +-- Orange +minetest.register_alias("farming_plus:orange_1", "farming:tomato_1") +minetest.register_alias("farming_plus:orange_2", "farming:tomato_4") +minetest.register_alias("farming_plus:orange_3", "farming:tomato_6") +minetest.register_alias("farming_plus:orange", "farming:tomato_8") + +if eth then + minetest.register_alias("farming_plus:orange_item", "ethereal:orange") + minetest.register_alias("farming_plus:orange_seed", "ethereal:orange_tree_sapling") +else + minetest.register_alias("farming_plus:orange_item", "default:apple") + minetest.register_alias("farming_plus:orange_seed", "default:sapling") +end + +-- Potato +minetest.register_alias("farming_plus:potato_item", "farming:potato") +minetest.register_alias("farming_plus:potato_1", "farming:potato_1") +minetest.register_alias("farming_plus:potato_2", "farming:potato_2") +minetest.register_alias("farming_plus:potato", "farming:potato_3") +minetest.register_alias("farming_plus:potato_seed", "farming:potato") + +-- Pumpkin +minetest.register_alias("farming:pumpkin_seed", "farming:pumpkin_slice") +minetest.register_alias("farming:pumpkin_face", "farming:pumpkin") +minetest.register_alias("farming:pumpkin_face_light", "farming:jackolantern") +minetest.register_alias("farming:big_pumpkin", "farming:pumpkin") +minetest.register_alias("farming:big_pumpkin_side", "air") +minetest.register_alias("farming:big_pumpkin_corner", "air") +minetest.register_alias("farming:big_pumpkin_top", "air") +minetest.register_alias("farming:scarecrow", "farming:pumpkin") +minetest.register_alias("farming:scarecrow_bottom", "default:fence_wood") +minetest.register_alias("farming:scarecrow_light", "farming:jackolantern") +minetest.register_alias("farming:pumpkin_flour", "farming:pumpkin_dough") + +-- Rhubarb +minetest.register_alias("farming_plus:rhubarb_seed", "farming:rhubarb") +minetest.register_alias("farming_plus:rhubarb_1", "farming:rhubarb_1") +minetest.register_alias("farming_plus:rhubarb_2", "farming:rhubarb_2") +minetest.register_alias("farming_plus:rhubarb", "farming:rhubarb_3") +minetest.register_alias("farming_plus:rhubarb_item", "farming:rhubarb") + +-- Strawberry +if eth then + minetest.register_alias("farming_plus:strawberry_item", "ethereal:strawberry") + minetest.register_alias("farming_plus:strawberry_seed", "ethereal:strawberry") + minetest.register_alias("farming_plus:strawberry_1", "ethereal:strawberry_1") + minetest.register_alias("farming_plus:strawberry_2", "ethereal:strawberry_3") + minetest.register_alias("farming_plus:strawberry_3", "ethereal:strawberry_5") + minetest.register_alias("farming_plus:strawberry", "ethereal:strawberry_7") +else + minetest.register_alias("farming_plus:strawberry_item", "farming:raspberries") + minetest.register_alias("farming_plus:strawberry_seed", "farming:raspberries") + minetest.register_alias("farming_plus:strawberry_1", "farming:raspberry_1") + minetest.register_alias("farming_plus:strawberry_2", "farming:raspberry_2") + minetest.register_alias("farming_plus:strawberry_3", "farming:raspberry_3") + minetest.register_alias("farming_plus:strawberry", "farming:raspberry_4") + +end + +-- Tomato +minetest.register_alias("farming_plus:tomato_seed", "farming:tomato") +minetest.register_alias("farming_plus:tomato_item", "farming:tomato") +minetest.register_alias("farming_plus:tomato_1", "farming:tomato_2") +minetest.register_alias("farming_plus:tomato_2", "farming:tomato_4") +minetest.register_alias("farming_plus:tomato_3", "farming:tomato_6") +minetest.register_alias("farming_plus:tomato", "farming:tomato_8") + +-- Weed +minetest.register_alias("farming:weed", "default:grass_2") \ No newline at end of file diff --git a/mods/farming/corn.lua b/mods/farming/corn.lua new file mode 100644 index 0000000..dcb0833 --- /dev/null +++ b/mods/farming/corn.lua @@ -0,0 +1,200 @@ + +--= Corn (Original textures from GeMinecraft) +-- http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/wip-mods/1440575-1-2-5-generation-minecraft-beta-1-2-farming-and + +minetest.register_craftitem("farming:corn", { + description = "Corn", + inventory_image = "farming_corn.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:corn_1") + end, + on_use = minetest.item_eat(3), +}) + +--= Corn on the Cob (Texture by TenPlus1) + +minetest.register_craftitem("farming:corn_cob", { + description = "Corn on the Cob", + inventory_image = "farming_corn_cob.png", + on_use = minetest.item_eat(5), +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 10, + output = "farming:corn_cob", + recipe = "farming:corn" +}) + +--= Ethanol (Thanks to JKMurray for this idea) + +minetest.register_craftitem("farming:bottle_ethanol", { + description = "Bottle of Ethanol", + inventory_image = "farming_bottle_ethanol.png", +}) + +minetest.register_craft( { + output = "farming:bottle_ethanol", + recipe = { + { "vessels:glass_bottle", "farming:corn", "farming:corn"}, + { "farming:corn", "farming:corn", "farming:corn"}, + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "farming:bottle_ethanol", + burntime = 240, + replacements = {{ "farming:bottle_ethanol", "vessels:glass_bottle"}} +}) + +-- Define Corn growth stages + +minetest.register_node("farming:corn_1", { + drawtype = "plantlike", + tiles = {"farming_corn_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:corn_2", { + drawtype = "plantlike", + tiles = {"farming_corn_2.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:corn_3", { + drawtype = "plantlike", + tiles = {"farming_corn_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:corn_4", { + drawtype = "plantlike", + tiles = {"farming_corn_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:corn_5", { + drawtype = "plantlike", + tiles = {"farming_corn_5.png"}, + paramtype = "light", + waving = 1, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:corn_6", { + drawtype = "plantlike", + tiles = {"farming_corn_6.png"}, + visual_scale = 1.45, + paramtype = "light", + waving = 1, + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:corn_7", { + drawtype = "plantlike", + tiles = {"farming_corn_7.png"}, + visual_scale = 1.45, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:corn'}, rarity = 1}, + {items = {'farming:corn'}, rarity = 2}, + {items = {'farming:corn'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth doesn not have growing group so abm never checks these + +minetest.register_node("farming:corn_8", { + drawtype = "plantlike", + tiles = {"farming_corn_8.png"}, + visual_scale = 1.45, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:corn 2'}, rarity = 1}, + {items = {'farming:corn 2'}, rarity = 2}, + {items = {'farming:corn 2'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/cotton.lua b/mods/farming/cotton.lua new file mode 100644 index 0000000..1edbd3a --- /dev/null +++ b/mods/farming/cotton.lua @@ -0,0 +1,205 @@ +-- Cotton Seed + +--minetest.register_craftitem("farming:seed_cotton", { +-- description = "Cotton Seed", +-- inventory_image = "farming_cotton_seed.png", +-- on_place = function(itemstack, placer, pointed_thing) +-- return farming.place_seed(itemstack, placer, pointed_thing, "farming:cotton_1") +-- end, +--}) + +minetest.register_node("farming:seed_cotton", { + description = "Cotton Seed", + tiles = {"farming_cotton_seed.png"}, + inventory_image = "farming_cotton_seed.png", + wield_image = "farming_cotton_seed.png", + drawtype = "signlike", + groups = {seed = 1, snappy = 3, attached_node = 1}, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:cotton_1") + end, +}) + +-- Cotton + +minetest.register_craftitem("farming:cotton", { + description = "Cotton", + inventory_image = "farming_cotton.png", +}) + +minetest.register_alias("farming:string", "farming:cotton") + +-- String to Wool + +minetest.register_craft({ + output = "wool:white", + recipe = { + {"farming:string", "farming:string"}, + {"farming:string", "farming:string"}, + } +}) + +-- Define Cotton growth stages + +minetest.register_node("farming:cotton_1", { + drawtype = "plantlike", + tiles = {"farming_cotton_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cotton_2", { + drawtype = "plantlike", + tiles = {"farming_cotton_2.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cotton_3", { + drawtype = "plantlike", + tiles = {"farming_cotton_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cotton_4", { + drawtype = "plantlike", + tiles = {"farming_cotton_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cotton_5", { + drawtype = "plantlike", + tiles = {"farming_cotton_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {"farming:seed_cotton"}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cotton_6", { + drawtype = "plantlike", + tiles = {"farming_cotton_6.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {"farming:cotton"}, rarity = 1}, + {items = {"farming:cotton"}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cotton_7", { + drawtype = "plantlike", + tiles = {"farming_cotton_7.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {"farming:cotton"}, rarity = 1}, + {items = {"farming:cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 1}, + {items = {"farming:seed_cotton"}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:cotton_8", { + drawtype = "plantlike", + tiles = {"farming_cotton_8.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {"farming:string"}, rarity = 1}, + {items = {"farming:string"}, rarity = 2}, + {items = {"farming:string"}, rarity = 3}, + {items = {"farming:seed_cotton"}, rarity = 1}, + {items = {"farming:seed_cotton"}, rarity = 2}, + {items = {"farming:seed_cotton"}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/cucumber.lua b/mods/farming/cucumber.lua new file mode 100644 index 0000000..6a1bbab --- /dev/null +++ b/mods/farming/cucumber.lua @@ -0,0 +1,84 @@ + +--= Cucumber (Original textures from DocFarming mod) +-- https://forum.minetest.net/viewtopic.php?id=3948 + +minetest.register_craftitem("farming:cucumber", { + description = "Cucumber", + inventory_image = "farming_cucumber.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:cucumber_1") + end, + on_use = minetest.item_eat(4), +}) + +-- Define Cucumber growth stages + +minetest.register_node("farming:cucumber_1", { + drawtype = "plantlike", + tiles = {"farming_cucumber_1.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cucumber_2", { + drawtype = "plantlike", + tiles = {"farming_cucumber_2.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:cucumber_3", { + drawtype = "plantlike", + tiles = {"farming_cucumber_3.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:cucumber_4", { + drawtype = "plantlike", + tiles = {"farming_cucumber_4.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:cucumber'}, rarity = 1}, + {items = {'farming:cucumber 2'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/depends.txt b/mods/farming/depends.txt new file mode 100644 index 0000000..be420a3 --- /dev/null +++ b/mods/farming/depends.txt @@ -0,0 +1,2 @@ +default +wool \ No newline at end of file diff --git a/mods/farming/donut.lua b/mods/farming/donut.lua new file mode 100644 index 0000000..1b49848 --- /dev/null +++ b/mods/farming/donut.lua @@ -0,0 +1,45 @@ +-- Donut (thanks to Bockwurst for making the donut images) +minetest.register_craftitem("farming:donut", { + description = "Donut", + inventory_image = "farming_donut.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craft({ + output = "farming:donut 3", + recipe = { + {'', 'farming:wheat', ''}, + {'farming:wheat', '', 'farming:wheat'}, + {'', 'farming:wheat', ''}, + } +}) + +-- Chocolate Donut +minetest.register_craftitem("farming:donut_chocolate", { + description = "Chocolate Donut", + inventory_image = "farming_donut_chocolate.png", + on_use = minetest.item_eat(6), +}) + +minetest.register_craft({ + output = "farming:donut_chocolate", + recipe = { + {'farming:cocoa_beans'}, + {'farming:donut'}, + } +}) + +-- Apple Donut +minetest.register_craftitem("farming:donut_apple", { + description = "Apple Donut", + inventory_image = "farming_donut_apple.png", + on_use = minetest.item_eat(6), +}) + +minetest.register_craft({ + output = "farming:donut_apple", + recipe = { + {'default:apple'}, + {'farming:donut'}, + } +}) \ No newline at end of file diff --git a/mods/farming/grass.lua b/mods/farming/grass.lua new file mode 100644 index 0000000..04a66a8 --- /dev/null +++ b/mods/farming/grass.lua @@ -0,0 +1,28 @@ + +-- Override default grass and have it drop Wheat Seeds + +for i=1,5 do + + minetest.override_item("default:grass_"..i, { + drop = { + max_items = 1, + items = { + {items = {'farming:seed_wheat'}, rarity = 5}, + {items = {'default:grass_1'}}, + } + }, + }) + +end + +-- Override default Jungle Grass and have it drop Cotton Seeds + +minetest.override_item("default:junglegrass", { + drop = { + max_items = 1, + items = { + {items = {'farming:seed_cotton'}, rarity = 8}, + {items = {'default:junglegrass'}}, + } + }, +}) \ No newline at end of file diff --git a/mods/farming/hoes.lua b/mods/farming/hoes.lua new file mode 100644 index 0000000..3a2d107 --- /dev/null +++ b/mods/farming/hoes.lua @@ -0,0 +1,150 @@ + +-- Hoe registration function + +farming.register_hoe = function(name, def) + -- Check for : prefix (register new hoes in your mod's namespace) + if name:sub(1,1) ~= ":" then + name = ":" .. name + end + -- Check def table + if def.description == nil then + def.description = "Hoe" + end + if def.inventory_image == nil then + def.inventory_image = "unknown_item.png" + end + if def.recipe == nil then + def.recipe = { + {"air","air",""}, + {"","group:stick",""}, + {"","group:stick",""} + } + end + if def.max_uses == nil then + def.max_uses = 30 + end + -- Register the tool + minetest.register_tool(name, { + description = def.description, + inventory_image = def.inventory_image, + on_use = function(itemstack, user, pointed_thing) + return farming.hoe_on_use(itemstack, user, pointed_thing, def.max_uses) + end + }) + -- Register its recipe + minetest.register_craft({ + output = name:gsub(":", "", 1), + recipe = def.recipe + }) +end + +-- Turns dirt with group soil=1 into soil + +function farming.hoe_on_use(itemstack, user, pointed_thing, uses) + local pt = pointed_thing + -- check if pointing at a node + if not pt or pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local upos = pointed_thing.under + + if minetest.is_protected(upos, user:get_player_name()) then + minetest.record_protection_violation(upos, user:get_player_name()) + return + end + + local p = {x = pt.under.x, y = pt.under.y + 1, z = pt.under.z} + local above = minetest.get_node(p) + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] + or not minetest.registered_nodes[above.name] then + return + end + + -- check if the node above the pointed thing is air + if above.name ~= "air" then + return + end + + -- check if pointing at dirt + if minetest.get_item_group(under.name, "soil") ~= 1 then + return + end + + -- turn the node into soil, wear out item and play sound + minetest.set_node(pt.under, {name = "farming:soil"}) + minetest.sound_play("default_dig_crumbly", {pos = pt.under, gain = 0.5}) + itemstack:add_wear(65535/(uses - 1)) + return itemstack +end + +-- Define Hoes + +farming.register_hoe(":farming:hoe_wood", { + description = "Wooden Hoe", + inventory_image = "farming_tool_woodhoe.png", + max_uses = 30, + recipe = { + {"group:wood", "group:wood"}, + {"", "group:stick"}, + {"", "group:stick"}, + } +}) + +farming.register_hoe(":farming:hoe_stone", { + description = "Stone Hoe", + inventory_image = "farming_tool_stonehoe.png", + max_uses = 90, + recipe = { + {"group:stone", "group:stone"}, + {"", "group:stick"}, + {"", "group:stick"}, + } +}) + +farming.register_hoe(":farming:hoe_steel", { + description = "Steel Hoe", + inventory_image = "farming_tool_steelhoe.png", + max_uses = 200, + recipe = { + {"default:steel_ingot", "default:steel_ingot"}, + {"", "group:stick"}, + {"", "group:stick"}, + } +}) + +farming.register_hoe(":farming:hoe_bronze", { + description = "Bronze Hoe", + inventory_image = "farming_tool_bronzehoe.png", + max_uses = 220, + recipe = { + {"default:bronze_ingot", "default:bronze_ingot"}, + {"", "group:stick"}, + {"", "group:stick"}, + } +}) + +farming.register_hoe(":farming:hoe_mese", { + description = "Mese Hoe", + inventory_image = "farming_tool_mesehoe.png", + max_uses = 350, + recipe = { + {"default:mese_crystal", "default:mese_crystal"}, + {"", "group:stick"}, + {"", "group:stick"}, + } +}) + +farming.register_hoe(":farming:hoe_diamond", { + description = "Diamond Hoe", + inventory_image = "farming_tool_diamondhoe.png", + max_uses = 500, + recipe = { + {"default:diamond", "default:diamond"}, + {"", "group:stick"}, + {"", "group:stick"}, + } +}) \ No newline at end of file diff --git a/mods/farming/init.lua b/mods/farming/init.lua new file mode 100644 index 0000000..03fc451 --- /dev/null +++ b/mods/farming/init.lua @@ -0,0 +1,520 @@ +--[[ + Minetest Farming Redo Mod 1.20 (5th July 2015) + by TenPlus1 + NEW growing routine by prestidigitator +]] + +farming = {} +farming.mod = "redo" +farming.path = minetest.get_modpath("farming") +farming.hoe_on_use = default.hoe_on_use +farming.select = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5} +} + +farming.DEBUG = false +-- farming.DEBUG = {} -- Uncomment to turn on profiling code/functions + +local DEBUG_abm_runs = 0 +local DEBUG_abm_time = 0 +local DEBUG_timer_runs = 0 +local DEBUG_timer_time = 0 +if farming.DEBUG then + function farming.DEBUG.reset_times() + DEBUG_abm_runs = 0 + DEBUG_abm_time = 0 + DEBUG_timer_runs = 0 + DEBUG_timer_time = 0 + end + + function farming.DEBUG.report_times() + local abm_n = DEBUG_abm_runs + local abm_dt = DEBUG_abm_time + local abm_avg = (abm_n > 0 and abm_dt / abm_n) or 0 + local timer_n = DEBUG_timer_runs + local timer_dt = DEBUG_timer_time + local timer_avg = (timer_n > 0 and timer_dt / timer_n) or 0 + local dt = abm_dt + timer_dt + print("ABM ran for "..abm_dt.."µs over "..abm_n.." runs: ".. + abm_avg.."µs/run") + print("Timer ran for "..timer_dt.."µs over "..timer_n.." runs: ".. + timer_avg.."µs/run") + print("Total farming time: "..dt.."µs") + end +end + +local statistics = dofile(farming.path.."/statistics.lua") +dofile(farming.path.."/soil.lua") +dofile(farming.path.."/hoes.lua") +dofile(farming.path.."/grass.lua") +dofile(farming.path.."/wheat.lua") +dofile(farming.path.."/cotton.lua") +dofile(farming.path.."/carrot.lua") +dofile(farming.path.."/potato.lua") +dofile(farming.path.."/tomato.lua") +dofile(farming.path.."/cucumber.lua") +dofile(farming.path.."/corn.lua") +dofile(farming.path.."/coffee.lua") +dofile(farming.path.."/melon.lua") +dofile(farming.path.."/sugar.lua") +dofile(farming.path.."/pumpkin.lua") +dofile(farming.path.."/cocoa.lua") +dofile(farming.path.."/raspberry.lua") +dofile(farming.path.."/blueberry.lua") +dofile(farming.path.."/rhubarb.lua") +dofile(farming.path.."/beanpole.lua") +dofile(farming.path.."/donut.lua") +dofile(farming.path.."/mapgen.lua") +dofile(farming.path.."/compatibility.lua") -- Farming Plus compatibility + +-- Utility Functions + +local time_speed = tonumber(minetest.setting_get("time_speed")) or 72 +local SECS_PER_CYCLE = (time_speed > 0 and 24 * 60 * 60 / time_speed) or nil + +local function clamp(x, min, max) + return (x < min and min) or (x > max and max) or x +end + +local function in_range(x, min, max) + return min <= x and x <= max +end + +--- Tests the amount of day or night time between two times. + -- + -- @param t_game + -- The current time, as reported by mintest.get_gametime(). + -- @param t_day + -- The current time, as reported by mintest.get_timeofday(). + -- @param dt + -- The amount of elapsed time. + -- @param count_day + -- If true, count elapsed day time. Otherwise, count elapsed night time. + -- @return + -- The amount of day or night time that has elapsed. + -- +local function day_or_night_time(t_game, t_day, dt, count_day) + local t1_day = t_day - dt / SECS_PER_CYCLE + + local t1_c, t2_c -- t1_c < t2_c and t2_c always in [0, 1) + if count_day then + if t_day < 0.25 then + t1_c = t1_day + 0.75 -- Relative to sunup, yesterday + t2_c = t_day + 0.75 + else + t1_c = t1_day - 0.25 -- Relative to sunup, today + t2_c = t_day - 0.25 + end + else + if t_day < 0.75 then + t1_c = t1_day + 0.25 -- Relative to sundown, yesterday + t2_c = t_day + 0.25 + else + t1_c = t1_day - 0.75 -- Relative to sundown, today + t2_c = t_day - 0.75 + end + end + + local dt_c = clamp(t2_c, 0, 0.5) - clamp(t1_c, 0, 0.5) -- this cycle + if t1_c < -0.5 then + local nc = math.floor(-t1_c) + t1_c = t1_c + nc + dt_c = dt_c + 0.5 * nc + clamp(-t1_c - 0.5, 0, 0.5) + end + + return dt_c * SECS_PER_CYCLE +end + +--- Tests the amount of elapsed day time. + -- + -- @param dt + -- The amount of elapsed time. + -- @return + -- The amount of day time that has elapsed. + -- +local function day_time(dt) + return day_or_night_time(minetest.get_gametime(), minetest.get_timeofday(), dt, true) +end + +--- Tests the amount of elapsed night time. + -- + -- @param dt + -- The amount of elapsed time. + -- @return + -- The amount of night time that has elapsed. + -- +local function night_time(time_game, time_day, dt, count_day) + return day_or_night_time(minetest.get_gametime(), minetest.get_timeofday(), dt, false) +end + + +-- Growth Logic + +local STAGE_LENGTH_AVG = 160.0 +local STAGE_LENGTH_DEV = STAGE_LENGTH_AVG / 6 +local MIN_LIGHT = 13 +local MAX_LIGHT = 1000 + +--- Determines plant name and stage from node. + -- + -- Separates node name on the last underscore (_). + -- + -- @param node + -- Node or position table, or node name. + -- @return + -- List (plant_name, stage), or nothing (nil) if node isn't loaded + -- +local function plant_name_stage(node) + local name + if type(node) == 'table' then + if node.name then + name = node.name + elseif node.x and node.y and node.z then + node = minetest.get_node_or_nil(node) + name = node and node.name + end + else + name = tostring(node) + end + if not name or name == "ignore" then return nil end + + local sep_pos = name:find("_[^_]+$") + if sep_pos and sep_pos > 1 then + local stage = tonumber(name:sub(sep_pos + 1)) + if stage and stage >= 0 then + return name:sub(1, sep_pos - 1), stage + end + end + + return name, 0 +end + +--- Map from node name to + -- { plant_name = ..., name = ..., stage = n, stages_left = { node_name, ... } } +local plant_stages = {} +farming.plant_stages = plant_stages + +--- Registers the stages of growth of a (possible plant) node. + -- + -- @param node + -- Node or position table, or node name. + -- @return + -- The (possibly zero) number of stages of growth the plant will go through + -- before being fully grown, or nil if not a plant. + -- +local register_plant_node +-- Recursive helper +local function reg_plant_stages(plant_name, stage, force_last) + local node_name = plant_name and plant_name .. "_" .. stage + local node_def = node_name and minetest.registered_nodes[node_name] + if not node_def then return nil end + + local stages = plant_stages[node_name] + if stages then return stages end + + if minetest.get_item_group(node_name, "growing") > 0 then + local ns = reg_plant_stages(plant_name, stage + 1, true) + + local stages_left = (ns and { ns.name, unpack(ns.stages_left) }) or {} + stages = { + plant_name = plant_name, + name = node_name, + stage = stage, + stages_left = stages_left + } + + if #stages_left > 0 then + local old_constr = node_def.on_construct + local old_destr = node_def.on_destruct + minetest.override_item(node_name, + { + on_construct = function(pos) + if old_constr then old_constr(pos) end + farming.handle_growth(pos) + end, + + on_destruct = function(pos) + minetest.get_node_timer(pos):stop() + if old_destr then old_destr(pos) end + end, + + on_timer = function(pos, elapsed) + return farming.plant_growth_timer(pos, elapsed, node_name) + end, + }) + end + elseif force_last then + stages = { + plant_name = plant_name, + name = node_name, + stage = stage, + stages_left = {} + } + else + return nil + end + + plant_stages[node_name] = stages + return stages +end + +register_plant_node = function(node) + local plant_name, stage = plant_name_stage(node) + if plant_name then + local stages = reg_plant_stages(plant_name, stage, false) + return stages and #stages.stages_left + else + return nil + end +end + +local function set_growing(pos, stages_left) + if not stages_left then return end + + local timer = minetest.get_node_timer(pos) + if stages_left > 0 then + if not timer:is_started() then + local stage_length = statistics.normal(STAGE_LENGTH_AVG, STAGE_LENGTH_DEV) + stage_length = clamp(stage_length, 0.5 * STAGE_LENGTH_AVG, 3.0 * STAGE_LENGTH_AVG) + timer:set(stage_length, -0.5 * math.random() * STAGE_LENGTH_AVG) + end + elseif timer:is_started() then + timer:stop() + end +end + +--- Detects a plant type node at the given position, starting or stopping the plant growth timer as appopriate + -- + -- @param pos + -- The node's position. + -- @param node + -- The cached node table if available, or nil. + -- +function farming.handle_growth(pos, node) + if not pos then return end + local stages_left = register_plant_node(node or pos) + if stages_left then set_growing(pos, stages_left) end +end + +minetest.after(0, + function() + for _, node_def in pairs(minetest.registered_nodes) do + register_plant_node(node_def) + end + end) + +local abm_func = farming.handle_growth +if farming.DEBUG then + local normal_abm_func = abm_func + abm_func = function(...) + local t0 = minetest.get_us_time() + local r = { normal_abm_func(...) } + local t1 = minetest.get_us_time() + DEBUG_abm_runs = DEBUG_abm_runs + 1 + DEBUG_abm_time = DEBUG_abm_time + (t1 - t0) + return unpack(r) + end +end + +-- Just in case a growing type or added node is missed (also catches existing +-- nodes added to map before timers were incorporated). +minetest.register_abm({ + nodenames = { "group:growing" }, + interval = 300, + chance = 1, + action = abm_func}) + +--- Plant timer function. + -- + -- Grows plants under the right conditions. + -- +function farming.plant_growth_timer(pos, elapsed, node_name) + local stages = plant_stages[node_name] + if not stages then return false end + + local max_growth = #stages.stages_left + if max_growth <= 0 then return false end + + if stages.plant_name == "farming:cocoa" then + if not minetest.find_node_near(pos, 1, { "default:jungletree", "moretrees:jungletree_leaves_green" }) then + return true + end + else + local under = minetest.get_node_or_nil({ x = pos.x, y = pos.y - 1, z = pos.z }) + if not under or under.name ~= "farming:soil_wet" then return true end + end + + local growth + + local light_pos = { x = pos.x, y = pos.y, z = pos.z } + local lambda = elapsed / STAGE_LENGTH_AVG + if lambda < 0.1 then return true end + if max_growth == 1 or lambda < 2.0 then + local light = (minetest.get_node_light(light_pos) or 0) -- CHANGED + --print ("light level:", light) + if not in_range(light, MIN_LIGHT, MAX_LIGHT) then return true end + growth = 1 + else + local night_light = (minetest.get_node_light(light_pos, 0) or 0) -- CHANGED + local day_light = (minetest.get_node_light(light_pos, 0.5) or 0) -- ChANGED + local night_growth = in_range(night_light, MIN_LIGHT, MAX_LIGHT) + local day_growth = in_range(day_light, MIN_LIGHT, MAX_LIGHT) + + if not night_growth then + if not day_growth then return true end + lambda = day_time(elapsed) / STAGE_LENGTH_AVG + elseif not day_growth then + lambda = night_time(elapsed) / STAGE_LENGTH_AVG + end + + growth = statistics.poisson(lambda, max_growth) + if growth < 1 then return true end + end + + minetest.swap_node(pos, { name = stages.stages_left[growth] }) + + return growth ~= max_growth +end + +if farming.DEBUG then + local timer_func = farming.plant_growth_timer; + farming.plant_growth_timer = function(pos, elapsed, node_name) + local t0 = minetest.get_us_time() + + local r = { timer_func(pos, elapsed, node_name) } + + local t1 = minetest.get_us_time() + DEBUG_timer_runs = DEBUG_timer_runs + 1 + DEBUG_timer_time = DEBUG_timer_time + (t1 - t0) + return unpack(r) + end +end + +-- Place Seeds on Soil + +function farming.place_seed(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + + -- check if pointing at a node + if not pt and pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y + 1 then + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] + or not minetest.registered_nodes[above.name] then + return + end + + -- can I replace above node, and am I pointing at soil + if not minetest.registered_nodes[above.name].buildable_to + or minetest.get_item_group(under.name, "soil") < 2 + or minetest.get_item_group(above.name, "plant") ~= 0 then -- ADDED this line for multiple seed placement bug + return + end + + -- add the node and remove 1 item from the itemstack + if not minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.add_node(pt.above, {name=plantname}) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end +end + +-- Function to register plants (for compatibility) + +farming.register_plant = function(name, def) + local mname = name:split(":")[1] + local pname = name:split(":")[2] + + -- Check def table + if not def.description then + def.description = "Seed" + end + if not def.inventory_image then + def.inventory_image = "unknown_item.png" + end + if not def.steps then + return nil + end + + -- Register seed + minetest.register_node(":" .. mname .. ":seed_" .. pname, { + description = def.description, + tiles = {def.inventory_image}, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = "signlike", + groups = {seed = 1, snappy = 3, attached_node = 1}, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":"..pname.."_1") + end + }) + + -- Register harvest + minetest.register_craftitem(":" .. mname .. ":" .. pname, { + description = pname:gsub("^%l", string.upper), + inventory_image = mname .. "_" .. pname .. ".png", + }) + + -- Register growing steps + for i=1,def.steps do + local drop = { + items = { + {items = {mname .. ":" .. pname}, rarity = 9 - i}, + {items = {mname .. ":" .. pname}, rarity= 18 - i * 2}, + {items = {mname .. ":seed_" .. pname}, rarity = 9 - i}, + {items = {mname .. ":seed_" .. pname}, rarity = 18 - i * 2}, + } + } + + local g = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, growing = 1} + -- Last step doesn't need growing=1 so Abm never has to check these + if i == def.steps then + g = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1} + end + + local node_name = mname .. ":" .. pname .. "_" .. i + minetest.register_node(node_name, { + drawtype = "plantlike", + waving = 1, + tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = drop, + selection_box = farming.select, + groups = g, + sounds = default.node_sound_leaves_defaults(), + }) + register_plant_node(node_name) + end + + -- Return info + local r = {seed = mname .. ":seed_" .. pname, harvest = mname .. ":" .. pname} + return r +end + +--[[ Cotton (example, is already registered in cotton.lua) +farming.register_plant("farming:cotton", { + description = "Cotton2 seed", + inventory_image = "farming_cotton_seed.png", + steps = 8, +})]] \ No newline at end of file diff --git a/mods/farming/init.lua_orig b/mods/farming/init.lua_orig new file mode 100644 index 0000000..aee9976 --- /dev/null +++ b/mods/farming/init.lua_orig @@ -0,0 +1,192 @@ +--[[ + Minetest Farming Redo Mod 1.14 (11th May 2015) + by TenPlus1 +]] + +farming = {} +farming.mod = "redo" +farming.path = minetest.get_modpath("farming") +farming.hoe_on_use = default.hoe_on_use + +dofile(farming.path.."/soil.lua") +dofile(farming.path.."/hoes.lua") +dofile(farming.path.."/grass.lua") +dofile(farming.path.."/wheat.lua") +dofile(farming.path.."/cotton.lua") +dofile(farming.path.."/carrot.lua") +dofile(farming.path.."/potato.lua") +dofile(farming.path.."/tomato.lua") +dofile(farming.path.."/cucumber.lua") +dofile(farming.path.."/corn.lua") +dofile(farming.path.."/coffee.lua") +dofile(farming.path.."/melon.lua") +dofile(farming.path.."/sugar.lua") +dofile(farming.path.."/pumpkin.lua") +dofile(farming.path.."/cocoa.lua") +dofile(farming.path.."/raspberry.lua") +dofile(farming.path.."/blueberry.lua") +dofile(farming.path.."/rhubarb.lua") +dofile(farming.path.."/beanpole.lua") +dofile(farming.path.."/donut.lua") +dofile(farming.path.."/mapgen.lua") +dofile(farming.path.."/compatibility.lua") -- Farming Plus compatibility + +-- Place Seeds on Soil + +function farming.place_seed(itemstack, placer, pointed_thing, plantname) + local pt = pointed_thing + + -- check if pointing at a node + if not pt and pt.type ~= "node" then + return + end + + local under = minetest.get_node(pt.under) + local above = minetest.get_node(pt.above) + + -- check if pointing at the top of the node + if pt.above.y ~= pt.under.y+1 then + return + end + + -- return if any of the nodes is not registered + if not minetest.registered_nodes[under.name] + or not minetest.registered_nodes[above.name] then + return + end + + -- can I replace above node, and am I pointing at soil + if not minetest.registered_nodes[above.name].buildable_to + or minetest.get_item_group(under.name, "soil") < 2 + or minetest.get_item_group(above.name, "plant") ~= 0 then -- ADDED this line for multiple seed placement bug + return + end + + -- add the node and remove 1 item from the itemstack + if not minetest.is_protected(pt.above, placer:get_player_name()) then + minetest.add_node(pt.above, {name=plantname}) + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end +end + +-- Single ABM Handles Growing of All Plants + +minetest.register_abm({ + nodenames = {"group:growing"}, + neighbors = {"farming:soil_wet", "default:jungletree"}, + interval = 80, + chance = 2, + + action = function(pos, node) + + -- split plant name (e.g. farming:wheat_1) + local plant = node.name:split("_")[1].."_" + local numb = node.name:split("_")[2] + + -- fully grown ? + if not minetest.registered_nodes[plant..(numb + 1)] then return end + + -- cocoa pod on jungle tree ? + if plant ~= "farming:cocoa_" then + + -- growing on wet soil ? + if minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name ~= "farming:soil_wet" then return end + end + + -- enough light ? + if minetest.get_node_light(pos) < 13 then return end + + -- grow + minetest.set_node(pos, {name=plant..(numb + 1)}) + + end +}) + +-- Function to register plants (for compatibility) + +farming.register_plant = function(name, def) + local mname = name:split(":")[1] + local pname = name:split(":")[2] + + -- Check def table + if not def.description then + def.description = "Seed" + end + if not def.inventory_image then + def.inventory_image = "unknown_item.png" + end + if not def.steps then + return nil + end + + -- Register seed + minetest.register_node(":" .. mname .. ":seed_" .. pname, { + description = def.description, + tiles = {def.inventory_image}, + inventory_image = def.inventory_image, + wield_image = def.inventory_image, + drawtype = "signlike", + groups = {seed = 1, snappy = 3, attached_node = 1}, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},}, + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, mname .. ":"..pname.."_1") + end + }) + + -- Register harvest + minetest.register_craftitem(":" .. mname .. ":" .. pname, { + description = pname:gsub("^%l", string.upper), + inventory_image = mname .. "_" .. pname .. ".png", + }) + + -- Register growing steps + for i=1,def.steps do + local drop = { + items = { + {items = {mname .. ":" .. pname}, rarity = 9 - i}, + {items = {mname .. ":" .. pname}, rarity= 18 - i * 2}, + {items = {mname .. ":seed_" .. pname}, rarity = 9 - i}, + {items = {mname .. ":seed_" .. pname}, rarity = 18 - i * 2}, + } + } + + local g = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1, growing = 1} + -- Last step doesn't need growing=1 so Abm never has to check these + if i == def.steps then + g = {snappy = 3, flammable = 2, plant = 1, not_in_creative_inventory = 1, attached_node = 1} + end + + minetest.register_node(mname .. ":" .. pname .. "_" .. i, { + drawtype = "plantlike", + waving = 1, + tiles = {mname .. "_" .. pname .. "_" .. i .. ".png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = drop, + selection_box = {type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5},}, + groups = g, + sounds = default.node_sound_leaves_defaults(), + }) + end + + -- Return info + local r = {seed = mname .. ":seed_" .. pname, harvest = mname .. ":" .. pname} + return r +end + +--[[ Cotton (example, is already registered in cotton.lua) +farming.register_plant("farming:cotton", { + description = "Cotton seed", + inventory_image = "farming_cotton_seed.png", + steps = 8, +}) +--]] diff --git a/mods/farming/license.txt b/mods/farming/license.txt new file mode 100644 index 0000000..5d30c14 --- /dev/null +++ b/mods/farming/license.txt @@ -0,0 +1,14 @@ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. \ No newline at end of file diff --git a/mods/farming/mapgen.lua b/mods/farming/mapgen.lua new file mode 100644 index 0000000..cb87930 --- /dev/null +++ b/mods/farming/mapgen.lua @@ -0,0 +1,61 @@ +-- decoration function +local function register_plant(name, min, max, spawnby, num) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x = 100, y = 100, z = 100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = min, + y_max = max, + decoration = "farming:" .. name, + spawn_by = spawnby, + num_spawn_by = num, + }) +end + +function farming.register_mgv6_decorations() + register_plant("potato_3", 15, 40, "", -1) + register_plant("tomato_7", 5, 20, "", -1) + register_plant("carrot_8", 1, 30, "group:water", 1) + register_plant("cucumber_4", 1, 20, "group:water", 1) + register_plant("corn_7", 12, 22, "", -1) + register_plant("corn_8", 10, 20, "", -1) + register_plant("coffee_5", 20, 45, "", -1) + register_plant("melon_8", 1, 20, "group:water", 1) + register_plant("pumpkin_8", 1, 20, "group:water", 1) + register_plant("raspberry_4", 3, 10, "", -1) + register_plant("rhubarb_3", 3, 15, "group:tree", 1) + register_plant("blueberry_4", 3, 10, "", -1) + register_plant("beanbush", 18, 35, "", -1) +end + +-- v7 maps have a beach so plants growing near water is limited to 6- high +function farming.register_mgv7_decorations() + register_plant("potato_3", 15, 40, "", -1) + register_plant("tomato_7", 5, 20, "", -1) + register_plant("carrot_8", 1, 6, "", -1) + register_plant("cucumber_4", 1, 6, "", -1) + register_plant("corn_7", 12, 22, "", -1) + register_plant("corn_8", 10, 20, "", -1) + register_plant("coffee_5", 20, 45, "", -1) + register_plant("melon_8", 1, 6, "", -1) + register_plant("pumpkin_8", 1, 6, "", -1) + register_plant("raspberry_4", 3, 10, "", -1) + register_plant("rhubarb_3", 3, 15, "group:tree", 1) + register_plant("blueberry_4", 3, 10, "", -1) + register_plant("beanbush", 18, 35, "", -1) +end + +-- detect mapgen +if minetest.get_mapgen_params().mgname == "v7" then + farming.register_mgv7_decorations() +else + farming.register_mgv6_decorations() +end \ No newline at end of file diff --git a/mods/farming/melon.lua b/mods/farming/melon.lua new file mode 100644 index 0000000..77b2390 --- /dev/null +++ b/mods/farming/melon.lua @@ -0,0 +1,159 @@ + +--= Melon + +minetest.register_craftitem("farming:melon_slice", { + description = "Melon Slice", + inventory_image = "farming_melon_slice.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:melon_1") + end, + on_use = minetest.item_eat(2), +}) + +minetest.register_craft({ + output = "farming:melon_8", + recipe = { + {"farming:melon_slice", "farming:melon_slice", "farming:melon_slice"}, + {"farming:melon_slice", "farming:melon_slice", "farming:melon_slice"}, + {"farming:melon_slice", "farming:melon_slice", "farming:melon_slice"}, + } +}) + +minetest.register_craft({ + output = "farming:melon_slice 9", + recipe = { + {"", "farming:melon_8", ""}, + } +}) + +-- Define Melon growth stages + +minetest.register_node("farming:melon_1", { + drawtype = "plantlike", + tiles = {"farming_melon_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:melon_2", { + drawtype = "plantlike", + tiles = {"farming_melon_2.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:melon_3", { + drawtype = "plantlike", + tiles = {"farming_melon_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:melon_4", { + drawtype = "plantlike", + tiles = {"farming_melon_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:melon_5", { + drawtype = "plantlike", + tiles = {"farming_melon_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:melon_6", { + drawtype = "plantlike", + tiles = {"farming_melon_6.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:melon_7", { + drawtype = "plantlike", + tiles = {"farming_melon_7.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:melon_8", { + --drawtype = "nodebox", + description = "Melon", + tiles = {"farming_melon_top.png", "farming_melon_top.png", "farming_melon_side.png"}, + paramtype = "light", + walkable = true, + drop = { + items = { + {items = {'farming:melon_slice 9'}, rarity = 1}, + } + }, + groups = {snappy = 1, oddly_breakable_by_hand = 1, flammable = 2, plant = 1}, + sounds = default.node_sound_wood_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/potato.lua b/mods/farming/potato.lua new file mode 100644 index 0000000..fb13d99 --- /dev/null +++ b/mods/farming/potato.lua @@ -0,0 +1,107 @@ + +--= Potato (Original textures from DocFarming mod) +-- https://forum.minetest.net/viewtopic.php?id=3948 + +minetest.register_craftitem("farming:potato", { + description = "Potato", + inventory_image = "farming_potato.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:potato_1") + end, + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("farming:baked_potato", { + description = "Baked Potato", + inventory_image = "farming_baked_potato.png", + on_use = minetest.item_eat(6), +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 10, + output = "farming:baked_potato", + recipe = "farming:potato" +}) + +-- Define Potato growth stages + +minetest.register_node("farming:potato_1", { + drawtype = "plantlike", + tiles = {"farming_potato_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:potato_2", { + drawtype = "plantlike", + tiles = {"farming_potato_2.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:potato_3", { + drawtype = "plantlike", + tiles = {"farming_potato_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:potato'}, rarity = 1}, + {items = {'farming:potato'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:potato_4", { + drawtype = "plantlike", + tiles = {"farming_potato_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:potato 2'}, rarity = 1}, + {items = {'farming:potato 3'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory=1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/pumpkin.lua b/mods/farming/pumpkin.lua new file mode 100644 index 0000000..60f0175 --- /dev/null +++ b/mods/farming/pumpkin.lua @@ -0,0 +1,260 @@ + +--= Pumpkin (Big thanks to the PainterlyPack.net for Minecraft for allowing me to use these textures) + +minetest.register_node("farming:pumpkin", { + description = "Pumpkin", + tiles = { + "farming_pumpkin_top.png", + "farming_pumpkin_top.png", + "farming_pumpkin_side.png" + }, + groups = { + choppy = 1, oddly_breakable_by_hand = 1, + flammable = 2, plant = 1 + }, + drop = { + items = { + {items = {'farming:pumpkin_slice 9'}, rarity = 1}, + } + }, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_craftitem("farming:pumpkin_slice", { + description = "Pumpkin Slice", + inventory_image = "farming_pumpkin_slice.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:pumpkin_1") + end, + on_use = minetest.item_eat(2), +}) + +minetest.register_craft({ + output = "farming:pumpkin", + recipe = { + {"farming:pumpkin_slice", "farming:pumpkin_slice", "farming:pumpkin_slice"}, + {"farming:pumpkin_slice", "farming:pumpkin_slice", "farming:pumpkin_slice"}, + {"farming:pumpkin_slice", "farming:pumpkin_slice", "farming:pumpkin_slice"}, + } +}) + +minetest.register_craft({ + output = "farming:pumpkin_slice 9", + recipe = { + {"", "farming:pumpkin", ""}, + } +}) + +-- Jack 'O Lantern +minetest.register_node("farming:jackolantern", { + description = "Jack 'O Lantern", + tiles = { + "farming_pumpkin_top.png", + "farming_pumpkin_top.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_face_off.png" + }, + paramtype2 = "facedir", + groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + on_punch = function(pos, node, puncher) + node.name = "farming:jackolantern_on" + minetest.set_node(pos, node) + end, +}) + +minetest.register_node("farming:jackolantern_on", { + description = "Jack 'O Lantern", + tiles = { + "farming_pumpkin_top.png", + "farming_pumpkin_top.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_side.png", + "farming_pumpkin_face_on.png" + }, + light_source = default.LIGHT_MAX - 1, + paramtype2 = "facedir", + groups = {choppy = 1, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = default.node_sound_wood_defaults(), + drop = "farming:jackolantern", + on_punch = function(pos, node, puncher) + node.name = "farming:jackolantern" + minetest.set_node(pos, node) + end, +}) + +minetest.register_craft({ + output = "farming:jackolantern", + recipe = { + {"", "", ""}, + {"", "default:torch", ""}, + {"", "farming:pumpkin", ""}, + } +}) + +-- Pumpkin Bread +minetest.register_craftitem("farming:pumpkin_bread", { + description = ("Pumpkin Bread"), + inventory_image = "farming_pumpkin_bread.png", + on_use = minetest.item_eat(8) +}) + +minetest.register_craftitem("farming:pumpkin_dough", { + description = "Pumpkin Dough", + inventory_image = "farming_pumpkin_dough.png", +}) + +minetest.register_craft({ + output = "farming:pumpkin_dough", + type = "shapeless", + recipe = {"farming:flour", "farming:pumpkin_slice", "farming:pumpkin_slice"} +}) + +minetest.register_craft({ + type = "cooking", + output = "farming:pumpkin_bread", + recipe = "farming:pumpkin_dough", + cooktime = 10 +}) + +-- Define Pumpkin growth stages + +minetest.register_node("farming:pumpkin_1", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_1.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:pumpkin_2", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_2.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory =1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:pumpkin_3", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:pumpkin_4", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:pumpkin_5", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:pumpkin_6", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_6.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:pumpkin_7", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_7.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:pumpkin_8", { + drawtype = "plantlike", + tiles = {"farming_pumpkin_8.png"}, + paramtype = "light", + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:pumpkin_slice 9'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/raspberry.lua b/mods/farming/raspberry.lua new file mode 100644 index 0000000..b202f60 --- /dev/null +++ b/mods/farming/raspberry.lua @@ -0,0 +1,105 @@ + +--= Raspberries + +minetest.register_craftitem("farming:raspberries", { + description = "Raspberries", + inventory_image = "farming_raspberries.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:raspberry_1") + end, + on_use = minetest.item_eat(1), +}) + +-- Raspberry Smoothie + +minetest.register_craftitem("farming:smoothie_raspberry", { + description = "Raspberry Smoothie", + inventory_image = "farming_raspberry_smoothie.png", + on_use = minetest.item_eat(2, "vessels:drinking_glass"), +}) + +minetest.register_craft({ + output = "farming:smoothie_raspberry", + recipe = { + {"default:snow"}, + {"farming:raspberries"}, + {"vessels:drinking_glass"}, + } +}) + +-- Define Raspberry growth stages + +minetest.register_node("farming:raspberry_1", { + drawtype = "plantlike", + tiles = {"farming_raspberry_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:raspberry_2", { + drawtype = "plantlike", + tiles = {"farming_raspberry_2.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:raspberry_3", { + drawtype = "plantlike", + tiles = {"farming_raspberry_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:raspberry_4", { + drawtype = "plantlike", + tiles = {"farming_raspberry_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:raspberries 2'}, rarity = 1}, + {items = {'farming:raspberries'}, rarity = 2}, + {items = {'farming:raspberries'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/rhubarb.lua b/mods/farming/rhubarb.lua new file mode 100644 index 0000000..1f1f404 --- /dev/null +++ b/mods/farming/rhubarb.lua @@ -0,0 +1,86 @@ + +--= Rhubarb + +minetest.register_craftitem("farming:rhubarb", { + description = "Rhubarb", + inventory_image = "farming_rhubarb.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:rhubarb_1") + end, + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("farming:rhubarb_pie", { + description = "Rhubarb Pie", + inventory_image = "farming_rhubarb_pie.png", + on_use = minetest.item_eat(6), +}) + +minetest.register_craft({ + output = "farming:rhubarb_pie", + recipe = { + {"", "farming:sugar", ""}, + {"farming:rhubarb", "farming:rhubarb", "farming:rhubarb"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + } +}) + +-- Define Rhubarb growth stages + +minetest.register_node("farming:rhubarb_1", { + drawtype = "plantlike", + tiles = {"farming_rhubarb_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:rhubarb_2", { + drawtype = "plantlike", + tiles = {"farming_rhubarb_2.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:rhubarb_3", { + drawtype = "plantlike", + tiles = {"farming_rhubarb_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:rhubarb 2'}, rarity = 1}, + {items = {'farming:rhubarb'}, rarity = 2}, + {items = {'farming:rhubarb'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/soil.lua b/mods/farming/soil.lua new file mode 100644 index 0000000..b8f3001 --- /dev/null +++ b/mods/farming/soil.lua @@ -0,0 +1,60 @@ +-- normal soil +minetest.register_node("farming:soil", { + description = "Soil", + tiles = {"farming_soil.png", "default_dirt.png"}, + drop = "default:dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 2}, + sounds = default.node_sound_dirt_defaults(), +}) + +-- sand is not soil, change existing sand-soil to use normal soil +minetest.register_alias("farming:desert_sand_soil", "farming:soil") + +-- wet soil +minetest.register_node("farming:soil_wet", { + description = "Wet Soil", + tiles = {"farming_soil_wet.png", "farming_soil_wet_side.png"}, + drop = "default:dirt", + groups = {crumbly = 3, not_in_creative_inventory = 1, soil = 3}, + sounds = default.node_sound_dirt_defaults(), +}) +minetest.register_alias("farming:desert_sand_soil_wet", "farming:soil_wet") + +-- if water near soil then change to wet soil +minetest.register_abm({ + nodenames = {"farming:soil", "farming:soil_wet"}, + interval = 15, + chance = 4, + action = function(pos, node) + + pos.y = pos.y + 1 + local nn = minetest.get_node_or_nil(pos) + pos.y = pos.y - 1 + + if nn then nn = nn.name else return end + + -- what's on top of soil, if solid/not plant change soil to dirt + if minetest.registered_nodes[nn] + and minetest.registered_nodes[nn].walkable + and minetest.get_item_group(nn, "plant") == 0 then + minetest.set_node(pos, {name = "default:dirt"}) + return + end + + -- if map around soil not loaded then skip until loaded + if minetest.find_node_near(pos, 3, {"ignore"}) then + return + end + + -- check if there is water nearby and change soil accordingly + if minetest.find_node_near(pos, 3, {"group:water"}) then + if node.name == "farming:soil" then + minetest.set_node(pos, {name = "farming:soil_wet"}) + end + elseif node.name == "farming:soil_wet" then + minetest.set_node(pos, {name = "farming:soil"}) + elseif node.name == "farming:soil" then + minetest.set_node(pos, {name = "default:dirt"}) + end + end, +}) \ No newline at end of file diff --git a/mods/farming/statistics.lua b/mods/farming/statistics.lua new file mode 100644 index 0000000..265ccb3 --- /dev/null +++ b/mods/farming/statistics.lua @@ -0,0 +1,150 @@ +local statistics = {} + +local ROOT_2 = math.sqrt(2.0) + +-- Approximations for erf(x) and erfInv(x) from +-- https://en.wikipedia.org/wiki/Error_function +local erf +local erf_inv + +local A = 8 * (math.pi - 3.0)/(3.0 * math.pi * (4.0 - math.pi)) +local B = 4.0 / math.pi +local C = 2.0/(math.pi * A) +local D = 1.0 / A + +erf = function(x) + if x == 0 then return 0; end + local xSq = x * x + local aXSq = A * xSq + local v = math.sqrt(1.0 - math.exp(-xSq * (B + aXSq) / (1.0 + aXSq))) + return (x > 0 and v) or -v +end + +erf_inv = function(x) + if x == 0 then return 0; end + if x <= -1 or x >= 1 then return nil; end + local y = math.log(1 - x * x) + local u = C + 0.5 * y + local v = math.sqrt(math.sqrt(u * u - D * y) - u) + return (x > 0 and v) or -v +end + +local function std_normal(u) + return ROOT_2 * erf_inv(2.0 * u - 1.0) +end + +local poisson +local cdf_table = {} + +local function generate_cdf(lambda_index, lambda) + local max = math.ceil(4 * lambda) + local pdf = math.exp(-lambda) + local cdf = pdf + local t = { [0] = pdf } + + for i = 1, max - 1 do + pdf = pdf * lambda / i + cdf = cdf + pdf + t[i] = cdf + end + + return t +end + +for li = 1, 100 do + cdf_table[li] = generate_cdf(li, 0.25 * li) +end + +poisson = function(lambda, max) + if max < 2 then + return (math.random() < math.exp(-lambda) and 0) or 1 + elseif lambda >= 2 * max then + return max + end + + local u = math.random() + local lambda_index = math.floor(4 * lambda + 0.5) + local cdfs = cdf_table[lambda_index] + + if cdfs then + lambda = 0.25 * lambda_index + + if u < cdfs[0] then return 0; end + if max > #cdfs then max = #cdfs + 1 else max = math.floor(max); end + if u >= cdfs[max - 1] then return max; end + + if max > 4 then -- Binary search + local s = 0 + while s + 1 < max do + local m = math.floor(0.5 * (s + max)) + if u < cdfs[m] then max = m; else s = m; end + end + else + for i = 1, max - 1 do + if u < cdfs[i] then return i; end + end + end + + return max + else + local x = lambda + math.sqrt(lambda) * std_normal(u) + return (x < 0.5 and 0) or (x >= max - 0.5 and max) or math.floor(x + 0.5) + end +end + +-- Error function. +statistics.erf = erf + +-- Inverse error function. +statistics.erf_inv = erf_inv + +--- Standard normal distribution function (mean 0, standard deviation 1). + -- + -- @return + -- Any real number (actually between -3.0 and 3.0). + -- +statistics.std_normal = function() + local u = math.random() + if u < 0.001 then + return -3.0 + elseif u > 0.999 then + return 3.0 + end + return std_normal(u) +end + +--- Standard normal distribution function (mean 0, standard deviation 1). + -- + -- @param mu + -- The distribution mean. + -- @param sigma + -- The distribution standard deviation. + -- @return + -- Any real number (actually between -3*sigma and 3*sigma). + -- +statistics.normal = function(mu, sigma) + local u = math.random() + if u < 0.001 then + return mu - 3.0 * sigma + elseif u > 0.999 then + return mu + 3.0 * sigma + end + return mu + sigma * std_normal(u) +end + +--- Poisson distribution function. + -- + -- @param lambda + -- The distribution mean and variance. + -- @param max + -- The distribution maximum. + -- @return + -- An integer between 0 and max (both inclusive). + -- +statistics.poisson = function(lambda, max) + lambda, max = tonumber(lambda), tonumber(max) + if not lambda or not max or lambda <= 0 or max < 1 then return 0; end + return poisson(lambda, max) +end + +return statistics \ No newline at end of file diff --git a/mods/farming/sugar.lua b/mods/farming/sugar.lua new file mode 100644 index 0000000..efc92ef --- /dev/null +++ b/mods/farming/sugar.lua @@ -0,0 +1,14 @@ + +--= Sugar + +minetest.register_craftitem("farming:sugar", { + description = "Sugar", + inventory_image = "farming_sugar.png", +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 3, + output = "farming:sugar 2", + recipe = "default:papyrus", +}) \ No newline at end of file diff --git a/mods/farming/textures/default_junglegrass.png b/mods/farming/textures/default_junglegrass.png new file mode 100644 index 0000000..5d8cdbc Binary files /dev/null and b/mods/farming/textures/default_junglegrass.png differ diff --git a/mods/farming/textures/farming_baked_potato.png b/mods/farming/textures/farming_baked_potato.png new file mode 100644 index 0000000..425c4ae Binary files /dev/null and b/mods/farming/textures/farming_baked_potato.png differ diff --git a/mods/farming/textures/farming_beanbush.png b/mods/farming/textures/farming_beanbush.png new file mode 100644 index 0000000..637e716 Binary files /dev/null and b/mods/farming/textures/farming_beanbush.png differ diff --git a/mods/farming/textures/farming_beanpole.png b/mods/farming/textures/farming_beanpole.png new file mode 100644 index 0000000..ed07572 Binary files /dev/null and b/mods/farming/textures/farming_beanpole.png differ diff --git a/mods/farming/textures/farming_beanpole_1.png b/mods/farming/textures/farming_beanpole_1.png new file mode 100644 index 0000000..ef2bd5a Binary files /dev/null and b/mods/farming/textures/farming_beanpole_1.png differ diff --git a/mods/farming/textures/farming_beanpole_2.png b/mods/farming/textures/farming_beanpole_2.png new file mode 100644 index 0000000..34143e4 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_2.png differ diff --git a/mods/farming/textures/farming_beanpole_3.png b/mods/farming/textures/farming_beanpole_3.png new file mode 100644 index 0000000..d693f17 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_3.png differ diff --git a/mods/farming/textures/farming_beanpole_4.png b/mods/farming/textures/farming_beanpole_4.png new file mode 100644 index 0000000..c779b25 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_4.png differ diff --git a/mods/farming/textures/farming_beanpole_5.png b/mods/farming/textures/farming_beanpole_5.png new file mode 100644 index 0000000..910f8a0 Binary files /dev/null and b/mods/farming/textures/farming_beanpole_5.png differ diff --git a/mods/farming/textures/farming_beans.png b/mods/farming/textures/farming_beans.png new file mode 100644 index 0000000..ad5cf85 Binary files /dev/null and b/mods/farming/textures/farming_beans.png differ diff --git a/mods/farming/textures/farming_blueberries.png b/mods/farming/textures/farming_blueberries.png new file mode 100644 index 0000000..b0c4931 Binary files /dev/null and b/mods/farming/textures/farming_blueberries.png differ diff --git a/mods/farming/textures/farming_blueberry_1.png b/mods/farming/textures/farming_blueberry_1.png new file mode 100644 index 0000000..83832c8 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_1.png differ diff --git a/mods/farming/textures/farming_blueberry_2.png b/mods/farming/textures/farming_blueberry_2.png new file mode 100644 index 0000000..308a0ca Binary files /dev/null and b/mods/farming/textures/farming_blueberry_2.png differ diff --git a/mods/farming/textures/farming_blueberry_3.png b/mods/farming/textures/farming_blueberry_3.png new file mode 100644 index 0000000..43d2ab1 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_3.png differ diff --git a/mods/farming/textures/farming_blueberry_4.png b/mods/farming/textures/farming_blueberry_4.png new file mode 100644 index 0000000..75fb69a Binary files /dev/null and b/mods/farming/textures/farming_blueberry_4.png differ diff --git a/mods/farming/textures/farming_blueberry_muffin.png b/mods/farming/textures/farming_blueberry_muffin.png new file mode 100644 index 0000000..b1253d7 Binary files /dev/null and b/mods/farming/textures/farming_blueberry_muffin.png differ diff --git a/mods/farming/textures/farming_bottle_ethanol.png b/mods/farming/textures/farming_bottle_ethanol.png new file mode 100644 index 0000000..84e6162 Binary files /dev/null and b/mods/farming/textures/farming_bottle_ethanol.png differ diff --git a/mods/farming/textures/farming_bread.png b/mods/farming/textures/farming_bread.png new file mode 100644 index 0000000..bd00e3e Binary files /dev/null and b/mods/farming/textures/farming_bread.png differ diff --git a/mods/farming/textures/farming_carrot.png b/mods/farming/textures/farming_carrot.png new file mode 100644 index 0000000..73f2fd4 Binary files /dev/null and b/mods/farming/textures/farming_carrot.png differ diff --git a/mods/farming/textures/farming_carrot_1.png b/mods/farming/textures/farming_carrot_1.png new file mode 100644 index 0000000..bbeae7e Binary files /dev/null and b/mods/farming/textures/farming_carrot_1.png differ diff --git a/mods/farming/textures/farming_carrot_2.png b/mods/farming/textures/farming_carrot_2.png new file mode 100644 index 0000000..b24ecc0 Binary files /dev/null and b/mods/farming/textures/farming_carrot_2.png differ diff --git a/mods/farming/textures/farming_carrot_3.png b/mods/farming/textures/farming_carrot_3.png new file mode 100644 index 0000000..8400505 Binary files /dev/null and b/mods/farming/textures/farming_carrot_3.png differ diff --git a/mods/farming/textures/farming_carrot_4.png b/mods/farming/textures/farming_carrot_4.png new file mode 100644 index 0000000..32ee262 Binary files /dev/null and b/mods/farming/textures/farming_carrot_4.png differ diff --git a/mods/farming/textures/farming_carrot_5.png b/mods/farming/textures/farming_carrot_5.png new file mode 100644 index 0000000..0bcd9c1 Binary files /dev/null and b/mods/farming/textures/farming_carrot_5.png differ diff --git a/mods/farming/textures/farming_carrot_6.png b/mods/farming/textures/farming_carrot_6.png new file mode 100644 index 0000000..a17c6b2 Binary files /dev/null and b/mods/farming/textures/farming_carrot_6.png differ diff --git a/mods/farming/textures/farming_carrot_7.png b/mods/farming/textures/farming_carrot_7.png new file mode 100644 index 0000000..d26eee7 Binary files /dev/null and b/mods/farming/textures/farming_carrot_7.png differ diff --git a/mods/farming/textures/farming_carrot_8.png b/mods/farming/textures/farming_carrot_8.png new file mode 100644 index 0000000..00b6d92 Binary files /dev/null and b/mods/farming/textures/farming_carrot_8.png differ diff --git a/mods/farming/textures/farming_carrot_gold.png b/mods/farming/textures/farming_carrot_gold.png new file mode 100644 index 0000000..b817101 Binary files /dev/null and b/mods/farming/textures/farming_carrot_gold.png differ diff --git a/mods/farming/textures/farming_chocolate_dark.png b/mods/farming/textures/farming_chocolate_dark.png new file mode 100644 index 0000000..03243b2 Binary files /dev/null and b/mods/farming/textures/farming_chocolate_dark.png differ diff --git a/mods/farming/textures/farming_cocoa_1.png b/mods/farming/textures/farming_cocoa_1.png new file mode 100644 index 0000000..f887a1f Binary files /dev/null and b/mods/farming/textures/farming_cocoa_1.png differ diff --git a/mods/farming/textures/farming_cocoa_2.png b/mods/farming/textures/farming_cocoa_2.png new file mode 100644 index 0000000..f0d3935 Binary files /dev/null and b/mods/farming/textures/farming_cocoa_2.png differ diff --git a/mods/farming/textures/farming_cocoa_3.png b/mods/farming/textures/farming_cocoa_3.png new file mode 100644 index 0000000..8eaf67e Binary files /dev/null and b/mods/farming/textures/farming_cocoa_3.png differ diff --git a/mods/farming/textures/farming_cocoa_beans.png b/mods/farming/textures/farming_cocoa_beans.png new file mode 100644 index 0000000..4022f8e Binary files /dev/null and b/mods/farming/textures/farming_cocoa_beans.png differ diff --git a/mods/farming/textures/farming_coffee_1.png b/mods/farming/textures/farming_coffee_1.png new file mode 100644 index 0000000..97c207a Binary files /dev/null and b/mods/farming/textures/farming_coffee_1.png differ diff --git a/mods/farming/textures/farming_coffee_2.png b/mods/farming/textures/farming_coffee_2.png new file mode 100644 index 0000000..a659f85 Binary files /dev/null and b/mods/farming/textures/farming_coffee_2.png differ diff --git a/mods/farming/textures/farming_coffee_3.png b/mods/farming/textures/farming_coffee_3.png new file mode 100644 index 0000000..93088c8 Binary files /dev/null and b/mods/farming/textures/farming_coffee_3.png differ diff --git a/mods/farming/textures/farming_coffee_4.png b/mods/farming/textures/farming_coffee_4.png new file mode 100644 index 0000000..37a609f Binary files /dev/null and b/mods/farming/textures/farming_coffee_4.png differ diff --git a/mods/farming/textures/farming_coffee_5.png b/mods/farming/textures/farming_coffee_5.png new file mode 100644 index 0000000..e624fbe Binary files /dev/null and b/mods/farming/textures/farming_coffee_5.png differ diff --git a/mods/farming/textures/farming_coffee_beans.png b/mods/farming/textures/farming_coffee_beans.png new file mode 100644 index 0000000..0786f4e Binary files /dev/null and b/mods/farming/textures/farming_coffee_beans.png differ diff --git a/mods/farming/textures/farming_coffee_cup.png b/mods/farming/textures/farming_coffee_cup.png new file mode 100644 index 0000000..d3820bc Binary files /dev/null and b/mods/farming/textures/farming_coffee_cup.png differ diff --git a/mods/farming/textures/farming_coffee_cup_hot.png b/mods/farming/textures/farming_coffee_cup_hot.png new file mode 100644 index 0000000..f4fae90 Binary files /dev/null and b/mods/farming/textures/farming_coffee_cup_hot.png differ diff --git a/mods/farming/textures/farming_cookie.png b/mods/farming/textures/farming_cookie.png new file mode 100644 index 0000000..e80be35 Binary files /dev/null and b/mods/farming/textures/farming_cookie.png differ diff --git a/mods/farming/textures/farming_corn.png b/mods/farming/textures/farming_corn.png new file mode 100644 index 0000000..2a2894a Binary files /dev/null and b/mods/farming/textures/farming_corn.png differ diff --git a/mods/farming/textures/farming_corn_1.png b/mods/farming/textures/farming_corn_1.png new file mode 100644 index 0000000..60e8b99 Binary files /dev/null and b/mods/farming/textures/farming_corn_1.png differ diff --git a/mods/farming/textures/farming_corn_2.png b/mods/farming/textures/farming_corn_2.png new file mode 100644 index 0000000..6ba6cc9 Binary files /dev/null and b/mods/farming/textures/farming_corn_2.png differ diff --git a/mods/farming/textures/farming_corn_3.png b/mods/farming/textures/farming_corn_3.png new file mode 100644 index 0000000..c5fa80b Binary files /dev/null and b/mods/farming/textures/farming_corn_3.png differ diff --git a/mods/farming/textures/farming_corn_4.png b/mods/farming/textures/farming_corn_4.png new file mode 100644 index 0000000..a43632d Binary files /dev/null and b/mods/farming/textures/farming_corn_4.png differ diff --git a/mods/farming/textures/farming_corn_5.png b/mods/farming/textures/farming_corn_5.png new file mode 100644 index 0000000..7b6fb02 Binary files /dev/null and b/mods/farming/textures/farming_corn_5.png differ diff --git a/mods/farming/textures/farming_corn_6.png b/mods/farming/textures/farming_corn_6.png new file mode 100644 index 0000000..313697b Binary files /dev/null and b/mods/farming/textures/farming_corn_6.png differ diff --git a/mods/farming/textures/farming_corn_7.png b/mods/farming/textures/farming_corn_7.png new file mode 100644 index 0000000..6a937e7 Binary files /dev/null and b/mods/farming/textures/farming_corn_7.png differ diff --git a/mods/farming/textures/farming_corn_8.png b/mods/farming/textures/farming_corn_8.png new file mode 100644 index 0000000..77e442b Binary files /dev/null and b/mods/farming/textures/farming_corn_8.png differ diff --git a/mods/farming/textures/farming_corn_cob.png b/mods/farming/textures/farming_corn_cob.png new file mode 100644 index 0000000..a2fd9da Binary files /dev/null and b/mods/farming/textures/farming_corn_cob.png differ diff --git a/mods/farming/textures/farming_cotton.png b/mods/farming/textures/farming_cotton.png new file mode 100644 index 0000000..ee0c290 Binary files /dev/null and b/mods/farming/textures/farming_cotton.png differ diff --git a/mods/farming/textures/farming_cotton_1.png b/mods/farming/textures/farming_cotton_1.png new file mode 100644 index 0000000..8750adf Binary files /dev/null and b/mods/farming/textures/farming_cotton_1.png differ diff --git a/mods/farming/textures/farming_cotton_2.png b/mods/farming/textures/farming_cotton_2.png new file mode 100644 index 0000000..dc1025b Binary files /dev/null and b/mods/farming/textures/farming_cotton_2.png differ diff --git a/mods/farming/textures/farming_cotton_3.png b/mods/farming/textures/farming_cotton_3.png new file mode 100644 index 0000000..a1fe3b6 Binary files /dev/null and b/mods/farming/textures/farming_cotton_3.png differ diff --git a/mods/farming/textures/farming_cotton_4.png b/mods/farming/textures/farming_cotton_4.png new file mode 100644 index 0000000..d0096da Binary files /dev/null and b/mods/farming/textures/farming_cotton_4.png differ diff --git a/mods/farming/textures/farming_cotton_5.png b/mods/farming/textures/farming_cotton_5.png new file mode 100644 index 0000000..11f67fc Binary files /dev/null and b/mods/farming/textures/farming_cotton_5.png differ diff --git a/mods/farming/textures/farming_cotton_6.png b/mods/farming/textures/farming_cotton_6.png new file mode 100644 index 0000000..1334304 Binary files /dev/null and b/mods/farming/textures/farming_cotton_6.png differ diff --git a/mods/farming/textures/farming_cotton_7.png b/mods/farming/textures/farming_cotton_7.png new file mode 100644 index 0000000..fb98f1e Binary files /dev/null and b/mods/farming/textures/farming_cotton_7.png differ diff --git a/mods/farming/textures/farming_cotton_8.png b/mods/farming/textures/farming_cotton_8.png new file mode 100644 index 0000000..ae9ed37 Binary files /dev/null and b/mods/farming/textures/farming_cotton_8.png differ diff --git a/mods/farming/textures/farming_cotton_seed.png b/mods/farming/textures/farming_cotton_seed.png new file mode 100644 index 0000000..70d2ac2 Binary files /dev/null and b/mods/farming/textures/farming_cotton_seed.png differ diff --git a/mods/farming/textures/farming_cucumber.png b/mods/farming/textures/farming_cucumber.png new file mode 100644 index 0000000..2acb7b2 Binary files /dev/null and b/mods/farming/textures/farming_cucumber.png differ diff --git a/mods/farming/textures/farming_cucumber_1.png b/mods/farming/textures/farming_cucumber_1.png new file mode 100644 index 0000000..e008fd1 Binary files /dev/null and b/mods/farming/textures/farming_cucumber_1.png differ diff --git a/mods/farming/textures/farming_cucumber_2.png b/mods/farming/textures/farming_cucumber_2.png new file mode 100644 index 0000000..9c345ff Binary files /dev/null and b/mods/farming/textures/farming_cucumber_2.png differ diff --git a/mods/farming/textures/farming_cucumber_3.png b/mods/farming/textures/farming_cucumber_3.png new file mode 100644 index 0000000..25f3c54 Binary files /dev/null and b/mods/farming/textures/farming_cucumber_3.png differ diff --git a/mods/farming/textures/farming_cucumber_4.png b/mods/farming/textures/farming_cucumber_4.png new file mode 100644 index 0000000..fc62f2f Binary files /dev/null and b/mods/farming/textures/farming_cucumber_4.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil.png b/mods/farming/textures/farming_desert_sand_soil.png new file mode 100644 index 0000000..1450e01 Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil_wet.png b/mods/farming/textures/farming_desert_sand_soil_wet.png new file mode 100644 index 0000000..cffa955 Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil_wet.png differ diff --git a/mods/farming/textures/farming_desert_sand_soil_wet_side.png b/mods/farming/textures/farming_desert_sand_soil_wet_side.png new file mode 100644 index 0000000..fbb2815 Binary files /dev/null and b/mods/farming/textures/farming_desert_sand_soil_wet_side.png differ diff --git a/mods/farming/textures/farming_donut.png b/mods/farming/textures/farming_donut.png new file mode 100644 index 0000000..8985299 Binary files /dev/null and b/mods/farming/textures/farming_donut.png differ diff --git a/mods/farming/textures/farming_donut_apple.png b/mods/farming/textures/farming_donut_apple.png new file mode 100644 index 0000000..6dfe63d Binary files /dev/null and b/mods/farming/textures/farming_donut_apple.png differ diff --git a/mods/farming/textures/farming_donut_chocolate.png b/mods/farming/textures/farming_donut_chocolate.png new file mode 100644 index 0000000..aa4b93f Binary files /dev/null and b/mods/farming/textures/farming_donut_chocolate.png differ diff --git a/mods/farming/textures/farming_flour.png b/mods/farming/textures/farming_flour.png new file mode 100644 index 0000000..a526b20 Binary files /dev/null and b/mods/farming/textures/farming_flour.png differ diff --git a/mods/farming/textures/farming_melon_1.png b/mods/farming/textures/farming_melon_1.png new file mode 100644 index 0000000..3c6ea6d Binary files /dev/null and b/mods/farming/textures/farming_melon_1.png differ diff --git a/mods/farming/textures/farming_melon_2.png b/mods/farming/textures/farming_melon_2.png new file mode 100644 index 0000000..185ed82 Binary files /dev/null and b/mods/farming/textures/farming_melon_2.png differ diff --git a/mods/farming/textures/farming_melon_3.png b/mods/farming/textures/farming_melon_3.png new file mode 100644 index 0000000..6e661f9 Binary files /dev/null and b/mods/farming/textures/farming_melon_3.png differ diff --git a/mods/farming/textures/farming_melon_4.png b/mods/farming/textures/farming_melon_4.png new file mode 100644 index 0000000..d9199f3 Binary files /dev/null and b/mods/farming/textures/farming_melon_4.png differ diff --git a/mods/farming/textures/farming_melon_5.png b/mods/farming/textures/farming_melon_5.png new file mode 100644 index 0000000..755cbd3 Binary files /dev/null and b/mods/farming/textures/farming_melon_5.png differ diff --git a/mods/farming/textures/farming_melon_6.png b/mods/farming/textures/farming_melon_6.png new file mode 100644 index 0000000..b31a5b4 Binary files /dev/null and b/mods/farming/textures/farming_melon_6.png differ diff --git a/mods/farming/textures/farming_melon_7.png b/mods/farming/textures/farming_melon_7.png new file mode 100644 index 0000000..3aebfdd Binary files /dev/null and b/mods/farming/textures/farming_melon_7.png differ diff --git a/mods/farming/textures/farming_melon_side.png b/mods/farming/textures/farming_melon_side.png new file mode 100644 index 0000000..88e40c6 Binary files /dev/null and b/mods/farming/textures/farming_melon_side.png differ diff --git a/mods/farming/textures/farming_melon_slice.png b/mods/farming/textures/farming_melon_slice.png new file mode 100644 index 0000000..6ee9775 Binary files /dev/null and b/mods/farming/textures/farming_melon_slice.png differ diff --git a/mods/farming/textures/farming_melon_top.png b/mods/farming/textures/farming_melon_top.png new file mode 100644 index 0000000..f387dbd Binary files /dev/null and b/mods/farming/textures/farming_melon_top.png differ diff --git a/mods/farming/textures/farming_potato.png b/mods/farming/textures/farming_potato.png new file mode 100644 index 0000000..6e91d6a Binary files /dev/null and b/mods/farming/textures/farming_potato.png differ diff --git a/mods/farming/textures/farming_potato_1.png b/mods/farming/textures/farming_potato_1.png new file mode 100644 index 0000000..a9c0040 Binary files /dev/null and b/mods/farming/textures/farming_potato_1.png differ diff --git a/mods/farming/textures/farming_potato_2.png b/mods/farming/textures/farming_potato_2.png new file mode 100644 index 0000000..c81830c Binary files /dev/null and b/mods/farming/textures/farming_potato_2.png differ diff --git a/mods/farming/textures/farming_potato_3.png b/mods/farming/textures/farming_potato_3.png new file mode 100644 index 0000000..a3d7920 Binary files /dev/null and b/mods/farming/textures/farming_potato_3.png differ diff --git a/mods/farming/textures/farming_potato_4.png b/mods/farming/textures/farming_potato_4.png new file mode 100644 index 0000000..405b7e5 Binary files /dev/null and b/mods/farming/textures/farming_potato_4.png differ diff --git a/mods/farming/textures/farming_pumpkin_1.png b/mods/farming/textures/farming_pumpkin_1.png new file mode 100644 index 0000000..e5b9a2b Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_1.png differ diff --git a/mods/farming/textures/farming_pumpkin_2.png b/mods/farming/textures/farming_pumpkin_2.png new file mode 100644 index 0000000..d977e8c Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_2.png differ diff --git a/mods/farming/textures/farming_pumpkin_3.png b/mods/farming/textures/farming_pumpkin_3.png new file mode 100644 index 0000000..83f8190 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_3.png differ diff --git a/mods/farming/textures/farming_pumpkin_4.png b/mods/farming/textures/farming_pumpkin_4.png new file mode 100644 index 0000000..20de004 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_4.png differ diff --git a/mods/farming/textures/farming_pumpkin_5.png b/mods/farming/textures/farming_pumpkin_5.png new file mode 100644 index 0000000..59fa78e Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_5.png differ diff --git a/mods/farming/textures/farming_pumpkin_6.png b/mods/farming/textures/farming_pumpkin_6.png new file mode 100644 index 0000000..6ae543e Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_6.png differ diff --git a/mods/farming/textures/farming_pumpkin_7.png b/mods/farming/textures/farming_pumpkin_7.png new file mode 100644 index 0000000..79190e0 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_7.png differ diff --git a/mods/farming/textures/farming_pumpkin_8.png b/mods/farming/textures/farming_pumpkin_8.png new file mode 100644 index 0000000..b941442 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_8.png differ diff --git a/mods/farming/textures/farming_pumpkin_bread.png b/mods/farming/textures/farming_pumpkin_bread.png new file mode 100644 index 0000000..0dfae08 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_bread.png differ diff --git a/mods/farming/textures/farming_pumpkin_dough.png b/mods/farming/textures/farming_pumpkin_dough.png new file mode 100644 index 0000000..62ea7a6 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_dough.png differ diff --git a/mods/farming/textures/farming_pumpkin_face_off.png b/mods/farming/textures/farming_pumpkin_face_off.png new file mode 100644 index 0000000..df70171 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_face_off.png differ diff --git a/mods/farming/textures/farming_pumpkin_face_on.png b/mods/farming/textures/farming_pumpkin_face_on.png new file mode 100644 index 0000000..fa71c9d Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_face_on.png differ diff --git a/mods/farming/textures/farming_pumpkin_side.png b/mods/farming/textures/farming_pumpkin_side.png new file mode 100644 index 0000000..2d30f20 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_side.png differ diff --git a/mods/farming/textures/farming_pumpkin_slice.png b/mods/farming/textures/farming_pumpkin_slice.png new file mode 100644 index 0000000..1fb659e Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_slice.png differ diff --git a/mods/farming/textures/farming_pumpkin_top.png b/mods/farming/textures/farming_pumpkin_top.png new file mode 100644 index 0000000..7928345 Binary files /dev/null and b/mods/farming/textures/farming_pumpkin_top.png differ diff --git a/mods/farming/textures/farming_raspberries.png b/mods/farming/textures/farming_raspberries.png new file mode 100644 index 0000000..ab96e1b Binary files /dev/null and b/mods/farming/textures/farming_raspberries.png differ diff --git a/mods/farming/textures/farming_raspberry_1.png b/mods/farming/textures/farming_raspberry_1.png new file mode 100644 index 0000000..d1a7ffc Binary files /dev/null and b/mods/farming/textures/farming_raspberry_1.png differ diff --git a/mods/farming/textures/farming_raspberry_2.png b/mods/farming/textures/farming_raspberry_2.png new file mode 100644 index 0000000..308a0ca Binary files /dev/null and b/mods/farming/textures/farming_raspberry_2.png differ diff --git a/mods/farming/textures/farming_raspberry_3.png b/mods/farming/textures/farming_raspberry_3.png new file mode 100644 index 0000000..43d2ab1 Binary files /dev/null and b/mods/farming/textures/farming_raspberry_3.png differ diff --git a/mods/farming/textures/farming_raspberry_4.png b/mods/farming/textures/farming_raspberry_4.png new file mode 100644 index 0000000..32da6b9 Binary files /dev/null and b/mods/farming/textures/farming_raspberry_4.png differ diff --git a/mods/farming/textures/farming_raspberry_smoothie.png b/mods/farming/textures/farming_raspberry_smoothie.png new file mode 100644 index 0000000..fe178d1 Binary files /dev/null and b/mods/farming/textures/farming_raspberry_smoothie.png differ diff --git a/mods/farming/textures/farming_rhubarb.png b/mods/farming/textures/farming_rhubarb.png new file mode 100644 index 0000000..7d416ab Binary files /dev/null and b/mods/farming/textures/farming_rhubarb.png differ diff --git a/mods/farming/textures/farming_rhubarb_1.png b/mods/farming/textures/farming_rhubarb_1.png new file mode 100644 index 0000000..01585b1 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_1.png differ diff --git a/mods/farming/textures/farming_rhubarb_2.png b/mods/farming/textures/farming_rhubarb_2.png new file mode 100644 index 0000000..71845c7 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_2.png differ diff --git a/mods/farming/textures/farming_rhubarb_3.png b/mods/farming/textures/farming_rhubarb_3.png new file mode 100644 index 0000000..b412f7e Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_3.png differ diff --git a/mods/farming/textures/farming_rhubarb_pie.png b/mods/farming/textures/farming_rhubarb_pie.png new file mode 100644 index 0000000..1f77b53 Binary files /dev/null and b/mods/farming/textures/farming_rhubarb_pie.png differ diff --git a/mods/farming/textures/farming_soil.png b/mods/farming/textures/farming_soil.png new file mode 100644 index 0000000..0be94e3 Binary files /dev/null and b/mods/farming/textures/farming_soil.png differ diff --git a/mods/farming/textures/farming_soil_wet.png b/mods/farming/textures/farming_soil_wet.png new file mode 100644 index 0000000..d5e335e Binary files /dev/null and b/mods/farming/textures/farming_soil_wet.png differ diff --git a/mods/farming/textures/farming_soil_wet_side.png b/mods/farming/textures/farming_soil_wet_side.png new file mode 100644 index 0000000..6bd3a56 Binary files /dev/null and b/mods/farming/textures/farming_soil_wet_side.png differ diff --git a/mods/farming/textures/farming_straw.png b/mods/farming/textures/farming_straw.png new file mode 100644 index 0000000..e427772 Binary files /dev/null and b/mods/farming/textures/farming_straw.png differ diff --git a/mods/farming/textures/farming_sugar.png b/mods/farming/textures/farming_sugar.png new file mode 100644 index 0000000..5cb7fa0 Binary files /dev/null and b/mods/farming/textures/farming_sugar.png differ diff --git a/mods/farming/textures/farming_tomato.png b/mods/farming/textures/farming_tomato.png new file mode 100644 index 0000000..586aa56 Binary files /dev/null and b/mods/farming/textures/farming_tomato.png differ diff --git a/mods/farming/textures/farming_tomato_1.png b/mods/farming/textures/farming_tomato_1.png new file mode 100644 index 0000000..d858e58 Binary files /dev/null and b/mods/farming/textures/farming_tomato_1.png differ diff --git a/mods/farming/textures/farming_tomato_2.png b/mods/farming/textures/farming_tomato_2.png new file mode 100644 index 0000000..9d9ed6d Binary files /dev/null and b/mods/farming/textures/farming_tomato_2.png differ diff --git a/mods/farming/textures/farming_tomato_3.png b/mods/farming/textures/farming_tomato_3.png new file mode 100644 index 0000000..fe3dcf0 Binary files /dev/null and b/mods/farming/textures/farming_tomato_3.png differ diff --git a/mods/farming/textures/farming_tomato_4.png b/mods/farming/textures/farming_tomato_4.png new file mode 100644 index 0000000..27c3282 Binary files /dev/null and b/mods/farming/textures/farming_tomato_4.png differ diff --git a/mods/farming/textures/farming_tomato_5.png b/mods/farming/textures/farming_tomato_5.png new file mode 100644 index 0000000..f369a68 Binary files /dev/null and b/mods/farming/textures/farming_tomato_5.png differ diff --git a/mods/farming/textures/farming_tomato_6.png b/mods/farming/textures/farming_tomato_6.png new file mode 100644 index 0000000..0135cb5 Binary files /dev/null and b/mods/farming/textures/farming_tomato_6.png differ diff --git a/mods/farming/textures/farming_tomato_7.png b/mods/farming/textures/farming_tomato_7.png new file mode 100644 index 0000000..4cd85f5 Binary files /dev/null and b/mods/farming/textures/farming_tomato_7.png differ diff --git a/mods/farming/textures/farming_tomato_8.png b/mods/farming/textures/farming_tomato_8.png new file mode 100644 index 0000000..0b49025 Binary files /dev/null and b/mods/farming/textures/farming_tomato_8.png differ diff --git a/mods/farming/textures/farming_tool_bronzehoe.png b/mods/farming/textures/farming_tool_bronzehoe.png new file mode 100644 index 0000000..ef07a80 Binary files /dev/null and b/mods/farming/textures/farming_tool_bronzehoe.png differ diff --git a/mods/farming/textures/farming_tool_diamondhoe.png b/mods/farming/textures/farming_tool_diamondhoe.png new file mode 100644 index 0000000..093acb8 Binary files /dev/null and b/mods/farming/textures/farming_tool_diamondhoe.png differ diff --git a/mods/farming/textures/farming_tool_mesehoe.png b/mods/farming/textures/farming_tool_mesehoe.png new file mode 100644 index 0000000..ffd597a Binary files /dev/null and b/mods/farming/textures/farming_tool_mesehoe.png differ diff --git a/mods/farming/textures/farming_tool_steelhoe.png b/mods/farming/textures/farming_tool_steelhoe.png new file mode 100644 index 0000000..893a695 Binary files /dev/null and b/mods/farming/textures/farming_tool_steelhoe.png differ diff --git a/mods/farming/textures/farming_tool_stonehoe.png b/mods/farming/textures/farming_tool_stonehoe.png new file mode 100644 index 0000000..4f8dade Binary files /dev/null and b/mods/farming/textures/farming_tool_stonehoe.png differ diff --git a/mods/farming/textures/farming_tool_woodhoe.png b/mods/farming/textures/farming_tool_woodhoe.png new file mode 100644 index 0000000..8b20d2d Binary files /dev/null and b/mods/farming/textures/farming_tool_woodhoe.png differ diff --git a/mods/farming/textures/farming_wheat.png b/mods/farming/textures/farming_wheat.png new file mode 100644 index 0000000..8ecd735 Binary files /dev/null and b/mods/farming/textures/farming_wheat.png differ diff --git a/mods/farming/textures/farming_wheat_1.png b/mods/farming/textures/farming_wheat_1.png new file mode 100644 index 0000000..4943000 Binary files /dev/null and b/mods/farming/textures/farming_wheat_1.png differ diff --git a/mods/farming/textures/farming_wheat_2.png b/mods/farming/textures/farming_wheat_2.png new file mode 100644 index 0000000..63550d1 Binary files /dev/null and b/mods/farming/textures/farming_wheat_2.png differ diff --git a/mods/farming/textures/farming_wheat_3.png b/mods/farming/textures/farming_wheat_3.png new file mode 100644 index 0000000..00a8c66 Binary files /dev/null and b/mods/farming/textures/farming_wheat_3.png differ diff --git a/mods/farming/textures/farming_wheat_4.png b/mods/farming/textures/farming_wheat_4.png new file mode 100644 index 0000000..80b98aa Binary files /dev/null and b/mods/farming/textures/farming_wheat_4.png differ diff --git a/mods/farming/textures/farming_wheat_5.png b/mods/farming/textures/farming_wheat_5.png new file mode 100644 index 0000000..1023f0c Binary files /dev/null and b/mods/farming/textures/farming_wheat_5.png differ diff --git a/mods/farming/textures/farming_wheat_6.png b/mods/farming/textures/farming_wheat_6.png new file mode 100644 index 0000000..591c138 Binary files /dev/null and b/mods/farming/textures/farming_wheat_6.png differ diff --git a/mods/farming/textures/farming_wheat_7.png b/mods/farming/textures/farming_wheat_7.png new file mode 100644 index 0000000..98bc60a Binary files /dev/null and b/mods/farming/textures/farming_wheat_7.png differ diff --git a/mods/farming/textures/farming_wheat_8.png b/mods/farming/textures/farming_wheat_8.png new file mode 100644 index 0000000..44bc532 Binary files /dev/null and b/mods/farming/textures/farming_wheat_8.png differ diff --git a/mods/farming/textures/farming_wheat_seed.png b/mods/farming/textures/farming_wheat_seed.png new file mode 100644 index 0000000..9afcd4d Binary files /dev/null and b/mods/farming/textures/farming_wheat_seed.png differ diff --git a/mods/farming/textures/vessels_drinking_cup.png b/mods/farming/textures/vessels_drinking_cup.png new file mode 100644 index 0000000..2eba232 Binary files /dev/null and b/mods/farming/textures/vessels_drinking_cup.png differ diff --git a/mods/farming/tomato.lua b/mods/farming/tomato.lua new file mode 100644 index 0000000..99c091a --- /dev/null +++ b/mods/farming/tomato.lua @@ -0,0 +1,158 @@ + +--= Tomato (Original textures from link below) +-- http://www.minecraftforum.net/forums/mapping-and-modding/minecraft-mods/1288375-food-plus-mod-more-food-than-you-can-imagine-v2-9) + +minetest.register_craftitem("farming:tomato", { + description = "Tomato", + inventory_image = "farming_tomato.png", + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:tomato_1") + end, + on_use = minetest.item_eat(4), +}) + +-- Define Tomato growth stages + +minetest.register_node("farming:tomato_1", { + drawtype = "plantlike", + tiles = {"farming_tomato_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:tomato_2", { + drawtype = "plantlike", + tiles = {"farming_tomato_2.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:tomato_3", { + drawtype = "plantlike", + tiles = {"farming_tomato_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:tomato_4", { + drawtype = "plantlike", + tiles = {"farming_tomato_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:tomato_5", { + drawtype = "plantlike", + tiles = {"farming_tomato_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:tomato_6", { + drawtype = "plantlike", + tiles = {"farming_tomato_6.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:tomato_7", { + drawtype = "plantlike", + tiles = {"farming_tomato_7.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:tomato'}, rarity = 1}, + {items = {'farming:tomato'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:tomato_8", { + drawtype = "plantlike", + tiles = {"farming_tomato_8.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:tomato 3'}, rarity = 1}, + {items = {'farming:tomato 3'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/farming/wheat.lua b/mods/farming/wheat.lua new file mode 100644 index 0000000..d2bad0d --- /dev/null +++ b/mods/farming/wheat.lua @@ -0,0 +1,251 @@ + +--= Wheat + +-- Wheat Seed + +--minetest.register_craftitem("farming:seed_wheat", { +-- description = "Wheat Seed", +-- inventory_image = "farming_wheat_seed.png", +-- on_place = function(itemstack, placer, pointed_thing) +-- return farming.place_seed(itemstack, placer, pointed_thing, "farming:wheat_1") +-- end, +--}) + +minetest.register_node("farming:seed_wheat", { + description = "Wheat Seed", + tiles = {"farming_wheat_seed.png"}, + inventory_image = "farming_wheat_seed.png", + wield_image = "farming_wheat_seed.png", + drawtype = "signlike", + groups = {seed = 1, snappy = 3, attached_node = 1}, + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + sunlight_propagates = true, + selection_box = farming.select, + on_place = function(itemstack, placer, pointed_thing) + return farming.place_seed(itemstack, placer, pointed_thing, "farming:wheat_1") + end, +}) + +-- Harvested Wheat + +minetest.register_craftitem("farming:wheat", { + description = "Wheat", + inventory_image = "farming_wheat.png", +}) + +-- Straw + +minetest.register_node("farming:straw", { + description = "Straw", + tiles = {"farming_straw.png"}, + is_ground_content = false, + groups = {snappy = 3, flammable = 4}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_craft({ + output = "farming:straw 3", + recipe = { + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + {"farming:wheat", "farming:wheat", "farming:wheat"}, + } +}) + +minetest.register_craft({ + output = "farming:wheat 3", + recipe = { + {"farming:straw"}, + } +}) + +-- flour + +minetest.register_craftitem("farming:flour", { + description = "Flour", + inventory_image = "farming_flour.png", +}) + +minetest.register_craft({ + type = "shapeless", + output = "farming:flour", + recipe = {"farming:wheat", "farming:wheat", "farming:wheat", "farming:wheat"} +}) + +-- Bread + +minetest.register_craftitem("farming:bread", { + description = "Bread", + inventory_image = "farming_bread.png", + on_use = minetest.item_eat(5), +}) + +minetest.register_craft({ + type = "cooking", + cooktime = 15, + output = "farming:bread", + recipe = "farming:flour" +}) + +-- Define Wheat growth stages + +minetest.register_node("farming:wheat_1", { + drawtype = "plantlike", + tiles = {"farming_wheat_1.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing=1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:wheat_2", { + drawtype = "plantlike", + tiles = {"farming_wheat_2.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:wheat_3", { + drawtype = "plantlike", + tiles = {"farming_wheat_3.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:wheat_4", { + drawtype = "plantlike", + tiles = {"farming_wheat_4.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = "", + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:wheat_5", { + drawtype = "plantlike", + tiles = {"farming_wheat_5.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:wheat'}, rarity = 2}, + {items = {'farming:seed_wheat'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:wheat_6", { + drawtype = "plantlike", + tiles = {"farming_wheat_6.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:wheat'}, rarity = 2}, + {items = {'farming:seed_wheat'}, rarity = 1}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("farming:wheat_7", { + drawtype = "plantlike", + tiles = {"farming_wheat_7.png"}, + paramtype = "light", + sunlight_propagates = true, + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:wheat'}, rarity = 1}, + {items = {'farming:wheat'}, rarity = 3}, + {items = {'farming:seed_wheat'}, rarity = 1}, + {items = {'farming:seed_wheat'}, rarity = 3}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1, growing = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) + +-- Last stage of growth does not have growing group so abm never checks these + +minetest.register_node("farming:wheat_8", { + drawtype = "plantlike", + tiles = {"farming_wheat_8.png"}, + paramtype = "light", + waving = 1, + walkable = false, + buildable_to = true, + drop = { + items = { + {items = {'farming:wheat'}, rarity = 1}, + {items = {'farming:wheat'}, rarity = 2}, + {items = {'farming:seed_wheat'}, rarity = 1}, + {items = {'farming:seed_wheat'}, rarity = 2}, + } + }, + selection_box = farming.select, + groups = { + snappy = 3, flammable = 2, plant = 1, attached_node = 1, + not_in_creative_inventory = 1 + }, + sounds = default.node_sound_leaves_defaults(), +}) \ No newline at end of file diff --git a/mods/fire/README.txt b/mods/fire/README.txt new file mode 100644 index 0000000..fdbce15 --- /dev/null +++ b/mods/fire/README.txt @@ -0,0 +1,32 @@ +Minetest 0.4 mod: fire +====================== + +License of source code: +----------------------- +Copyright (C) 2012 Perttu Ahola (celeron55) + +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. + +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) 2012 Perttu Ahola (celeron55) + +fire_small.ogg sampled from: + http://www.freesound.org/people/dobroide/sounds/4211/ + +fire_large.ogg sampled from: + http://www.freesound.org/people/Dynamicell/sounds/17548/ + +fire_basic_flame_animated.png: + Muadtralk diff --git a/mods/fire/init.lua b/mods/fire/init.lua new file mode 100644 index 0000000..20b1dd2 --- /dev/null +++ b/mods/fire/init.lua @@ -0,0 +1,189 @@ +-- minetest/fire/init.lua + +fire = {} + +minetest.register_node("fire:basic_flame", { + description = "Fire", + drawtype = "firelike", + tiles = {{ + name="fire_basic_flame_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}, + }}, + inventory_image = "fire_basic_flame.png", + light_source = 14, + groups = {igniter=2,dig_immediate=3}, + drop = '', + walkable = false, + buildable_to = true, + damage_per_second = 4, + + on_construct = function(pos) + minetest.after(0, fire.on_flame_add_at, pos) + end, + + on_destruct = function(pos) + minetest.after(0, fire.on_flame_remove_at, pos) + end, + + -- unaffected by explosions + on_blast = function() end, +}) + +fire.D = 6 +-- key: position hash of low corner of area +-- value: {handle=sound handle, name=sound name} +fire.sounds = {} + +function fire.get_area_p0p1(pos) + local p0 = { + x=math.floor(pos.x/fire.D)*fire.D, + y=math.floor(pos.y/fire.D)*fire.D, + z=math.floor(pos.z/fire.D)*fire.D, + } + local p1 = { + x=p0.x+fire.D-1, + y=p0.y+fire.D-1, + z=p0.z+fire.D-1 + } + return p0, p1 +end + +function fire.update_sounds_around(pos) + local p0, p1 = fire.get_area_p0p1(pos) + local cp = {x=(p0.x+p1.x)/2, y=(p0.y+p1.y)/2, z=(p0.z+p1.z)/2} + local flames_p = minetest.find_nodes_in_area(p0, p1, {"fire:basic_flame"}) + --print("number of flames at "..minetest.pos_to_string(p0).."/" + -- ..minetest.pos_to_string(p1)..": "..#flames_p) + local should_have_sound = (#flames_p > 0) + local wanted_sound = nil + if #flames_p >= 9 then + wanted_sound = {name="fire_large", gain=1.5} + elseif #flames_p > 0 then + wanted_sound = {name="fire_small", gain=1.5} + end + local p0_hash = minetest.hash_node_position(p0) + local sound = fire.sounds[p0_hash] + if not sound then + if should_have_sound then + fire.sounds[p0_hash] = { + handle = minetest.sound_play(wanted_sound, {pos=cp, max_hear_distance = 16, loop=true}), + name = wanted_sound.name, + } + end + else + if not wanted_sound then + minetest.sound_stop(sound.handle) + fire.sounds[p0_hash] = nil + elseif sound.name ~= wanted_sound.name then + minetest.sound_stop(sound.handle) + fire.sounds[p0_hash] = { + handle = minetest.sound_play(wanted_sound, {pos=cp, max_hear_distance = 16, loop=true}), + name = wanted_sound.name, + } + end + end +end + +function fire.on_flame_add_at(pos) + fire.update_sounds_around(pos) +end + +function fire.on_flame_remove_at(pos) + fire.update_sounds_around(pos) +end + +function fire.find_pos_for_flame_around(pos) + return minetest.find_node_near(pos, 1, {"air"}) +end + +function fire.flame_should_extinguish(pos) + if minetest.setting_getbool("disable_fire") then return true end + --return minetest.find_node_near(pos, 1, {"group:puts_out_fire"}) + local p0 = {x=pos.x-2, y=pos.y, z=pos.z-2} + local p1 = {x=pos.x+2, y=pos.y, z=pos.z+2} + local ps = minetest.find_nodes_in_area(p0, p1, {"group:puts_out_fire"}) + return (#ps ~= 0) +end + +-- Ignite neighboring nodes +minetest.register_abm({ + nodenames = {"group:flammable"}, + neighbors = {"group:igniter"}, + interval = 5, + chance = 2, + action = function(p0, node, _, _) + -- If there is water or stuff like that around flame, don't ignite + if fire.flame_should_extinguish(p0) then + return + end + local p = fire.find_pos_for_flame_around(p0) + if p then + minetest.set_node(p, {name="fire:basic_flame"}) + end + end, +}) + +-- Rarely ignite things from far +minetest.register_abm({ + nodenames = {"group:igniter"}, + neighbors = {"air"}, + interval = 5, + chance = 10, + action = function(p0, node, _, _) + local reg = minetest.registered_nodes[node.name] + if not reg or not reg.groups.igniter or reg.groups.igniter < 2 then + return + end + local d = reg.groups.igniter + local p = minetest.find_node_near(p0, d, {"group:flammable"}) + if p then + -- If there is water or stuff like that around flame, don't ignite + if fire.flame_should_extinguish(p) then + return + end + local p2 = fire.find_pos_for_flame_around(p) + if p2 then + minetest.set_node(p2, {name="fire:basic_flame"}) + end + end + end, +}) + +-- Remove flammable nodes and flame +minetest.register_abm({ + nodenames = {"fire:basic_flame"}, + interval = 3, + chance = 2, + action = function(p0, node, _, _) + -- If there is water or stuff like that around flame, remove flame + if fire.flame_should_extinguish(p0) then + minetest.remove_node(p0) + return + end + -- Make the following things rarer + if math.random(1,3) == 1 then + return + end + -- If there are no flammable nodes around flame, remove flame + if not minetest.find_node_near(p0, 1, {"group:flammable"}) then + minetest.remove_node(p0) + return + end + if math.random(1,4) == 1 then + -- remove a flammable node around flame + local p = minetest.find_node_near(p0, 1, {"group:flammable"}) + if p then + -- If there is water or stuff like that around flame, don't remove + if fire.flame_should_extinguish(p0) then + return + end + minetest.remove_node(p) + nodeupdate(p) + end + else + -- remove flame + minetest.remove_node(p0) + end + end, +}) + diff --git a/mods/fire/sounds/fire_large.ogg b/mods/fire/sounds/fire_large.ogg new file mode 100644 index 0000000..fe78e62 Binary files /dev/null and b/mods/fire/sounds/fire_large.ogg differ diff --git a/mods/fire/sounds/fire_small.ogg b/mods/fire/sounds/fire_small.ogg new file mode 100644 index 0000000..5aac595 Binary files /dev/null and b/mods/fire/sounds/fire_small.ogg differ diff --git a/mods/fire/textures/fire_basic_flame.png b/mods/fire/textures/fire_basic_flame.png new file mode 100644 index 0000000..1da0702 Binary files /dev/null and b/mods/fire/textures/fire_basic_flame.png differ diff --git a/mods/fire/textures/fire_basic_flame_animated.png b/mods/fire/textures/fire_basic_flame_animated.png new file mode 100644 index 0000000..1cdd9fd Binary files /dev/null and b/mods/fire/textures/fire_basic_flame_animated.png differ diff --git a/mods/fireworks/README.txt b/mods/fireworks/README.txt new file mode 100644 index 0000000..f62e955 --- /dev/null +++ b/mods/fireworks/README.txt @@ -0,0 +1,6 @@ +--Fireworks V3.0 by: crazyginger72 +--License code and textures WTFPL +--original mod by: InfinityProject, Mauvebic, Cornernote, and Neuromancer + +--REWRITE BY: crayzginger72 (2014) + diff --git a/mods/fireworks/depends.txt b/mods/fireworks/depends.txt new file mode 100644 index 0000000..3a7daa1 --- /dev/null +++ b/mods/fireworks/depends.txt @@ -0,0 +1,2 @@ +default + diff --git a/mods/fireworks/init.lua b/mods/fireworks/init.lua new file mode 100644 index 0000000..20b9e1b --- /dev/null +++ b/mods/fireworks/init.lua @@ -0,0 +1,175 @@ +-- +--Fireworks by InfinityProject +--License code and textures WTFPL +--Thanks to Mauvebic, Cornernote, and Neuromancer + +--REWRITE BY: crayzginger72 (2014) + +--Sound will be added soon + +local colours_list = { + {"rainbow", "Rainbow"}, + {"red", "Red"}, + {"green", "Green"}, + {"blue", "Blue"}, + {"purple", "Purple"}, + {"orange", "Orange"}, + {"yellow", "Yellow"}, + {"white", ""} , + } + +for i in ipairs(colours_list) do + local colour = colours_list[i][1] + local desc = colours_list[i][2] + + if colour == "white" then + minetest.register_node("fireworks:white", { + drawtype = "airlike", + light_source = 14, + buildable_to = true, + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + pointable = false, + groups = {not_in_creative_inventory=1}, + }) + + minetest.register_abm({ + nodenames = {"fireworks:white"}, + interval =20, + chance = 1, + + action = function(pos, node, active_object_count, active_object_count_wider) + if node.name == "fireworks:white" then + minetest.remove_node(pos,{name="fireworks:white"}) + end + end + }) + + return + end + + minetest.register_node("fireworks:firework_"..colour, { + description = desc.." Fireworks", + tiles = {"fireworks_firework_"..colour..".png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + mesecons = {effector = { action_on = function(pos, node) + local f_colour = colour + fireworks_activate(pos, node, f_colour) + end}}, + + on_rightclick = function(pos, node, clicker) + local f_colour = colour + fireworks_activate(pos, node, f_colour) + end + }) + + minetest.register_node("fireworks:"..colour, { + drawtype = "plantlike", + description = desc, + tiles = {"fireworks_"..colour..".png"}, + light_source = 14, + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + pointable = false, + groups = {cracky=3,not_in_creative_inventory=1},--, hot=1, igniter=3}, --<<<= radius*radius-w and math.random(1, 10) <= 7 then + if node.name == "fireworks:firework_rainbow" then + local r_colour = colours_list[math.random(2,7)][1] + minetest.add_particle({ + pos = {x=pos.x+x+xrand,y=pos.y+y+yrand,z=pos.z+z+zrand}, + vel = {x=0, y=0, z=0}, + acc = {x=0, y=-0.2, z=0}, + expirationtime = math.random((radius/3)+(yrand/6)+2, (radius/3)+(yrand/6)-4) , + size = math.random(3, 6), + collisiondetection = false, + vertical = false, + texture = "fireworks_"..r_colour..".png" + }) + else + local r_colour = colours_list[math.random(2,7)][1] + minetest.add_particle({ + pos = {x=pos.x+x+xrand,y=pos.y+y+yrand,z=pos.z+z+zrand}, + vel = {x=0, y=0, z=0}, + acc = {x=0, y=-0.2, z=0}, + expirationtime = math.random((radius/3)+(yrand/6)+2, (radius/3)+(yrand/6)-4) , + size = math.random(3, 6), + collisiondetection = false, + vertical = false, + texture = "fireworks_"..f_colour..".png" + }) + end + end + end + end + end + end + end + end + end +end + +print("Fireworks Mod Loaded v3.0!") diff --git a/mods/fireworks/sounds/FireworkCombo44q5.ogg b/mods/fireworks/sounds/FireworkCombo44q5.ogg new file mode 100644 index 0000000..056176d Binary files /dev/null and b/mods/fireworks/sounds/FireworkCombo44q5.ogg differ diff --git a/mods/fireworks/sounds/SoundLicences.txt b/mods/fireworks/sounds/SoundLicences.txt new file mode 100644 index 0000000..331ad56 --- /dev/null +++ b/mods/fireworks/sounds/SoundLicences.txt @@ -0,0 +1,15 @@ +Sound Licenses +File: fireworks_triangle +Created By:Syna-Max +Licence: Attribution Noncommercial License. +URL: http://www.freesound.org/people/Syna-Max/sounds/56606/ + +File:RomanCandlesandShells.mp3 +CreatedBy: Mr Sensible +License: This work is licensed under the Creative Commons 0 License. +URL:http://www.freesound.org/people/Mr%20Sensible/sounds/15000/ + +File: MrSensibleFireworks.mp3 +CreatedBy: Mr Sensible +License: This work is licensed under the Creative Commons 0 License. +http://www.freesound.org/people/Mr%20Sensible/sounds/27757/ \ No newline at end of file diff --git a/mods/fireworks/textures/fireworks_blue.png b/mods/fireworks/textures/fireworks_blue.png new file mode 100644 index 0000000..99fa90b Binary files /dev/null and b/mods/fireworks/textures/fireworks_blue.png differ diff --git a/mods/fireworks/textures/fireworks_firework_blue.png b/mods/fireworks/textures/fireworks_firework_blue.png new file mode 100644 index 0000000..3c4ec41 Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_blue.png differ diff --git a/mods/fireworks/textures/fireworks_firework_green.png b/mods/fireworks/textures/fireworks_firework_green.png new file mode 100644 index 0000000..491f9df Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_green.png differ diff --git a/mods/fireworks/textures/fireworks_firework_orange.png b/mods/fireworks/textures/fireworks_firework_orange.png new file mode 100644 index 0000000..e42fc7d Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_orange.png differ diff --git a/mods/fireworks/textures/fireworks_firework_purple.png b/mods/fireworks/textures/fireworks_firework_purple.png new file mode 100644 index 0000000..53834ce Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_purple.png differ diff --git a/mods/fireworks/textures/fireworks_firework_rainbow.png b/mods/fireworks/textures/fireworks_firework_rainbow.png new file mode 100644 index 0000000..23cdb67 Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_rainbow.png differ diff --git a/mods/fireworks/textures/fireworks_firework_red.png b/mods/fireworks/textures/fireworks_firework_red.png new file mode 100644 index 0000000..0eeb8a0 Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_red.png differ diff --git a/mods/fireworks/textures/fireworks_firework_yellow.png b/mods/fireworks/textures/fireworks_firework_yellow.png new file mode 100644 index 0000000..a4796a3 Binary files /dev/null and b/mods/fireworks/textures/fireworks_firework_yellow.png differ diff --git a/mods/fireworks/textures/fireworks_green.png b/mods/fireworks/textures/fireworks_green.png new file mode 100644 index 0000000..b6568ea Binary files /dev/null and b/mods/fireworks/textures/fireworks_green.png differ diff --git a/mods/fireworks/textures/fireworks_orange.png b/mods/fireworks/textures/fireworks_orange.png new file mode 100644 index 0000000..66c0628 Binary files /dev/null and b/mods/fireworks/textures/fireworks_orange.png differ diff --git a/mods/fireworks/textures/fireworks_purple.png b/mods/fireworks/textures/fireworks_purple.png new file mode 100644 index 0000000..f7722a1 Binary files /dev/null and b/mods/fireworks/textures/fireworks_purple.png differ diff --git a/mods/fireworks/textures/fireworks_rainbow.png b/mods/fireworks/textures/fireworks_rainbow.png new file mode 100644 index 0000000..381929e Binary files /dev/null and b/mods/fireworks/textures/fireworks_rainbow.png differ diff --git a/mods/fireworks/textures/fireworks_red.png b/mods/fireworks/textures/fireworks_red.png new file mode 100644 index 0000000..cb76c57 Binary files /dev/null and b/mods/fireworks/textures/fireworks_red.png differ diff --git a/mods/fireworks/textures/fireworks_white.png b/mods/fireworks/textures/fireworks_white.png new file mode 100644 index 0000000..91165dd Binary files /dev/null and b/mods/fireworks/textures/fireworks_white.png differ diff --git a/mods/fireworks/textures/fireworks_yellow.png b/mods/fireworks/textures/fireworks_yellow.png new file mode 100644 index 0000000..5216c3b Binary files /dev/null and b/mods/fireworks/textures/fireworks_yellow.png differ diff --git a/mods/flowers/README.txt b/mods/flowers/README.txt new file mode 100644 index 0000000..04f96d9 --- /dev/null +++ b/mods/flowers/README.txt @@ -0,0 +1,16 @@ +Minetest 0.4 mod: flowers +========================= + +License of source code: +----------------------- +Copyright (C) 2012-2013 Ironzorg, VanessaE + +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. + +License of media (textures and sounds) +-------------------------------------- +WTFPL diff --git a/mods/flowers/depends.txt b/mods/flowers/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/flowers/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/flowers/init.lua b/mods/flowers/init.lua new file mode 100644 index 0000000..0071067 --- /dev/null +++ b/mods/flowers/init.lua @@ -0,0 +1,105 @@ +-- Minetest 0.4 mod: default +-- See README.txt for licensing and other information. + +-- Namespace for functions +flowers = {} + +-- Map Generation +dofile(minetest.get_modpath("flowers").."/mapgen.lua") + +-- Aliases for original flowers mod +minetest.register_alias("flowers:flower_dandelion_white", "flowers:dandelion_white") +minetest.register_alias("flowers:flower_dandelion_yellow", "flowers:dandelion_yellow") +minetest.register_alias("flowers:flower_geranium", "flowers:geranium") +minetest.register_alias("flowers:flower_rose", "flowers:rose") +minetest.register_alias("flowers:flower_tulip", "flowers:tulip") +minetest.register_alias("flowers:flower_viola", "flowers:viola") + +-- Flower registration function +local function add_simple_flower(name, desc, box, f_groups) + -- Common flowers' groups + f_groups.dig_immediate = 3 + f_groups.snappy = 3 + f_groups.flammable = 2 + f_groups.flower = 1 + f_groups.flora = 1 + f_groups.attached_node = 1 + + minetest.register_node("flowers:"..name.."", { + description = desc, + drawtype = "plantlike", + tiles = { "flowers_" .. name .. ".png" }, + inventory_image = "flowers_" .. name .. ".png", + wield_image = "flowers_" .. name .. ".png", + sunlight_propagates = true, + paramtype = "light", + walkable = false, + stack_max = 99, + groups = f_groups, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = box + } + }) +end + +-- Registrations using the function above +flowers.datas = { + {"dandelion_yellow", "Yellow Dandelion", { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 }, {color_yellow=1}}, + {"geranium", "Blue Geranium", { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 }, {color_blue=1}}, + {"rose", "Rose", { -0.15, -0.5, -0.15, 0.15, 0.3, 0.15 }, {color_red=1}}, + {"tulip", "Orange Tulip", { -0.15, -0.5, -0.15, 0.15, 0.2, 0.15 }, {color_orange=1}}, + {"dandelion_white", "White dandelion", { -0.5, -0.5, -0.5, 0.5, -0.2, 0.5 }, {color_white=1}}, + {"viola", "Viola", { -0.5, -0.5, -0.5, 0.5, -0.2, 0.5 }, {color_violet=1}} +} + +for _,item in pairs(flowers.datas) do + add_simple_flower(unpack(item)) +end + +minetest.register_abm({ + nodenames = {"group:flora"}, + neighbors = {"default:dirt_with_grass", "default:desert_sand"}, + interval = 50, + chance = 25, + action = function(pos, node) + pos.y = pos.y - 1 + local under = minetest.get_node(pos) + pos.y = pos.y + 1 + if under.name == "default:desert_sand" then + minetest.set_node(pos, {name="default:dry_shrub"}) + elseif under.name ~= "default:dirt_with_grass" then + return + end + + local light = minetest.get_node_light(pos) + if not light or light < 13 then + return + end + + local pos0 = {x=pos.x-4,y=pos.y-4,z=pos.z-4} + local pos1 = {x=pos.x+4,y=pos.y+4,z=pos.z+4} + if #minetest.find_nodes_in_area(pos0, pos1, "group:flora_block") > 0 then + return + end + + local flowers = minetest.find_nodes_in_area(pos0, pos1, "group:flora") + if #flowers > 3 then + return + end + + local seedling = minetest.find_nodes_in_area(pos0, pos1, "default:dirt_with_grass") + if #seedling > 0 then + seedling = seedling[math.random(#seedling)] + seedling.y = seedling.y + 1 + light = minetest.get_node_light(seedling) + if not light or light < 13 then + return + end + if minetest.get_node(seedling).name == "air" then + minetest.set_node(seedling, {name=node.name}) + end + end + end, +}) diff --git a/mods/flowers/mapgen.lua b/mods/flowers/mapgen.lua new file mode 100644 index 0000000..aa0380a --- /dev/null +++ b/mods/flowers/mapgen.lua @@ -0,0 +1,35 @@ +local function register_flower(name) + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.006, + spread = {x=100, y=100, z=100}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "flowers:"..name, + }) +end + +function flowers.register_mgv6_decorations() + register_flower("rose") + register_flower("tulip") + register_flower("dandelion_yellow") + register_flower("geranium") + register_flower("viola") + register_flower("dandelion_white") +end + +-- Enable in mapgen v6 only + +local mg_params = minetest.get_mapgen_params() +if mg_params.mgname == "v6" then + flowers.register_mgv6_decorations() +end + diff --git a/mods/flowers/textures/flowers_dandelion_white.png b/mods/flowers/textures/flowers_dandelion_white.png new file mode 100644 index 0000000..1bc02fb Binary files /dev/null and b/mods/flowers/textures/flowers_dandelion_white.png differ diff --git a/mods/flowers/textures/flowers_dandelion_yellow.png b/mods/flowers/textures/flowers_dandelion_yellow.png new file mode 100644 index 0000000..ec11c1c Binary files /dev/null and b/mods/flowers/textures/flowers_dandelion_yellow.png differ diff --git a/mods/flowers/textures/flowers_geranium.png b/mods/flowers/textures/flowers_geranium.png new file mode 100644 index 0000000..88de1d7 Binary files /dev/null and b/mods/flowers/textures/flowers_geranium.png differ diff --git a/mods/flowers/textures/flowers_rose.png b/mods/flowers/textures/flowers_rose.png new file mode 100644 index 0000000..e3b841d Binary files /dev/null and b/mods/flowers/textures/flowers_rose.png differ diff --git a/mods/flowers/textures/flowers_tulip.png b/mods/flowers/textures/flowers_tulip.png new file mode 100644 index 0000000..471fcd3 Binary files /dev/null and b/mods/flowers/textures/flowers_tulip.png differ diff --git a/mods/flowers/textures/flowers_viola.png b/mods/flowers/textures/flowers_viola.png new file mode 100644 index 0000000..ca2d750 Binary files /dev/null and b/mods/flowers/textures/flowers_viola.png differ diff --git a/mods/gemalde/README.txt b/mods/gemalde/README.txt new file mode 100644 index 0000000..0251050 --- /dev/null +++ b/mods/gemalde/README.txt @@ -0,0 +1 @@ +This mod is an edited version of gemalde. The textures are from minecraft. This mod was edited by jojoa1997. \ No newline at end of file diff --git a/mods/gemalde/depends.txt b/mods/gemalde/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/gemalde/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/gemalde/init.lua b/mods/gemalde/init.lua new file mode 100644 index 0000000..7fd2600 --- /dev/null +++ b/mods/gemalde/init.lua @@ -0,0 +1,171 @@ +-- Count the number of pictures. +local function get_picture(number) + local filename = minetest.get_modpath("gemalde").."/textures/gemalde_"..number..".png" + local file = io.open(filename, "r") + if file ~= nil then io.close(file) return true else return false end +end + +local N = 1 + +while get_picture(N) == true do + N = N + 1 +end + +N = N - 1 + +-- register for each picture +for n=1, N do + +local groups = {choppy=2, dig_immediate=3, picture=1, not_in_creative_inventory=1} +if n == 1 then + groups = {choppy=2, dig_immediate=3, picture=1} +end + +-- inivisible node +minetest.register_node("gemalde:node_"..n.."", { + description = "Picture #"..n.."", + drawtype = "signlike", + tiles = {"gemalde_"..n..".png"}, + visual_scale = 3.0, + inventory_image = "gemalde_node.png", + wield_image = "gemalde_node.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "wallmounted", + }, + groups = groups, + + on_rightclick = function(pos, node, clicker) + + local length = string.len (node.name) + local number = string.sub (node.name, 14, length) + + -- TODO. Reducing currently not working, because sneaking prevents right click. + local keys=clicker:get_player_control() + if keys["sneak"]==false then + if number == tostring(N) then + number = 1 + else + number = number + 1 + end + else + if number == 1 then + number = N - 1 + else + number = number - 1 + end + end + + print("[gemalde] number is "..number.."") + node.name = "gemalde:node_"..number.."" + minetest.env:set_node(pos, node) + end, + +-- TODO. +-- on_place = minetest.rotate_node +}) + +-- crafts +if n < N then +minetest.register_craft({ + output = 'gemalde:node_'..n..'', + recipe = { + {'gemalde:node_'..(n+1)..''}, + } +}) +end + +n = n + 1 + +end + +-- close the craft loop +minetest.register_craft({ + output = 'gemalde:node_'..N..'', + recipe = { + {'gemalde:node_1'}, + } +}) + +-- initial craft +minetest.register_craft({ + output = 'gemalde:node_1', + recipe = { + {'default:paper', 'default:paper'}, + {'default:paper', 'default:paper'}, + {'default:paper', 'default:paper'}, + } +}) + +-- reset several pictures to #1 +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 2', + recipe = {'group:picture', 'group:picture'}, +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 3', + recipe = {'group:picture', 'group:picture', 'group:picture'}, +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 4', + recipe = { + 'group:picture', 'group:picture', 'group:picture', + 'group:picture' + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 5', + recipe = { + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture' + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 6', + recipe = { + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture', 'group:picture' + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 7', + recipe = { + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture', 'group:picture', + 'group:picture' + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 8', + recipe = { + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture' + } +}) + +minetest.register_craft({ + type = 'shapeless', + output = 'gemalde:node_1 9', + recipe = { + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture', 'group:picture', + 'group:picture', 'group:picture', 'group:picture' + } +}) diff --git a/mods/gemalde/textures/gemalde_1.png b/mods/gemalde/textures/gemalde_1.png new file mode 100644 index 0000000..07f04f0 Binary files /dev/null and b/mods/gemalde/textures/gemalde_1.png differ diff --git a/mods/gemalde/textures/gemalde_10.png b/mods/gemalde/textures/gemalde_10.png new file mode 100644 index 0000000..c4aea38 Binary files /dev/null and b/mods/gemalde/textures/gemalde_10.png differ diff --git a/mods/gemalde/textures/gemalde_11.png b/mods/gemalde/textures/gemalde_11.png new file mode 100644 index 0000000..2ca793c Binary files /dev/null and b/mods/gemalde/textures/gemalde_11.png differ diff --git a/mods/gemalde/textures/gemalde_12.png b/mods/gemalde/textures/gemalde_12.png new file mode 100644 index 0000000..7454306 Binary files /dev/null and b/mods/gemalde/textures/gemalde_12.png differ diff --git a/mods/gemalde/textures/gemalde_13.png b/mods/gemalde/textures/gemalde_13.png new file mode 100644 index 0000000..cd704c6 Binary files /dev/null and b/mods/gemalde/textures/gemalde_13.png differ diff --git a/mods/gemalde/textures/gemalde_14.png b/mods/gemalde/textures/gemalde_14.png new file mode 100644 index 0000000..65974ef Binary files /dev/null and b/mods/gemalde/textures/gemalde_14.png differ diff --git a/mods/gemalde/textures/gemalde_15.png b/mods/gemalde/textures/gemalde_15.png new file mode 100644 index 0000000..5fd55c7 Binary files /dev/null and b/mods/gemalde/textures/gemalde_15.png differ diff --git a/mods/gemalde/textures/gemalde_16.png b/mods/gemalde/textures/gemalde_16.png new file mode 100644 index 0000000..db80403 Binary files /dev/null and b/mods/gemalde/textures/gemalde_16.png differ diff --git a/mods/gemalde/textures/gemalde_17.png b/mods/gemalde/textures/gemalde_17.png new file mode 100644 index 0000000..0803245 Binary files /dev/null and b/mods/gemalde/textures/gemalde_17.png differ diff --git a/mods/gemalde/textures/gemalde_18.png b/mods/gemalde/textures/gemalde_18.png new file mode 100644 index 0000000..e4a6381 Binary files /dev/null and b/mods/gemalde/textures/gemalde_18.png differ diff --git a/mods/gemalde/textures/gemalde_19.png b/mods/gemalde/textures/gemalde_19.png new file mode 100644 index 0000000..843e4a1 Binary files /dev/null and b/mods/gemalde/textures/gemalde_19.png differ diff --git a/mods/gemalde/textures/gemalde_2.png b/mods/gemalde/textures/gemalde_2.png new file mode 100644 index 0000000..07b1116 Binary files /dev/null and b/mods/gemalde/textures/gemalde_2.png differ diff --git a/mods/gemalde/textures/gemalde_20.png b/mods/gemalde/textures/gemalde_20.png new file mode 100644 index 0000000..7e9faa8 Binary files /dev/null and b/mods/gemalde/textures/gemalde_20.png differ diff --git a/mods/gemalde/textures/gemalde_21.png b/mods/gemalde/textures/gemalde_21.png new file mode 100644 index 0000000..65c32b7 Binary files /dev/null and b/mods/gemalde/textures/gemalde_21.png differ diff --git a/mods/gemalde/textures/gemalde_22.png b/mods/gemalde/textures/gemalde_22.png new file mode 100644 index 0000000..d2e6ca3 Binary files /dev/null and b/mods/gemalde/textures/gemalde_22.png differ diff --git a/mods/gemalde/textures/gemalde_23.png b/mods/gemalde/textures/gemalde_23.png new file mode 100644 index 0000000..b836e8d Binary files /dev/null and b/mods/gemalde/textures/gemalde_23.png differ diff --git a/mods/gemalde/textures/gemalde_24.png b/mods/gemalde/textures/gemalde_24.png new file mode 100644 index 0000000..c6d6bdb Binary files /dev/null and b/mods/gemalde/textures/gemalde_24.png differ diff --git a/mods/gemalde/textures/gemalde_25.png b/mods/gemalde/textures/gemalde_25.png new file mode 100644 index 0000000..7b8650f Binary files /dev/null and b/mods/gemalde/textures/gemalde_25.png differ diff --git a/mods/gemalde/textures/gemalde_26.png b/mods/gemalde/textures/gemalde_26.png new file mode 100644 index 0000000..ab965ca Binary files /dev/null and b/mods/gemalde/textures/gemalde_26.png differ diff --git a/mods/gemalde/textures/gemalde_27.png b/mods/gemalde/textures/gemalde_27.png new file mode 100644 index 0000000..62670be Binary files /dev/null and b/mods/gemalde/textures/gemalde_27.png differ diff --git a/mods/gemalde/textures/gemalde_28.png b/mods/gemalde/textures/gemalde_28.png new file mode 100644 index 0000000..2e8b740 Binary files /dev/null and b/mods/gemalde/textures/gemalde_28.png differ diff --git a/mods/gemalde/textures/gemalde_3.png b/mods/gemalde/textures/gemalde_3.png new file mode 100644 index 0000000..02bae8c Binary files /dev/null and b/mods/gemalde/textures/gemalde_3.png differ diff --git a/mods/gemalde/textures/gemalde_4.png b/mods/gemalde/textures/gemalde_4.png new file mode 100644 index 0000000..9d13450 Binary files /dev/null and b/mods/gemalde/textures/gemalde_4.png differ diff --git a/mods/gemalde/textures/gemalde_5.png b/mods/gemalde/textures/gemalde_5.png new file mode 100644 index 0000000..367d5bd Binary files /dev/null and b/mods/gemalde/textures/gemalde_5.png differ diff --git a/mods/gemalde/textures/gemalde_6.png b/mods/gemalde/textures/gemalde_6.png new file mode 100644 index 0000000..8c5b8ac Binary files /dev/null and b/mods/gemalde/textures/gemalde_6.png differ diff --git a/mods/gemalde/textures/gemalde_7.png b/mods/gemalde/textures/gemalde_7.png new file mode 100644 index 0000000..e79bb46 Binary files /dev/null and b/mods/gemalde/textures/gemalde_7.png differ diff --git a/mods/gemalde/textures/gemalde_8.png b/mods/gemalde/textures/gemalde_8.png new file mode 100644 index 0000000..24342c8 Binary files /dev/null and b/mods/gemalde/textures/gemalde_8.png differ diff --git a/mods/gemalde/textures/gemalde_node.png b/mods/gemalde/textures/gemalde_node.png new file mode 100644 index 0000000..3862b75 Binary files /dev/null and b/mods/gemalde/textures/gemalde_node.png differ diff --git a/mods/give_initial_stuff/depends.txt b/mods/give_initial_stuff/depends.txt new file mode 100644 index 0000000..3a7daa1 --- /dev/null +++ b/mods/give_initial_stuff/depends.txt @@ -0,0 +1,2 @@ +default + diff --git a/mods/give_initial_stuff/init.lua b/mods/give_initial_stuff/init.lua new file mode 100644 index 0000000..1c6bd39 --- /dev/null +++ b/mods/give_initial_stuff/init.lua @@ -0,0 +1,17 @@ +minetest.register_on_newplayer(function(player) + --print("on_newplayer") + if minetest.setting_getbool("give_initial_stuff") then + minetest.log("action", "Giving initial stuff to player "..player:get_player_name()) + player:get_inventory():add_item('main', 'default:pick_steel') + player:get_inventory():add_item('main', 'default:torch 99') + player:get_inventory():add_item('main', 'default:axe_steel') + player:get_inventory():add_item('main', 'default:shovel_steel') + player:get_inventory():add_item('main', 'default:diamond 99') + player:get_inventory():add_item('main', 'default:cobble 99') + player:get_inventory():add_item('main', 'default:sapling 9') + player:get_inventory():add_item('main', 'default:apple 99') + player:get_inventory():add_item('main', 'default:tree 99') + player:get_inventory():add_item('main', 'default:mese 16') + end +end) + diff --git a/mods/give_initial_stuff/mapgen - Copy.lua b/mods/give_initial_stuff/mapgen - Copy.lua new file mode 100644 index 0000000..378614e --- /dev/null +++ b/mods/give_initial_stuff/mapgen - Copy.lua @@ -0,0 +1,711 @@ +-- +-- Aliases for map generator outputs +-- + + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") +minetest.register_alias("mapgen_sandstone", "default:sandstone") + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pinetree", "default:pinetree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") +minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick") + + +-- +-- Register ores +-- + + +-- Blob ore first to avoid other ores inside blobs + +function default.register_ores() + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -15, + y_max = 0, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=-316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 4, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=2316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=17676, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -31000, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=766, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 8, + clust_size = 3, + y_min = -31000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 3, + clust_size = 2, + y_min = -15, + y_max = 2, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -63, + y_max = -16, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7*7*7, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18*18*18, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14*14*14, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36*36*36, + clust_num_ores = 3, + clust_size = 2, + y_min = -31000, + y_max = -1024, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 3, + clust_size = 2, + y_min = -255, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13*13*13, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17*17*17, + clust_num_ores = 4, + clust_size = 3, + y_min = -255, + y_max = -128, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 4, + clust_size = 3, + y_min = -63, + y_max = -16, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) +end + + +-- +-- Register biomes +-- + + +function default.register_biomes() + minetest.clear_registered_biomes() + + minetest.register_biome({ + name = "default:grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = 5, + y_max = 31000, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "default:grassland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = -31000, + y_max = 4, + heat_point = 50, + humidity_point = 50, + }) +end + + +-- +-- Register mgv6 decorations +-- + + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 8, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x=100, y=100, z=100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_min = 1, + y_max = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x=100, y=100, z=100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Grasses + + for length = 1, 5 do + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:dry_shrub", + }) +end + + +-- +-- Register decorations +-- + + +function default.register_decorations() + + -- Flowers + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:rose", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = 33, + y_max = 31000, + decoration = "flowers:tulip", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_yellow", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 36662, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:geranium", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:viola", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 73133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_white", + }) + + -- Grasses + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.04, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_1", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.06, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_2", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.08, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_3", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.10, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_4", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.12, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_5", + }) +end + + +-- +-- Detect mapgen to select functions +-- + + +-- Mods using singlenode mapgen can call these functions to enable +-- the use of minetest.generate_ores or minetest.generate_decorations + +local mg_params = minetest.get_mapgen_params() +if mg_params.mgname == "v6" then + default.register_ores() + default.register_mgv6_decorations() +elseif mg_params.mgname ~= "singlenode" then + default.register_ores() + default.register_biomes() + default.register_decorations() +end + + +-- +-- Generate nyan cats in all mapgens +-- + + +-- facedir: 0/1/2/3 (head node facedir value) +-- length: length of rainbow tail +function default.make_nyancat(pos, facedir, length) + local tailvec = {x=0, y=0, z=0} + if facedir == 0 then + tailvec.z = 1 + elseif facedir == 1 then + tailvec.x = 1 + elseif facedir == 2 then + tailvec.z = -1 + elseif facedir == 3 then + tailvec.x = -1 + else + --print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) + facedir = 0 + tailvec.z = 1 + end + local p = {x=pos.x, y=pos.y, z=pos.z} + minetest.set_node(p, {name="default:nyancat", param2=facedir}) + for i=1,length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name="default:nyancat_rainbow", param2=facedir}) + end +end + + +function default.generate_nyancats(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed + 9324342) + local max_num_nyancats = math.floor(volume / (16*16*16)) + for i=1,max_num_nyancats do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x=x0, y=y0, z=z0} + default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) + end + end +end + + +minetest.register_on_generated(default.generate_nyancats) diff --git a/mods/give_initial_stuff/mapgen.lua b/mods/give_initial_stuff/mapgen.lua new file mode 100644 index 0000000..307e471 --- /dev/null +++ b/mods/give_initial_stuff/mapgen.lua @@ -0,0 +1,711 @@ +-- +-- Aliases for map generator outputs +-- + + +minetest.register_alias("mapgen_stone", "default:stone") +minetest.register_alias("mapgen_dirt", "default:dirt") +minetest.register_alias("mapgen_dirt_with_grass", "default:dirt_with_grass") +minetest.register_alias("mapgen_sand", "default:sand") +minetest.register_alias("mapgen_water_source", "default:water_source") +minetest.register_alias("mapgen_river_water_source", "default:river_water_source") +minetest.register_alias("mapgen_lava_source", "default:lava_source") +minetest.register_alias("mapgen_gravel", "default:gravel") +minetest.register_alias("mapgen_desert_stone", "default:desert_stone") +minetest.register_alias("mapgen_desert_sand", "default:desert_sand") +minetest.register_alias("mapgen_dirt_with_snow", "default:dirt_with_snow") +minetest.register_alias("mapgen_snowblock", "default:snowblock") +minetest.register_alias("mapgen_snow", "default:snow") +minetest.register_alias("mapgen_ice", "default:ice") +minetest.register_alias("mapgen_sandstone", "default:sandstone") + +minetest.register_alias("mapgen_tree", "default:tree") +minetest.register_alias("mapgen_leaves", "default:leaves") +minetest.register_alias("mapgen_apple", "default:apple") +minetest.register_alias("mapgen_jungletree", "default:jungletree") +minetest.register_alias("mapgen_jungleleaves", "default:jungleleaves") +minetest.register_alias("mapgen_junglegrass", "default:junglegrass") +minetest.register_alias("mapgen_pinetree", "default:pinetree") +minetest.register_alias("mapgen_pine_needles", "default:pine_needles") + +minetest.register_alias("mapgen_cobble", "default:cobble") +minetest.register_alias("mapgen_stair_cobble", "stairs:stair_cobble") +minetest.register_alias("mapgen_mossycobble", "default:mossycobble") +minetest.register_alias("mapgen_sandstonebrick", "default:sandstonebrick") +minetest.register_alias("mapgen_stair_sandstonebrick", "stairs:stair_sandstonebrick") + + +-- +-- Register ores +-- + + +-- Blob ore first to avoid other ores inside blobs + +function default.register_ores() + minetest.register_ore({ + ore_type = "blob", + ore = "default:clay", + wherein = {"default:sand"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -15, + y_max = 0, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=-316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:sand", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -63, + y_max = 64, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=2316, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:dirt", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -64, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=17676, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "blob", + ore = "default:gravel", + wherein = {"default:stone"}, + clust_scarcity = 24*24*24, + clust_size = 7, + y_min = -31000, + y_max = 31000, + noise_threshhold = 0, + noise_params = { + offset=0.35, + scale=0.2, + spread={x=5, y=5, z=5}, + seed=766, + octaves=1, + persist=0.5 + }, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 8*8*8, + clust_num_ores = 27, + clust_size = 3, + y_min = -31000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_coal", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = 0, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 27, + clust_size = 3, + y_min = -15, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -63, + y_max = -16, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 7*7*7, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_iron", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 27, + clust_size = 6, + y_min = -31000, + y_max = -64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 18*18*18, + clust_num_ores = 27, + clust_size = 3, + y_min = -255, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_mese", + wherein = "default:stone", + clust_scarcity = 14*14*14, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:mese", + wherein = "default:stone", + clust_scarcity = 36*36*36, + clust_num_ores = 27, + clust_size = 3, + y_min = -31000, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 27, + clust_size = 3, + y_min = -255, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_gold", + wherein = "default:stone", + clust_scarcity = 13*13*13, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 17*17*17, + clust_num_ores = 27, + clust_size = 3, + y_min = -255, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_diamond", + wherein = "default:stone", + clust_scarcity = 15*15*15, + clust_num_ores = 4, + clust_size = 3, + y_min = -31000, + y_max = -256, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 12*12*12, + clust_num_ores = 27, + clust_size = 3, + y_min = -63, + y_max = 64, + }) + + minetest.register_ore({ + ore_type = "scatter", + ore = "default:stone_with_copper", + wherein = "default:stone", + clust_scarcity = 9*9*9, + clust_num_ores = 5, + clust_size = 3, + y_min = -31000, + y_max = -64, + }) +end + + +-- +-- Register biomes +-- + + +function default.register_biomes() + minetest.clear_registered_biomes() + + minetest.register_biome({ + name = "default:grassland", + --node_dust = "", + node_top = "default:dirt_with_grass", + depth_top = 1, + node_filler = "default:dirt", + depth_filler = 1, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = 5, + y_max = 31000, + heat_point = 50, + humidity_point = 50, + }) + + minetest.register_biome({ + name = "default:grassland_ocean", + --node_dust = "", + node_top = "default:sand", + depth_top = 1, + node_filler = "default:sand", + depth_filler = 2, + --node_stone = "", + --node_water_top = "", + --depth_water_top = , + --node_water = "", + y_min = -31000, + y_max = 4, + heat_point = 50, + humidity_point = 50, + }) +end + + +-- +-- Register mgv6 decorations +-- + + +function default.register_mgv6_decorations() + + -- Papyrus + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 8, + noise_params = { + offset = -0.3, + scale = 0.7, + spread = {x=100, y=100, z=100}, + seed = 354, + octaves = 3, + persist = 0.7 + }, + y_min = 1, + y_max = 1, + decoration = "default:papyrus", + height = 2, + height_max = 4, + spawn_by = "default:water_source", + num_spawn_by = 1, + }) + + -- Cacti + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand"}, + sidelen = 16, + noise_params = { + offset = -0.012, + scale = 0.024, + spread = {x=100, y=100, z=100}, + seed = 230, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:cactus", + height = 3, + height_max = 4, + }) + + -- Grasses + + for length = 1, 5 do + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.007, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:grass_"..length, + }) + end + + -- Dry shrubs + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:desert_sand", "default:dirt_with_snow"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.035, + spread = {x=100, y=100, z=100}, + seed = 329, + octaves = 3, + persist = 0.6 + }, + y_min = 1, + y_max = 30, + decoration = "default:dry_shrub", + }) +end + + +-- +-- Register decorations +-- + + +function default.register_decorations() + + -- Flowers + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 436, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:rose", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 19822, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = 33, + y_max = 31000, + decoration = "flowers:tulip", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1220999, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_yellow", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 36662, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:geranium", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 1133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:viola", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.03, + spread = {x=200, y=200, z=200}, + seed = 73133, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "flowers:dandelion_white", + }) + + -- Grasses + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.04, + scale = 0.04, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_1", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0.02, + scale = 0.06, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_2", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = 0, + scale = 0.08, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_3", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.02, + scale = 0.10, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_4", + }) + + minetest.register_decoration({ + deco_type = "simple", + place_on = {"default:dirt_with_grass"}, + sidelen = 16, + noise_params = { + offset = -0.04, + scale = 0.12, + spread = {x=200, y=200, z=200}, + seed = 66440, + octaves = 3, + persist = 0.6 + }, + biomes = {"default:grassland"}, + y_min = -31000, + y_max = 31000, + decoration = "default:grass_5", + }) +end + + +-- +-- Detect mapgen to select functions +-- + + +-- Mods using singlenode mapgen can call these functions to enable +-- the use of minetest.generate_ores or minetest.generate_decorations + +local mg_params = minetest.get_mapgen_params() +if mg_params.mgname == "v6" then + default.register_ores() + default.register_mgv6_decorations() +elseif mg_params.mgname ~= "singlenode" then + default.register_ores() + default.register_biomes() + default.register_decorations() +end + + +-- +-- Generate nyan cats in all mapgens +-- + + +-- facedir: 0/1/2/3 (head node facedir value) +-- length: length of rainbow tail +function default.make_nyancat(pos, facedir, length) + local tailvec = {x=0, y=0, z=0} + if facedir == 0 then + tailvec.z = 1 + elseif facedir == 1 then + tailvec.x = 1 + elseif facedir == 2 then + tailvec.z = -1 + elseif facedir == 3 then + tailvec.x = -1 + else + --print("default.make_nyancat(): Invalid facedir: "+dump(facedir)) + facedir = 0 + tailvec.z = 1 + end + local p = {x=pos.x, y=pos.y, z=pos.z} + minetest.set_node(p, {name="default:nyancat", param2=facedir}) + for i=1,length do + p.x = p.x + tailvec.x + p.z = p.z + tailvec.z + minetest.set_node(p, {name="default:nyancat_rainbow", param2=facedir}) + end +end + + +function default.generate_nyancats(minp, maxp, seed) + local height_min = -31000 + local height_max = -32 + if maxp.y < height_min or minp.y > height_max then + return + end + local y_min = math.max(minp.y, height_min) + local y_max = math.min(maxp.y, height_max) + local volume = (maxp.x-minp.x+1)*(y_max-y_min+1)*(maxp.z-minp.z+1) + local pr = PseudoRandom(seed + 9324342) + local max_num_nyancats = math.floor(volume / (16*16*16)) + for i=1,max_num_nyancats do + if pr:next(0, 1000) == 0 then + local x0 = pr:next(minp.x, maxp.x) + local y0 = pr:next(minp.y, maxp.y) + local z0 = pr:next(minp.z, maxp.z) + local p0 = {x=x0, y=y0, z=z0} + default.make_nyancat(p0, pr:next(0,3), pr:next(3,15)) + end + end +end + + +minetest.register_on_generated(default.generate_nyancats) diff --git a/mods/give_initial_stuff/nodes - Copy.lua b/mods/give_initial_stuff/nodes - Copy.lua new file mode 100644 index 0000000..31d61b5 --- /dev/null +++ b/mods/give_initial_stuff/nodes - Copy.lua @@ -0,0 +1,1612 @@ +-- mods/default/nodes.lua + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) + +default:stone +default:cobble +default:stonebrick +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick + +default:sandstone +default:sandstonebrick + +default:obsidian +default:obsidianbrick + +Soft / Non-Stone +---------------- +(1. Material [2. Modified forms]) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_snow + +default:sand +default:desert_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pinetree +default:pinewood +default:pine_needles +default:pine_sapling + +Ores +---- +(1. In stone 2. Block) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife (non-cubic) +--------------------- +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- +default:torch + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall +default:ladder +default:fence_wood + +default:glass +default:obsidian_glass + +default:rail + +default:brick + +default:meselamp + +Misc +---- +default:cloud +default:nyancat +default:nyancat_rainbow + +--]] + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = "Stone Brick", + tiles = {"default_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = "Desert Stone Brick", + tiles = {"default_desert_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + is_ground_content = true, + groups = {crumbly=2,cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + tiles = {"default_sandstone_brick.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = "Dirt with Snow", + tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + }), +}) + + + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + + + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + is_ground_content = true, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), +}) + + + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults(), +}) + + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + is_ground_content = true, + paramtype = "light", + buildable_to = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, + }, + }, + groups = {crumbly=3,falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end, +}) + + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + is_ground_content = true, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), +}) + + + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="default:apple", param2=1}) + end + end, +}) + + + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = "Junglewood Planks", + tiles = {"default_junglewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_jungleleaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:junglesapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:jungleleaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = "Jungle Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + + + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:pine_sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:pine_needles"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), + light_source = 1, +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 3, +}) + + + + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + is_ground_content = true, + groups = {cracky=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + paramtype2 = "facedir", + is_ground_content = true, + groups = {snappy=1,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.3, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = {snappy=3,flammable=2,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:grass_1", { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, +}) + +for i=2,5 do + minetest.register_node("default:grass_"..i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_"..i..".png"}, + inventory_image = "default_grass_"..i..".png", + wield_image = "default_grass_"..i..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = "default:grass_1", + groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "torchlike", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_on_ceiling_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + }, + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + light_source = default.LIGHT_MAX - 1, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, + }, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), +}) + + + +local chest_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + +local function get_locked_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," ..pos.z + local formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + return formspec +end + +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest", { + description = "Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if has_locked_chest_privilege(meta, clicker) then + minetest.show_formspec( + clicker:get_player_name(), + "default:chest_locked", + get_locked_chest_formspec(pos) + ) + end + end, + on_blast = function() end, +}) + + + +local bookshelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;books;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bookshelf_formspec) + local inv = meta:get_inventory() + inv:set_size("books", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("books") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "books" then + if stack:get_name() == "default:book" and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "nodebox", + tiles = {"default_sign.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +}) + +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + + + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = "Obsidian Glass", + drawtype = "glasslike", + tiles = {"default_obsidian_glass.png"}, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + + + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")}, +}) + + + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("default:nyancat", { + description = "Nyan Cat", + tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", + "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + legacy_facedir_simple = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:nyancat_rainbow", { + description = "Nyan Cat Rainbow", + tiles = { + "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", + "default_nc_rb.png", "default_nc_rb.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_defaults(), +}) diff --git a/mods/give_initial_stuff/nodes.lua b/mods/give_initial_stuff/nodes.lua new file mode 100644 index 0000000..09ff02b --- /dev/null +++ b/mods/give_initial_stuff/nodes.lua @@ -0,0 +1,1617 @@ +-- mods/default/nodes.lua + +--[[ Index: + +Stone +----- +(1. Material 2. Cobble variant 3. Brick variant [4. Modified forms]) + +default:stone +default:cobble +default:stonebrick +default:mossycobble + +default:desert_stone +default:desert_cobble +default:desert_stonebrick + +default:sandstone +default:sandstonebrick + +default:obsidian +default:obsidianbrick + +Soft / Non-Stone +---------------- +(1. Material [2. Modified forms]) + +default:dirt +default:dirt_with_grass +default:dirt_with_grass_footsteps +default:dirt_with_snow + +default:sand +default:desert_sand + +default:gravel + +default:clay + +default:snow +default:snowblock + +default:ice + +Trees +----- +(1. Trunk 2. Fabricated trunk 3. Leaves 4. Sapling [5. Fruits]) + +default:tree +default:wood +default:leaves +default:sapling +default:apple + +default:jungletree +default:junglewood +default:jungleleaves +default:junglesapling + +default:pinetree +default:pinewood +default:pine_needles +default:pine_sapling + +Ores +---- +(1. In stone 2. Block) + +default:stone_with_coal +default:coalblock + +default:stone_with_iron +default:steelblock + +default:stone_with_copper +default:copperblock +default:bronzeblock + +default:stone_with_gold +default:goldblock + +default:stone_with_mese +default:mese + +default:stone_with_diamond +default:diamondblock + +Plantlife (non-cubic) +--------------------- +default:cactus +default:papyrus +default:dry_shrub +default:junglegrass +default:grass_1 +default:grass_2 +default:grass_3 +default:grass_4 +default:grass_5 + +Liquids +------- +(1. Source 2. Flowing) + +default:water_source +default:water_flowing + +default:river_water_source +default:river_water_flowing + +default:lava_source +default:lava_flowing + +Tools / "Advanced" crafting / Non-"natural" +------------------------------------------- +default:torch + +default:chest +default:chest_locked + +default:bookshelf + +default:sign_wall +default:ladder +default:fence_wood + +default:glass +default:obsidian_glass + +default:rail + +default:brick + +default:meselamp + +Misc +---- +default:cloud +default:nyancat +default:nyancat_rainbow + +--]] + +-- +-- Stone +-- + +minetest.register_node("default:stone", { + description = "Stone", + tiles = {"default_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:cobble", { + description = "Cobblestone", + tiles = {"default_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:stonebrick", { + description = "Stone Brick", + tiles = {"default_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:mossycobble", { + description = "Mossy Cobblestone", + tiles = {"default_mossycobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:desert_stone", { + description = "Desert Stone", + tiles = {"default_desert_stone.png"}, + is_ground_content = true, + groups = {cracky=3, stone=1}, + drop = 'default:desert_cobble', + legacy_mineral = true, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_cobble", { + description = "Desert Cobblestone", + tiles = {"default_desert_cobble.png"}, + is_ground_content = true, + groups = {cracky=3, stone=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:desert_stonebrick", { + description = "Desert Stone Brick", + tiles = {"default_desert_stone_brick.png"}, + groups = {cracky=2, stone=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:sandstone", { + description = "Sandstone", + tiles = {"default_sandstone.png"}, + is_ground_content = true, + groups = {crumbly=2,cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:sandstonebrick", { + description = "Sandstone Brick", + tiles = {"default_sandstone_brick.png"}, + is_ground_content = true, + groups = {cracky=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +minetest.register_node("default:obsidianbrick", { + description = "Obsidian Brick", + tiles = {"default_obsidian_brick.png"}, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, +}) + +-- +-- Soft / Non-Stone +-- + +minetest.register_node("default:dirt", { + description = "Dirt", + tiles = {"default_dirt.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + sounds = default.node_sound_dirt_defaults(), +}) + +minetest.register_node("default:dirt_with_grass", { + description = "Dirt with Grass", + tiles = {"default_grass.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_grass_footsteps", { + description = "Dirt with Grass and Footsteps", + tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_grass_footstep", gain=0.25}, + }), +}) + +minetest.register_node("default:dirt_with_snow", { + description = "Dirt with Snow", + tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, + is_ground_content = true, + groups = {crumbly=3,soil=1}, + drop = 'default:dirt', + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + }), +}) + + + +minetest.register_node("default:sand", { + description = "Sand", + tiles = {"default_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + +minetest.register_node("default:desert_sand", { + description = "Desert Sand", + tiles = {"default_desert_sand.png"}, + is_ground_content = true, + groups = {crumbly=3, falling_node=1, sand=1}, + sounds = default.node_sound_sand_defaults(), +}) + + + +minetest.register_node("default:gravel", { + description = "Gravel", + tiles = {"default_gravel.png"}, + is_ground_content = true, + groups = {crumbly=2, falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.5}, + dug = {name="default_gravel_footstep", gain=1.0}, + }), +}) + + + +minetest.register_node("default:clay", { + description = "Clay", + tiles = {"default_clay.png"}, + is_ground_content = true, + groups = {crumbly=3}, + drop = 'default:clay_lump 4', + sounds = default.node_sound_dirt_defaults(), +}) + + + +minetest.register_node("default:snow", { + description = "Snow", + tiles = {"default_snow.png"}, + inventory_image = "default_snowball.png", + wield_image = "default_snowball.png", + is_ground_content = true, + paramtype = "light", + buildable_to = true, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.5+2/16, 0.5}, + }, + }, + groups = {crumbly=3,falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), + + on_construct = function(pos) + pos.y = pos.y - 1 + if minetest.get_node(pos).name == "default:dirt_with_grass" then + minetest.set_node(pos, {name="default:dirt_with_snow"}) + end + end, +}) + + +minetest.register_node("default:snowblock", { + description = "Snow Block", + tiles = {"default_snow.png"}, + is_ground_content = true, + groups = {crumbly=3}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_snow_footstep", gain=0.25}, + dug = {name="default_snow_footstep", gain=0.75}, + }), +}) + + + +minetest.register_node("default:ice", { + description = "Ice", + tiles = {"default_ice.png"}, + is_ground_content = false, + paramtype = "light", + groups = {cracky=3}, + sounds = default.node_sound_glass_defaults(), +}) + +-- +-- Trees +-- + +minetest.register_node("default:tree", { + description = "Tree", + tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:wood", { + description = "Wooden Planks", + tiles = {"default_wood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:sapling", { + description = "Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_sapling.png"}, + inventory_image = "default_sapling.png", + wield_image = "default_sapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("default:leaves", { + description = "Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_leaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:sapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:leaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:apple", { + description = "Apple", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_apple.png"}, + inventory_image = "default_apple.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + }, + groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, + on_use = minetest.item_eat(2), + sounds = default.node_sound_leaves_defaults(), + + after_place_node = function(pos, placer, itemstack) + if placer:is_player() then + minetest.set_node(pos, {name="default:apple", param2=1}) + end + end, +}) + + + +minetest.register_node("default:jungletree", { + description = "Jungle Tree", + tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:junglewood", { + description = "Junglewood Planks", + tiles = {"default_junglewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:jungleleaves", { + description = "Jungle Leaves", + drawtype = "allfaces_optional", + waving = 1, + visual_scale = 1.3, + tiles = {"default_jungleleaves.png"}, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {'default:junglesapling'}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {'default:jungleleaves'}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:junglesapling", { + description = "Jungle Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + + + +minetest.register_node("default:pinetree", { + description = "Pine Tree", + tiles = {"default_pinetree_top.png", "default_pinetree_top.png", "default_pinetree.png"}, + paramtype2 = "facedir", + is_ground_content = false, + groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + + on_place = minetest.rotate_node +}) + +minetest.register_node("default:pinewood", { + description = "Pinewood Planks", + tiles = {"default_pinewood.png"}, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), +}) + +minetest.register_node("default:pine_needles",{ + description = "Pine Needles", + drawtype = "allfaces_optional", + visual_scale = 1.3, + tiles = {"default_pine_needles.png"}, + waving = 1, + paramtype = "light", + is_ground_content = false, + groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + drop = { + max_items = 1, + items = { + { + -- player will get sapling with 1/20 chance + items = {"default:pine_sapling"}, + rarity = 20, + }, + { + -- player will get leaves only if he get no saplings, + -- this is because max_items is 1 + items = {"default:pine_needles"}, + } + } + }, + sounds = default.node_sound_leaves_defaults(), + + after_place_node = default.after_place_leaves, +}) + +minetest.register_node("default:pine_sapling", { + description = "Pine Sapling", + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_pine_sapling.png"}, + inventory_image = "default_pine_sapling.png", + wield_image = "default_pine_sapling.png", + paramtype = "light", + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +-- +-- Ores +-- + +minetest.register_node("default:stone_with_coal", { + description = "Coal Ore", + tiles = {"default_stone.png^default_mineral_coal.png"}, + is_ground_content = true, + groups = {cracky=3}, + drop = 'default:coal_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:coalblock", { + description = "Coal Block", + tiles = {"default_coal_block.png"}, + is_ground_content = true, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_iron", { + description = "Iron Ore", + tiles = {"default_stone.png^default_mineral_iron.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:iron_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:steelblock", { + description = "Steel Block", + tiles = {"default_steel_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_copper", { + description = "Copper Ore", + tiles = {"default_stone.png^default_mineral_copper.png"}, + is_ground_content = true, + groups = {cracky=2}, + drop = 'default:copper_lump', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:copperblock", { + description = "Copper Block", + tiles = {"default_copper_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:bronzeblock", { + description = "Bronze Block", + tiles = {"default_bronze_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_mese", { + description = "Mese Ore", + tiles = {"default_stone.png^default_mineral_mese.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1}, + drop = "default:mese_crystal", + sounds = default.node_sound_stone_defaults(), + light_source = 12, +}) + +minetest.register_node("default:mese", { + description = "Mese Block", + tiles = {"default_mese_block.png"}, + paramtype = "light", + is_ground_content = true, + groups = {cracky = 1, level = 2}, + sounds = default.node_sound_stone_defaults(), + light_source = 15, +}) + + + + +minetest.register_node("default:stone_with_gold", { + description = "Gold Ore", + tiles = {"default_stone.png^default_mineral_gold.png"}, + paramtype = "light", + light_source = 3, + is_ground_content = true, + groups = {cracky=2}, + drop = "default:gold_lump", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:goldblock", { + description = "Gold Block", + tiles = {"default_gold_block.png"}, + is_ground_content = true, + groups = {cracky=1}, + sounds = default.node_sound_stone_defaults(), +}) + + + +minetest.register_node("default:stone_with_diamond", { + description = "Diamond Ore", + tiles = {"default_stone.png^default_mineral_diamond.png"}, + paramtype = "light", + light_source = 9, + sunlight_propagates = true, + is_ground_content = true, + groups = {cracky=1}, + drop = "default:diamond", + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("default:diamondblock", { + description = "Diamond Block", + tiles = {"default_diamond_block.png"}, + is_ground_content = true, + groups = {cracky=1,level=3}, + sounds = default.node_sound_stone_defaults(), +}) + +-- +-- Plantlife (non-cubic) +-- + +minetest.register_node("default:cactus", { + description = "Cactus", + tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, + paramtype2 = "facedir", + is_ground_content = true, + groups = {snappy=1,choppy=3,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:papyrus", { + description = "Papyrus", + drawtype = "plantlike", + tiles = {"default_papyrus.png"}, + inventory_image = "default_papyrus.png", + wield_image = "default_papyrus.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.5, 0.3} + }, + groups = {snappy=3,flammable=2}, + sounds = default.node_sound_leaves_defaults(), + + after_dig_node = function(pos, node, metadata, digger) + default.dig_up(pos, node, digger) + end, +}) + +minetest.register_node("default:dry_shrub", { + description = "Dry Shrub", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.0, + tiles = {"default_dry_shrub.png"}, + inventory_image = "default_dry_shrub.png", + wield_image = "default_dry_shrub.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:junglegrass", { + description = "Jungle Grass", + drawtype = "plantlike", + waving = 1, + visual_scale = 1.3, + tiles = {"default_junglegrass.png"}, + inventory_image = "default_junglegrass.png", + wield_image = "default_junglegrass.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + groups = {snappy=3,flammable=2,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, +}) + +minetest.register_node("default:grass_1", { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_1.png"}, + -- Use texture of a taller grass stage in inventory + inventory_image = "default_grass_3.png", + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = true, + buildable_to = true, + groups = {snappy=3,flammable=3,flora=1,attached_node=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + + on_place = function(itemstack, placer, pointed_thing) + -- place a random grass node + local stack = ItemStack("default:grass_"..math.random(1,5)) + local ret = minetest.item_place(stack, placer, pointed_thing) + return ItemStack("default:grass_1 "..itemstack:get_count()-(1-ret:get_count())) + end, +}) + +for i=2,5 do + minetest.register_node("default:grass_"..i, { + description = "Grass", + drawtype = "plantlike", + waving = 1, + tiles = {"default_grass_"..i..".png"}, + inventory_image = "default_grass_"..i..".png", + wield_image = "default_grass_"..i..".png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + buildable_to = true, + is_ground_content = true, + drop = "default:grass_1", + groups = {snappy=3,flammable=3,flora=1,attached_node=1,not_in_creative_inventory=1}, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, + }, + }) +end + +-- +-- Liquids +-- + +minetest.register_node("default:water_source", { + description = "Water Source", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + -- New-style water source material (mostly unused) + { + name = "default_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:water_flowing", { + description = "Flowing Water", + inventory_image = minetest.inventorycube("default_water.png"), + drawtype = "flowingliquid", + tiles = {"default_water.png"}, + special_tiles = { + { + name = "default_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:water_flowing", + liquid_alternative_source = "default:water_source", + liquid_viscosity = 1, + post_effect_color = {a=120, r=30, g=60, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + +minetest.register_node("default:river_water_source", { + description = "River Water Source", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "liquid", + tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + }, + }, + special_tiles = { + { + name = "default_river_water_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 2.0, + }, + backface_culling = false, + }, + }, + alpha = 160, + paramtype = "light", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1}, +}) + +minetest.register_node("default:river_water_flowing", { + description = "Flowing River Water", + inventory_image = minetest.inventorycube("default_river_water.png"), + drawtype = "flowingliquid", + tiles = {"default_river_water.png"}, + special_tiles = { + { + name = "default_river_water_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { + name = "default_river_water_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + }, + alpha = 160, + paramtype = "light", + paramtype2 = "flowingliquid", + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:river_water_flowing", + liquid_alternative_source = "default:river_water_source", + liquid_viscosity = 1, + liquid_renewable = false, + liquid_range = 2, + post_effect_color = {a=120, r=30, g=76, b=90}, + groups = {water=3, liquid=3, puts_out_fire=1, not_in_creative_inventory=1}, +}) + + + +minetest.register_node("default:lava_source", { + description = "Lava Source", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "liquid", + tiles = { + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + }, + }, + special_tiles = { + -- New-style lava source material (mostly unused) + { + name = "default_lava_source_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0, + }, + backface_culling = false, + }, + }, + paramtype = "light", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "source", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1}, +}) + +minetest.register_node("default:lava_flowing", { + description = "Flowing Lava", + inventory_image = minetest.inventorycube("default_lava.png"), + drawtype = "flowingliquid", + tiles = {"default_lava.png"}, + special_tiles = { + { + name = "default_lava_flowing_animated.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + { + name = "default_lava_flowing_animated.png", + backface_culling = true, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.3, + }, + }, + }, + paramtype = "light", + paramtype2 = "flowingliquid", + light_source = default.LIGHT_MAX - 1, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + is_ground_content = false, + drop = "", + drowning = 1, + liquidtype = "flowing", + liquid_alternative_flowing = "default:lava_flowing", + liquid_alternative_source = "default:lava_source", + liquid_viscosity = 7, + liquid_renewable = false, + damage_per_second = 4 * 2, + post_effect_color = {a=192, r=255, g=64, b=0}, + groups = {lava=3, liquid=2, hot=3, igniter=1, not_in_creative_inventory=1}, +}) + +-- +-- Tools / "Advanced" crafting / Non-"natural" +-- + +minetest.register_node("default:torch", { + description = "Torch", + drawtype = "torchlike", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_on_ceiling_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + { + name="default_torch_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 3.0 + }, + }, + }, + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + light_source = default.LIGHT_MAX - 1, + selection_box = { + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.5+0.3, 0.3, 0.1}, + }, + groups = {choppy=2,dig_immediate=3,flammable=1,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), +}) + + + +local chest_formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + +local function get_locked_chest_formspec(pos) + local spos = pos.x .. "," .. pos.y .. "," ..pos.z + local formspec = + "size[8,9]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[nodemeta:".. spos .. ";main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + default.get_hotbar_bg(0,4.85) + return formspec +end + +local function has_locked_chest_privilege(meta, player) + if player:get_player_name() ~= meta:get_string("owner") then + return false + end + return true +end + +minetest.register_node("default:chest", { + description = "Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_front.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:chest_locked", { + description = "Locked Chest", + tiles = {"default_chest_top.png", "default_chest_top.png", "default_chest_side.png", + "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, + paramtype2 = "facedir", + groups = {choppy=2,oddly_breakable_by_hand=2}, + legacy_facedir_simple = true, + is_ground_content = false, + sounds = default.node_sound_wood_defaults(), + + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("infotext", "Locked Chest") + meta:set_string("owner", "") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") and has_locked_chest_privilege(meta, player) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + return 0 + end + return stack:get_count() + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + end, + on_rightclick = function(pos, node, clicker) + local meta = minetest.get_meta(pos) + if has_locked_chest_privilege(meta, clicker) then + minetest.show_formspec( + clicker:get_player_name(), + "default:chest_locked", + get_locked_chest_formspec(pos) + ) + end + end, + on_blast = function() end, +}) + + + +local bookshelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;books;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("default:bookshelf", { + description = "Bookshelf", + tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", bookshelf_formspec) + local inv = meta:get_inventory() + inv:set_size("books", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("books") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "books" then + if minetest.get_item_group(stack:get_name(), "book") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "books" then + if stack:get_name() == "default:book" and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to bookshelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from bookshelf at "..minetest.pos_to_string(pos)) + end, +}) + + + +minetest.register_node("default:sign_wall", { + description = "Sign", + drawtype = "nodebox", + tiles = {"default_sign.png"}, + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + is_ground_content = false, + walkable = false, + node_box = { + type = "wallmounted", + wall_top = {-0.4375, 0.4375, -0.3125, 0.4375, 0.5, 0.3125}, + wall_bottom = {-0.4375, -0.5, -0.3125, 0.4375, -0.4375, 0.3125}, + wall_side = {-0.5, -0.3125, -0.4375, -0.4375, 0.3125, 0.4375}, + }, + groups = {choppy=2,dig_immediate=2,attached_node=1}, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + + on_construct = function(pos) + --local n = minetest.get_node(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + if minetest.is_protected(pos, sender:get_player_name()) then + minetest.record_protection_violation(pos, sender:get_player_name()) + return + end + local meta = minetest.get_meta(pos) + if not fields.text then return end + minetest.log("action", (sender:get_player_name() or "").." wrote \""..fields.text.. + "\" to sign at "..minetest.pos_to_string(pos)) + meta:set_string("text", fields.text) + meta:set_string("infotext", '"'..fields.text..'"') + end, +}) + +minetest.register_node("default:ladder", { + description = "Ladder", + drawtype = "signlike", + tiles = {"default_ladder.png"}, + inventory_image = "default_ladder.png", + wield_image = "default_ladder.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + climbable = true, + is_ground_content = false, + selection_box = { + type = "wallmounted", + --wall_top = = + --wall_bottom = = + --wall_side = = + }, + groups = {choppy=2,oddly_breakable_by_hand=3,flammable=2}, + legacy_wallmounted = true, + sounds = default.node_sound_wood_defaults(), +}) + +local fence_texture = "default_fence_overlay.png^default_wood.png^default_fence_overlay.png^[makealpha:255,126,126" +minetest.register_node("default:fence_wood", { + description = "Wooden Fence", + drawtype = "fencelike", + tiles = {"default_wood.png"}, + inventory_image = fence_texture, + wield_image = fence_texture, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {choppy=2,oddly_breakable_by_hand=2,flammable=2}, + sounds = default.node_sound_wood_defaults(), +}) + + + +minetest.register_node("default:glass", { + description = "Glass", + drawtype = "glasslike_framed_optional", + tiles = {"default_glass.png", "default_glass_detail.png"}, + inventory_image = minetest.inventorycube("default_glass.png"), + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("default:obsidian_glass", { + description = "Obsidian Glass", + drawtype = "glasslike", + tiles = {"default_obsidian_glass.png"}, + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + sounds = default.node_sound_glass_defaults(), + groups = {cracky=3,oddly_breakable_by_hand=3}, +}) + + + +minetest.register_node("default:rail", { + description = "Rail", + drawtype = "raillike", + tiles = {"default_rail.png", "default_rail_curved.png", "default_rail_t_junction.png", "default_rail_crossing.png"}, + inventory_image = "default_rail.png", + wield_image = "default_rail.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + is_ground_content = false, + selection_box = { + type = "fixed", + -- but how to specify the dimensions for curved and sideways rails? + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {bendy=2,dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("rail")}, +}) + + + +minetest.register_node("default:brick", { + description = "Brick Block", + tiles = {"default_brick.png"}, + is_ground_content = false, + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), +}) + + +minetest.register_node("default:meselamp", { + description = "Mese Lamp", + drawtype = "glasslike", + tiles = {"default_meselamp.png"}, + paramtype = "light", + sunlight_propagates = true, + is_ground_content = false, + groups = {cracky = 3, oddly_breakable_by_hand = 3}, + sounds = default.node_sound_glass_defaults(), + light_source = default.LIGHT_MAX, +}) + +-- +-- Misc +-- + +minetest.register_node("default:cloud", { + description = "Cloud", + tiles = {"default_cloud.png"}, + sounds = default.node_sound_defaults(), + groups = {not_in_creative_inventory=1}, +}) + +minetest.register_node("default:nyancat", { + description = "Nyan Cat", + tiles = {"default_nc_side.png", "default_nc_side.png", "default_nc_side.png", + "default_nc_side.png", "default_nc_back.png", "default_nc_front.png"}, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + legacy_facedir_simple = true, + sounds = default.node_sound_defaults(), +}) + +minetest.register_node("default:nyancat_rainbow", { + description = "Nyan Cat Rainbow", + tiles = { + "default_nc_rb.png^[transformR90", "default_nc_rb.png^[transformR90", + "default_nc_rb.png", "default_nc_rb.png" + }, + paramtype2 = "facedir", + groups = {cracky=2}, + is_ground_content = false, + sounds = default.node_sound_defaults(), +}) diff --git a/mods/head/README.md b/mods/head/README.md new file mode 100644 index 0000000..952a200 --- /dev/null +++ b/mods/head/README.md @@ -0,0 +1,3 @@ +head mineclone +==== +Begin of little head \ No newline at end of file diff --git a/mods/head/depends.txt b/mods/head/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/head/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/head/init.lua b/mods/head/init.lua new file mode 100644 index 0000000..9bc533b --- /dev/null +++ b/mods/head/init.lua @@ -0,0 +1,52 @@ +-- head system + +function addhead(node, desc) + minetest.register_node("head:"..node, { + description = ""..desc, + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, + }, + }, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,head=1}, + tiles = { + node.."_top.png", + node.."_top.png", + node.."_left.png", + node.."_right.png", + node.."_back.png", + node.."_face.png", + }, + paramtype = "light", + stack_max = 16, + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = true, + selection_box = { + type = "fixed", + fixed = { -0.25, -0.5, -0.25, 0.25, 0.0, 0.25, }, + }, + + }) +end + +--head add +addhead("zombie", "Zombie Head") +addhead("creeper", "Creeper Head") +addhead("steve", "Steve Head") +addhead("herobrine", "Herobrine Head") + + +minetest.register_abm( + {nodenames = {"head:herobrine"}, + interval = 70, + chance = 4, + action = function(pos, node, active_object_count, active_object_count_wider) + if math.random(1, 200) <= 1 then + minetest.add_entity(pos, "mobs:herobrine") + minetest.chat_send_all("Herobrine : I'm Here for you !") + end + end, +}) diff --git a/mods/head/textures/creeper_back.png b/mods/head/textures/creeper_back.png new file mode 100644 index 0000000..b4ed86f Binary files /dev/null and b/mods/head/textures/creeper_back.png differ diff --git a/mods/head/textures/creeper_face.png b/mods/head/textures/creeper_face.png new file mode 100644 index 0000000..3a370f2 Binary files /dev/null and b/mods/head/textures/creeper_face.png differ diff --git a/mods/head/textures/creeper_left.png b/mods/head/textures/creeper_left.png new file mode 100644 index 0000000..84c2be9 Binary files /dev/null and b/mods/head/textures/creeper_left.png differ diff --git a/mods/head/textures/creeper_right.png b/mods/head/textures/creeper_right.png new file mode 100644 index 0000000..12bbb38 Binary files /dev/null and b/mods/head/textures/creeper_right.png differ diff --git a/mods/head/textures/creeper_top.png b/mods/head/textures/creeper_top.png new file mode 100644 index 0000000..5820753 Binary files /dev/null and b/mods/head/textures/creeper_top.png differ diff --git a/mods/head/textures/herobrine_back.png b/mods/head/textures/herobrine_back.png new file mode 100644 index 0000000..c848956 Binary files /dev/null and b/mods/head/textures/herobrine_back.png differ diff --git a/mods/head/textures/herobrine_face.png b/mods/head/textures/herobrine_face.png new file mode 100644 index 0000000..ed57f32 Binary files /dev/null and b/mods/head/textures/herobrine_face.png differ diff --git a/mods/head/textures/herobrine_left.png b/mods/head/textures/herobrine_left.png new file mode 100644 index 0000000..5d11c3d Binary files /dev/null and b/mods/head/textures/herobrine_left.png differ diff --git a/mods/head/textures/herobrine_right.png b/mods/head/textures/herobrine_right.png new file mode 100644 index 0000000..462fd5e Binary files /dev/null and b/mods/head/textures/herobrine_right.png differ diff --git a/mods/head/textures/herobrine_top.png b/mods/head/textures/herobrine_top.png new file mode 100644 index 0000000..0cbd6b4 Binary files /dev/null and b/mods/head/textures/herobrine_top.png differ diff --git a/mods/head/textures/steve_back.png b/mods/head/textures/steve_back.png new file mode 100644 index 0000000..c848956 Binary files /dev/null and b/mods/head/textures/steve_back.png differ diff --git a/mods/head/textures/steve_face.png b/mods/head/textures/steve_face.png new file mode 100644 index 0000000..0beaed2 Binary files /dev/null and b/mods/head/textures/steve_face.png differ diff --git a/mods/head/textures/steve_left.png b/mods/head/textures/steve_left.png new file mode 100644 index 0000000..5d11c3d Binary files /dev/null and b/mods/head/textures/steve_left.png differ diff --git a/mods/head/textures/steve_right.png b/mods/head/textures/steve_right.png new file mode 100644 index 0000000..462fd5e Binary files /dev/null and b/mods/head/textures/steve_right.png differ diff --git a/mods/head/textures/steve_top.png b/mods/head/textures/steve_top.png new file mode 100644 index 0000000..0cbd6b4 Binary files /dev/null and b/mods/head/textures/steve_top.png differ diff --git a/mods/head/textures/zombie_back.png b/mods/head/textures/zombie_back.png new file mode 100644 index 0000000..a0c34dc Binary files /dev/null and b/mods/head/textures/zombie_back.png differ diff --git a/mods/head/textures/zombie_face.png b/mods/head/textures/zombie_face.png new file mode 100644 index 0000000..e4ed5d1 Binary files /dev/null and b/mods/head/textures/zombie_face.png differ diff --git a/mods/head/textures/zombie_left.png b/mods/head/textures/zombie_left.png new file mode 100644 index 0000000..15f1432 Binary files /dev/null and b/mods/head/textures/zombie_left.png differ diff --git a/mods/head/textures/zombie_right.png b/mods/head/textures/zombie_right.png new file mode 100644 index 0000000..8f75e0c Binary files /dev/null and b/mods/head/textures/zombie_right.png differ diff --git a/mods/head/textures/zombie_top.png b/mods/head/textures/zombie_top.png new file mode 100644 index 0000000..0543370 Binary files /dev/null and b/mods/head/textures/zombie_top.png differ diff --git a/mods/hopper/init.lua b/mods/hopper/init.lua new file mode 100644 index 0000000..44965fe --- /dev/null +++ b/mods/hopper/init.lua @@ -0,0 +1,507 @@ + + +local chest = minetest.get_content_id("default:chest") + +local chest_formspec = + "size[8,9]".. + --default.gui_bg.. + --default.gui_bg_img.. + --default.gui_slots.. + "list[current_name;main;0,0.3;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]" + --default.get_hotbar_bg(0,4.85) + +minetest.register_node("hopper:hopper", { + drop = "hopper:hopper_item", + description = "I think you broke something", + groups = {cracky=1,level=2}, + drawtype = "nodebox", + paramtype = "light", + tiles = {"default_coal_block.png"}, + selection_box = {type="regular"}, + node_box = { + type = "fixed", + fixed = { + --funnel walls + {-0.5, 0.0, 0.4, 0.5, 0.5, 0.5}, + {0.4, 0.0, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.0, -0.5, -0.4, 0.5, 0.5}, + {-0.5, 0.0, -0.5, 0.5, 0.5, -0.4}, + --funnel base + {-0.5, 0.0, -0.5, 0.5, 0.1, 0.5}, + --spout + {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, + {-0.15, -0.3, -0.15, 0.15, -0.5, 0.15}, + }, + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in hopper at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to hopper at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from hopper at "..minetest.pos_to_string(pos)) + end, +}) + +minetest.register_node("hopper:hopper_side", { + description = "I think you broke something", + drop = "hopper:hopper_item", + groups = {cracky=1,level=2}, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + tiles = {"default_coal_block.png"}, + selection_box = {type="regular"}, + node_box = { + type = "fixed", + fixed = { + --funnel walls + {-0.5, 0.0, 0.4, 0.5, 0.5, 0.5}, + {0.4, 0.0, -0.5, 0.5, 0.5, 0.5}, + {-0.5, 0.0, -0.5, -0.4, 0.5, 0.5}, + {-0.5, 0.0, -0.5, 0.5, 0.5, -0.4}, + --funnel base + {-0.5, 0.0, -0.5, 0.5, 0.1, 0.5}, + --spout + {-0.3, -0.3, -0.3, 0.3, 0.0, 0.3}, + {-0.7, -0.3, -0.15, 0.15, 0.0, 0.15}, + }, + }, + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", chest_formspec) + meta:set_string("infotext", "Chest") + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in hopper at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to hopper at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from hopper at "..minetest.pos_to_string(pos)) + end, +}) +--make hoppers suck in blocks +minetest.register_abm({ + nodenames = {"hopper:hopper","hopper:hopper_side"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local posob = object:getpos() + if math.abs(posob.x-pos.x) <= 0.5 and (posob.y-pos.y <= 0.85 and posob.y-pos.y >= 0.3) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + object:get_luaentity().itemstring = "" + object:remove() + end + end + end + end + end, +}) + +minetest.register_abm({ + nodenames = {"hopper:hopper"}, + neighbors = {"default:chest","hopper:hopper","hopper:hopper_side","default:furnace","default:furnace_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + + local min = {x=pos.x-1,y=pos.y-1,z=pos.z-1} + local max = {x=pos.x+1,y=pos.y+1,z=pos.z+1} + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(min,max) + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + local data = vm:get_data() + + local a = vm:get_node_at({x=pos.x,y=pos.y-1,z=pos.z}).name + local b = vm:get_node_at({x=pos.x,y=pos.y+1,z=pos.z}).name + + --the hopper input + if b == "default:chest" then + --hopper inventory + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("main") + if inv2:is_empty("main") == false then + for i = 1,invsize2 do + local stack = inv2:get_stack("main", i) + local item = stack:get_name() + if item ~= "" then + if inv:room_for_item("main", item) == false then + --print("no room for items 2") + --return + end + --print(stack:to_string()) + stack:take_item(1) + inv2:set_stack("main", i, stack) + --add to hopper + --print("adding item") + inv:add_item("main", item) + break + + end + end + end + end + if b == "default:furnace" or b == "default:furnace_active" then + --hopper inventory + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("dst") + if inv2:is_empty("dst") == true then + --print("furnace is empty") + return + end + + for i = 1,invsize2 do + local stack = inv2:get_stack("dst", i) + local item = stack:get_name() + if item ~= "" then + if inv:room_for_item("main", item) == false then + --print("no room for items") + return + end + --print(stack:to_string()) + stack:take_item(1) + inv2:set_stack("dst", i, stack) + --add to hopper + --print("adding item") + inv:add_item("main", item) + break + + end + end + end + + --the hopper output + if a == "default:chest" or a == "hopper:hopper" or a == "hopper:hopper_side" then + --hopper inventory + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + if inv:is_empty("main") == true then + return + end + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("main") + + for i = 1,invsize do + local stack = inv:get_stack("main", i) + local item = stack:get_name() + if item ~= "" then + if inv2:room_for_item("main", item) == false then + --print("no room for items") + return + end + stack:take_item(1) + inv:set_stack("main", i, stack) + --add to hopper or chest + --print("adding item") + inv2:add_item("main", item) + break + + end + end + --print(inv) + elseif a == "default:furnace" or a == "default:furnace_active" then + --print("test") + --room_for_item(listname, stack) + --hopper inventory + local meta = minetest.get_meta(pos); + --print(dump(meta:to_table())) + local inv = meta:get_inventory() + if inv:is_empty("main") == true then + return + end + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z}); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("src") + + for i = 1,invsize do + local stack = inv:get_stack("main", i) + local item = stack:get_name() + if item ~= "" then + if inv2:room_for_item("src", item) == false then + --print("no room for items") + return + end + stack:take_item(1) + inv:set_stack("main", i, stack) + --add to hopper or chest + --print("adding item") + inv2:add_item("src", item) + break + + end + end + end + end, +}) + + +minetest.register_abm({ + nodenames = {"hopper:hopper_side"}, + neighbors = {"default:chest","hopper:hopper","hopper:hopper_side","default:furnace","default:furnace_active"}, + interval = 1.0, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + + local min = {x=pos.x-1,y=pos.y-1,z=pos.z-1} + local max = {x=pos.x+1,y=pos.y+1,z=pos.z+1} + local vm = minetest.get_voxel_manip() + local emin, emax = vm:read_from_map(min,max) + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + local data = vm:get_data() + local face = vm:get_node_at(pos).param2 + local front = {} + --print(face) + if face == 0 then + front = {x=pos.x-1,y=pos.y,z=pos.z} + elseif face == 1 then + front = {x=pos.x,y=pos.y,z=pos.z+1} + elseif face == 2 then + front = {x=pos.x+1,y=pos.y,z=pos.z} + elseif face == 3 then + front = {x=pos.x,y=pos.y,z=pos.z-1} + end + local a = vm:get_node_at(front).name + local b = vm:get_node_at({x=pos.x,y=pos.y+1,z=pos.z}).name + + --the hopper input + if b == "default:chest" then + --hopper inventory + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("main") + if inv2:is_empty("main") == false then + for i = 1,invsize2 do + local stack = inv2:get_stack("main", i) + local item = stack:get_name() + if item ~= "" then + if inv:room_for_item("main", item) == false then + --print("no room for items 2") + --return + end + --print(stack:to_string()) + stack:take_item(1) + inv2:set_stack("main", i, stack) + --add to hopper + --print("adding item") + inv:add_item("main", item) + break + + end + end + end + end + if b == "default:furnace" or b == "default:furnace_active" then + --hopper inventory + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta({x=pos.x,y=pos.y+1,z=pos.z}); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("dst") + if inv2:is_empty("dst") == true then + --print("furnace is empty") + return + end + + for i = 1,invsize2 do + local stack = inv2:get_stack("dst", i) + local item = stack:get_name() + if item ~= "" then + if inv:room_for_item("main", item) == false then + --print("no room for items") + return + end + --print(stack:to_string()) + stack:take_item(1) + inv2:set_stack("dst", i, stack) + --add to hopper + --print("adding item") + inv:add_item("main", item) + break + + end + end + end + + --the hopper output + if a == "default:chest" or a == "hopper:hopper" or a == "hopper:hopper_side" then + --print("test") + --room_for_item(listname, stack) + --hopper inventory + local meta = minetest.get_meta(pos); + --print(dump(meta:to_table())) + local inv = meta:get_inventory() + if inv:is_empty("main") == true then + return + end + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta(front); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("main") + + for i = 1,invsize do + local stack = inv:get_stack("main", i) + local item = stack:get_name() + if item ~= "" then + if inv2:room_for_item("main", item) == false then + --print("no room for items") + return + end + stack:take_item(1) + inv:set_stack("main", i, stack) + --add to hopper or chest + --print("adding item") + inv2:add_item("main", item) + break + + end + end + --print(inv) + elseif a == "default:furnace" or a == "default:furnace_active" then + --print("test") + --room_for_item(listname, stack) + --hopper inventory + local meta = minetest.get_meta(pos); + --print(dump(meta:to_table())) + local inv = meta:get_inventory() + if inv:is_empty("main") == true then + return + end + local invsize = inv:get_size("main") + + --chest/hopper/furnace inventory + local meta2 = minetest.get_meta(front); + local inv2 = meta2:get_inventory() + local invsize2 = inv2:get_size("fuel") + + for i = 1,invsize do + local stack = inv:get_stack("main", i) + local item = stack:get_name() + if item ~= "" then + if inv2:room_for_item("fuel", item) == false then + --print("no room for items") + return + end + stack:take_item(1) + inv:set_stack("main", i, stack) + --add to hopper or chest + --print("adding item") + inv2:add_item("fuel", item) + break + + end + end + end + end, +}) + +minetest.register_craftitem("hopper:hopper_item", { + description = "Hopper", + inventory_image = "hopper_item.png", + on_place = function(itemstack, placer, pointed_thing) + local pos = pointed_thing.under + local pos2 = pointed_thing.above + + local x = pos.x - pos2.x + local y = pos.y - pos2.y + local z = pos.z - pos2.z + + local placed = false + + if x == -1 then + minetest.set_node(pos2, {name="hopper:hopper_side", param2=0}) + placed = true + elseif x == 1 then + minetest.set_node(pos2, {name="hopper:hopper_side", param2=2}) + placed = true + elseif z == -1 then + minetest.set_node(pos2, {name="hopper:hopper_side", param2=3}) + placed = true + elseif z == 1 then + minetest.set_node(pos2, {name="hopper:hopper_side", param2=1}) + placed = true + else + minetest.set_node(pos2, {name="hopper:hopper"}) + placed = true + end + if placed == true then + if not minetest.setting_getbool("creative_mode") then + itemstack:take_item() + end + return itemstack + end + end, +}) +minetest.register_craft({ + output = "hopper:hopper_item", + recipe = { + {"default:steel_ingot","default:chest","default:steel_ingot"}, + {"","default:steel_ingot",""}, + } +}) diff --git a/mods/hopper/textures/hopper_item.png b/mods/hopper/textures/hopper_item.png new file mode 100644 index 0000000..56555af Binary files /dev/null and b/mods/hopper/textures/hopper_item.png differ diff --git a/mods/instabuild/depends.txt b/mods/instabuild/depends.txt new file mode 100644 index 0000000..da4039a --- /dev/null +++ b/mods/instabuild/depends.txt @@ -0,0 +1,2 @@ +default +worldedit diff --git a/mods/instabuild/init.lua b/mods/instabuild/init.lua new file mode 100644 index 0000000..1fc190d --- /dev/null +++ b/mods/instabuild/init.lua @@ -0,0 +1,281 @@ +--This mod is licensed under CC BY-SA + +instabuild = {} + +--Item Registering + +local instabuild_list = { + { "Small Hut Kit", "small_hut"}, + { "Large Hut Kit", "large_hut"}, + { "Small House Kit", "small_house"}, + { "Large House Kit", "large_house"}, + { "Small Warehouse Kit", "small_warehouse"}, + { "Large Warehouse Kit", "large_warehouse"}, + { "Small Farm Kit", "small_farm"}, + { "Large Farm Kit", "large_farm"}, + { "Short Tower Kit", "short_tower"}, + { "Tall Tower Kit", "tall_tower"}, + { "Factory Kit", "factory"}, + { "Modern House Kit", "modern_house"}, + { "Mansion Kit", "mansion"}, + +} + +for i in ipairs(instabuild_list) do + local builddesc = instabuild_list[i][1] + local build = instabuild_list[i][2] + + minetest.register_craftitem("instabuild:"..build, { + description = builddesc, + inventory_image = build..".png", + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.above then + local file = io.open(minetest.get_modpath("instabuild").."/models/"..build..".we") + local value = file:read("*a") + file:close() + local p = pointed_thing.above + p.x = p.x - 5 + p.z = p.z - 2 + local count = worldedit.deserialize(pointed_thing.above, value) + itemstack:take_item() + end + return itemstack + end, + }) +end + +minetest.register_node("instabuild:glass_panel",{ + drawtype="nodebox", + description= "Glass Panel", + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + tiles = { 'default_glass.png' }, + node_box = { + type = "fixed", + fixed = { + {-0.500000,-0.500000,0.000000,0.500000,0.500000,0.500000}, + }, + }, + groups={oddly_breakable_by_hand=3}, +}) + +minetest.register_node("instabuild:glass_roof",{ + drawtype="nodebox", + description= "Glass Roof", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + tiles = { "default_glass.png" }, + node_box = { + type = "fixed", + fixed = { + {-0.500000,-0.500000,-0.500000,-0.125000,-0.125000,0.500000}, + {0.125000,0.125000,-0.500000,0.500000,0.500000,0.500000}, + {-0.187500,-0.187500,-0.500000,0.187500,0.187500,0.500000}, + }, + }, + groups={oddly_breakable_by_hand=3}, +}) + +minetest.register_node("instabuild:light",{ + drawtype="nodebox", + description= "Strip Light", + light_source = 14, + tiles = { 'default_wood.png', + 'default_cloud.png', + 'default_wood.png', + 'default_wood.png', + 'default_wood.png', + 'default_wood.png' }, + paramtype2 = "facedir", + node_box = { + type = "fixed", + fixed = { + {-0.500000,0.250000,-0.250000,0.500000,0.407216,0.250000}, + {-0.500000,0.312500,-0.062500,0.500000,0.500000,0.062500}, + }, + }, + groups={oddly_breakable_by_hand=3}, +}) + +minetest.register_node("instabuild:catwalk",{ + drawtype="nodebox", + description= "Catwalk", + paramtype = "light", + paramtype2 = "facedir", + tiles = { 'catwalk.png', + 'catwalk.png', + 'default_steel_block.png', + 'default_steel_block.png', + 'default_steel_block.png', + 'default_steel_block.png', }, + node_box = { + type = "fixed", + fixed = { + {-0.500000,-0.500000,-0.500000,0.500000,-0.375000,0.500000}, --NodeBox 1 + {-0.500000,-0.500000,-0.062500,-0.437500,0.500000,0.062500}, --NodeBox 2 + {0.443299,-0.500000,-0.062500,0.500000,0.500000,0.062500}, --NodeBox 3 + {0.443299,0.448454,-0.500000,0.500000,0.500000,0.500000}, --NodeBox 4 + {-0.500000,0.448454,-0.500000,-0.437500,0.500000,0.500000}, --NodeBox 5 + }, + }, + groups={oddly_breakable_by_hand=3}, +}) + +minetest.register_node("instabuild:corner",{ + drawtype="nodebox", + description= "House Corner", + paramtype = "light", + sunlight_propagates = true, + tiles = { 'house_corner.png' }, + groups={oddly_breakable_by_hand=1}, +}) + +minetest.register_node("instabuild:flame", { + description = "Fake Fire", + drawtype = "plantlike", + tiles = {{ + name="fire_basic_flame_animated.png", + animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=1}, + }}, + inventory_image = "fire_basic_flame.png", + light_source = 14, + groups = {dig_immediate=3}, + drop = '', + walkable = false, + buildable_to = true, +}) + +--Item Crafting + +minetest.register_craft({ + output = 'instabuild:small_hut 1', + recipe = { + {'default:tree', 'default:mese_crystal_fragment','default:tree'}, + {'default:tree', 'doors:door_wood','default:tree'}, + {'default:tree', 'default:wood','default:tree'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:large_hut 1', + recipe = { + {'default:tree', 'default:mese_crystal_fragment','default:tree'}, + {'default:tree', 'instabuild:small_hut','default:tree'}, + {'default:tree', 'default:wood','default:tree'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:small_house 1', + recipe = { + {'default:brick', 'default:mese_crystal_fragment','default:brick'}, + {'default:brick', 'instabuild:large_hut','default:brick'}, + {'default:brick', 'default:brick','default:brick'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:large_house 1', + recipe = { + {'default:brick', 'default:mese_crystal','default:brick'}, + {'default:brick', 'instabuild:small_house','default:brick'}, + {'default:brick', 'default:brick','default:brick'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:small_warehouse 1', + recipe = { + {'default:wood', 'default:mese_crystal_fragment','default:wood'}, + {'default:wood', 'default:chest','default:wood'}, + {'default:wood', 'default:wood','default:wood'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:large_warehouse 1', + recipe = { + {'default:wood', 'default:mese_crystal','default:wood'}, + {'default:wood', 'instabuild:small_warehouse','default:wood'}, + {'default:wood', 'default:wood','default:wood'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:small_farm 1', + recipe = { + {'default:papyrus', 'default:mese_crystal_fragment','default:papyrus'}, + {'default:sapling', 'default:dirt','default:sapling'}, + {'default:papyrus', 'default:cactus','default:papyrus'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:large_farm 1', + recipe = { + {'default:papyrus', 'default:mese_crystal_fragment','default:papyrus'}, + {'default:sapling', 'instabuild:small_farm','default:sapling'}, + {'default:papyrus', 'default:cactus','default:papyrus'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:short_tower 1', + recipe = { + {'default:cobble', 'default:mese_crystal_fragment','default:cobble'}, + {'default:cobble', 'default:cobble','default:cobble'}, + {'default:cobble', 'doors:door_wood','default:cobble'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:tall_tower 1', + recipe = { + {'default:cobble', 'default:mese_crystal','default:cobble'}, + {'default:cobble', 'instabuild:short_tower','default:cobble'}, + {'default:cobble', 'default:cobble','default:cobble'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:factory 1', + recipe = { + {'default:glass', 'default:mese_crystal','default:glass'}, + {'default:steel_ingot', 'default:torch','default:steel_ingot'}, + {'default:brick', 'doors:door_wood','default:brick'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:modern_house 1', + recipe = { + {'default:stonebrick', 'default:stonebrick','default:stonebrick'}, + {'default:stonebrick', 'default:mese_crystal','default:stonebrick'}, + {'doors:door_wood', 'default:stonebrick','default:stonebrick'}, + + } +}) + +minetest.register_craft({ + output = 'instabuild:mansion 1', + recipe = { + {'stairs:stair_wood', 'default:wood','stairs:stair_wood'}, + {'default:sand', 'default:mese','default:sand'}, + {'default:wood', 'doors:door_wood','default:wood'}, + + } +}) \ No newline at end of file diff --git a/mods/instabuild/models/factory.we b/mods/instabuild/models/factory.we new file mode 100644 index 0000000..9a409f0 --- /dev/null +++ b/mods/instabuild/models/factory.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 141, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 1, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 2, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 173, ["z"] = 3, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 4, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 5, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 8, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 9, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 10, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 11, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 12, ["name"] = "stairs:stair_brick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 173, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 1, ["param1"] = 155, ["z"] = 12, ["name"] = "default:ladder" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 2, ["param1"] = 172, ["z"] = 12, ["name"] = "default:ladder" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 157, ["z"] = 2, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 173, ["z"] = 3, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 4, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 5, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 188, ["z"] = 6, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 188, ["z"] = 7, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 8, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 9, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 10, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 11, ["name"] = "instabuild:catwalk" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 3, ["param1"] = 189, ["z"] = 12, ["name"] = "default:ladder" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 157, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 175, ["z"] = 1, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 191, ["z"] = 2, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 207, ["z"] = 3, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 4, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 5, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 221, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 221, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 8, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 9, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 10, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 11, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 223, ["z"] = 12, ["name"] = "instabuild:glass_roof" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 205, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 171, ["z"] = 2, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 173, ["z"] = 1, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 188, ["z"] = 3, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 189, ["z"] = 1, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 221, ["z"] = 12, ["name"] = "stairs:stair_brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "instabuild:light" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 173, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 191, ["z"] = 1, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 207, ["z"] = 2, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 207, ["z"] = 3, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 4, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 5, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 221, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 221, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 8, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 9, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 10, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 11, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 223, ["z"] = 12, ["name"] = "instabuild:glass_roof" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 205, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 141, ["z"] = 13, ["name"] = "doors:door_wood_b_2" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 187, ["z"] = 2, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 157, ["z"] = 13, ["name"] = "doors:door_wood_t_2" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 187, ["z"] = 3, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 204, ["z"] = 3, ["name"] = "instabuild:glass_panel" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "instabuild:light" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 221, ["z"] = 3, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 205, ["z"] = 1, ["name"] = "stairs:slab_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 221, ["z"] = 2, ["name"] = "stairs:slab_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 173, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 1, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 205, ["z"] = 2, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 3, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 4, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 5, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 8, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 9, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 10, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 11, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 189, ["z"] = 12, ["name"] = "stairs:stair_brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 173, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 141, ["z"] = 13, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 187, ["z"] = 2, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 157, ["z"] = 13, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 187, ["z"] = 3, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 204, ["z"] = 3, ["name"] = "instabuild:glass_panel" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "instabuild:light" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 221, ["z"] = 3, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 205, ["z"] = 1, ["name"] = "stairs:slab_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 221, ["z"] = 2, ["name"] = "stairs:slab_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 173, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 1, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 205, ["z"] = 2, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 3, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 4, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 5, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 8, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 9, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 10, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 11, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 189, ["z"] = 12, ["name"] = "stairs:stair_brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 173, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 171, ["z"] = 2, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 173, ["z"] = 1, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 188, ["z"] = 3, ["name"] = "stairs:stair_brickupside_down" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 1, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 221, ["z"] = 12, ["name"] = "stairs:stair_brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "instabuild:light" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 173, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 191, ["z"] = 1, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 207, ["z"] = 2, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 207, ["z"] = 3, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 4, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 5, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 221, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 221, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 8, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 9, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 10, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 11, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 223, ["z"] = 12, ["name"] = "instabuild:glass_roof" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 205, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 1, ["param1"] = 155, ["z"] = 12, ["name"] = "default:ladder" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 2, ["param1"] = 172, ["z"] = 12, ["name"] = "default:ladder" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 157, ["z"] = 2, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 173, ["z"] = 3, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 4, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 5, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 188, ["z"] = 6, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 188, ["z"] = 7, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 8, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 9, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 10, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 189, ["z"] = 11, ["name"] = "instabuild:catwalk" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 3, ["param1"] = 189, ["z"] = 12, ["name"] = "default:ladder" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 157, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 175, ["z"] = 1, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 191, ["z"] = 2, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 207, ["z"] = 3, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 4, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 5, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 221, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 221, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 8, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 9, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 10, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 11, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 223, ["z"] = 12, ["name"] = "instabuild:glass_roof" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 205, ["z"] = 13, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 12, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 13, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 141, ["z"] = 0, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 157, ["z"] = 1, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 157, ["z"] = 2, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 173, ["z"] = 3, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 4, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 5, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 6, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 7, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 8, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 9, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 10, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 11, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 189, ["z"] = 12, ["name"] = "stairs:stair_brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 173, ["z"] = 13, ["name"] = "stairs:stair_brick" } } \ No newline at end of file diff --git a/mods/instabuild/models/large_farm.we b/mods/instabuild/models/large_farm.we new file mode 100644 index 0000000..b927c47 --- /dev/null +++ b/mods/instabuild/models/large_farm.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 29, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 45, ["z"] = 6, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 61, ["z"] = 7, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 77, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 45, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 61, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 29, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 45, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 29, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "farming:soil_wet" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 4, ["name"] = "default:water_source" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:dirt_with_grass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:dirt_with_grass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:desert_sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "farming:wheat_8" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:papyrus" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:cactus" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:junglewood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 6, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 7, ["name"] = "default:fence_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 8, ["name"] = "default:fence_wood" } } \ No newline at end of file diff --git a/mods/instabuild/models/large_house.we b/mods/instabuild/models/large_house.we new file mode 100644 index 0000000..fad4399 --- /dev/null +++ b/mods/instabuild/models/large_house.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 173, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 205, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 189, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 205, ["z"] = 6, ["name"] = "default:fence_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 14, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 14, ["z"] = 6, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 189, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 189, ["z"] = 6, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 172, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 172, ["z"] = 6, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 125, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 141, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 141, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 141, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 141, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 125, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 125, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 109, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 93, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 140, ["z"] = 4, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 156, ["z"] = 4, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 172, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 156, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 156, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 172, ["z"] = 9, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 61, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 93, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 109, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 125, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 109, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 109, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 125, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 109, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 93, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 93, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 77, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 61, ["z"] = 11, ["name"] = "stairs:slab_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["src_totaltime"] = "0", ["formspec"] = "size[8,9]image[2,2;1,1;default_furnace_fire_bg.png]list[current_name;fuel;2,3;1,1;]list[current_name;src;2,1;1,1;]list[current_name;dst;5,1;2,2;]list[current_player;main;0,5;8,4;]", ["fuel_time"] = "0", ["fuel_totaltime"] = "0", ["src_time"] = "0", ["infotext"] = "Furnace out of fuel" }, ["inventory"] = { ["fuel"] = { "" }, ["dst"] = { "", "", "", "" }, ["src"] = { "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:furnace" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 138, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 154, ["z"] = 5, ["name"] = "default:leaves" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 170, ["z"] = 10, ["name"] = "default:apple" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 77, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 45, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 77, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 45, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 77, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 93, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 93, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 77, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 93, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 77, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 61, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 61, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 45, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["src_totaltime"] = "0", ["formspec"] = "size[8,9]image[2,2;1,1;default_furnace_fire_bg.png]list[current_name;fuel;2,3;1,1;]list[current_name;src;2,1;1,1;]list[current_name;dst;5,1;2,2;]list[current_player;main;0,5;8,4;]", ["fuel_time"] = "0", ["fuel_totaltime"] = "0", ["src_time"] = "0", ["infotext"] = "Furnace out of fuel" }, ["inventory"] = { ["fuel"] = { "" }, ["dst"] = { "", "", "", "" }, ["src"] = { "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:furnace" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 187, ["z"] = 10, ["name"] = "default:apple" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 9, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 61, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 29, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 77, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 45, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 77, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 45, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 3, ["name"] = "stairs:slab_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 93, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 77, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 61, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 77, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 61, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 45, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 170, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 170, ["z"] = 10, ["name"] = "default:apple" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 61, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 29, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 93, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 61, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 93, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 61, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 61, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 93, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 77, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 61, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 77, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 61, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 170, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 77, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 45, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 109, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 7, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:chest" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 77, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 109, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 77, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 77, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 109, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 93, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 77, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 93, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 77, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 170, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "wool:red" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "wool:red" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "wool:white" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 187, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 9, ["name"] = "default:torch" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 170, ["z"] = 7, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 61, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 93, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 125, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 93, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 125, ["z"] = 3, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 141, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 125, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 109, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 125, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 109, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 136, ["z"] = 5, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "wool:red" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "wool:red" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "wool:white" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 170, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 137, ["z"] = 6, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 154, ["z"] = 6, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 170, ["z"] = 7, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:brick" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 77, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 45, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 109, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 77, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 109, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 125, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 141, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 125, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 109, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 6, ["param1"] = 125, ["z"] = 7, ["name"] = "instabuild:glass_panel" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 109, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 93, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 77, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 7, ["name"] = "stairs:slab_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:brick" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 61, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 29, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 93, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 109, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 125, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 141, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 125, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 109, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 125, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 109, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 93, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 77, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 61, ["z"] = 11, ["name"] = "stairs:slab_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 61, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 77, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 93, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 109, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 93, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 77, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 93, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 77, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 61, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 45, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 29, ["z"] = 11, ["name"] = "stairs:stair_wood" } } \ No newline at end of file diff --git a/mods/instabuild/models/large_hut.we b/mods/instabuild/models/large_hut.we new file mode 100644 index 0000000..b67b075 --- /dev/null +++ b/mods/instabuild/models/large_hut.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 173, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 189, ["z"] = 1, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 205, ["z"] = 2, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 189, ["z"] = 3, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 173, ["z"] = 4, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 157, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 141, ["z"] = 6, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 172, ["z"] = 3, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 188, ["z"] = 3, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 157, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 109, ["z"] = 7, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 2, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 154, ["z"] = 4, ["name"] = "default:apple" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 137, ["z"] = 5, ["name"] = "default:apple" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 141, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 93, ["z"] = 7, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 125, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 77, ["z"] = 7, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "wool:red" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "wool:red" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "wool:white" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 109, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 61, ["z"] = 7, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 45, ["z"] = 7, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 61, ["z"] = 1, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 77, ["z"] = 2, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 61, ["z"] = 3, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 45, ["z"] = 4, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 29, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_junglewood" } } \ No newline at end of file diff --git a/mods/instabuild/models/large_warehouse.we b/mods/instabuild/models/large_warehouse.we new file mode 100644 index 0000000..0c65976 --- /dev/null +++ b/mods/instabuild/models/large_warehouse.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:torch" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 125, ["z"] = 0, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 141, ["z"] = 0, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" } } \ No newline at end of file diff --git a/mods/instabuild/models/mansion.we b/mods/instabuild/models/mansion.we new file mode 100644 index 0000000..f582945 --- /dev/null +++ b/mods/instabuild/models/mansion.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 9, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 9, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 9, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 9, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 9, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 7, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 8, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 9, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 10, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 9, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 10, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 11, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 10, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 7, ["z"] = 9, ["name"] = "default:fence_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 10, ["name"] = "default:fence_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 9, ["z"] = 11, ["name"] = "default:fence_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 10, ["z"] = 12, ["name"] = "default:fence_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 12, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 12, ["z"] = 2, ["name"] = "default:leaves" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 2, ["name"] = "default:leaves" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 4, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 4, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 6, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 8, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 9, ["z"] = 13, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 13, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 7, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 6, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 9, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 5, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 5, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 6, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 8, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 9, ["z"] = 13, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 14, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:slab_cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 12, ["z"] = 2, ["name"] = "stairs:slab_cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_cobble" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 8, ["z"] = 5, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 7, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 6, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 8, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 5, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 4, ["z"] = 9, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 5, ["z"] = 10, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 6, ["z"] = 11, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 7, ["z"] = 12, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 8, ["z"] = 13, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 10, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 7, ["z"] = 9, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 10, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 9, ["z"] = 11, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 10, ["z"] = 12, ["name"] = "default:fence_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 15, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:slab_cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 0, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_cobble" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 8, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 13, ["z"] = 15, ["name"] = "doors:door_wood_b_2" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 6, ["z"] = 8, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 7, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 13, ["z"] = 15, ["name"] = "doors:door_wood_t_2" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 5, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 9, ["z"] = 5, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 9, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 9, ["z"] = 13, ["name"] = "default:fence_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 16, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:slab_cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 0, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_cobble" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 8, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 13, ["z"] = 15, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 6, ["z"] = 8, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 7, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 13, ["z"] = 15, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 5, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 9, ["z"] = 5, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 9, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 9, ["z"] = 13, ["name"] = "default:fence_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 17, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:slab_cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 12, ["z"] = 2, ["name"] = "stairs:slab_cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_cobble" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 8, ["z"] = 5, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 7, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 6, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 8, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 5, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 4, ["z"] = 9, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 5, ["z"] = 10, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 6, ["z"] = 11, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 7, ["z"] = 12, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 8, ["z"] = 13, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 10, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 7, ["z"] = 9, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 10, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 9, ["z"] = 11, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 10, ["z"] = 12, ["name"] = "default:fence_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 18, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 7, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 6, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 9, ["z"] = 5, ["name"] = "default:fence_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 21, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 5, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 6, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 15, ["name"] = "default:glass" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 8, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 9, ["z"] = 13, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 19, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 12, ["z"] = 2, ["name"] = "default:leaves" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 2, ["name"] = "default:leaves" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 36, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 4, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 6, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 8, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 9, ["z"] = 13, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 11, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 20, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 10, ["param1"] = 10, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 7, ["z"] = 9, ["name"] = "default:fence_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 8, ["z"] = 10, ["name"] = "default:fence_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 9, ["z"] = 11, ["name"] = "default:fence_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 10, ["z"] = 12, ["name"] = "default:fence_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 11, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 12, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 21, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 12, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 13, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 22, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 13, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 14, ["param1"] = 13, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 23, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 12, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 8, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 13, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 14, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 15, ["param1"] = 13, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 24, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 15, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 25, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_wood" }, { ["x"] = 26, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 29, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 29, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 13, ["z"] = 20, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 13, ["z"] = 16, ["name"] = "default:glass" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:slab_wood" }, { ["x"] = 27, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:slab_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 28, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 15, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 61, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 45, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 21, ["name"] = "default:glass" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 61, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 45, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 29, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 14, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 77, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 61, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 61, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 30, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 17, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 18, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 19, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 20, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 21, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 29, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 13, ["z"] = 19, ["name"] = "default:glass" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 20, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 29, ["z"] = 18, ["name"] = "default:glass" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 19, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 18, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 17, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 16, ["name"] = "default:sand" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 31, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 11, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 12, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 13, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 14, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 15, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 16, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "instabuild:flame" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "instabuild:flame" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 77, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 93, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 93, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 77, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 61, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 77, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 77, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 61, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 18, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 19, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 20, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 21, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 14, ["z"] = 22, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "instabuild:flame" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 9, ["name"] = "instabuild:flame" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 14, ["z"] = 21, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 7, ["param1"] = 14, ["z"] = 20, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 61, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 77, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 77, ["z"] = 13, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 61, ["z"] = 14, ["name"] = "default:glass" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 14, ["z"] = 19, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 2, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 4, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 5, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 11, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 12, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 13, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 14, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 15, ["name"] = "default:sand" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 16, ["name"] = "default:tree" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 9, ["param1"] = 14, ["z"] = 18, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 11, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 12, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 13, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 14, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 15, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 16, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 17, ["name"] = "default:wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:slab_stone" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_stone" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_stone" }, { ["x"] = 32, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_stone" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 30, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 11, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 12, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 30, ["z"] = 13, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 14, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 15, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 16, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 14, ["z"] = 17, ["name"] = "stairs:stair_wood" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 7, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 8, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 9, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 16, ["param1"] = 0, ["z"] = 10, ["name"] = "default:cobble" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 14, ["z"] = 7, ["name"] = "stairs:slab_stone" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:slab_stone" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 9, ["name"] = "stairs:slab_stone" }, { ["x"] = 33, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 17, ["param1"] = 13, ["z"] = 10, ["name"] = "stairs:slab_stone" } } \ No newline at end of file diff --git a/mods/instabuild/models/modern_house.we b/mods/instabuild/models/modern_house.we new file mode 100644 index 0000000..a0ba884 --- /dev/null +++ b/mods/instabuild/models/modern_house.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 95, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 93, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 111, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 109, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 127, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 189, ["z"] = 2, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 173, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 173, ["z"] = 5, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 189, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 125, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 111, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 109, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 127, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 109, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 125, ["z"] = 2, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 125, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 5, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 125, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 143, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 109, ["z"] = 2, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 109, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 5, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 141, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 109, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 127, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 93, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 1, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 2, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 61, ["z"] = 3, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 45, ["z"] = 4, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 61, ["z"] = 5, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 6, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 61, ["z"] = 7, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 154, ["z"] = 4, ["name"] = "stairs:stair_stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 188, ["z"] = 5, ["name"] = "stairs:stair_stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 187, ["z"] = 6, ["name"] = "stairs:stair_stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 156, ["z"] = 3, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 157, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 124, ["z"] = 4, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 123, ["z"] = 5, ["name"] = "stairs:stair_woodupside_down" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 61, ["z"] = 8, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 189, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 139, ["z"] = 3, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 125, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 154, ["z"] = 3, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 141, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 0, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 77, ["z"] = 8, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 173, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 138, ["z"] = 5, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 141, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 157, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 154, ["z"] = 5, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 157, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 93, ["z"] = 8, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["src_totaltime"] = "0", ["formspec"] = "size[8,9]image[2,2;1,1;default_furnace_fire_bg.png]list[current_name;fuel;2,3;1,1;]list[current_name;src;2,1;1,1;]list[current_name;dst;5,1;2,2;]list[current_player;main;0,5;8,4;]", ["fuel_time"] = "0", ["fuel_totaltime"] = "0", ["src_time"] = "0", ["infotext"] = "Furnace out of fuel" }, ["inventory"] = { ["fuel"] = { "" }, ["dst"] = { "", "", "", "" }, ["src"] = { "" } } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:furnace" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 154, ["z"] = 3, ["name"] = "stairs:slab_stonebrickupside_down" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 137, ["z"] = 4, ["name"] = "stairs:slab_stonebrickupside_down" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 189, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 187, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 171, ["z"] = 4, ["name"] = "stairs:slab_woodupside_down" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 187, ["z"] = 4, ["name"] = "stairs:slab_woodupside_down" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 0, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 8, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 0, ["param1"] = 172, ["z"] = 7, ["name"] = "stairs:stair_stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 171, ["z"] = 6, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 187, ["z"] = 6, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 173, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 188, ["z"] = 4, ["name"] = "stairs:slab_woodupside_down" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "wool:red" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "wool:white" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 173, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 189, ["z"] = 0, ["name"] = "default:glass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 204, ["z"] = 4, ["name"] = "stairs:slab_woodupside_down" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 189, ["z"] = 8, ["name"] = "default:glass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 8, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 125, ["z"] = 0, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 125, ["z"] = 8, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 95, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 189, ["z"] = 7, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 173, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 111, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 189, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 127, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 189, ["z"] = 2, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 173, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:torch" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 205, ["z"] = 8, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 143, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 191, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 159, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 173, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 2, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 173, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 5, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 157, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 173, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 175, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 175, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 189, ["z"] = 1, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 2, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 3, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 189, ["z"] = 4, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 5, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 173, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 189, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 175, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 159, ["z"] = 0, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 7, ["name"] = "default:stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 159, ["z"] = 8, ["name"] = "instabuild:corner" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 125, ["z"] = 1, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 2, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 3, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 125, ["z"] = 4, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 5, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 109, ["z"] = 6, ["name"] = "stairs:slab_stonebrick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 125, ["z"] = 7, ["name"] = "stairs:slab_stonebrick" } } \ No newline at end of file diff --git a/mods/instabuild/models/short_tower.we b/mods/instabuild/models/short_tower.we new file mode 100644 index 0000000..0f41651 --- /dev/null +++ b/mods/instabuild/models/short_tower.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 173, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 15, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 15, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 173, ["z"] = 3, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 189, ["z"] = 3, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 15, ["z"] = 0, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 15, ["z"] = 6, ["name"] = "default:torch" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 122, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 138, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 154, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 171, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 188, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 173, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 137, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 153, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 170, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 187, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 204, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 15, ["z"] = 0, ["name"] = "default:torch" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 9, ["param1"] = 15, ["z"] = 6, ["name"] = "default:torch" } } \ No newline at end of file diff --git a/mods/instabuild/models/small_farm.we b/mods/instabuild/models/small_farm.we new file mode 100644 index 0000000..d4415df --- /dev/null +++ b/mods/instabuild/models/small_farm.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:dirt_with_grass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:papyrus" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:dirt_with_grass" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:papyrus" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:dirt_with_grass" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:cotton_8" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:papyrus" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 240, ["y"] = 0, ["param1"] = 15, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:dirt_with_grass" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:wheat_8" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:papyrus" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:dirt_with_grass" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:wheat_8" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:papyrus" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "farming:soil_wet" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 13, ["z"] = 2, ["name"] = "default:water_source" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:dirt_with_grass" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "farming:wheat_8" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:papyrus" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 0, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 1, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 13, ["z"] = 4, ["name"] = "default:fence_wood" } } \ No newline at end of file diff --git a/mods/instabuild/models/small_house.we b/mods/instabuild/models/small_house.we new file mode 100644 index 0000000..0aa950d --- /dev/null +++ b/mods/instabuild/models/small_house.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 173, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 205, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 205, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 15, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 15, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 188, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 188, ["z"] = 4, ["name"] = "default:fence_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 173, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 173, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 157, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 141, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 125, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 109, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 93, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 156, ["z"] = 3, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 172, ["z"] = 3, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 172, ["z"] = 5, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 156, ["z"] = 6, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 172, ["z"] = 7, ["name"] = "default:glass" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 125, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 61, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 125, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 141, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 125, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 141, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 125, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 109, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 93, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 5, ["param1"] = 77, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 61, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["src_totaltime"] = "0", ["formspec"] = "size[8,9]image[2,2;1,1;default_furnace_fire_bg.png]list[current_name;fuel;2,3;1,1;]list[current_name;src;2,1;1,1;]list[current_name;dst;5,1;2,2;]list[current_player;main;0,5;8,4;]", ["fuel_time"] = "0", ["fuel_totaltime"] = "0", ["src_time"] = "0", ["infotext"] = "Furnace out of fuel" }, ["inventory"] = { ["fuel"] = { "" }, ["dst"] = { "", "", "", "" }, ["src"] = { "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:furnace" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 109, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 45, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 109, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 45, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 187, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 29, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 93, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 29, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "wool:red" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "wool:red" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "wool:white" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 170, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 77, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 29, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 77, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 29, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "wool:red" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "wool:red" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "wool:white" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 153, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:brick" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 61, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 45, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 61, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 45, ["z"] = 9, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 7, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 8, ["name"] = "default:brick" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 9, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 45, ["z"] = 0, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 7, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 8, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 9, ["name"] = "default:wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 61, ["z"] = 10, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 45, ["z"] = 1, ["name"] = "stairs:slab_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 29, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 29, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 29, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 5, ["param1"] = 45, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 61, ["z"] = 9, ["name"] = "stairs:slab_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 1, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 4, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 5, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 6, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 7, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 13, ["z"] = 8, ["name"] = "stairs:stair_wood" }, { ["x"] = 8, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 4, ["param1"] = 29, ["z"] = 9, ["name"] = "stairs:stair_wood" } } \ No newline at end of file diff --git a/mods/instabuild/models/small_hut.we b/mods/instabuild/models/small_hut.we new file mode 100644 index 0000000..3321109 --- /dev/null +++ b/mods/instabuild/models/small_hut.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 173, ["z"] = 2, ["name"] = "stairs:stair_wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 173, ["z"] = 1, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 189, ["z"] = 2, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 205, ["z"] = 3, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 189, ["z"] = 4, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 172, ["z"] = 2, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 188, ["z"] = 2, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 141, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 157, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "wool:red" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 125, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 141, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "wool:red" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 109, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 125, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "wool:white" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 204, ["z"] = 2, ["name"] = "default:apple" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 93, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 109, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 77, ["z"] = 0, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:junglewood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 93, ["z"] = 5, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 45, ["z"] = 1, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 61, ["z"] = 2, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 77, ["z"] = 3, ["name"] = "stairs:stair_junglewood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 3, ["param1"] = 61, ["z"] = 4, ["name"] = "stairs:stair_junglewood" } } \ No newline at end of file diff --git a/mods/instabuild/models/small_warehouse.we b/mods/instabuild/models/small_warehouse.we new file mode 100644 index 0000000..fc78c5e --- /dev/null +++ b/mods/instabuild/models/small_warehouse.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:torch" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 157, ["z"] = 0, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 173, ["z"] = 0, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 5, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:torch" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 4, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:torch" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:wood" } } \ No newline at end of file diff --git a/mods/instabuild/models/tall_tower.we b/mods/instabuild/models/tall_tower.we new file mode 100644 index 0000000..44b070d --- /dev/null +++ b/mods/instabuild/models/tall_tower.we @@ -0,0 +1 @@ +return { { ["x"] = 0, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 0, ["param1"] = 77, ["z"] = 3, ["name"] = "stairs:stair_wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 1, ["param1"] = 109, ["z"] = 3, ["name"] = "doors:door_wood_b_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 1, ["y"] = 2, ["param1"] = 125, ["z"] = 3, ["name"] = "doors:door_wood_t_1" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 1, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 187, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 204, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 187, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 170, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 154, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 171, ["z"] = 2, ["name"] = "default:fence_wood" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 2, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "wool:red" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 7, ["param1"] = 170, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "wool:red" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 8, ["param1"] = 187, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 9, ["param1"] = 170, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 10, ["param1"] = 154, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 11, ["param1"] = 171, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 12, ["param1"] = 188, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 3, ["y"] = 13, ["param1"] = 173, ["z"] = 2, ["name"] = "default:ladder" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 3, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 122, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 2, ["param1"] = 138, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 3, ["param1"] = 153, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 4, ["param1"] = 170, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 5, ["param1"] = 187, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 6, ["param1"] = 170, ["z"] = 3, ["name"] = "default:ladder" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "wool:red" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "wool:red" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 4, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 2, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 137, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:chest" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 153, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 170, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 187, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 204, ["z"] = 3, ["name"] = "default:fence_wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:torch" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:wood" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "wool:white" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "wool:white" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 5, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:wood" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { ["infotext"] = "Chest", ["formspec"] = "size[8,9]list[current_name;main;0,0;8,4;]list[current_player;main;0,5;8,4;]" }, ["inventory"] = { ["main"] = { "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "", "" } } }, ["param2"] = 1, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:chest" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 2, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:torch" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 6, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 0, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 1, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 2, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 3, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 4, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 5, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 6, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 7, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 8, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 9, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 10, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 11, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 12, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 0, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 1, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 2, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 3, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 4, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 5, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 13, ["param1"] = 0, ["z"] = 6, ["name"] = "default:tree" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 1, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 3, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 5, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 14, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 0, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 2, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 4, ["name"] = "default:cobble" }, { ["x"] = 7, ["meta"] = { ["fields"] = { }, ["inventory"] = { } }, ["param2"] = 0, ["y"] = 15, ["param1"] = 0, ["z"] = 6, ["name"] = "default:cobble" } } \ No newline at end of file diff --git a/mods/instabuild/textures/catwalk.png b/mods/instabuild/textures/catwalk.png new file mode 100644 index 0000000..9c6d269 Binary files /dev/null and b/mods/instabuild/textures/catwalk.png differ diff --git a/mods/instabuild/textures/factory.png b/mods/instabuild/textures/factory.png new file mode 100644 index 0000000..f4f4089 Binary files /dev/null and b/mods/instabuild/textures/factory.png differ diff --git a/mods/instabuild/textures/house_corner.png b/mods/instabuild/textures/house_corner.png new file mode 100644 index 0000000..eb2bcaf Binary files /dev/null and b/mods/instabuild/textures/house_corner.png differ diff --git a/mods/instabuild/textures/large_farm.png b/mods/instabuild/textures/large_farm.png new file mode 100644 index 0000000..b7979ea Binary files /dev/null and b/mods/instabuild/textures/large_farm.png differ diff --git a/mods/instabuild/textures/large_house.png b/mods/instabuild/textures/large_house.png new file mode 100644 index 0000000..5f9e339 Binary files /dev/null and b/mods/instabuild/textures/large_house.png differ diff --git a/mods/instabuild/textures/large_hut.png b/mods/instabuild/textures/large_hut.png new file mode 100644 index 0000000..6e3259b Binary files /dev/null and b/mods/instabuild/textures/large_hut.png differ diff --git a/mods/instabuild/textures/large_warehouse.png b/mods/instabuild/textures/large_warehouse.png new file mode 100644 index 0000000..2987eec Binary files /dev/null and b/mods/instabuild/textures/large_warehouse.png differ diff --git a/mods/instabuild/textures/mansion.png b/mods/instabuild/textures/mansion.png new file mode 100644 index 0000000..07f73f7 Binary files /dev/null and b/mods/instabuild/textures/mansion.png differ diff --git a/mods/instabuild/textures/modern_house.png b/mods/instabuild/textures/modern_house.png new file mode 100644 index 0000000..8bb16b2 Binary files /dev/null and b/mods/instabuild/textures/modern_house.png differ diff --git a/mods/instabuild/textures/short_tower.png b/mods/instabuild/textures/short_tower.png new file mode 100644 index 0000000..0924ab8 Binary files /dev/null and b/mods/instabuild/textures/short_tower.png differ diff --git a/mods/instabuild/textures/small_farm.png b/mods/instabuild/textures/small_farm.png new file mode 100644 index 0000000..2e1b7fe Binary files /dev/null and b/mods/instabuild/textures/small_farm.png differ diff --git a/mods/instabuild/textures/small_house.png b/mods/instabuild/textures/small_house.png new file mode 100644 index 0000000..d7993e3 Binary files /dev/null and b/mods/instabuild/textures/small_house.png differ diff --git a/mods/instabuild/textures/small_hut.png b/mods/instabuild/textures/small_hut.png new file mode 100644 index 0000000..a5cca65 Binary files /dev/null and b/mods/instabuild/textures/small_hut.png differ diff --git a/mods/instabuild/textures/small_warehouse.png b/mods/instabuild/textures/small_warehouse.png new file mode 100644 index 0000000..30f6f96 Binary files /dev/null and b/mods/instabuild/textures/small_warehouse.png differ diff --git a/mods/instabuild/textures/tall_tower.png b/mods/instabuild/textures/tall_tower.png new file mode 100644 index 0000000..a1e7d2c Binary files /dev/null and b/mods/instabuild/textures/tall_tower.png differ diff --git a/mods/intllib/README.txt b/mods/intllib/README.txt new file mode 100644 index 0000000..b2cd5b8 --- /dev/null +++ b/mods/intllib/README.txt @@ -0,0 +1,76 @@ + +Internationalization Lib for Minetest +By Diego Martínez (a.k.a. "Kaeza"). +Released as WTFPL. + +This mod is an attempt at providing internationalization support for mods +(something Minetest currently lacks). + +How do I use it? +In order to enable it for your mod, copy the following code snippet and paste +it at the beginning of your source file(s): + + -- Boilerplate to support localized strings if intllib mod is installed. + local S + if minetest.get_modpath("intllib") then + S = intllib.Getter() + else + S = function(s) return s end + end + +You will also need to optionally depend on intllib, to do so add "intllib?" to +a empty line in your depends.txt. Also note that if intllib is not installed, +the S() function is defined so it returns the string unchanged. This is done +so you don't have to sprinkle tons of 'if's (or similar constructs) to check +if the lib is actually installed. + +Next, for each "translatable" string in your sources, use the S() function +(defined in the snippet) to return the translated string. For example: + + minetest.register_node("mymod:mynode", { + description = S("My Fabulous Node"), + <...> + }) + +Then, you create a `locale' directory inside your mod directory, with files +named after the two-letter ISO Language Code of the languages you want to +support. Here's an example for a Spanish locale file (`es.txt'): + + # Lines beginning with a pound sign are comments and are effectively ignored + # by the reader. Note that comments only span until the end of the line; + # there's no support for multiline comments. + Hello, World! = Hola, Mundo! + String with\nnewlines = Cadena con\nsaltos de linea + String with an \= equals sign = Cadena con un signo de \= igualdad + +Since there's currently no portable way to detect the language, this library +tries several alternatives, and uses the first one found: + - `language' setting in `minetest.conf' + - `LANG' environment variable (this is always set on Unix-like OSes). + - Default of "en". +Note that in any case only up to the first two characters are used, so for +example, the settings "de_DE.UTF-8", "de_DE", and "de" are all equal. +Windows users have no `LANG' environment variable by default. To add it, do +the following: + - Click Start->Settings->Control Panel. + - Start the "System" applet. + - Click on the "Advanced" tab. + - Click on the "Environment variables" button + - Click "New". + - Type "LANG" (without quotes) as name and the language code as value. + - Click OK until all dialogs are closed. +Alternatively for all platforms, if you don't want to modify system settings, +you may add the following line to your `minetest.conf' file: + language = + +Also note that there are some problems with using accented, and in general +non-latin characters in strings. Until a fix is found, please limit yourself +to using only US-ASCII characters. + +Thanks for reading up to this point. +Should you have any comments/suggestions, please post them in the forum topic. + +Let there be translated texts! :P +-- +Yours Truly, +Kaeza diff --git a/mods/intllib/init.lua b/mods/intllib/init.lua new file mode 100644 index 0000000..62a8f51 --- /dev/null +++ b/mods/intllib/init.lua @@ -0,0 +1,58 @@ + +-- Support the old multi-load method +intllib = intllib or {} + +local MP = minetest.get_modpath("intllib") + +dofile(MP.."/lib.lua") + +local strings = {} + +local LANG = minetest.setting_get("language") +if not (LANG and (LANG ~= "")) then LANG = os.getenv("LANG") end +if not (LANG and (LANG ~= "")) then LANG = "en" end +LANG = LANG:sub(1, 2) + +-- Support the old multi-load method +intllib.getters = intllib.getters or {} + +intllib.strings = {} + +local function noop_getter(s) + return s +end + +function intllib.Getter(modname) + modname = modname or minetest.get_current_modname() + if not intllib.getters[modname] then + local modpath = minetest.get_modpath(modname) + if modpath then + local filename = modpath.."/locale/"..LANG..".txt" + local msgstr = intllib.load_strings(filename) + intllib.strings[modname] = msgstr or false + if msgstr then + intllib.getters[modname] = function (s) + if msgstr[s] and msgstr[s] ~= "" then + return msgstr[s] + end + return s + end + else + intllib.getters[modname] = noop_getter + end + end + end + return intllib.getters[modname] +end + +function intllib.get_strings(modname) + modname = modname or minetest.get_current_modname() + local msgstr = intllib.strings[modname] + if msgstr == nil then + local modpath = minetest.get_modpath(modname) + msgstr = intllib.load_strings(modpath.."/locale/"..LANG..".txt") + intllib.strings[modname] = msgstr + end + return msgstr or nil +end + diff --git a/mods/intllib/intllib.lua b/mods/intllib/intllib.lua new file mode 100644 index 0000000..adb0f88 --- /dev/null +++ b/mods/intllib/intllib.lua @@ -0,0 +1,3 @@ +-- Support for the old multi-load method +dofile(minetest.get_modpath("intllib").."/init.lua") + diff --git a/mods/intllib/lib.lua b/mods/intllib/lib.lua new file mode 100644 index 0000000..b3f183b --- /dev/null +++ b/mods/intllib/lib.lua @@ -0,0 +1,45 @@ + +intllib = intllib or {} + +local escapes = { + ["\\"] = "\\", + ["n"] = "\n", +} + +local function unescape(s) + return s:gsub("([\\]?)\\(.)", function(slash, what) + if slash and (slash ~= "") then + return "\\"..what + else + return escapes[what] or what + end + end) +end + +local function find_eq(s) + for slashes, pos in s:gmatch("([\\]*)=()") do + if (slashes:len() % 2) == 0 then + return pos - 1 + end + end +end + +function intllib.load_strings(filename) + local file, err = io.open(filename, "r") + if not file then + return nil + end + local strings = {} + for line in file:lines() do + line = line:trim() + if line ~= "" and line:sub(1, 1) ~= "#" then + local pos = find_eq(line) + if pos then + local msgid = unescape(line:sub(1, pos - 1):trim()) + strings[msgid] = unescape(line:sub(pos + 1):trim()) + end + end + end + file:close() + return strings +end diff --git a/mods/intllib/tools/findtext.lua b/mods/intllib/tools/findtext.lua new file mode 100644 index 0000000..63137e0 --- /dev/null +++ b/mods/intllib/tools/findtext.lua @@ -0,0 +1,142 @@ +#! /usr/bin/env lua + +local me = arg[0]:gsub(".*[/\\](.*)$", "%1") + +local function err(fmt, ...) + io.stderr:write(("%s: %s\n"):format(me, fmt:format(...))) + os.exit(1) +end + +local output +local inputs = { } +local lang +local author + +local i = 1 + +local function usage() + print([[ +Usage: ]]..me..[[ [OPTIONS] FILE... + +Extract translatable strings from the given FILE(s). + +Available options: + -h,--help Show this help screen and exit. + -o,--output X Set output file (default: stdout). + -a,--author X Set author. + -l,--lang X Set language name. +]]) + os.exit(0) +end + +while i <= #arg do + local a = arg[i] + if (a == "-h") or (a == "--help") then + usage() + elseif (a == "-o") or (a == "--output") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + output = arg[i] + elseif (a == "-a") or (a == "--author") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + author = arg[i] + elseif (a == "-l") or (a == "--lang") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + lang = arg[i] + elseif a:sub(1, 1) ~= "-" then + table.insert(inputs, a) + else + err("unrecognized option `%s'", a) + end + i = i + 1 +end + +if #inputs == 0 then + err("no input files") +end + +local outfile = io.stdout + +local function printf(fmt, ...) + outfile:write(fmt:format(...)) +end + +if output then + local e + outfile, e = io.open(output, "w") + if not outfile then + err("error opening file for writing: %s", e) + end +end + +if author or lang then + outfile:write("\n") +end + +if lang then + printf("# Language: %s\n", lang) +end + +if author then + printf("# Author: %s\n", author) +end + +if author or lang then + outfile:write("\n") +end + +local escapes = { + ["\n"] = "\\n", + ["="] = "\\=", + ["\\"] = "\\\\", +} + +local function escape(s) + return s:gsub("[\\\n=]", escapes) +end + +local messages = { } + +for _, file in ipairs(inputs) do + local infile, e = io.open(file, "r") + if infile then + for line in infile:lines() do + for s in line:gmatch('S%("([^"]*)"%)') do + table.insert(messages, s) + end + end + infile:close() + else + io.stderr:write(("%s: WARNING: error opening file: %s\n"):format(me, e)) + end +end + +table.sort(messages) + +local last_msg + +for i, msg in ipairs(messages) do + if msg ~= last_msg then + printf("%s =\n", escape(msg)) + end + last_msg = msg +end + +if output then + outfile:close() +end + +--[[ +TESTS: +S("foo") S("bar") +S("bar") +S("foo") +]] diff --git a/mods/intllib/tools/updatetext.lua b/mods/intllib/tools/updatetext.lua new file mode 100644 index 0000000..00f9bf6 --- /dev/null +++ b/mods/intllib/tools/updatetext.lua @@ -0,0 +1,141 @@ +#! /usr/bin/env lua + +local basedir = "" +if arg[0]:find("[/\\]") then + basedir = arg[0]:gsub("(.*[/\\]).*$", "%1"):gsub("\\", "/") +end +if basedir == "" then basedir = "./" end + +-- Required by load_strings() +function string.trim(s) + return s:gsub("^%s*(.-)%s*$", "%1") +end + +dofile(basedir.."/../lib.lua") + +local me = arg[0]:gsub(".*[/\\](.*)$", "%1") + +local function err(fmt, ...) + io.stderr:write(("%s: %s\n"):format(me, fmt:format(...))) + os.exit(1) +end + +local template +local catalogs = { } + +local function usage() + print([[ +Usage: ]]..me..[[ [OPTIONS] TEMPLATE CATALOG... + +Update a catalog with new strings from a template. + +Available options: + -h,--help Show this help screen and exit. + -o,--output X Set output file (default: stdout). + +Messages in the template that are not on the catalog are added to the +catalog at the end. + +This tool also checks messages that are in the catalog but not in the +template, and reports such lines. It's up to the user to remove such +lines, if so desired. +]]) + os.exit(0) +end + +local i = 1 + +while i <= #arg do + local a = arg[i] + if (a == "-h") or (a == "--help") then + usage() + elseif (a == "-o") or (a == "--output") then + i = i + 1 + if i > #arg then + err("missing required argument to `%s'", a) + end + elseif (a == "-c") or (a == "--comment") then + old_msg_mode = "c" + elseif (a == "-d") or (a == "--delete") then + old_msg_mode = "d" + elseif a:sub(1, 1) ~= "-" then + if not template then + template = a + else + table.insert(catalogs, a) + end + else + err("unrecognized option `%s'", a) + end + i = i + 1 +end + +if not template then + err("no template specified") +elseif #catalogs == 0 then + err("no catalogs specified") +end + +local f, e = io.open(template, "r") +if not f then + err("error opening template: %s", e) +end + +local function printf(fmt, ...) + outfile:write(fmt:format(...)) +end + +local escapes = { ["\n"] = "\\n", ["="] = "\\=", ["\\"] = "\\\\", } +local function escape(s) + return s:gsub("[\\\n=]", escapes) +end + +if output then + local e + outfile, e = io.open(output, "w") + if not outfile then + err("error opening file for writing: %s", e) + end +end + +local function printf(fmt, ...) + io.stdout:write(fmt:format(...)) +end + +local template_msgs = intllib.load_strings(template) + +for _, file in ipairs(catalogs) do + print("Processing: "..file) + local catalog_msgs = intllib.load_strings(file) + local dirty_lines = { } + if catalog_msgs then + -- Add new entries from template. + for k in pairs(template_msgs) do + if not catalog_msgs[k] then + print("NEW: "..k) + table.insert(dirty_lines, escape(k).." =") + end + end + -- Check for old messages. + for k, v in pairs(catalog_msgs) do + if not template_msgs[k] then + print("OLD: "..k) + end + end + if #dirty_lines > 0 then + local outf, e = io.open(file, "a+") + if outf then + outf:write("\n") + for _, line in ipairs(dirty_lines) do + outf:write(line) + outf:write("\n") + end + outf:close() + else + io.stderr:write(("%s: WARNING: cannot write: %s\n"):format(me, e)) + end + end + else + io.stderr:write(("%s: WARNING: could not load catalog\n"):format(me)) + end +end diff --git a/mods/inventory_sorter/README b/mods/inventory_sorter/README new file mode 100644 index 0000000..2fe55bb --- /dev/null +++ b/mods/inventory_sorter/README @@ -0,0 +1,9 @@ +To craft a sorting wand: + +S S X +S S X +X S X + +To sort your own inventory use /sort + +TODO: sort your hotbar separately diff --git a/mods/inventory_sorter/depends.txt b/mods/inventory_sorter/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/inventory_sorter/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/inventory_sorter/init.lua b/mods/inventory_sorter/init.lua new file mode 100644 index 0000000..b758529 --- /dev/null +++ b/mods/inventory_sorter/init.lua @@ -0,0 +1,245 @@ +-------------------------------------------------------- +-- supporting junk + + +function min(a,b) + if a < b then + return a + else + return b + end +end + +if not string.starts then + function string.starts(String,Start) + return string.sub(String,1,string.len(Start))==Start + end +end + +-------------------------------------------------------- + +function sortInventory(inv,sorter) + local tabl = inv:get_list("main") + if(tabl == nil) then + -- we don't sort furnaces! + return false + end + + table.sort(tabl,sorter) + -- note take_item will set the name to '' when empty + -- NEVER reduce the inventory array size for chests + inv:set_list('main',tabl) + return true +end + +sorters = { + wise = function(a,b) + -- XXX: this needs to have stricter ordering! + -- (why is air scoring higher than the end?) + if(a == nil) then + if b == nil then + return true + else + return false + end + elseif b == nil then + return true + end + + local aname = a:get_name() + local bname = b:get_name() + -- make sure empty slots go at the end + + if(string.len(aname) == 0) then + return false + end + if(string.len(bname) == 0) then + return true + end + + -- if the nodes are entirely different, sorted + if (aname ~= bname) then + return aname < bname + end + + -- same node types + -- may need to collapse the two together! + local bothmax = a:get_stack_max() + if bothmax == 1 then + -- it's unstackable + local awear = a:get_wear() + local bwear = b:get_wear() + return awear < bwear + end + local acount = a:get_count() + local bcount = b:get_count() + if(acount == bothmax) then + --print('same?',acount,bcount,bothmax) + return bcount ~= bothmax + elseif (bcount == bothmax) then + --print('bcount bothmax derp') + return false + end + local num = min(bcount,bothmax-acount) + a:add_item(b:take_item(num)) + -- nothing can have both count AND wear, right? + -- now a:count > b:count so a should go first + --print('numnum',num) + return true + end, + amount = function(a,b) + return a:get_count() > b:get_count() + end, + wear = function(a,b) + return a:get_wear() < b:get_wear() + end, + -- etc... +} + +function registerWand(method,sorter) + if method == nil then + name = "inventory_sorter:wand" + sorter = sorters.wise + assert(sorter ~= nil) + desc = 'Chest Sorter' + image = 'inventory_sorter_wand.png' + else + name = "inventory_sorter:wand_"..method + desc = "Chest Sorter ("..method..')' + image = 'inventory_sorter_wand_'..method..'.png' + end + + minetest.register_tool(name, { + description = desc, + inventory_image = image, + wield_image = image, + stack_max = 1, + tool_capabilities = { + full_punch_interval=0, + max_drop_level=0 + }, + on_use = function(self,user,punched) + local pos = minetest.get_pointed_thing_position(punched) + if pos==nil then + return + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if(inv == nil) then + minetest.chat_send_player(user:get_player_name(),"That can't be sorted.","Sorter -!-") + return + end + -- this isn't exported, but default locked chest does this + local owner = meta:get_string("owner") + if(owner ~= nil and string.len(owner) ~= 0 and user:get_player_name() ~= owner) then + minetest.chat_send_player(user:get_player_name(),"That's not yours!","Sorter -!-") + return + end + -- Sokomine's shared chest locks + if locks ~= nil then + if punched == nil or punched.name == nil then + punched = minetest.get_node(pos) + end + if punched and punched.name:starts('locks:') and not locks:lock_allow_use(pos,user) then + -- the error has already been reported (yay side effects) + return + end + end + + if(sortInventory(inv,sorter)) then + minetest.chat_send_player(user:get_player_name(),"Chest sorted.","Sorter -!-") + end + end + }) +end + +function debugSorter(a,b) + result = sorters.wise(a,b) + function derp(a) + return a:get_name()..":"..a:get_count()..":"..a:get_wear() + end + if a then + a = derp(a) + end + if b then + b = derp(b) + end + if result then + print('a goes first',a,b) + else + print('b goes first',a,b) + end + return result +end +function test() + function thingy(name,stack_max) + return { + get_name=function(self) return name end, + get_stack_max=function(self) return stack_max end, + get_count=function(self) return stack_max end, + get_wear=function(self) return 1/stack_max end, + take_item=function() end, + add_item=function() end, + derp=function() + return name..', '..tostring(stack_max) + end + } + end + tabl = {thingy('thing1',1),thingy('hting2',1),nil,thingy('thing1',2),thingy('thing1',4),thingy('thing1',10)} + table.sort(tabl,sorter) + for n,v in pairs(tabl) do + print(n,v:get_name(),v:get_count()) + end +end +-- test() +-- print('yay') +-- error('...') + +for name,sorter in pairs(sorters) do + registerWand(name,sorter) +end + +registerWand() + +minetest.register_craft({ + output = 'inventory_sorter:wand', + recipe = { + {'default:stick','default:stick',''}, + {'default:stick','default:stick',''}, + {'','default:stick',''} + } +}) + +-- is this one automatic...? + +minetest.register_craft({ + output = 'inventory_sorter:wand', + recipe = { + {'','default:stick','default:stick'}, + {'','default:stick','default:stick'}, + {'','','default:stick'} + } +}) + +minetest.register_chatcommand('sort',{ + params = '[optional algorithm: amount,wear]', + description = 'Sort your inventory! No takebacks.', + privs={interact=true}, + func = function(name,param) + local sorter = sorters.wise; + if string.len(param) > 0 then + sorter = sorters[param]; + if sorter == nil then + minetest.chat_send_player(name,"/sort [algorithm]","Sorter -!-") + minetest.chat_send_player(name,"Valid algorithms:","Sorter -!-") + for n,v in pairs(sorters) do + minetest.chat_send_player(name,' '..n,"Sorter -!-") + end + return; + end + end + if(sortInventory(minetest.get_player_by_name(name):get_inventory(),sorter)) then + minetest.chat_send_player(name,"Sorted.","Sorter -!-") + end + end +}) diff --git a/mods/inventory_sorter/textures/inventory_sorter_wand.png b/mods/inventory_sorter/textures/inventory_sorter_wand.png new file mode 100644 index 0000000..9ebb488 Binary files /dev/null and b/mods/inventory_sorter/textures/inventory_sorter_wand.png differ diff --git a/mods/inventory_sorter/textures/inventory_sorter_wand_amount.png b/mods/inventory_sorter/textures/inventory_sorter_wand_amount.png new file mode 100644 index 0000000..d17e14b --- /dev/null +++ b/mods/inventory_sorter/textures/inventory_sorter_wand_amount.png @@ -0,0 +1 @@ +inventory_sorter_wand.png \ No newline at end of file diff --git a/mods/inventory_sorter/textures/inventory_sorter_wand_wear.png b/mods/inventory_sorter/textures/inventory_sorter_wand_wear.png new file mode 100644 index 0000000..d17e14b --- /dev/null +++ b/mods/inventory_sorter/textures/inventory_sorter_wand_wear.png @@ -0,0 +1 @@ +inventory_sorter_wand.png \ No newline at end of file diff --git a/mods/inventory_sorter/textures/inventory_sorter_wand_wise.png b/mods/inventory_sorter/textures/inventory_sorter_wand_wise.png new file mode 100644 index 0000000..d17e14b --- /dev/null +++ b/mods/inventory_sorter/textures/inventory_sorter_wand_wise.png @@ -0,0 +1 @@ +inventory_sorter_wand.png \ No newline at end of file diff --git a/mods/item_drop/README.txt b/mods/item_drop/README.txt new file mode 100644 index 0000000..fe43054 --- /dev/null +++ b/mods/item_drop/README.txt @@ -0,0 +1,42 @@ +===ITEM_DROP MOD for MINETEST-C55=== +by PilzAdam + +Introduction: +This mod adds Minecraft like drop/pick up of items to Minetest. + +How to install: +Unzip the archive an place it in minetest-base-directory/mods/minetest/ +if you have a windows client or a linux run-in-place client. If you have +a linux system-wide instalation place it in ~/.minetest/mods/minetest/. +If you want to install this mod only in one world create the folder +worldmods/ in your worlddirectory. +For further information or help see: +http://wiki.minetest.com/wiki/Installing_Mods + +How to use the mod: +Just install it an everything works. + +For developers: +You dont have to use get_drops() anymore because of changes in the +builtin files of minetest. + +License: +Sourcecode: WTFPL (see below) +Sound: WTFPL (see below) + +See also: +http://minetest.net/ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/item_drop/init.lua b/mods/item_drop/init.lua new file mode 100644 index 0000000..27297d5 --- /dev/null +++ b/mods/item_drop/init.lua @@ -0,0 +1,111 @@ +minetest.register_globalstep(function(dtime) + for _,player in ipairs(minetest.get_connected_players()) do + if player:get_hp() > 0 or not minetest.setting_getbool("enable_damage") then + local pos = player:getpos() + local inv = player:get_inventory() + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 0.75)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", {pos = pos, gain = 0.3, max_hear_distance = 16}) + end + object:get_luaentity().itemstring = "" + object:remove() + end + end + end + + for _,object in ipairs(minetest.get_objects_inside_radius(pos, 9)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if object:get_luaentity().collect then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local pos2 = object:getpos() + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) + + minetest.after(1, function(args) + local lua = object:get_luaentity() + if object == nil or lua == nil or lua.itemstring == nil then + return + end + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", {pos = pos, gain = 0.3, max_hear_distance = 16}) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x = 0,y = 0,z = 0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true + }) + end + end, {player, object}) + + end + end + end + end + end + end +end) + +--[[ +function minetest.handle_node_drops(pos, drops, digger) + local inv + if minetest.setting_getbool("creative_mode") and digger and digger:is_player() then + inv = digger:get_inventory() + end + for _,item in ipairs(drops) do + local count, name + if type(item) == "string" then + count = 1 + name = item + else + count = item:get_count() + name = item:get_name() + end + if not inv or not inv:contains_item("main", ItemStack(name)) then + for i=1,count do + local obj = minetest.add_item(pos, name) + if obj ~= nil then + obj:get_luaentity().collect = true + local x = math.random(1, 5) + if math.random(1,2) == 1 then + x = -x + end + local z = math.random(1, 5) + if math.random(1,2) == 1 then + z = -z + end + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + + -- FIXME this doesnt work for deactiveted objects + if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then + minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj) + obj:remove() + end, obj) + end + end + end + end + end +end +--]] + +if minetest.setting_getbool("log_mods") then + minetest.log("action", "Carbone: [item_drop] loaded.") +end diff --git a/mods/item_drop/init.lua.txt b/mods/item_drop/init.lua.txt new file mode 100644 index 0000000..00b66fe --- /dev/null +++ b/mods/item_drop/init.lua.txt @@ -0,0 +1,116 @@ +minetest.register_globalstep(function(dtime) + for _,player in ipairs(minetest.get_connected_players()) do + if player:get_hp() > 0 or not minetest.setting_getbool("enable_damage") then + local pos = player:getpos() + pos.y = pos.y+0.5 + local inv = player:get_inventory() + + for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 1)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = 0.4, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + end + end + end + + for _,object in ipairs(minetest.env:get_objects_inside_radius(pos, 5)) do + if not object:is_player() and object:get_luaentity() and object:get_luaentity().name == "__builtin:item" then + if object:get_luaentity().collect then + if inv and inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + local pos1 = pos + pos1.y = pos1.y+0.2 + local pos2 = object:getpos() + local vec = {x=pos1.x-pos2.x, y=pos1.y-pos2.y, z=pos1.z-pos2.z} + vec.x = vec.x*3 + vec.y = vec.y*3 + vec.z = vec.z*3 + object:setvelocity(vec) + object:get_luaentity().physical_state = false + object:get_luaentity().object:set_properties({ + physical = false + }) + + minetest.after(1, function(args) + local lua = object:get_luaentity() + if object == nil or lua == nil or lua.itemstring == nil then + return + end + if inv:room_for_item("main", ItemStack(object:get_luaentity().itemstring)) then + inv:add_item("main", ItemStack(object:get_luaentity().itemstring)) + if object:get_luaentity().itemstring ~= "" then + minetest.sound_play("item_drop_pickup", { + to_player = player:get_player_name(), + gain = 0.4, + }) + end + object:get_luaentity().itemstring = "" + object:remove() + else + object:setvelocity({x=0,y=0,z=0}) + object:get_luaentity().physical_state = true + object:get_luaentity().object:set_properties({ + physical = true + }) + end + end, {player, object}) + + end + end + end + end + end + end +end) + +function minetest.handle_node_drops(pos, drops, digger) + local inv + if minetest.setting_getbool("creative_mode") and digger and digger:is_player() then + inv = digger:get_inventory() + end + for _,item in ipairs(drops) do + local count, name + if type(item) == "string" then + count = 1 + name = item + else + count = item:get_count() + name = item:get_name() + end + if not inv or not inv:contains_item("main", ItemStack(name)) then + for i=1,count do + local obj = minetest.env:add_item(pos, name) + if obj ~= nil then + obj:get_luaentity().collect = true + local x = math.random(1, 5) + if math.random(1,2) == 1 then + x = -x + end + local z = math.random(1, 5) + if math.random(1,2) == 1 then + z = -z + end + obj:setvelocity({x=1/x, y=obj:getvelocity().y, z=1/z}) + + -- FIXME this doesnt work for deactiveted objects + if minetest.setting_get("remove_items") and tonumber(minetest.setting_get("remove_items")) then + minetest.after(tonumber(minetest.setting_get("remove_items")), function(obj) + obj:remove() + end, obj) + end + end + end + end + end +end + +if minetest.setting_get("log_mods") then + minetest.log("action", "item_drop loaded") +end diff --git a/mods/item_drop/sounds/item_drop_pickup.1.ogg b/mods/item_drop/sounds/item_drop_pickup.1.ogg new file mode 100644 index 0000000..2ae432d Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.1.ogg differ diff --git a/mods/item_drop/sounds/item_drop_pickup.2.ogg b/mods/item_drop/sounds/item_drop_pickup.2.ogg new file mode 100644 index 0000000..f58bf08 Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.2.ogg differ diff --git a/mods/item_drop/sounds/item_drop_pickup.3.ogg b/mods/item_drop/sounds/item_drop_pickup.3.ogg new file mode 100644 index 0000000..cf57c94 Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.3.ogg differ diff --git a/mods/item_drop/sounds/item_drop_pickup.4.ogg b/mods/item_drop/sounds/item_drop_pickup.4.ogg new file mode 100644 index 0000000..bfe99d9 Binary files /dev/null and b/mods/item_drop/sounds/item_drop_pickup.4.ogg differ diff --git a/mods/itemframes/depends.txt b/mods/itemframes/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/itemframes/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/itemframes/init.lua b/mods/itemframes/init.lua new file mode 100644 index 0000000..ac81b71 --- /dev/null +++ b/mods/itemframes/init.lua @@ -0,0 +1,221 @@ +local tmp = {} +screwdriver = screwdriver or {} + +minetest.register_entity("itemframes:item",{ + hp_max = 1, + visual="wielditem", + visual_size={x=.33,y=.33}, + collisionbox = {0,0,0,0,0,0}, + physical=false, + textures={"air"}, + on_activate = function(self, staticdata) + if tmp.nodename ~= nil and tmp.texture ~= nil then + self.nodename = tmp.nodename + tmp.nodename = nil + self.texture = tmp.texture + tmp.texture = nil + else + if staticdata ~= nil and staticdata ~= "" then + local data = staticdata:split(';') + if data and data[1] and data[2] then + self.nodename = data[1] + self.texture = data[2] + end + end + end + if self.texture ~= nil then + self.object:set_properties({textures={self.texture}}) + end + if self.nodename == "itemframes:pedestal" then + self.object:set_properties({automatic_rotate=1}) + end + end, + get_staticdata = function(self) + if self.nodename ~= nil and self.texture ~= nil then + return self.nodename .. ';' .. self.texture + end + return "" + end, +}) + + +local facedir = {} +facedir[0] = {x=0,y=0,z=1} +facedir[1] = {x=1,y=0,z=0} +facedir[2] = {x=0,y=0,z=-1} +facedir[3] = {x=-1,y=0,z=0} + +local remove_item = function(pos, node) + local objs = nil + if node.name == "itemframes:frame" then + objs = minetest.get_objects_inside_radius(pos, .5) + elseif node.name == "itemframes:pedestal" then + objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y+1,z=pos.z}, .5) + end + if objs then + for _, obj in ipairs(objs) do + if obj and obj:get_luaentity() and obj:get_luaentity().name == "itemframes:item" then + obj:remove() + end + end + end +end + +local update_item = function(pos, node) + remove_item(pos, node) + local meta = minetest.get_meta(pos) + if meta:get_string("item") ~= "" then + if node.name == "itemframes:frame" then + local posad = facedir[node.param2] + if not posad then return end + pos.x = pos.x + posad.x*6.5/16 + pos.y = pos.y + posad.y*6.5/16 + pos.z = pos.z + posad.z*6.5/16 + elseif node.name == "itemframes:pedestal" then + pos.y = pos.y + 12/16+.33 + end + tmp.nodename = node.name + tmp.texture = ItemStack(meta:get_string("item")):get_name() + local e = minetest.add_entity(pos,"itemframes:item") + if node.name == "itemframes:frame" then + local yaw = math.pi*2 - node.param2 * math.pi/2 + e:setyaw(yaw) + end + end +end + +local drop_item = function(pos, node) + local meta = minetest.get_meta(pos) + if meta:get_string("item") ~= "" then + if node.name == "itemframes:frame" then + minetest.add_item(pos, meta:get_string("item")) + elseif node.name == "itemframes:pedestal" then + minetest.add_item({x=pos.x,y=pos.y+1,z=pos.z}, meta:get_string("item")) + end + meta:set_string("item","") + end + remove_item(pos, node) +end + +minetest.register_node("itemframes:frame",{ + description = "Item frame", + drawtype = "nodebox", + node_box = { type = "fixed", fixed = {-0.5, -0.5, 7/16, 0.5, 0.5, 0.5} }, + selection_box = { type = "fixed", fixed = {-0.5, -0.5, 7/16, 0.5, 0.5, 0.5} }, + tiles = {"itemframes_frame.png"}, + inventory_image = "itemframes_frame.png", + wield_image = "itemframes_frame.png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + groups = { choppy=2,dig_immediate=2 }, + legacy_wallmounted = true, + sounds = default.node_sound_defaults(), + on_rotate = screwdriver.disallow, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + meta:set_string("infotext","Item frame (owned by "..placer:get_player_name()..")") + end, + on_rightclick = function(pos, node, clicker, itemstack) + if not itemstack then return end + local meta = minetest.get_meta(pos) + if clicker:get_player_name() == meta:get_string("owner") then + drop_item(pos,node) + local s = itemstack:take_item() + meta:set_string("item",s:to_string()) + update_item(pos,node) + end + return itemstack + end, + on_punch = function(pos,node,puncher) + local meta = minetest.get_meta(pos) + if puncher:get_player_name() == meta:get_string("owner") then + drop_item(pos, node) + end + end, + can_dig = function(pos,player) + + local meta = minetest.get_meta(pos) + return player:get_player_name() == meta:get_string("owner") + end, + after_destruct = remove_item, +}) + + +minetest.register_node("itemframes:pedestal",{ + description = "Pedestal", + drawtype = "nodebox", + node_box = { type = "fixed", fixed = { + {-7/16, -8/16, -7/16, 7/16, -7/16, 7/16}, -- bottom plate + {-6/16, -7/16, -6/16, 6/16, -6/16, 6/16}, -- bottom plate (upper) + {-0.25, -6/16, -0.25, 0.25, 11/16, 0.25}, -- pillar + {-7/16, 11/16, -7/16, 7/16, 12/16, 7/16}, -- top plate + } }, + --selection_box = { type = "fixed", fixed = {-7/16, -0.5, -7/16, 7/16, 12/16, 7/16} }, + tiles = {"itemframes_pedestal.png"}, + paramtype = "light", + groups = { cracky=3 }, + sounds = default.node_sound_defaults(), + on_rotate = screwdriver.disallow, + after_place_node = function(pos, placer, itemstack) + local meta = minetest.get_meta(pos) + meta:set_string("owner",placer:get_player_name()) + meta:set_string("infotext","Pedestal (owned by "..placer:get_player_name()..")") + end, + on_rightclick = function(pos, node, clicker, itemstack) + if not itemstack then return end + local meta = minetest.get_meta(pos) + if clicker:get_player_name() == meta:get_string("owner") then + drop_item(pos,node) + local s = itemstack:take_item() + meta:set_string("item",s:to_string()) + update_item(pos,node) + end + return itemstack + end, + on_punch = function(pos,node,puncher) + local meta = minetest.get_meta(pos) + if puncher:get_player_name() == meta:get_string("owner") then + drop_item(pos,node) + end + end, + can_dig = function(pos,player) + + local meta = minetest.get_meta(pos) + return player:get_player_name() == meta:get_string("owner") + end, + after_destruct = remove_item, +}) + +-- automatically restore entities lost from frames/pedestals +-- due to /clearobjects or similar + +minetest.register_abm({ + nodenames = { "itemframes:frame", "itemframes:pedestal" }, + interval = 15, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + if #minetest.get_objects_inside_radius(pos, 0.5) > 0 then return end + update_item(pos, node) + end +}) + +-- crafts + +minetest.register_craft({ + output = 'itemframes:frame', + recipe = { + {'default:stick', 'default:stick', 'default:stick'}, + {'default:stick', 'default:paper', 'default:stick'}, + {'default:stick', 'default:stick', 'default:stick'}, + } +}) +minetest.register_craft({ + output = 'itemframes:pedestal', + recipe = { + {'default:stone', 'default:stone', 'default:stone'}, + {'', 'default:stone', ''}, + {'default:stone', 'default:stone', 'default:stone'}, + } +}) diff --git a/mods/itemframes/textures/itemframes_frame.png b/mods/itemframes/textures/itemframes_frame.png new file mode 100644 index 0000000..5373c45 Binary files /dev/null and b/mods/itemframes/textures/itemframes_frame.png differ diff --git a/mods/itemframes/textures/itemframes_pedestal.png b/mods/itemframes/textures/itemframes_pedestal.png new file mode 100644 index 0000000..a269b0b Binary files /dev/null and b/mods/itemframes/textures/itemframes_pedestal.png differ diff --git a/mods/kaeza_misc/README.txt b/mods/kaeza_misc/README.txt new file mode 100644 index 0000000..ce632d7 --- /dev/null +++ b/mods/kaeza_misc/README.txt @@ -0,0 +1,34 @@ +Well, I've developed a few mods for testing new features in the engine (back +when they were new anyway). + +Since these mods have nothing in common, and are rather smallish, I don't +want to clutter up the forums with lots of topics. I'll be posting more here +as I push them to my repo (and I find where I left them :P). + +Dependencies +------------ +default + +License +------- +WTFPL for code and media files. + +Download +-------- +ZIP Archive: https://github.com/kaeza/minetest-kaeza_misc/archive/master.zip +Browse Code: https://github.com/kaeza/minetest-kaeza_misc + +Mods +---- + +Currently, these are the things added: + +bookex + This overrides the default book. When used, you can write something in it. + Useful for taking notes and such. + +testclock + This was to test the new Lua HUD system. It adds a clock that shows the + time of the day (in-game). + +To uninstall a mod, just remove it from the pack :) diff --git a/mods/kaeza_misc/bookex/depends.txt b/mods/kaeza_misc/bookex/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/kaeza_misc/bookex/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/kaeza_misc/bookex/init.lua b/mods/kaeza_misc/bookex/init.lua new file mode 100644 index 0000000..316ee5d --- /dev/null +++ b/mods/kaeza_misc/bookex/init.lua @@ -0,0 +1,48 @@ + +-- Boilerplate to support localized strings if intllib mod is installed. +local S; +if (minetest.get_modpath("intllib")) then + dofile(minetest.get_modpath("intllib").."/intllib.lua"); + S = intllib.Getter(minetest.get_current_modname()); +else + S = function ( s ) return s end; +end + +local function deepcopy ( t ) + local nt = { }; + for k, v in pairs(t) do + if (type(v) == "table") then + nt[k] = deepcopy(v); + else + nt[k] = v; + end + end + return nt; +end + +local newbook = deepcopy(minetest.registered_items["default:book"]); + +newbook.on_use = function ( itemstack, user, pointed_thing ) + + local text = itemstack:get_metadata(); + + local formspec = "size[8,8]".. + "textarea[1,1;6,6;text;Foo;"..minetest.formspec_escape(text).."]".. + "button_exit[1,7;2,1;ok;OK]"; + + minetest.show_formspec(user:get_player_name(), "default:book", formspec); + +end + +minetest.register_craftitem(":default:book", newbook); + +minetest.register_on_player_receive_fields(function ( player, formname, fields ) + if ((formname == "default:book") and fields and fields.text) then + local stack = player:get_wielded_item(); + if (stack:get_name() and (stack:get_name() == "default:book")) then + local t = stack:to_table(); + t.metadata = fields.text; + player:set_wielded_item(ItemStack(t)); + end + end +end); diff --git a/mods/kaeza_misc/crosshair_ex/init.lua b/mods/kaeza_misc/crosshair_ex/init.lua new file mode 100644 index 0000000..8e7a4ae --- /dev/null +++ b/mods/kaeza_misc/crosshair_ex/init.lua @@ -0,0 +1,13 @@ + +minetest.register_on_joinplayer(function ( player ) + + minetest.after(0.5, function ( ) + player:hud_add({ + hud_elem_type = "image"; + text = "crosshair_ex_ch.png"; + position = {x=0.5, y=0.5}; + scale = {x=1, y=1}; + }); + end); + +end); diff --git a/mods/kaeza_misc/crosshair_ex/textures/crosshair_ex_ch.png b/mods/kaeza_misc/crosshair_ex/textures/crosshair_ex_ch.png new file mode 100644 index 0000000..454d84a Binary files /dev/null and b/mods/kaeza_misc/crosshair_ex/textures/crosshair_ex_ch.png differ diff --git a/mods/kaeza_misc/kutils/init.lua b/mods/kaeza_misc/kutils/init.lua new file mode 100644 index 0000000..ba1400f --- /dev/null +++ b/mods/kaeza_misc/kutils/init.lua @@ -0,0 +1,144 @@ + +if (not kutils) then kutils = { }; end + +-- Nodes to always ignore in checks. -- +kutils.ignore_nodes = { + ["air"] = true; + ["default:water_source"] = true; + ["default:water_flowing"] = true; +}; + +-- Entities to always ignore in checks. -- +kutils.ignore_ents = { + ["__builtin:item"] = true; +}; + +--[[ + | Cast a ray from a point in a direction. + | + | The `params' argument must be a table with the following fields: + | + | pos (required) + | Point from whihch to cast the ray. + | + | delta (required) + | This controls the direction and step size ofthe check for collision. + | It must be a table { x=deltax, y=deltay, z=deltaz } + | + | range (required) + | Number of steps to check. The distance checked is delta*range. + | + | radius (optional) + | Radius for the entity checker. Smaller radius may miss some entities + | on the way; bigger radius may check for objects not really in the + | ray's path. Default is 1. + | + | user (optional) + | This is the entity that is casting the ray. If not nil, this entity + | will be ignored in the check. + | + | ignore_ents (optional) + | Table containing entity names to ignore in the check. In addition + | to the entities listed here, it ignores "__builtin:item". The format + | must be { ["modname:entname"] = true, ... } + | + | solid_only (optional) + | If false, the ray takes not walkable nodes (e.g. lava) as solid. Air + | and water are always taken as not solid. + | + | return_all (optional) + | If true, the function returns all nodes found by the ray. + | + | Return value: + | If a node is hit by the ray, returns a table with `pos' and `node' + | fields. `pos' is the position where collision occurred, and `node' is + | the node info as returned by `minetest.env:get_node()'. + | If an entity is hit by the ray, returns a table with `pos' and `entity' + | fields. `pos' is as above, `entity' is an ObjectRef. + | If nothing is found, returns nil. Note that unloaded blocks are actual + | nodes! (check for node.name == "ignore" if you want to distinguish). + | Also note that if `params.return_all' is true, it will return an array + | where the items are in this format. + ]] +function kutils.find_pointed_thing ( params ) + local p = {x=params.pos.x, y=params.pos.y, z=params.pos.z}; + local dx, dy, dz = params.delta.x, params.delta.y, params.delta.z; + local radius = params.radius or 0.75; + local extra_ignore_ents = params.ignore_ents or { }; + local range = params.range; + local solid_only = params.solid_only; + local list = { }; + local listn = 1; + for n = 0, range do + local node = minetest.env:get_node(p); + if (not kutils.ignore_nodes[node.name]) then + if (solid_only) then + local walkable = minetest.registered_nodes[node.name].walkable; + if ((walkable == nil) or (walkable == true)) then + if (not return_all) then + return {pos = p; node=node}; + end + list[listn] = {pos = p; node=node}; + listn = listn + 1; + end + else + if (not return_all) then + return {pos = p; node=node}; + end + list[listn] = {pos = p; node=node}; + listn = listn + 1; + end + end + local ents = minetest.env:get_objects_inside_radius(p, radius); + if (#ents > 0) then + for _,e in ipairs(ents) do + if ((e ~= params.user) and (not kutils.ignore_ents[e:get_entity_name()]) + and (not extra_ignore_ents[e:get_entity_name()])) then + if (not return_all) then + return {pos=p; entity=e}; + end + list[listn] = {pos = p; entity=e}; + listn = listn + 1; + end + end + end + p.x = p.x + dx; + p.y = p.y + dy; + p.z = p.z + dz; + end + if (listn > 1) then + return list; + end + return nil; +end + +minetest.register_craftitem("kutils:test", { + description = "Test Object"; + inventory_image = "default_wood.png"; + on_use = function ( itemstack, user, pointed_thing ) + local start = os.clock(); + local p = user:getpos(); + p.y = p.y + 1.625; -- Found in player.cpp + local what = kutils.find_pointed_thing({ + pos = p; + delta = user:get_look_dir(); + range = 1000; + user = user; + }); + local done = os.clock(); + if (what) then + if (what.node) then + minetest.chat_send_player(user:get_player_name(), + ("Pointing at node `%s' at %s"):format(what.node.name, dump(what.pos)) + ); + elseif (what.entity) then + minetest.chat_send_player(user:get_player_name(), + ("Pointing at entity `%s' at %s"):format(what.entity:get_entity_name(), dump(what..pos)) + ); + end + else + minetest.chat_send_player(user:get_player_name(), "Pointing at nothing"); + end + minetest.chat_send_player(user:get_player_name(), "Time taken: "..(done - start)); + end; +}); diff --git a/mods/kaeza_misc/modpack.txt b/mods/kaeza_misc/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/kaeza_misc/notice/init.lua b/mods/kaeza_misc/notice/init.lua new file mode 100644 index 0000000..9f703c8 --- /dev/null +++ b/mods/kaeza_misc/notice/init.lua @@ -0,0 +1,53 @@ + +notice = { } + +function notice.send(target, text) + local player = minetest.get_player_by_name(target) + if not player then + return false, ("There's no player named '%s'."):format(target) + end + local fs = { } + --[[ + for _, line in ipairs(text:split("|")) do + table.insert(fs, ("label[1,%f;%s]"):format(y+1, minetest.formspec_escape(line))) + y = y + 0.5 + end + --]] + local lines = { } + for i, line in ipairs(text:split("|")) do + local lt = { } + for i = 1, #line, 40 do + table.insert(lt, line:sub(i, i+39)) + end + lines[i] = table.concat(lt, "\n") + end + text = table.concat(lines, "\n") + text = minetest.formspec_escape(text) + table.insert(fs, "size[8,4]") + table.insert(fs, "label[1,.2;"..text.."]") + table.insert(fs, "button_exit[3,3.2;2,0.5;ok;OK]") + fs = table.concat(fs) + minetest.after(0.5, function() + minetest.show_formspec(target, "notice:notice", fs) + end) + return true +end + +minetest.register_privilege("notice", "Send notices to players.") + +minetest.register_chatcommand("notice", { + params = " ", + privs = { notice=true, }, + description = "Show a notice to a player.", + func = function(name, params) + local target, text = params:match("(%S+)%s+(.+)") + if not (target and text) then + return false, "Usage: /notice " + end + local ok, err = notice.send(target, text) + if not ok then + return false, err + end + return true, "Notice sent!" + end, +}) \ No newline at end of file diff --git a/mods/mesecons/LICENSE.txt b/mods/mesecons/LICENSE.txt new file mode 100644 index 0000000..0d2fd18 --- /dev/null +++ b/mods/mesecons/LICENSE.txt @@ -0,0 +1,532 @@ +The LGPLv3 applies to all code in this project. +The CC-BY-SA-3.0 license applies to textures and any other content in this project which is not source code. + +================================================================= + +GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. + +================================================================= + +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at http://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at http://creativecommons.org/. diff --git a/mods/mesecons/README.md b/mods/mesecons/README.md new file mode 100644 index 0000000..5de72c7 --- /dev/null +++ b/mods/mesecons/README.md @@ -0,0 +1,78 @@ + ######################################################################## + ## __ __ _____ _____ _____ _____ _____ _ _ _____ ## + ## | \ / | | ___| | ___| | ___| | ___| | _ | | \ | | | ___| ## + ## | \/ | | |___ | |___ | |___ | | | | | | | \| | | |___ ## + ## | |\__/| | | ___| |___ | | ___| | | | | | | | | |___ | ## + ## | | | | | |___ ___| | | |___ | |___ | |_| | | |\ | ___| | ## + ## |_| |_| |_____| |_____| |_____| |_____| |_____| |_| \_| |_____| ## + ## ## + ######################################################################## + +MESECONS by Jeija and contributors + +Mezzee-what? +------------ +[Mesecons](http://mesecons.net/)! They're yellow, they're conductive, and they'll add a whole new dimension to Minetest's gameplay. + +Mesecons is a mod for [Minetest](http://minetest.net/) that implements a ton of items related to digital circuitry, such as wires, buttons, lights, and even programmable controllers. Among other things, there are also pistons, solar panels, pressure plates, and note blocks. + +Mesecons has a similar goal to Redstone in Minecraft, but works in its own way, with different rules and mechanics. + +OK, I want in. +-------------- +Go get it! + +[DOWNLOADS PAGE](http://mesecons.net/downloads.php) + +Now go ahead and install it like any other Minetest mod. Don't know how? Check out [the wonderful page about it](http://wiki.minetest.com/wiki/Mods) over at the Minetest Wiki. For your convenience, here's a quick summary: + +1. If Mesecons is still in a ZIP file, extract the folder inside to somewhere on the computer. +2. Make sure that when you open the folder, you can directly find `README.md` in the listing. If you just see another folder, move that folder up one level and delete the old one. +3. Open up the Minetest mods folder - usually `/mods/`. If you see the `minetest` or folder inside of that, that is your mod folder instead. +4. Copy the Mesecons folder into the mods folder. + +Don't like some parts of Mesecons? Open up the Mesecons folder and delete the subfolder containing the mod you don't want. If you didn't want movestones, for example, all you have to do is delete the `mesecons_movestones` folder and they will no longer be available. + +There are no dependencies - it will work right after installing! + +How do I use this thing? +------------------------ +How about a [quick overview video](https://www.youtube.com/watch?v=6kmeQj6iW5k)? + +Or maybe a [comprehensive reference](http://mesecons.net/items.php) is your style? + +An overview for the very newest of new beginners? How does [this one](http://uberi.mesecons.net/projects/MeseconsBasics/index.html) look? + +Want to get more into building? Why not check out the [Mesecons Laboratory](http://uberi.mesecons.net/), a website dedicated to advanced Mesecons builders? + +Want to contribute to Mesecons itself? Check out the [source code](https://github.com/Jeija/minetest-mod-mesecons)! + +Who wrote it anyways? +--------------------- +These awesome people made Mesecons possible! + +| Contributor | Contribution | +| --------------- | -------------------------------- | +| Jat15 | Various tweaks. | +| Jeija | **Main developer! Everything.** | +| Jordach | Noteblock sounds. | +| khonkhortistan | Code, recipes, textures. | +| Kotolegokot | Nodeboxes for items. | +| minerd247 | Textures. | +| Nore/Novatux | Code. | +| RealBadAngel | Fixes, improvements. | +| sfan5 | Code, recipes, textures. | +| suzenako | Piston sounds. | +| Uberi/Temperest | Code, textures, documentation. | +| VanessaE | Code, recipes, textures, design. | +| Whiskers75 | Logic gates implementation. | + +There are also a whole bunch of other people helping with everything from code to testing and feedback. Mesecons would also not be possible without their help! + +Alright, how can I use it? +-------------------------- +All textures in this project are licensed under the CC-BY-SA 3.0 (Creative Commons Attribution-ShareAlike 3.0 Generic). That means you can distribute and remix them as much as you want to, under the condition that you give credit to the authors and the project, and that if you remix and release them, they must be under the same or similar license to this one. + +All code in this project is licensed under the LGPL version 3 or later. That means you have unlimited freedom to distribute and modify the work however you see fit, provided that if you decide to distribute it or any modified versions of it, you must also use the same license. The LGPL also grants the additional freedom to write extensions for the software and distribute them without the extensions being subject to the terms of the LGPL, although the software itself retains its license. + +No warranty is provided, express or implied, for any part of the project. diff --git a/mods/mesecons/mesecons/VERSION b/mods/mesecons/mesecons/VERSION new file mode 100644 index 0000000..75b9e03 --- /dev/null +++ b/mods/mesecons/mesecons/VERSION @@ -0,0 +1 @@ +0.41 DEV diff --git a/mods/mesecons/mesecons/actionqueue.lua b/mods/mesecons/mesecons/actionqueue.lua new file mode 100644 index 0000000..fa4079f --- /dev/null +++ b/mods/mesecons/mesecons/actionqueue.lua @@ -0,0 +1,118 @@ +mesecon.queue.actions={} -- contains all ActionQueue actions + +function mesecon.queue:add_function(name, func) + mesecon.queue.funcs[name] = func +end + +-- If add_action with twice the same overwritecheck and same position are called, the first one is overwritten +-- use overwritecheck nil to never overwrite, but just add the event to the queue +-- priority specifies the order actions are executed within one globalstep, highest first +-- should be between 0 and 1 +function mesecon.queue:add_action(pos, func, params, time, overwritecheck, priority) + -- Create Action Table: + time = time or 0 -- time <= 0 --> execute, time > 0 --> wait time until execution + priority = priority or 1 + local action = { pos=mesecon.tablecopy(pos), + func=func, + params=mesecon.tablecopy(params or {}), + time=time, + owcheck=(overwritecheck and mesecon.tablecopy(overwritecheck)) or nil, + priority=priority} + + local toremove = nil + -- Otherwise, add the action to the queue + if overwritecheck then -- check if old action has to be overwritten / removed: + for i, ac in ipairs(mesecon.queue.actions) do + if(mesecon.cmpPos(pos, ac.pos) + and mesecon.cmpAny(overwritecheck, ac.owcheck)) then + toremove = i + break + end + end + end + + if (toremove ~= nil) then + table.remove(mesecon.queue.actions, toremove) + end + + table.insert(mesecon.queue.actions, action) +end + +-- execute the stored functions on a globalstep +-- if however, the pos of a function is not loaded (get_node_or_nil == nil), do NOT execute the function +-- this makes sure that resuming mesecons circuits when restarting minetest works fine +-- However, even that does not work in some cases, that's why we delay the time the globalsteps +-- start to be execute by 5 seconds +local get_highest_priority = function (actions) + local highestp = -1 + local highesti + for i, ac in ipairs(actions) do + if ac.priority > highestp then + highestp = ac.priority + highesti = i + end + end + + return highesti +end + +local m_time = 0 +local resumetime = mesecon.setting("resumetime", 4) +minetest.register_globalstep(function (dtime) + m_time = m_time + dtime + -- don't even try if server has not been running for XY seconds; resumetime = time to wait + -- after starting the server before processing the ActionQueue, don't set this too low + if (m_time < resumetime) then return end + local actions = mesecon.tablecopy(mesecon.queue.actions) + local actions_now={} + + mesecon.queue.actions = {} + + -- sort actions into two categories: + -- those toexecute now (actions_now) and those to execute later (mesecon.queue.actions) + for i, ac in ipairs(actions) do + if ac.time > 0 then + ac.time = ac.time - dtime -- executed later + table.insert(mesecon.queue.actions, ac) + else + table.insert(actions_now, ac) + end + end + + while(#actions_now > 0) do -- execute highest priorities first, until all are executed + local hp = get_highest_priority(actions_now) + mesecon.queue:execute(actions_now[hp]) + table.remove(actions_now, hp) + end +end) + +function mesecon.queue:execute(action) + mesecon.queue.funcs[action.func](action.pos, unpack(action.params)) +end + + +-- Store and read the ActionQueue to / from a file +-- so that upcoming actions are remembered when the game +-- is restarted + +local wpath = minetest.get_worldpath() +local function file2table(filename) + local f = io.open(filename, "r") + if f==nil then return {} end + local t = f:read("*all") + f:close() + if t=="" or t==nil then return {} end + return minetest.deserialize(t) +end + +local function table2file(filename, table) + local f = io.open(filename, "w") + f:write(minetest.serialize(table)) + f:close() +end + +mesecon.queue.actions = file2table(wpath.."/mesecon_actionqueue") + +minetest.register_on_shutdown(function() + mesecon.queue.actions = table2file(wpath.."/mesecon_actionqueue", mesecon.queue.actions) +end) diff --git a/mods/mesecons/mesecons/depends.txt b/mods/mesecons/mesecons/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/mesecons/mesecons/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/mesecons/mesecons/init.lua b/mods/mesecons/mesecons/init.lua new file mode 100644 index 0000000..096e509 --- /dev/null +++ b/mods/mesecons/mesecons/init.lua @@ -0,0 +1,139 @@ +-- |\ /| ____ ____ ____ _____ ____ _____ +-- | \ / | | | | | | | |\ | | +-- | \/ | |___ ____ |___ | | | | \ | |____ +-- | | | | | | | | | \ | | +-- | | |___ ____| |___ |____ |____| | \| ____| +-- by Jeija, Uberi (Temperest), sfan5, VanessaE +-- +-- +-- +-- This mod adds mesecons[=minecraft redstone] and different receptors/effectors to minetest. +-- See the documentation on the forum for additional information, especially about crafting +-- +-- +-- For developer documentation see the Developers' section on mesecons.TK +-- +-- +-- +--Quick draft for the mesecons array in the node's definition +--mesecons = +--{ +-- receptor = +-- { +-- state = mesecon.state.on/off +-- rules = rules/get_rules +-- }, +-- effector = +-- { +-- action_on = function +-- action_off = function +-- action_change = function +-- rules = rules/get_rules +-- }, +-- conductor = +-- { +-- state = mesecon.state.on/off +-- offstate = opposite state (for state = on only) +-- onstate = opposite state (for state = off only) +-- rules = rules/get_rules +-- } +--} + +-- PUBLIC VARIABLES +mesecon={} -- contains all functions and all global variables +mesecon.queue={} -- contains the ActionQueue +mesecon.queue.funcs={} -- contains all ActionQueue functions + +-- Settings +dofile(minetest.get_modpath("mesecons").."/settings.lua") + +-- Utilities like comparing positions, +-- adding positions and rules, +-- mostly things that make the source look cleaner +dofile(minetest.get_modpath("mesecons").."/util.lua"); + +-- Presets (eg default rules) +dofile(minetest.get_modpath("mesecons").."/presets.lua"); + +-- The ActionQueue +-- Saves all the actions that have to be execute in the future +dofile(minetest.get_modpath("mesecons").."/actionqueue.lua"); + +-- Internal stuff +-- This is the most important file +-- it handles signal transmission and basically everything else +-- It is also responsible for managing the nodedef things, +-- like calling action_on/off/change +dofile(minetest.get_modpath("mesecons").."/internal.lua"); + +-- API +-- these are the only functions you need to remember + +mesecon.queue:add_function("receptor_on", function (pos, rules) + rules = rules or mesecon.rules.default + + -- if area (any of the rule targets) is not loaded, keep trying and call this again later + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = mesecon.addPosRule(pos, rule) + -- if area is not loaded, keep trying + if minetest.get_node_or_nil(np) == nil then + mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) + return + end + end + + -- execute action + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = mesecon.addPosRule(pos, rule) + local rulenames = mesecon.rules_link_rule_all(pos, rule) + for _, rulename in ipairs(rulenames) do + mesecon.turnon(np, rulename) + end + end +end) + +function mesecon.receptor_on(pos, rules) + mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) +end + +mesecon.queue:add_function("receptor_off", function (pos, rules) + rules = rules or mesecon.rules.default + + -- if area (any of the rule targets) is not loaded, keep trying and call this again later + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = mesecon.addPosRule(pos, rule) + if minetest.get_node_or_nil(np) == nil then + mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) + return + end + end + + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local np = mesecon.addPosRule(pos, rule) + local rulenames = mesecon.rules_link_rule_all(pos, rule) + for _, rulename in ipairs(rulenames) do + if not mesecon.connected_to_receptor(np, mesecon.invertRule(rule)) then + mesecon.turnoff(np, rulename) + else + mesecon.changesignal(np, minetest.get_node(np), rulename, mesecon.state.off, 2) + end + end + end +end) + +function mesecon.receptor_off(pos, rules) + mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) +end + + +print("[OK] Mesecons") + +-- Deprecated stuff +-- To be removed in future releases +dofile(minetest.get_modpath("mesecons").."/legacy.lua"); + +--The actual wires +dofile(minetest.get_modpath("mesecons").."/wires.lua"); + +--Services like turnoff receptor on dignode and so on +dofile(minetest.get_modpath("mesecons").."/services.lua"); diff --git a/mods/mesecons/mesecons/internal.lua b/mods/mesecons/mesecons/internal.lua new file mode 100644 index 0000000..d62df1f --- /dev/null +++ b/mods/mesecons/mesecons/internal.lua @@ -0,0 +1,652 @@ +-- Internal.lua - The core of mesecons +-- +-- For more practical developer resources see http://mesecons.net/developers.php +-- +-- Function overview +-- mesecon.get_effector(nodename) --> Returns the mesecons.effector -specifictation in the nodedef by the nodename +-- mesecon.get_receptor(nodename) --> Returns the mesecons.receptor -specifictation in the nodedef by the nodename +-- mesecon.get_conductor(nodename) --> Returns the mesecons.conductor-specifictation in the nodedef by the nodename +-- mesecon.get_any_inputrules (node) --> Returns the rules of a node if it is a conductor or an effector +-- mesecon.get_any_outputrules (node) --> Returns the rules of a node if it is a conductor or a receptor + +-- RECEPTORS +-- mesecon.is_receptor(nodename) --> Returns true if nodename is a receptor +-- mesecon.is_receptor_on(nodename --> Returns true if nodename is an receptor with state = mesecon.state.on +-- mesecon.is_receptor_off(nodename) --> Returns true if nodename is an receptor with state = mesecon.state.off +-- mesecon.receptor_get_rules(node) --> Returns the rules of the receptor (mesecon.rules.default if none specified) + +-- EFFECTORS +-- mesecon.is_effector(nodename) --> Returns true if nodename is an effector +-- mesecon.is_effector_on(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_off +-- mesecon.is_effector_off(nodename) --> Returns true if nodename is an effector with nodedef.mesecons.effector.action_on +-- mesecon.effector_get_rules(node) --> Returns the input rules of the effector (mesecon.rules.default if none specified) + +-- SIGNALS +-- mesecon.activate(pos, node, depth) --> Activates the effector node at the specific pos (calls nodedef.mesecons.effector.action_on), higher depths are executed later +-- mesecon.deactivate(pos, node, depth) --> Deactivates the effector node at the specific pos (calls nodedef.mesecons.effector.action_off), higher depths are executed later +-- mesecon.changesignal(pos, node, rulename, newstate, depth) --> Changes the effector node at the specific pos (calls nodedef.mesecons.effector.action_change), higher depths are executed later + +-- CONDUCTORS +-- mesecon.is_conductor(nodename) --> Returns true if nodename is a conductor +-- mesecon.is_conductor_on(node --> Returns true if node is a conductor with state = mesecon.state.on +-- mesecon.is_conductor_off(node) --> Returns true if node is a conductor with state = mesecon.state.off +-- mesecon.get_conductor_on(node_off) --> Returns the onstate nodename of the conductor +-- mesecon.get_conductor_off(node_on) --> Returns the offstate nodename of the conductor +-- mesecon.conductor_get_rules(node) --> Returns the input+output rules of a conductor (mesecon.rules.default if none specified) + +-- HIGH-LEVEL Internals +-- mesecon.is_power_on(pos) --> Returns true if pos emits power in any way +-- mesecon.is_power_off(pos) --> Returns true if pos does not emit power in any way +-- mesecon.turnon(pos, link) --> link is the input rule that caused calling turnon, turns on every connected node, iterative +-- mesecon.turnoff(pos, link) --> link is the input rule that caused calling turnoff, turns off every connected node, iterative +-- mesecon.connected_to_receptor(pos, link) --> Returns true if pos is connected to a receptor directly or via conductors, iterative +-- mesecon.rules_link(output, input, dug_outputrules) --> Returns true if outputposition + outputrules = inputposition and inputposition + inputrules = outputposition (if the two positions connect) +-- mesecon.rules_link_anydir(outp., inp., d_outpr.) --> Same as rules mesecon.rules_link but also returns true if output and input are swapped +-- mesecon.is_powered(pos) --> Returns true if pos is powered by a receptor or a conductor + +-- RULES ROTATION helpers +-- mesecon.rotate_rules_right(rules) +-- mesecon.rotate_rules_left(rules) +-- mesecon.rotate_rules_up(rules) +-- mesecon.rotate_rules_down(rules) +-- These functions return rules that have been rotated in the specific direction + +-- General +function mesecon.get_effector(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.effector then + return minetest.registered_nodes[nodename].mesecons.effector + end +end + +function mesecon.get_receptor(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.receptor then + return minetest.registered_nodes[nodename].mesecons.receptor + end +end + +function mesecon.get_conductor(nodename) + if minetest.registered_nodes[nodename] + and minetest.registered_nodes[nodename].mesecons + and minetest.registered_nodes[nodename].mesecons.conductor then + return minetest.registered_nodes[nodename].mesecons.conductor + end +end + +function mesecon.get_any_outputrules (node) + if mesecon.is_conductor(node.name) then + return mesecon.conductor_get_rules(node) + elseif mesecon.is_receptor(node.name) then + return mesecon.receptor_get_rules(node) + end +end + +function mesecon.get_any_inputrules (node) + if mesecon.is_conductor(node.name) then + return mesecon.conductor_get_rules(node) + elseif mesecon.is_effector(node.name) then + return mesecon.effector_get_rules(node) + end +end + +function mesecon.get_any_rules (node) + return mesecon.mergetable(mesecon.get_any_inputrules(node) or {}, + mesecon.get_any_outputrules(node) or {}) +end + +-- Receptors +-- Nodes that can power mesecons +function mesecon.is_receptor_on(nodename) + local receptor = mesecon.get_receptor(nodename) + if receptor and receptor.state == mesecon.state.on then + return true + end + return false +end + +function mesecon.is_receptor_off(nodename) + local receptor = mesecon.get_receptor(nodename) + if receptor and receptor.state == mesecon.state.off then + return true + end + return false +end + +function mesecon.is_receptor(nodename) + local receptor = mesecon.get_receptor(nodename) + if receptor then + return true + end + return false +end + +function mesecon.receptor_get_rules(node) + local receptor = mesecon.get_receptor(node.name) + if receptor then + local rules = receptor.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + + return mesecon.rules.default +end + +-- Effectors +-- Nodes that can be powered by mesecons +function mesecon.is_effector_on(nodename) + local effector = mesecon.get_effector(nodename) + if effector and effector.action_off then + return true + end + return false +end + +function mesecon.is_effector_off(nodename) + local effector = mesecon.get_effector(nodename) + if effector and effector.action_on then + return true + end + return false +end + +function mesecon.is_effector(nodename) + local effector = mesecon.get_effector(nodename) + if effector then + return true + end + return false +end + +function mesecon.effector_get_rules(node) + local effector = mesecon.get_effector(node.name) + if effector then + local rules = effector.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + return mesecon.rules.default +end + +-- ####################### +-- # Signals (effectors) # +-- ####################### + +-- Activation: +mesecon.queue:add_function("activate", function (pos, rulename) + local node = minetest.get_node(pos) + local effector = mesecon.get_effector(node.name) + + if effector and effector.action_on then + effector.action_on(pos, node, rulename) + end +end) + +function mesecon.activate(pos, node, rulename, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.activate(pos, node, rule, depth + 1) + end + return + end + mesecon.queue:add_action(pos, "activate", {rulename}, nil, rulename, 1 / depth) +end + + +-- Deactivation +mesecon.queue:add_function("deactivate", function (pos, rulename) + local node = minetest.get_node(pos) + local effector = mesecon.get_effector(node.name) + + if effector and effector.action_off then + effector.action_off(pos, node, rulename) + end +end) + +function mesecon.deactivate(pos, node, rulename, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.deactivate(pos, node, rule, depth + 1) + end + return + end + mesecon.queue:add_action(pos, "deactivate", {rulename}, nil, rulename, 1 / depth) +end + + +-- Change +mesecon.queue:add_function("change", function (pos, rulename, changetype) + local node = minetest.get_node(pos) + local effector = mesecon.get_effector(node.name) + + if effector and effector.action_change then + effector.action_change(pos, node, rulename, changetype) + end +end) + +function mesecon.changesignal(pos, node, rulename, newstate, depth) + if rulename == nil then + for _,rule in ipairs(mesecon.effector_get_rules(node)) do + mesecon.changesignal(pos, node, rule, newstate, depth + 1) + end + return + end + + -- Include "change" in overwritecheck so that it cannot be overwritten + -- by "active" / "deactivate" that will be called upon the node at the same time. + local overwritecheck = {"change", rulename} + mesecon.queue:add_action(pos, "change", {rulename, newstate}, nil, overwritecheck, 1 / depth) +end + +-- Conductors + +function mesecon.is_conductor_on(node, rulename) + local conductor = mesecon.get_conductor(node.name) + if conductor then + if conductor.state then + return conductor.state == mesecon.state.on + end + if conductor.states then + if not rulename then + return mesecon.getstate(node.name, conductor.states) ~= 1 + end + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) + local binstate = mesecon.getbinstate(node.name, conductor.states) + return mesecon.get_bit(binstate, bit) + end + end + return false +end + +function mesecon.is_conductor_off(node, rulename) + local conductor = mesecon.get_conductor(node.name) + if conductor then + if conductor.state then + return conductor.state == mesecon.state.off + end + if conductor.states then + if not rulename then + return mesecon.getstate(node.name, conductor.states) == 1 + end + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node)) + local binstate = mesecon.getbinstate(node.name, conductor.states) + return not mesecon.get_bit(binstate, bit) + end + end + return false +end + +function mesecon.is_conductor(nodename) + local conductor = mesecon.get_conductor(nodename) + if conductor then + return true + end + return false +end + +function mesecon.get_conductor_on(node_off, rulename) + local conductor = mesecon.get_conductor(node_off.name) + if conductor then + if conductor.onstate then + return conductor.onstate + end + if conductor.states then + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_off)) + local binstate = mesecon.getbinstate(node_off.name, conductor.states) + binstate = mesecon.set_bit(binstate, bit, "1") + return conductor.states[tonumber(binstate,2)+1] + end + end + return offstate +end + +function mesecon.get_conductor_off(node_on, rulename) + local conductor = mesecon.get_conductor(node_on.name) + if conductor then + if conductor.offstate then + return conductor.offstate + end + if conductor.states then + local bit = mesecon.rule2bit(rulename, mesecon.conductor_get_rules(node_on)) + local binstate = mesecon.getbinstate(node_on.name, conductor.states) + binstate = mesecon.set_bit(binstate, bit, "0") + return conductor.states[tonumber(binstate,2)+1] + end + end + return onstate +end + +function mesecon.conductor_get_rules(node) + local conductor = mesecon.get_conductor(node.name) + if conductor then + local rules = conductor.rules + if type(rules) == 'function' then + return rules(node) + elseif rules then + return rules + end + end + return mesecon.rules.default +end + +-- some more general high-level stuff + +function mesecon.is_power_on(pos, rulename) + local node = minetest.get_node(pos) + if mesecon.is_conductor_on(node, rulename) or mesecon.is_receptor_on(node.name) then + return true + end + return false +end + +function mesecon.is_power_off(pos, rulename) + local node = minetest.get_node(pos) + if mesecon.is_conductor_off(node, rulename) or mesecon.is_receptor_off(node.name) then + return true + end + return false +end + +function mesecon.turnon(pos, link) + local frontiers = {{pos = pos, link = link}} + + local depth = 1 + while frontiers[depth] do + local f = frontiers[depth] + local node = minetest.get_node_or_nil(f.pos) + + -- area not loaded, postpone action + if not node then + mesecon.queue:add_action(f.pos, "turnon", {link}, nil, true) + elseif mesecon.is_conductor_off(node, f.link) then + local rules = mesecon.conductor_get_rules(node) + + minetest.swap_node(f.pos, {name = mesecon.get_conductor_on(node, f.link), + param2 = node.param2}) + + -- call turnon on neighbors: normal rules + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = mesecon.addPosRule(f.pos, r) + + -- area not loaded, postpone action + if not minetest.get_node_or_nil(np) then + mesecon.queue:add_action(np, "turnon", {rulename}, + nil, true) + else + local links = mesecon.rules_link_rule_all(f.pos, r) + for _, l in ipairs(links) do + table.insert(frontiers, {pos = np, link = l}) + end + end + end + elseif mesecon.is_effector(node.name) then + mesecon.changesignal(f.pos, node, f.link, mesecon.state.on, depth) + if mesecon.is_effector_off(node.name) then + mesecon.activate(f.pos, node, f.link, depth) + end + end + depth = depth + 1 + end +end + +mesecon.queue:add_function("turnon", function (pos, rulename, recdepth) + mesecon.turnon(pos, rulename, recdepth) +end) + +function mesecon.turnoff(pos, link) + local frontiers = {{pos = pos, link = link}} + + local depth = 1 + while frontiers[depth] do + local f = frontiers[depth] + local node = minetest.get_node_or_nil(f.pos) + + -- area not loaded, postpone action + if not node then + mesecon.queue:add_action(f.pos, "turnoff", {link}, nil, true) + elseif mesecon.is_conductor_on(node, f.link) then + local rules = mesecon.conductor_get_rules(node) + + minetest.swap_node(f.pos, {name = mesecon.get_conductor_off(node, f.link), + param2 = node.param2}) + + -- call turnoff on neighbors: normal rules + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = mesecon.addPosRule(f.pos, r) + + -- area not loaded, postpone action + if not minetest.get_node_or_nil(np) then + mesecon.queue:add_action(np, "turnoff", {rulename}, + nil, true) + else + local links = mesecon.rules_link_rule_all(f.pos, r) + for _, l in ipairs(links) do + table.insert(frontiers, {pos = np, link = l}) + end + end + end + elseif mesecon.is_effector(node.name) then + mesecon.changesignal(f.pos, node, f.link, mesecon.state.off, depth) + if mesecon.is_effector_on(node.name) and not mesecon.is_powered(f.pos) then + mesecon.deactivate(f.pos, node, f.link, depth) + end + end + depth = depth + 1 + end +end + +mesecon.queue:add_function("turnoff", function (pos, rulename, recdepth) + mesecon.turnoff(pos, rulename, recdepth) +end) + + +function mesecon.connected_to_receptor(pos, link) + local node = minetest.get_node(pos) + + -- Check if conductors around are connected + local rules = mesecon.get_any_inputrules(node) + if not rules then return false end + + for _, rule in ipairs(mesecon.rule2meta(link, rules)) do + local links = mesecon.rules_link_rule_all_inverted(pos, rule) + for _, l in ipairs(links) do + local np = mesecon.addPosRule(pos, l) + if mesecon.find_receptor_on(np, mesecon.invertRule(l)) then + return true + end + end + end + + return false +end + +function mesecon.find_receptor_on(pos, link) + local frontiers = {{pos = pos, link = link}} + local checked = {} + + -- List of positions that have been searched for onstate receptors + local depth = 1 + while frontiers[depth] do + local f = frontiers[depth] + local node = minetest.get_node_or_nil(f.pos) + + if not node then return false end + if mesecon.is_receptor_on(node.name) then return true end + if mesecon.is_conductor_on(node, f.link) then + local rules = mesecon.conductor_get_rules(node) + + -- call turnoff on neighbors: normal rules + for _, r in ipairs(mesecon.rule2meta(f.link, rules)) do + local np = mesecon.addPosRule(f.pos, r) + + local links = mesecon.rules_link_rule_all_inverted(f.pos, r) + for _, l in ipairs(links) do + local checkedstring = np.x..np.y..np.z..l.x..l.y..l.z + if not checked[checkedstring] then + table.insert(frontiers, {pos = np, link = l}) + checked[checkedstring] = true + end + end + end + + end + depth = depth + 1 + end +end + +function mesecon.rules_link(output, input, dug_outputrules) --output/input are positions (outputrules optional, used if node has been dug), second return value: the name of the affected input rule + local outputnode = minetest.get_node(output) + local inputnode = minetest.get_node(input) + local outputrules = dug_outputrules or mesecon.get_any_outputrules (outputnode) + local inputrules = mesecon.get_any_inputrules (inputnode) + if not outputrules or not inputrules then + return + end + + for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do + -- Check if output sends to input + if mesecon.cmpPos(mesecon.addPosRule(output, outputrule), input) then + for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do + -- Check if input accepts from output + if mesecon.cmpPos(mesecon.addPosRule(input, inputrule), output) then + return true, inputrule + end + end + end + end + return false +end + +function mesecon.rules_link_rule_all(output, rule) + local input = mesecon.addPosRule(output, rule) + local inputnode = minetest.get_node(input) + local inputrules = mesecon.get_any_inputrules (inputnode) + if not inputrules then + return {} + end + local rules = {} + + for _, inputrule in ipairs(mesecon.flattenrules(inputrules)) do + -- Check if input accepts from output + if mesecon.cmpPos(mesecon.addPosRule(input, inputrule), output) then + table.insert(rules, inputrule) + end + end + return rules +end + +function mesecon.rules_link_rule_all_inverted(input, rule) + --local irule = mesecon.invertRule(rule) + local output = mesecon.addPosRule(input, rule) + local outputnode = minetest.get_node(output) + local outputrules = mesecon.get_any_outputrules (outputnode) + if not outputrules then + return {} + end + local rules = {} + + for _, outputrule in ipairs(mesecon.flattenrules(outputrules)) do + if mesecon.cmpPos(mesecon.addPosRule(output, outputrule), input) then + table.insert(rules, mesecon.invertRule(outputrule)) + end + end + return rules +end + +function mesecon.rules_link_anydir(pos1, pos2) + return mesecon.rules_link(pos1, pos2) or mesecon.rules_link(pos2, pos1) +end + +function mesecon.is_powered(pos, rule) + local node = minetest.get_node(pos) + local rules = mesecon.get_any_inputrules(node) + if not rules then return false end + + -- List of nodes that send out power to pos + local sourcepos = {} + + if not rule then + for _, rule in ipairs(mesecon.flattenrules(rules)) do + local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) + for _, rname in ipairs(rulenames) do + local np = mesecon.addPosRule(pos, rname) + local nn = minetest.get_node(np) + if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) + or mesecon.is_receptor_on (nn.name)) then + table.insert(sourcepos, np) + end + end + end + else + local rulenames = mesecon.rules_link_rule_all_inverted(pos, rule) + for _, rname in ipairs(rulenames) do + local np = mesecon.addPosRule(pos, rname) + local nn = minetest.get_node(np) + if (mesecon.is_conductor_on (nn, mesecon.invertRule(rname)) + or mesecon.is_receptor_on (nn.name)) then + table.insert(sourcepos, np) + end + end + end + + -- Return FALSE if not powered, return list of sources if is powered + if (#sourcepos == 0) then return false + else return sourcepos end +end + +--Rules rotation Functions: +function mesecon.rotate_rules_right(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = -rule.z, + y = rule.y, + z = rule.x, + name = rule.name}) + end + return nr +end + +function mesecon.rotate_rules_left(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = rule.z, + y = rule.y, + z = -rule.x, + name = rule.name}) + end + return nr +end + +function mesecon.rotate_rules_down(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = -rule.y, + y = rule.x, + z = rule.z, + name = rule.name}) + end + return nr +end + +function mesecon.rotate_rules_up(rules) + local nr = {} + for i, rule in ipairs(rules) do + table.insert(nr, { + x = rule.y, + y = -rule.x, + z = rule.z, + name = rule.name}) + end + return nr +end diff --git a/mods/mesecons/mesecons/legacy.lua b/mods/mesecons/mesecons/legacy.lua new file mode 100644 index 0000000..6d8ccca --- /dev/null +++ b/mods/mesecons/mesecons/legacy.lua @@ -0,0 +1,30 @@ +-- Ugly hack to prevent breaking compatibility with other mods +-- Just remove the following two functions to delete the hack, to be done when other mods have updated +function mesecon.receptor_on(self, pos, rules) + if (self.receptor_on) then + print("[Mesecons] Warning: A mod with mesecon support called mesecon:receptor_on.") + print("[Mesecons] If you are the programmer of this mod, please update it ") + print("[Mesecons] to use mesecon.receptor_on instead. mesecon:* is deprecated") + print("[Mesecons] Otherwise, please make sure you're running the latest version") + print("[Mesecons] of that mod and inform the mod creator.") + else + rules = pos + pos = self + end + mesecon.queue:add_action(pos, "receptor_on", {rules}, nil, rules) +end + +function mesecon.receptor_off(self, pos, rules) + if (self.receptor_off) then + print("[Mesecons] Warning: A mod with mesecon support called mesecon:receptor_off.") + print("[Mesecons] If you are the programmer of this mod, please update it ") + print("[Mesecons] to use mesecon.receptor_off instead. mesecon:* is deprecated") + print("[Mesecons] Otherwise, please make sure you're running the latest version") + print("[Mesecons] of that mod and inform the mod creator.") + else + rules = pos + pos = self + end + mesecon.queue:add_action(pos, "receptor_off", {rules}, nil, rules) +end + diff --git a/mods/mesecons/mesecons/oldwires.lua b/mods/mesecons/mesecons/oldwires.lua new file mode 100644 index 0000000..b3b09e5 --- /dev/null +++ b/mods/mesecons/mesecons/oldwires.lua @@ -0,0 +1,38 @@ +minetest.register_node("mesecons:mesecon_off", { + drawtype = "raillike", + tiles = {"jeija_mesecon_off.png", "jeija_mesecon_curved_off.png", "jeija_mesecon_t_junction_off.png", "jeija_mesecon_crossing_off.png"}, + inventory_image = "jeija_mesecon_off.png", + wield_image = "jeija_mesecon_off.png", + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + }, + groups = {dig_immediate=3, mesecon=1, mesecon_conductor_craftable=1}, + description="Mesecons", + mesecons = {conductor={ + state = mesecon.state.off, + onstate = "mesecons:mesecon_on" + }} +}) + +minetest.register_node("mesecons:mesecon_on", { + drawtype = "raillike", + tiles = {"jeija_mesecon_on.png", "jeija_mesecon_curved_on.png", "jeija_mesecon_t_junction_on.png", "jeija_mesecon_crossing_on.png"}, + paramtype = "light", + is_ground_content = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, -0.45, 0.5}, + }, + groups = {dig_immediate=3, not_in_creaive_inventory=1, mesecon=1}, + drop = "mesecons:mesecon_off 1", + light_source = default.LIGHT_MAX-11, + mesecons = {conductor={ + state = mesecon.state.on, + offstate = "mesecons:mesecon_off" + }} +}) diff --git a/mods/mesecons/mesecons/presets.lua b/mods/mesecons/mesecons/presets.lua new file mode 100644 index 0000000..e5ca1ca --- /dev/null +++ b/mods/mesecons/mesecons/presets.lua @@ -0,0 +1,55 @@ +mesecon.rules = {} +mesecon.state = {} + +mesecon.rules.default = +{{x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=1, y=1, z=0}, + {x=1, y=-1, z=0}, + {x=-1, y=1, z=0}, + {x=-1, y=-1, z=0}, + {x=0, y=1, z=1}, + {x=0, y=-1, z=1}, + {x=0, y=1, z=-1}, + {x=0, y=-1, z=-1}} + +mesecon.rules.pplate = mesecon.mergetable(mesecon.rules.default, {{x=0, y=-2, z=0}}) + +mesecon.rules.buttonlike = +{{x = 1, y = 0, z = 0}, + {x = 1, y = 1, z = 0}, + {x = 1, y =-1, z = 0}, + {x = 1, y =-1, z = 1}, + {x = 1, y =-1, z =-1}, + {x = 2, y = 0, z = 0}} + +mesecon.rules.flat = +{{x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}} + +mesecon.rules.alldirs = +{{x= 1, y= 0, z= 0}, + {x=-1, y= 0, z= 0}, + {x= 0, y= 1, z= 0}, + {x= 0, y=-1, z= 0}, + {x= 0, y= 0, z= 1}, + {x= 0, y= 0, z=-1}} + +mesecon.rules.buttonlike_get = function(node) + local rules = mesecon.rules.buttonlike + if node.param2 == 2 then + rules=mesecon.rotate_rules_left(rules) + elseif node.param2 == 3 then + rules=mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) + elseif node.param2 == 0 then + rules=mesecon.rotate_rules_right(rules) + end + return rules +end + +mesecon.state.on = "on" +mesecon.state.off = "off" diff --git a/mods/mesecons/mesecons/services.lua b/mods/mesecons/mesecons/services.lua new file mode 100644 index 0000000..469ab95 --- /dev/null +++ b/mods/mesecons/mesecons/services.lua @@ -0,0 +1,94 @@ +-- Dig and place services + +mesecon.on_placenode = function (pos, node) + mesecon.update_autoconnect(pos, node) + + -- Receptors: Send on signal when active + if mesecon.is_receptor_on(node.name) then + mesecon.receptor_on(pos, mesecon.receptor_get_rules(node)) + end + + -- Conductors: Send turnon signal when powered or replace by respective offstate conductor + -- if placed conductor is an onstate one + if mesecon.is_conductor(node.name) then + local sources = mesecon.is_powered(pos) + if sources then + -- also call receptor_on if itself is powered already, so that neighboring + -- conductors will be activated (when pushing an on-conductor with a piston) + for _, s in ipairs(sources) do + local rule = {x = pos.x - s.x, y = pos.y - s.y, z = pos.z - s.z} + mesecon.turnon(pos, rule) + end + --mesecon.receptor_on (pos, mesecon.conductor_get_rules(node)) + elseif mesecon.is_conductor_on(node) then + minetest.swap_node(pos, {name = mesecon.get_conductor_off(node)}) + end + end + + -- Effectors: Send changesignal and activate or deactivate + if mesecon.is_effector(node.name) then + local powered_rules = {} + + -- for each input rule, check if powered + for _, r in ipairs(mesecon.effector_get_rules(node)) do + local powered = mesecon.is_powered(pos, r) + if powered then table.insert(powered_rules, r) end + + local state = powered and mesecon.state.on or mesecon.state.off + mesecon.changesignal(pos, node, r, state, 1) + end + + if (#powered_rules > 0) then + for _, r in ipairs(powered_rules) do + mesecon.activate(pos, node, r, 1) + end + end + end +end + +mesecon.on_dignode = function (pos, node) + if mesecon.is_conductor_on(node) then + mesecon.receptor_off(pos, mesecon.conductor_get_rules(node)) + elseif mesecon.is_receptor_on(node.name) then + mesecon.receptor_off(pos, mesecon.receptor_get_rules(node)) + end + mesecon.queue:add_action(pos, "update_autoconnect", {node}) +end + +mesecon.queue:add_function("update_autoconnect", mesecon.update_autoconnect) + +minetest.register_on_placenode(mesecon.on_placenode) +minetest.register_on_dignode(mesecon.on_dignode) + +-- Overheating service for fast circuits + +-- returns true if heat is too high +mesecon.do_overheat = function(pos) + local meta = minetest.get_meta(pos) + local heat = meta:get_int("heat") or 0 + + heat = heat + 1 + meta:set_int("heat", heat) + + if heat < mesecon.setting("overheat_max", 20) then + mesecon.queue:add_action(pos, "cooldown", {}, 1, nil, 0) + else + return true + end + + return false +end + + +mesecon.queue:add_function("cooldown", function (pos) + if minetest.get_item_group(minetest.get_node(pos).name, "overheat") == 0 then + return -- node has been moved, this one does not use overheating - ignore + end + + local meta = minetest.get_meta(pos) + local heat = meta:get_int("heat") + + if (heat > 0) then + meta:set_int("heat", heat - 1) + end +end) diff --git a/mods/mesecons/mesecons/settings.lua b/mods/mesecons/mesecons/settings.lua new file mode 100644 index 0000000..fb03dff --- /dev/null +++ b/mods/mesecons/mesecons/settings.lua @@ -0,0 +1,10 @@ +-- SETTINGS +function mesecon.setting(setting, default) + if type(default) == "bool" then + return minetest.setting_getbool("mesecon."..setting) or default + elseif type(default) == "string" then + return minetest.setting_get("mesecon."..setting) or default + elseif type(default) == "number" then + return tonumber(minetest.setting_get("mesecon."..setting) or default) + end +end diff --git a/mods/mesecons/mesecons/textures/jeija_fiber.png b/mods/mesecons/mesecons/textures/jeija_fiber.png new file mode 100644 index 0000000..e8c7b08 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_fiber.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_glue.png b/mods/mesecons/mesecons/textures/jeija_glue.png new file mode 100644 index 0000000..2f351d1 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_glue.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_mesecon_switch_off.png b/mods/mesecons/mesecons/textures/jeija_mesecon_switch_off.png new file mode 100644 index 0000000..2a75ef3 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_mesecon_switch_off.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_mesecon_switch_on.png b/mods/mesecons/mesecons/textures/jeija_mesecon_switch_on.png new file mode 100644 index 0000000..9df3450 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_mesecon_switch_on.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_mesecon_switch_side.png b/mods/mesecons/mesecons/textures/jeija_mesecon_switch_side.png new file mode 100644 index 0000000..fb5db33 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_mesecon_switch_side.png differ diff --git a/mods/mesecons/mesecons/textures/jeija_silicon.png b/mods/mesecons/mesecons/textures/jeija_silicon.png new file mode 100644 index 0000000..a7b0d52 Binary files /dev/null and b/mods/mesecons/mesecons/textures/jeija_silicon.png differ diff --git a/mods/mesecons/mesecons/textures/mesecons_wire_inv.png b/mods/mesecons/mesecons/textures/mesecons_wire_inv.png new file mode 100644 index 0000000..a3930cb Binary files /dev/null and b/mods/mesecons/mesecons/textures/mesecons_wire_inv.png differ diff --git a/mods/mesecons/mesecons/textures/mesecons_wire_off.png b/mods/mesecons/mesecons/textures/mesecons_wire_off.png new file mode 100644 index 0000000..58164fa Binary files /dev/null and b/mods/mesecons/mesecons/textures/mesecons_wire_off.png differ diff --git a/mods/mesecons/mesecons/textures/mesecons_wire_on.png b/mods/mesecons/mesecons/textures/mesecons_wire_on.png new file mode 100644 index 0000000..98a86c8 Binary files /dev/null and b/mods/mesecons/mesecons/textures/mesecons_wire_on.png differ diff --git a/mods/mesecons/mesecons/util.lua b/mods/mesecons/mesecons/util.lua new file mode 100644 index 0000000..ab2f32c --- /dev/null +++ b/mods/mesecons/mesecons/util.lua @@ -0,0 +1,211 @@ +function mesecon.move_node(pos, newpos) + local node = minetest.get_node(pos) + local meta = minetest.get_meta(pos):to_table() + minetest.remove_node(pos) + minetest.add_node(newpos, node) + minetest.get_meta(pos):from_table(meta) +end + +function mesecon.flattenrules(allrules) +--[[ + { + { + {xyz}, + {xyz}, + }, + { + {xyz}, + {xyz}, + }, + } +--]] + if allrules[1] and + allrules[1].x then + return allrules + end + + local shallowrules = {} + for _, metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + table.insert(shallowrules, rule) + end + end + return shallowrules +--[[ + { + {xyz}, + {xyz}, + {xyz}, + {xyz}, + } +--]] +end + +function mesecon.rule2bit(findrule, allrules) + --get the bit of the metarule the rule is in, or bit 1 + if (allrules[1] and + allrules[1].x) or + not findrule then + return 1 + end + for m,metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + if mesecon.cmpPos(findrule, rule) then + return m + end + end + end +end + +function mesecon.rule2metaindex(findrule, allrules) + --get the metarule the rule is in, or allrules + if allrules[1].x then + return nil + end + + if not(findrule) then + return mesecon.flattenrules(allrules) + end + + for m, metarule in ipairs( allrules) do + for _, rule in ipairs(metarule ) do + if mesecon.cmpPos(findrule, rule) then + return m + end + end + end +end + +function mesecon.rule2meta(findrule, allrules) + if #allrules == 0 then return {} end + + local index = mesecon.rule2metaindex(findrule, allrules) + if index == nil then + if allrules[1].x then + return allrules + else + return {} + end + end + return allrules[index] +end + +function mesecon.dec2bin(n) + local x, y = math.floor(n / 2), n % 2 + if (n > 1) then + return mesecon.dec2bin(x)..y + else + return ""..y + end +end + +function mesecon.getstate(nodename, states) + for state, name in ipairs(states) do + if name == nodename then + return state + end + end + error(nodename.." doesn't mention itself in "..dump(states)) +end + +function mesecon.getbinstate(nodename, states) + return mesecon.dec2bin(mesecon.getstate(nodename, states)-1) +end + +function mesecon.get_bit(binary,bit) + bit = bit or 1 + local c = binary:len()-(bit-1) + return binary:sub(c,c) == "1" +end + +function mesecon.set_bit(binary,bit,value) + if value == "1" then + if not mesecon.get_bit(binary,bit) then + return mesecon.dec2bin(tonumber(binary,2)+math.pow(2,bit-1)) + end + elseif value == "0" then + if mesecon.get_bit(binary,bit) then + return mesecon.dec2bin(tonumber(binary,2)-math.pow(2,bit-1)) + end + end + return binary + +end + +function mesecon.invertRule(r) + return {x = -r.x, y = -r.y, z = -r.z} +end + +function mesecon.addPosRule(p, r) + return {x = p.x + r.x, y = p.y + r.y, z = p.z + r.z} +end + +function mesecon.cmpPos(p1, p2) + return (p1.x == p2.x and p1.y == p2.y and p1.z == p2.z) +end + +function mesecon.tablecopy(table) -- deep table copy + if type(table) ~= "table" then return table end -- no need to copy + local newtable = {} + + for idx, item in pairs(table) do + if type(item) == "table" then + newtable[idx] = mesecon.tablecopy(item) + else + newtable[idx] = item + end + end + + return newtable +end + +function mesecon.cmpAny(t1, t2) + if type(t1) ~= type(t2) then return false end + if type(t1) ~= "table" and type(t2) ~= "table" then return t1 == t2 end + + for i, e in pairs(t1) do + if not mesecon.cmpAny(e, t2[i]) then return false end + end + + return true +end + +-- does not overwrite values; number keys (ipairs) are appended, not overwritten +function mesecon.mergetable(source, dest) + local rval = mesecon.tablecopy(dest) + + for k, v in pairs(source) do + rval[k] = dest[k] or mesecon.tablecopy(v) + end + for i, v in ipairs(source) do + table.insert(rval, mesecon.tablecopy(v)) + end + + return rval +end + +function mesecon.register_node(name, spec_common, spec_off, spec_on) + spec_common.drop = spec_common.drop or name .. "_off" + spec_common.__mesecon_basename = name + spec_on.__mesecon_state = "on" + spec_off.__mesecon_state = "off" + + spec_on = mesecon.mergetable(spec_common, spec_on); + spec_off = mesecon.mergetable(spec_common, spec_off); + + minetest.register_node(name .. "_on", spec_on) + minetest.register_node(name .. "_off", spec_off) +end + +-- swap onstate and offstate nodes, returns new state +function mesecon.flipstate(pos, node) + local nodedef = minetest.registered_nodes[node.name] + local newstate + if (nodedef.__mesecon_state == "on") then newstate = "off" end + if (nodedef.__mesecon_state == "off") then newstate = "on" end + + minetest.swap_node(pos, {name = nodedef.__mesecon_basename .. "_" .. newstate, + param2 = node.param2}) + + return newstate +end diff --git a/mods/mesecons/mesecons/wires.lua b/mods/mesecons/mesecons/wires.lua new file mode 100644 index 0000000..40c8541 --- /dev/null +++ b/mods/mesecons/mesecons/wires.lua @@ -0,0 +1,250 @@ +-- naming scheme: wire:(xp)(zp)(xm)(zm)(xpyp)(zpyp)(xmyp)(zmyp)_on/off +-- where x= x direction, z= z direction, y= y direction, p = +1, m = -1, e.g. xpym = {x=1, y=-1, z=0} +-- The (xp)/(zpyp)/.. statements shall be replaced by either 0 or 1 +-- Where 0 means the wire has no visual connection to that direction and +-- 1 means that the wire visually connects to that other node. + +-- ####################### +-- ## Update wire looks ## +-- ####################### + +-- self_pos = pos of any mesecon node, from_pos = pos of conductor to getconnect for +local wire_getconnect = function (from_pos, self_pos) + local node = minetest.get_node(self_pos) + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecons then + -- rules of node to possibly connect to + local rules = {} + if (minetest.registered_nodes[node.name].mesecon_wire) then + rules = mesecon.rules.default + else + rules = mesecon.get_any_rules(node) + end + + for _, r in ipairs(mesecon.flattenrules(rules)) do + if (mesecon.cmpPos(mesecon.addPosRule(self_pos, r), from_pos)) then + return true + end + end + end + return false +end + +-- Update this node +local wire_updateconnect = function (pos) + local connections = {} + + for _, r in ipairs(mesecon.rules.default) do + if wire_getconnect(pos, mesecon.addPosRule(pos, r)) then + table.insert(connections, r) + end + end + + local nid = {} + for _, vec in ipairs(connections) do + -- flat component + if vec.x == 1 then nid[0] = "1" end + if vec.z == 1 then nid[1] = "1" end + if vec.x == -1 then nid[2] = "1" end + if vec.z == -1 then nid[3] = "1" end + + -- slopy component + if vec.y == 1 then + if vec.x == 1 then nid[4] = "1" end + if vec.z == 1 then nid[5] = "1" end + if vec.x == -1 then nid[6] = "1" end + if vec.z == -1 then nid[7] = "1" end + end + end + + local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") + ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + + local state_suffix = string.find(minetest.get_node(pos).name, "_off") and "_off" or "_on" + minetest.set_node(pos, {name = "mesecons:wire_"..nodeid..state_suffix}) +end + +local update_on_place_dig = function (pos, node) + -- Update placed node (get_node again as it may have been dug) + local nn = minetest.get_node(pos) + if (minetest.registered_nodes[nn.name]) + and (minetest.registered_nodes[nn.name].mesecon_wire) then + wire_updateconnect(pos) + end + + -- Update nodes around it + local rules = {} + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].mesecon_wire then + rules = mesecon.rules.default + else + rules = mesecon.get_any_rules(node) + end + if (not rules) then return end + + for _, r in ipairs(mesecon.flattenrules(rules)) do + local np = mesecon.addPosRule(pos, r) + if minetest.registered_nodes[minetest.get_node(np).name] + and minetest.registered_nodes[minetest.get_node(np).name].mesecon_wire then + wire_updateconnect(np) + end + end +end + +function mesecon.update_autoconnect(pos, node) + if (not node) then node = minetest.get_node(pos) end + update_on_place_dig(pos, node) +end + +-- ############################ +-- ## Wire node registration ## +-- ############################ +-- Nodeboxes: +local box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/16, 1/16} +local box_bump1 = { -2/16, -8/16, -2/16, 2/16, -13/32, 2/16 } + +local nbox_nid = +{ + [0] = {1/16, -.5, -1/16, 8/16, -.5+1/16, 1/16}, -- x positive + [1] = {-1/16, -.5, 1/16, 1/16, -.5+1/16, 8/16}, -- z positive + [2] = {-8/16, -.5, -1/16, -1/16, -.5+1/16, 1/16}, -- x negative + [3] = {-1/16, -.5, -8/16, 1/16, -.5+1/16, -1/16}, -- z negative + + [4] = {.5-1/16, -.5+1/16, -1/16, .5, .4999+1/16, 1/16}, -- x positive up + [5] = {-1/16, -.5+1/16, .5-1/16, 1/16, .4999+1/16, .5}, -- z positive up + [6] = {-.5, -.5+1/16, -1/16, -.5+1/16, .4999+1/16, 1/16}, -- x negative up + [7] = {-1/16, -.5+1/16, -.5, 1/16, .4999+1/16, -.5+1/16} -- z negative up +} + +local tiles_off = { "mesecons_wire_off.png" } +local tiles_on = { "mesecons_wire_on.png" } + +local selectionbox = +{ + type = "fixed", + fixed = {-.5, -.5, -.5, .5, -.5+4/16, .5} +} + +-- go to the next nodeid (ex.: 01000011 --> 01000100) +local nid_inc = function() end +nid_inc = function (nid) + local i = 0 + while nid[i-1] ~= 1 do + nid[i] = (nid[i] ~= 1) and 1 or 0 + i = i + 1 + end + + -- BUT: Skip impossible nodeids: + if ((nid[0] == 0 and nid[4] == 1) or (nid[1] == 0 and nid[5] == 1) + or (nid[2] == 0 and nid[6] == 1) or (nid[3] == 0 and nid[7] == 1)) then + return nid_inc(nid) + end + + return i <= 8 +end + +register_wires = function() + local nid = {} + while true do + -- Create group specifiction and nodeid string (see note above for details) + local nodeid = (nid[0] or "0")..(nid[1] or "0")..(nid[2] or "0")..(nid[3] or "0") + ..(nid[4] or "0")..(nid[5] or "0")..(nid[6] or "0")..(nid[7] or "0") + + -- Calculate nodebox + local nodebox = {type = "fixed", fixed={box_center}} + for i=0,7 do + if nid[i] == 1 then + table.insert(nodebox.fixed, nbox_nid[i]) + end + end + + -- Add bump to nodebox if curved + if (nid[0] == 1 and nid[1] == 1) or (nid[1] == 1 and nid[2] == 1) + or (nid[2] == 1 and nid[3] == 1) or (nid[3] == 1 and nid[0] == 1) then + table.insert(nodebox.fixed, box_bump1) + end + + -- If nothing to connect to, still make a nodebox of a straight wire + if nodeid == "00000000" then + nodebox.fixed = {-8/16, -.5, -1/16, 8/16, -.5+1/16, 1/16} + end + + local rules = {} + if (nid[0] == 1) then table.insert(rules, vector.new( 1, 0, 0)) end + if (nid[1] == 1) then table.insert(rules, vector.new( 0, 0, 1)) end + if (nid[2] == 1) then table.insert(rules, vector.new(-1, 0, 0)) end + if (nid[3] == 1) then table.insert(rules, vector.new( 0, 0, -1)) end + + if (nid[0] == 1) then table.insert(rules, vector.new( 1, -1, 0)) end + if (nid[1] == 1) then table.insert(rules, vector.new( 0, -1, 1)) end + if (nid[2] == 1) then table.insert(rules, vector.new(-1, -1, 0)) end + if (nid[3] == 1) then table.insert(rules, vector.new( 0, -1, -1)) end + + if (nid[4] == 1) then table.insert(rules, vector.new( 1, 1, 0)) end + if (nid[5] == 1) then table.insert(rules, vector.new( 0, 1, 1)) end + if (nid[6] == 1) then table.insert(rules, vector.new(-1, 1, 0)) end + if (nid[7] == 1) then table.insert(rules, vector.new( 0, 1, -1)) end + + local meseconspec_off = { conductor = { + rules = rules, + state = mesecon.state.off, + onstate = "mesecons:wire_"..nodeid.."_on" + }} + + local meseconspec_on = { conductor = { + rules = rules, + state = mesecon.state.on, + offstate = "mesecons:wire_"..nodeid.."_off" + }} + + local groups_on = {dig_immediate = 3, mesecon_conductor_craftable = 1, + not_in_creative_inventory = 1} + local groups_off = {dig_immediate = 3, mesecon_conductor_craftable = 1} + if nodeid ~= "00000000" then + groups_off["not_in_creative_inventory"] = 1 + end + + mesecon.register_node("mesecons:wire_"..nodeid, { + description = "Mesecon", + drawtype = "nodebox", + inventory_image = "mesecons_wire_inv.png", + wield_image = "mesecons_wire_inv.png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + selection_box = selectionbox, + node_box = nodebox, + walkable = false, + drop = "mesecons:wire_00000000_off", + mesecon_wire = true + }, {tiles = tiles_off, mesecons = meseconspec_off, groups = groups_off}, + {tiles = tiles_on, mesecons = meseconspec_on, groups = groups_on}) + + if (nid_inc(nid) == false) then return end + end +end +register_wires() + +-- ############## +-- ## Crafting ## +-- ############## +minetest.register_craft({ + type = "cooking", + output = "mesecons:wire_00000000_off 2", + recipe = "default:mese_crystal_fragment", + cooktime = 3, +}) + +minetest.register_craft({ + type = "cooking", + output = "mesecons:wire_00000000_off 18", + recipe = "default:mese_crystal", + cooktime = 15, +}) + +minetest.register_craft({ + type = "cooking", + output = "mesecons:wire_00000000_off 162", + recipe = "default:mese", + cooktime = 30, +}) diff --git a/mods/mesecons/mesecons_alias/depends.txt b/mods/mesecons/mesecons_alias/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_alias/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_alias/init.lua b/mods/mesecons/mesecons_alias/init.lua new file mode 100644 index 0000000..395c368 --- /dev/null +++ b/mods/mesecons/mesecons_alias/init.lua @@ -0,0 +1,38 @@ +-- This file registers aliases for the /give /giveme commands. + +minetest.register_alias("mesecons:removestone", "mesecons_random:removestone") +minetest.register_alias("mesecons:power_plant", "mesecons_powerplant:power_plant") +minetest.register_alias("mesecons:powerplant", "mesecons_powerplant:power_plant") +minetest.register_alias("mesecons:meselamp", "mesecons_lamp:lamp_off") +minetest.register_alias("mesecons:mesecon", "mesecons:wire_00000000_off") +minetest.register_alias("mesecons:object_detector", "mesecons_detector:object_detector_off") +minetest.register_alias("mesecons:wireless_inverter", "mesecons_wireless:wireless_inverter_on") +minetest.register_alias("mesecons:wireless_receiver", "mesecons_wireless:wireless_receiver_off") +minetest.register_alias("mesecons:wireless_transmitter", "mesecons_wireless:wireless_transmitter_off") +minetest.register_alias("mesecons:switch", "mesecons_switch:mesecon_switch_off") +minetest.register_alias("mesecons:button", "mesecons_button:button_off") +minetest.register_alias("mesecons:piston", "mesecons_pistons:piston_normal_off") +minetest.register_alias("mesecons:blinky_plant", "mesecons_blinkyplant:blinky_plant_off") +minetest.register_alias("mesecons:mesecon_torch", "mesecons_torch:mesecon_torch_on") +minetest.register_alias("mesecons:torch", "mesecons_torch:mesecon_torch_on") +minetest.register_alias("mesecons:hydro_turbine", "mesecons_hydroturbine:hydro_turbine_off") +minetest.register_alias("mesecons:pressure_plate_stone", "mesecons_pressureplates:pressure_plate_stone_off") +minetest.register_alias("mesecons:pressure_plate_wood", "mesecons_pressureplates:pressure_plate_wood_off") +minetest.register_alias("mesecons:mesecon_socket", "mesecons_temperest:mesecon_socket_off") +minetest.register_alias("mesecons:mesecon_inverter", "mesecons_temperest:mesecon_inverter_on") +minetest.register_alias("mesecons:movestone", "mesecons_movestones:movestone") +minetest.register_alias("mesecons:sticky_movestone", "mesecons_movestones:sticky_movestone") +minetest.register_alias("mesecons:noteblock", "mesecons_noteblock:noteblock") +minetest.register_alias("mesecons:microcontroller", "mesecons_microcontroller:microcontroller0000") +minetest.register_alias("mesecons:delayer", "mesecons_delayer:delayer_off_1") +minetest.register_alias("mesecons:solarpanel", "mesecons_solarpanel:solar_panel_off") + + +--Backwards compatibility +minetest.register_alias("mesecons:mesecon_off", "mesecons:wire_00000000_off") +minetest.register_alias("mesecons_pistons:piston_sticky", "mesecons_pistons:piston_sticky_on") +minetest.register_alias("mesecons_pistons:piston_normal", "mesecons_pistons:piston_normal_on") +minetest.register_alias("mesecons_pistons:piston_up_normal", "mesecons_pistons:piston_up_normal_on") +minetest.register_alias("mesecons_pistons:piston_down_normal", "mesecons_pistons:piston_down_normal_on") +minetest.register_alias("mesecons_pistons:piston_up_sticky", "mesecons_pistons:piston_up_sticky_on") +minetest.register_alias("mesecons_pistons:piston_down_sticky", "mesecons_pistons:piston_down_sticky_on") diff --git a/mods/mesecons/mesecons_blinkyplant/depends.txt b/mods/mesecons/mesecons_blinkyplant/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_blinkyplant/init.lua b/mods/mesecons/mesecons_blinkyplant/init.lua new file mode 100644 index 0000000..8d2aa6e --- /dev/null +++ b/mods/mesecons/mesecons_blinkyplant/init.lua @@ -0,0 +1,51 @@ +-- The BLINKY_PLANT + +local toggle_timer = function (pos) + local timer = minetest.get_node_timer(pos) + if timer:is_started() then + timer:stop() + else + timer:start(mesecon.setting("blinky_plant_interval", 3)) + end +end + +local on_timer = function (pos) + local node = minetest.get_node(pos) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos) + else + mesecon.receptor_off(pos) + end + toggle_timer(pos) +end + +mesecon.register_node("mesecons_blinkyplant:blinky_plant", { + description="Blinky Plant", + drawtype = "plantlike", + inventory_image = "jeija_blinky_plant_off.png", + paramtype = "light", + walkable = false, + sounds = default.node_sound_leaves_defaults(), + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, + }, + on_timer = on_timer, + on_rightclick = toggle_timer, + on_construct = toggle_timer +},{ + tiles = {"jeija_blinky_plant_off.png"}, + groups = {dig_immediate=3}, + mesecons = {receptor = { state = mesecon.state.off }} +},{ + tiles = {"jeija_blinky_plant_on.png"}, + groups = {dig_immediate=3, not_in_creative_inventory=1}, + mesecons = {receptor = { state = mesecon.state.on }} +}) + +minetest.register_craft({ + output = "mesecons_blinkyplant:blinky_plant_off 1", + recipe = { {"","group:mesecon_conductor_craftable",""}, + {"","group:mesecon_conductor_craftable",""}, + {"group:sapling","group:sapling","group:sapling"}} +}) diff --git a/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png new file mode 100644 index 0000000..4f507da Binary files /dev/null and b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_off.png differ diff --git a/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png new file mode 100644 index 0000000..f77a134 Binary files /dev/null and b/mods/mesecons/mesecons_blinkyplant/textures/jeija_blinky_plant_on.png differ diff --git a/mods/mesecons/mesecons_button/depends.txt b/mods/mesecons/mesecons_button/depends.txt new file mode 100644 index 0000000..19c798c --- /dev/null +++ b/mods/mesecons/mesecons_button/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_receiver diff --git a/mods/mesecons/mesecons_button/init.lua b/mods/mesecons/mesecons_button/init.lua new file mode 100644 index 0000000..ead688e --- /dev/null +++ b/mods/mesecons/mesecons_button/init.lua @@ -0,0 +1,98 @@ +-- WALL BUTTON +-- A button that when pressed emits power for 1 second +-- and then turns off again + +mesecon.button_turnoff = function (pos) + local node = minetest.get_node(pos) + if node.name=="mesecons_button:button_on" then --has not been dug + minetest.swap_node(pos, {name = "mesecons_button:button_off", param2=node.param2}) + minetest.sound_play("mesecons_button_pop", {pos=pos}) + local rules = mesecon.rules.buttonlike_get(node) + mesecon.receptor_off(pos, rules) + end +end + +minetest.register_node("mesecons_button:button_off", { + drawtype = "nodebox", + tiles = { + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_off.png" + }, + paramtype = "light", + paramtype2 = "facedir", + legacy_wallmounted = true, + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = { + { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, -- the thin plate behind the button + { -4/16, -2/16, 4/16, 4/16, 2/16, 6/16 } -- the button itself + } + }, + groups = {dig_immediate=2, mesecon_needs_receiver = 1}, + description = "Button", + on_punch = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_button:button_on", param2=node.param2}) + mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) + minetest.sound_play("mesecons_button_push", {pos=pos}) + minetest.after(1, mesecon.button_turnoff, pos) + end, + sounds = default.node_sound_stone_defaults(), + mesecons = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.buttonlike_get + }} +}) + +minetest.register_node("mesecons_button:button_on", { + drawtype = "nodebox", + tiles = { + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_sides.png", + "jeija_wall_button_on.png" + }, + paramtype = "light", + paramtype2 = "facedir", + legacy_wallmounted = true, + walkable = false, + light_source = default.LIGHT_MAX-7, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -6/16, -6/16, 5/16, 6/16, 6/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = { + { -6/16, -6/16, 6/16, 6/16, 6/16, 8/16 }, + { -4/16, -2/16, 11/32, 4/16, 2/16, 6/16 } + } + }, + groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon_needs_receiver = 1}, + drop = 'mesecons_button:button_off', + description = "Button", + sounds = default.node_sound_stone_defaults(), + mesecons = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.buttonlike_get + }} +}) + +minetest.register_craft({ + output = "mesecons_button:button_off 2", + recipe = { + {"group:mesecon_conductor_craftable","default:stone"}, + } +}) diff --git a/mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg b/mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg new file mode 100644 index 0000000..9d56bb8 Binary files /dev/null and b/mods/mesecons/mesecons_button/sounds/mesecons_button_pop.ogg differ diff --git a/mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg b/mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg new file mode 100644 index 0000000..53d45c1 Binary files /dev/null and b/mods/mesecons/mesecons_button/sounds/mesecons_button_push.ogg differ diff --git a/mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png b/mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png new file mode 100644 index 0000000..0e3ff25 Binary files /dev/null and b/mods/mesecons/mesecons_button/textures/jeija_wall_button_off.png differ diff --git a/mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png b/mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png new file mode 100644 index 0000000..1d97464 Binary files /dev/null and b/mods/mesecons/mesecons_button/textures/jeija_wall_button_on.png differ diff --git a/mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png b/mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png new file mode 100644 index 0000000..9b79b57 Binary files /dev/null and b/mods/mesecons/mesecons_button/textures/jeija_wall_button_sides.png differ diff --git a/mods/mesecons/mesecons_commandblock/depends.txt b/mods/mesecons/mesecons_commandblock/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_commandblock/init.lua b/mods/mesecons/mesecons_commandblock/init.lua new file mode 100644 index 0000000..9cf9b13 --- /dev/null +++ b/mods/mesecons/mesecons_commandblock/init.lua @@ -0,0 +1,195 @@ +minetest.register_chatcommand("say", { + params = "", + description = "Say as the server", + privs = {server=true}, + func = function(name, param) + minetest.chat_send_all(name .. ": " .. param) + end +}) + +minetest.register_chatcommand("tell", { + params = " ", + description = "Say to privately", + func = function(name, param) + local found, _, target, message = param:find("^([^%s]+)%s+(.*)$") + if found == nil then + minetest.chat_send_player(name, "Invalid usage: " .. param) + return + end + if not minetest.get_player_by_name(target) then + minetest.chat_send_player(name, "Invalid target: " .. target) + end + minetest.chat_send_player(target, name .. " whispers: " .. message, false) + end +}) + +minetest.register_chatcommand("hp", { + params = " ", + description = "Set health of to hitpoints", + privs = {ban=true}, + func = function(name, param) + local found, _, target, value = param:find("^([^%s]+)%s+(%d+)$") + if found == nil then + minetest.chat_send_player(name, "Invalid usage: " .. param) + return + end + local player = minetest.get_player_by_name(target) + if player then + player:set_hp(value) + else + minetest.chat_send_player(name, "Invalid target: " .. target) + end + end +}) + +local function initialize_data(meta) + local commands = meta:get_string("commands") + meta:set_string("formspec", + "invsize[9,5;]" .. + "textarea[0.5,0.5;8.5,4;commands;Commands;"..commands.."]" .. + "label[1,3.8;@nearest, @farthest, and @random are replaced by the respective player names]" .. + "button_exit[3.3,4.5;2,1;submit;Submit]") + local owner = meta:get_string("owner") + if owner == "" then + owner = "not owned" + else + owner = "owned by " .. owner + end + meta:set_string("infotext", "Command Block\n" .. + "(" .. owner .. ")\n" .. + "Commands: "..commands) +end + +local function construct(pos) + local meta = minetest.get_meta(pos) + + meta:set_string("commands", "tell @nearest Commandblock unconfigured") + + meta:set_string("owner", "") + + initialize_data(meta) +end + +local function after_place(pos, placer) + if placer then + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name()) + initialize_data(meta) + end +end + +local function receive_fields(pos, formname, fields, sender) + if not fields.submit then + return + end + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner ~= "" and sender:get_player_name() ~= owner then + return + end + meta:set_string("commands", fields.commands) + + initialize_data(meta) +end + +local function resolve_commands(commands, pos) + local nearest, farthest = nil, nil + local min_distance, max_distance = math.huge, -1 + local players = minetest.get_connected_players() + for index, player in pairs(players) do + local distance = vector.distance(pos, player:getpos()) + if distance < min_distance then + min_distance = distance + nearest = player:get_player_name() + end + if distance > max_distance then + max_distance = distance + farthest = player:get_player_name() + end + end + local random = players[math.random(#players)]:get_player_name() + commands = commands:gsub("@nearest", nearest) + commands = commands:gsub("@farthest", farthest) + commands = commands:gsub("@random", random) + return commands +end + +local function commandblock_action_on(pos, node) + if node.name ~= "mesecons_commandblock:commandblock_off" then + return + end + + minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_on"}) + + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + if owner == "" then + return + end + + local commands = resolve_commands(meta:get_string("commands"), pos) + for _, command in pairs(commands:split("\n")) do + local pos = command:find(" ") + local cmd, param = command, "" + if pos then + cmd = command:sub(1, pos - 1) + param = command:sub(pos + 1) + end + local cmddef = minetest.chatcommands[cmd] + if not cmddef then + minetest.chat_send_player(owner, "The command "..cmd.." does not exist") + return + end + local has_privs, missing_privs = minetest.check_player_privs(owner, cmddef.privs) + if not has_privs then + minetest.chat_send_player(owner, "You don't have permission " + .."to run "..cmd + .." (missing privileges: " + ..table.concat(missing_privs, ", ")..")") + return + end + cmddef.func(owner, param) + end +end + +local function commandblock_action_off(pos, node) + if node.name == "mesecons_commandblock:commandblock_on" then + minetest.swap_node(pos, {name = "mesecons_commandblock:commandblock_off"}) + end +end + +local function can_dig(pos, player) + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + return owner == "" or owner == player:get_player_name() +end + +minetest.register_node("mesecons_commandblock:commandblock_off", { + description = "Command Block", + tiles = {"jeija_commandblock_off.png"}, + inventory_image = minetest.inventorycube("jeija_commandblock_off.png"), + groups = {cracky=2, mesecon_effector_off=1}, + on_construct = construct, + after_place_node = after_place, + on_receive_fields = receive_fields, + can_dig = can_dig, + sounds = default.node_sound_stone_defaults(), + mesecons = {effector = { + action_on = commandblock_action_on + }} +}) + +minetest.register_node("mesecons_commandblock:commandblock_on", { + tiles = {"jeija_commandblock_on.png"}, + groups = {cracky=2, mesecon_effector_on=1, not_in_creative_inventory=1}, + light_source = 10, + drop = "mesecons_commandblock:commandblock_off", + on_construct = construct, + after_place_node = after_place, + on_receive_fields = receive_fields, + can_dig = can_dig, + sounds = default.node_sound_stone_defaults(), + mesecons = {effector = { + action_off = commandblock_action_off + }} +}) diff --git a/mods/mesecons/mesecons_commandblock/textures/jeija_close_window.png b/mods/mesecons/mesecons_commandblock/textures/jeija_close_window.png new file mode 100644 index 0000000..5c27c6c Binary files /dev/null and b/mods/mesecons/mesecons_commandblock/textures/jeija_close_window.png differ diff --git a/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png new file mode 100644 index 0000000..c05b616 Binary files /dev/null and b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_off.png differ diff --git a/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png new file mode 100644 index 0000000..7fc35b6 Binary files /dev/null and b/mods/mesecons/mesecons_commandblock/textures/jeija_commandblock_on.png differ diff --git a/mods/mesecons/mesecons_delayer/depends.txt b/mods/mesecons/mesecons_delayer/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_delayer/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_delayer/init.lua b/mods/mesecons/mesecons_delayer/init.lua new file mode 100644 index 0000000..ba4067f --- /dev/null +++ b/mods/mesecons/mesecons_delayer/init.lua @@ -0,0 +1,179 @@ +-- Function that get the input/output rules of the delayer +local delayer_get_output_rules = function(node) + local rules = {{x = 0, y = 0, z = 1}} + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + +local delayer_get_input_rules = function(node) + local rules = {{x = 0, y = 0, z = -1}} + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + +-- Functions that are called after the delay time + +local delayer_activate = function(pos, node) + local def = minetest.registered_nodes[node.name] + local time = def.delayer_time + minetest.swap_node(pos, {name = def.delayer_onstate, param2=node.param2}) + mesecon.queue:add_action(pos, "receptor_on", {delayer_get_output_rules(node)}, time, nil) +end + +local delayer_deactivate = function(pos, node) + local def = minetest.registered_nodes[node.name] + local time = def.delayer_time + minetest.swap_node(pos, {name = def.delayer_offstate, param2=node.param2}) + mesecon.queue:add_action(pos, "receptor_off", {delayer_get_output_rules(node)}, time, nil) +end + +-- Register the 2 (states) x 4 (delay times) delayers + +for i = 1, 4 do +local groups = {} +if i == 1 then + groups = {bendy=2,snappy=1,dig_immediate=2} +else + groups = {bendy=2,snappy=1,dig_immediate=2, not_in_creative_inventory=1} +end + +local delaytime +if i == 1 then delaytime = 0.1 +elseif i == 2 then delaytime = 0.3 +elseif i == 3 then delaytime = 0.5 +elseif i == 4 then delaytime = 1.0 end + +boxes = {{ -6/16, -8/16, -6/16, 6/16, -7/16, 6/16 }, -- the main slab + + { -2/16, -7/16, -4/16, 2/16, -26/64, -3/16 }, -- the jeweled "on" indicator + { -3/16, -7/16, -3/16, 3/16, -26/64, -2/16 }, + { -4/16, -7/16, -2/16, 4/16, -26/64, 2/16 }, + { -3/16, -7/16, 2/16, 3/16, -26/64, 3/16 }, + { -2/16, -7/16, 3/16, 2/16, -26/64, 4/16 }, + + { -6/16, -7/16, -6/16, -4/16, -27/64, -4/16 }, -- the timer indicator + { -8/16, -8/16, -1/16, -6/16, -7/16, 1/16 }, -- the two wire stubs + { 6/16, -8/16, -1/16, 8/16, -7/16, 1/16 }} + +minetest.register_node("mesecons_delayer:delayer_off_"..tostring(i), { + description = "Delayer", + drawtype = "nodebox", + tiles = { + "mesecons_delayer_off_"..tostring(i)..".png", + "mesecons_delayer_bottom.png", + "mesecons_delayer_ends_off.png", + "mesecons_delayer_ends_off.png", + "mesecons_delayer_sides_off.png", + "mesecons_delayer_sides_off.png" + }, + inventory_image = "mesecons_delayer_off_1.png", + wield_image = "mesecons_delayer_off_1.png", + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = boxes + }, + groups = groups, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = true, + drop = 'mesecons_delayer:delayer_off_1', + on_punch = function (pos, node) + if node.name=="mesecons_delayer:delayer_off_1" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_2", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_off_2" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_3", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_off_3" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_4", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_off_4" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_off_1", param2=node.param2}) + end + end, + delayer_time = delaytime, + delayer_onstate = "mesecons_delayer:delayer_on_"..tostring(i), + sounds = default.node_sound_stone_defaults(), + mesecons = { + receptor = + { + state = mesecon.state.off, + rules = delayer_get_output_rules + }, + effector = + { + rules = delayer_get_input_rules, + action_on = delayer_activate + } + } +}) + + +minetest.register_node("mesecons_delayer:delayer_on_"..tostring(i), { + description = "You hacker you", + drawtype = "nodebox", + tiles = { + "mesecons_delayer_on_"..tostring(i)..".png", + "mesecons_delayer_bottom.png", + "mesecons_delayer_ends_on.png", + "mesecons_delayer_ends_on.png", + "mesecons_delayer_sides_on.png", + "mesecons_delayer_sides_on.png" + }, + walkable = true, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -6/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = boxes + }, + groups = {bendy = 2, snappy = 1, dig_immediate = 2, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + is_ground_content = true, + drop = 'mesecons_delayer:delayer_off_1', + on_punch = function (pos, node) + if node.name=="mesecons_delayer:delayer_on_1" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_2", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_2" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_3", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_3" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_4", param2=node.param2}) + elseif node.name=="mesecons_delayer:delayer_on_4" then + minetest.swap_node(pos, {name = "mesecons_delayer:delayer_on_1", param2=node.param2}) + end + end, + delayer_time = delaytime, + delayer_offstate = "mesecons_delayer:delayer_off_"..tostring(i), + mesecons = { + receptor = + { + state = mesecon.state.on, + rules = delayer_get_output_rules + }, + effector = + { + rules = delayer_get_input_rules, + action_off = delayer_deactivate + } + } +}) +end + +minetest.register_craft({ + output = "mesecons_delayer:delayer_off_1", + recipe = { + {"mesecons_torch:mesecon_torch_on", "group:mesecon_conductor_craftable", "mesecons_torch:mesecon_torch_on"}, + {"default:cobble","default:cobble", "default:cobble"}, + } +}) diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_bottom.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_bottom.png new file mode 100644 index 0000000..2e49d31 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_bottom.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_ends_off.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_ends_off.png new file mode 100644 index 0000000..0242deb Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_ends_off.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_ends_on.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_ends_on.png new file mode 100644 index 0000000..19ae0cb Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_ends_on.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_1.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_1.png new file mode 100644 index 0000000..7372b37 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_1.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_2.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_2.png new file mode 100644 index 0000000..e34f0ac Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_2.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_3.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_3.png new file mode 100644 index 0000000..091adbc Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_3.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_4.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_4.png new file mode 100644 index 0000000..7ecc9b6 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_off_4.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_1.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_1.png new file mode 100644 index 0000000..61f52f2 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_1.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_2.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_2.png new file mode 100644 index 0000000..7bd363f Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_2.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_3.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_3.png new file mode 100644 index 0000000..b93f725 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_3.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_4.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_4.png new file mode 100644 index 0000000..ca90a1e Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_on_4.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_sides_off.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_sides_off.png new file mode 100644 index 0000000..79f3d59 Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_sides_off.png differ diff --git a/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_sides_on.png b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_sides_on.png new file mode 100644 index 0000000..1c8edaa Binary files /dev/null and b/mods/mesecons/mesecons_delayer/textures/mesecons_delayer_sides_on.png differ diff --git a/mods/mesecons/mesecons_detector/depends.txt b/mods/mesecons/mesecons_detector/depends.txt new file mode 100644 index 0000000..bc7b062 --- /dev/null +++ b/mods/mesecons/mesecons_detector/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_materials diff --git a/mods/mesecons/mesecons_detector/init.lua b/mods/mesecons/mesecons_detector/init.lua new file mode 100644 index 0000000..e589676 --- /dev/null +++ b/mods/mesecons/mesecons_detector/init.lua @@ -0,0 +1,272 @@ +local GET_COMMAND = "GET" + +-- Object detector +-- Detects players in a certain radius +-- The radius can be specified in mesecons/settings.lua + +local object_detector_make_formspec = function (pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "size[9,2.5]" .. + "field[0.3, 0;9,2;scanname;Name of player to scan for (empty for any):;${scanname}]".. + "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. + "button_exit[7,0.75;2,3;;Save]") +end + +local object_detector_on_receive_fields = function(pos, formname, fields) + if not fields.scanname or not fields.digiline_channel then return end; + + local meta = minetest.get_meta(pos) + meta:set_string("scanname", fields.scanname) + meta:set_string("digiline_channel", fields.digiline_channel) + object_detector_make_formspec(pos) +end + +-- returns true if player was found, false if not +local object_detector_scan = function (pos) + local objs = minetest.get_objects_inside_radius(pos, mesecon.setting("detector_radius", 6)) + for k, obj in pairs(objs) do + local isname = obj:get_player_name() -- "" is returned if it is not a player; "" ~= nil! + local scanname = minetest.get_meta(pos):get_string("scanname") + if (isname == scanname and isname ~= "") or (isname ~= "" and scanname == "") then -- player with scanname found or not scanname specified + return true + end + end + return false +end + +-- set player name when receiving a digiline signal on a specific channel +local object_detector_digiline = { + effector = { + action = function (pos, node, channel, msg) + local meta = minetest.get_meta(pos) + local active_channel = meta:get_string("digiline_channel") + if channel == active_channel then + meta:set_string("scanname", msg) + object_detector_make_formspec(pos) + end + end, + } +} + +minetest.register_node("mesecons_detector:object_detector_off", { + tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png", "jeija_object_detector_off.png"}, + paramtype = "light", + walkable = true, + groups = {cracky=3}, + description="Player Detector", + mesecons = {receptor = { + state = mesecon.state.off, + rules = mesecon.rules.pplate + }}, + on_construct = object_detector_make_formspec, + on_receive_fields = object_detector_on_receive_fields, + sounds = default.node_sound_stone_defaults(), + digiline = object_detector_digiline +}) + +minetest.register_node("mesecons_detector:object_detector_on", { + tiles = {"default_steel_block.png", "default_steel_block.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png", "jeija_object_detector_on.png"}, + paramtype = "light", + walkable = true, + groups = {cracky=3,not_in_creative_inventory=1}, + drop = 'mesecons_detector:object_detector_off', + mesecons = {receptor = { + state = mesecon.state.on, + rules = mesecon.rules.pplate + }}, + on_construct = object_detector_make_formspec, + on_receive_fields = object_detector_on_receive_fields, + sounds = default.node_sound_stone_defaults(), + digiline = object_detector_digiline +}) + +minetest.register_craft({ + output = 'mesecons_detector:object_detector_off', + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"}, + {"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"}, + } +}) + +minetest.register_abm( + {nodenames = {"mesecons_detector:object_detector_off"}, + interval = 1.0, + chance = 1, + action = function(pos) + if object_detector_scan(pos) then + minetest.swap_node(pos, {name = "mesecons_detector:object_detector_on"}) + mesecon.receptor_on(pos, mesecon.rules.pplate) + end + end, +}) + +minetest.register_abm( + {nodenames = {"mesecons_detector:object_detector_on"}, + interval = 1.0, + chance = 1, + action = function(pos) + if not object_detector_scan(pos) then + minetest.swap_node(pos, {name = "mesecons_detector:object_detector_off"}) + mesecon.receptor_off(pos, mesecon.rules.pplate) + end + end, +}) + +-- Node detector +-- Detects the node in front of it + +local node_detector_make_formspec = function (pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", "size[9,2.5]" .. + "field[0.3, 0;9,2;scanname;Name of node to scan for (empty for any):;${scanname}]".. + "field[0.3,1.5;4,2;digiline_channel;Digiline Channel (optional):;${digiline_channel}]".. + "button_exit[7,0.75;2,3;;Save]") +end + +local node_detector_on_receive_fields = function(pos, formname, fields) + if not fields.scanname or not fields.digiline_channel then return end; + + local meta = minetest.get_meta(pos) + meta:set_string("scanname", fields.scanname) + meta:set_string("digiline_channel", fields.digiline_channel) + node_detector_make_formspec(pos) +end + +-- returns true if player was found, false if not +local node_detector_scan = function (pos) + if not pos then return end + local node = minetest.get_node_or_nil(pos) + if not node then return end + local scandir = minetest.facedir_to_dir(node.param2) + if not scandir then return end + local frontpos = vector.subtract(pos, scandir) + local frontnode = minetest.get_node(frontpos) + local meta = minetest.get_meta(pos) + return (frontnode.name == meta:get_string("scanname")) or + (frontnode.name ~= "air" and frontnode.name ~= "ignore" and meta:get_string("scanname") == "") +end + +-- set player name when receiving a digiline signal on a specific channel +local node_detector_digiline = { + effector = { + action = function (pos, node, channel, msg) + local meta = minetest.get_meta(pos) + local active_channel = meta:get_string("digiline_channel") + if channel == active_channel then + if msg == GET_COMMAND then + local frontpos = vector.subtract(pos, minetest.facedir_to_dir(node.param2)) + local name = minetest.get_node(frontpos).name + digiline:receptor_send(pos, digiline.rules.default, channel, name) + else + meta:set_string("scanname", msg) + node_detector_make_formspec(pos) + end + end + end, + }, + receptor = {} +} + +minetest.register_node("mesecons_detector:node_detector_off", { + tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_off.png"}, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + groups = {cracky=3}, + description="Node Detector", + mesecons = {receptor = { + state = mesecon.state.off + }}, + on_construct = node_detector_make_formspec, + on_receive_fields = node_detector_on_receive_fields, + after_place_node = function (pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + end, + sounds = default.node_sound_stone_defaults(), + digiline = node_detector_digiline +}) + +minetest.register_node("mesecons_detector:node_detector_on", { + tiles = {"default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "default_steel_block.png", "jeija_node_detector_on.png"}, + paramtype = "light", + paramtype2 = "facedir", + walkable = true, + groups = {cracky=3,not_in_creative_inventory=1}, + drop = 'mesecons_detector:node_detector_off', + mesecons = {receptor = { + state = mesecon.state.on + }}, + on_construct = node_detector_make_formspec, + on_receive_fields = node_detector_on_receive_fields, + after_place_node = function (pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + end, + sounds = default.node_sound_stone_defaults(), + digiline = node_detector_digiline +}) + +minetest.register_craft({ + output = 'mesecons_detector:node_detector_off', + recipe = { + {"default:steel_ingot", "group:mesecon_conductor_craftable", "default:steel_ingot"}, + {"default:steel_ingot", "mesecons_luacontroller:luacontroller0000", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + } +}) + +minetest.register_abm( + {nodenames = {"mesecons_detector:node_detector_off"}, + interval = 1.0, + chance = 1, + action = function(pos, node) + if node_detector_scan(pos) then + minetest.swap_node(pos, {name = "mesecons_detector:node_detector_on", param2 = node.param2}) + mesecon.receptor_on(pos) + end + end, +}) + +minetest.register_abm( + {nodenames = {"mesecons_detector:node_detector_on"}, + interval = 1.0, + chance = 1, + action = function(pos, node) + if not node_detector_scan(pos) then + minetest.swap_node(pos, {name = "mesecons_detector:node_detector_off", param2 = node.param2}) + mesecon.receptor_off(pos) + end + end, +}) diff --git a/mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png new file mode 100644 index 0000000..6d130ad Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_off.png differ diff --git a/mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png new file mode 100644 index 0000000..926a9d1 Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_node_detector_on.png differ diff --git a/mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png new file mode 100644 index 0000000..825d78f Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_off.png differ diff --git a/mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png new file mode 100644 index 0000000..96f8ba3 Binary files /dev/null and b/mods/mesecons/mesecons_detector/textures/jeija_object_detector_on.png differ diff --git a/mods/mesecons/mesecons_doors/depends.txt b/mods/mesecons/mesecons_doors/depends.txt new file mode 100644 index 0000000..ed2fcd8 --- /dev/null +++ b/mods/mesecons/mesecons_doors/depends.txt @@ -0,0 +1,2 @@ +mesecons +doors diff --git a/mods/mesecons/mesecons_doors/init.lua b/mods/mesecons/mesecons_doors/init.lua new file mode 100644 index 0000000..dca8b4d --- /dev/null +++ b/mods/mesecons/mesecons_doors/init.lua @@ -0,0 +1,84 @@ +-- Modified, from minetest_game/mods/doors/init.lua +local function on_rightclick(pos, dir, check_name, replace, replace_dir, params) + pos.y = pos.y + dir + if not minetest.get_node(pos).name == check_name then + return + end + local p2 = minetest.get_node(pos).param2 + p2 = params[p2 + 1] + + minetest.swap_node(pos, {name = replace_dir, param2 = p2}) + + pos.y = pos.y - dir + minetest.swap_node(pos, {name = replace, param2 = p2}) + + if (minetest.get_meta(pos):get_int("right") ~= 0) == (params[1] ~= 3) then + minetest.sound_play("door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) + else + minetest.sound_play("door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) + end +end + +local function meseconify_door(name) + if not minetest.registered_items[name] then return end + + local function toggle_state1 (pos, node) + on_rightclick(pos, 1, name.."_t_1", name.."_b_2", name.."_t_2", {1,2,3,0}) + end + + local function toggle_state2 (pos, node) + on_rightclick(pos, 1, name.."_t_2", name.."_b_1", name.."_t_1", {3,0,1,2}) + end + + minetest.override_item(name.."_b_1", { + mesecons = {effector = { + action_on = toggle_state1, + action_off = toggle_state1, + rules = mesecon.rules.pplate + }}, + }) + + minetest.override_item(name.."_b_2", { + mesecons = {effector = { + action_on = toggle_state2, + action_off = toggle_state2, + rules = mesecon.rules.pplate + }}, + }) +end + +meseconify_door("doors:door_wood") +meseconify_door("doors:door_steel") +meseconify_door("doors:door_glass") +meseconify_door("doors:door_obsidian_glass") + +-- Trapdoor +local function trapdoor_switch(pos, node) + local state = minetest.get_meta(pos):get_int("state") + + if state == 1 then + minetest.sound_play("doors_door_close", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.set_node(pos, {name="doors:trapdoor", param2 = node.param2}) + else + minetest.sound_play("doors_door_open", {pos = pos, gain = 0.3, max_hear_distance = 10}) + minetest.set_node(pos, {name="doors:trapdoor_open", param2 = node.param2}) + end + + minetest.get_meta(pos):set_int("state", state == 1 and 0 or 1) +end + +if minetest.registered_nodes["doors:trapdoor"] then + minetest.override_item("doors:trapdoor", { + mesecons = {effector = { + action_on = trapdoor_switch, + action_off = trapdoor_switch + }}, + }) + + minetest.override_item("doors:trapdoor_open", { + mesecons = {effector = { + action_on = trapdoor_switch, + action_off = trapdoor_switch + }}, + }) +end diff --git a/mods/mesecons/mesecons_extrawires/corner.lua b/mods/mesecons/mesecons_extrawires/corner.lua new file mode 100644 index 0000000..003275a --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/corner.lua @@ -0,0 +1,83 @@ +local corner_nodebox = { + type = "fixed", + fixed = {{ -16/32-0.001, -17/32, -3/32, 0, -13/32, 3/32 }, + { -3/32, -17/32, -16/32+0.001, 3/32, -13/32, 3/32}} +} + +local corner_selectionbox = { + type = "fixed", + fixed = { -16/32-0.001, -18/32, -16/32, 5/32, -12/32, 5/32 }, +} + +local corner_get_rules = function (node) + local rules = + {{x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}} + + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + + return rules +end + +minetest.register_node("mesecons_extrawires:corner_on", { + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_curved_tb_on.png", + "jeija_insulated_wire_curved_tb_on.png^[transformR270", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png" + }, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + selection_box = corner_selectionbox, + node_box = corner_nodebox, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_extrawires:corner_off", + mesecons = {conductor = + { + state = mesecon.state.on, + rules = corner_get_rules, + offstate = "mesecons_extrawires:corner_off" + }} +}) + +minetest.register_node("mesecons_extrawires:corner_off", { + drawtype = "nodebox", + description = "Mesecon Corner", + tiles = { + "jeija_insulated_wire_curved_tb_off.png", + "jeija_insulated_wire_curved_tb_off.png^[transformR270", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png" + }, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + selection_box = corner_selectionbox, + node_box = corner_nodebox, + groups = {dig_immediate = 3}, + mesecons = {conductor = + { + state = mesecon.state.off, + rules = corner_get_rules, + onstate = "mesecons_extrawires:corner_on" + }} +}) + +minetest.register_craft({ + output = "mesecons_extrawires:corner_off 3", + recipe = { + {"", "", ""}, + {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", ""}, + {"", "mesecons_insulated:insulated_off", ""}, + } +}) diff --git a/mods/mesecons/mesecons_extrawires/crossover.lua b/mods/mesecons/mesecons_extrawires/crossover.lua new file mode 100644 index 0000000..4ecfc12 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/crossover.lua @@ -0,0 +1,176 @@ +function crossover_get_rules(node) + return { + {--first wire + {x=-1,y=0,z=0}, + {x=1,y=0,z=0}, + }, + {--second wire + {x=0,y=0,z=-1}, + {x=0,y=0,z=1}, + }, + } +end + +local crossover_states = { + "mesecons_extrawires:crossover_off", + "mesecons_extrawires:crossover_01", + "mesecons_extrawires:crossover_10", + "mesecons_extrawires:crossover_on", +} + +minetest.register_node("mesecons_extrawires:crossover_off", { + description = "Insulated Crossover", + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_crossing_tb_off.png", + "jeija_insulated_wire_crossing_tb_off.png", + "jeija_insulated_wire_ends_off.png" + }, + paramtype = "light", + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}}, + node_box = { + type = "fixed", + fixed = { + { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }, + { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 }, + { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 }, + { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 }, + { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 }, + { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 }, + }, + }, + groups = {dig_immediate=3, mesecon=3}, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_get_rules(), + } + }, +}) + +minetest.register_node("mesecons_extrawires:crossover_01", { + description = "You hacker you!", + drop = "mesecons_extrawires:crossover_off", + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_crossing_tb_01.png", + "jeija_insulated_wire_crossing_tb_01.png", + "jeija_insulated_wire_ends_01x.png", + "jeija_insulated_wire_ends_01x.png", + "jeija_insulated_wire_ends_01z.png", + "jeija_insulated_wire_ends_01z.png" + }, + paramtype = "light", + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}}, + node_box = { + type = "fixed", + fixed = { + { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }, + { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 }, + { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 }, + { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 }, + { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 }, + { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 }, + }, + }, + groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_get_rules(), + } + }, +}) + +minetest.register_node("mesecons_extrawires:crossover_10", { + description = "You hacker you!", + drop = "mesecons_extrawires:crossover_off", + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_crossing_tb_10.png", + "jeija_insulated_wire_crossing_tb_10.png", + "jeija_insulated_wire_ends_10x.png", + "jeija_insulated_wire_ends_10x.png", + "jeija_insulated_wire_ends_10z.png", + "jeija_insulated_wire_ends_10z.png" + }, + paramtype = "light", + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}}, + node_box = { + type = "fixed", + fixed = { + { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }, + { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 }, + { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 }, + { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 }, + { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 }, + { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 }, + }, + }, + groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_get_rules(), + } + }, +}) + +minetest.register_node("mesecons_extrawires:crossover_on", { + description = "You hacker you!", + drop = "mesecons_extrawires:crossover_off", + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_crossing_tb_on.png", + "jeija_insulated_wire_crossing_tb_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png" + }, + paramtype = "light", + walkable = false, + stack_max = 99, + selection_box = {type="fixed", fixed={-16/32-0.0001, -18/32, -16/32-0.001, 16/32+0.001, -5/32, 16/32+0.001}}, + node_box = { + type = "fixed", + fixed = { + { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }, + { -3/32, -17/32, -16/32-0.001, 3/32, -13/32, -6/32 }, + { -3/32, -13/32, -9/32, 3/32, -6/32, -6/32 }, + { -3/32, -9/32, -9/32, 3/32, -6/32, 9/32 }, + { -3/32, -13/32, 6/32, 3/32, -6/32, 9/32 }, + { -3/32, -17/32, 6/32, 3/32, -13/32, 16/32+0.001 }, + }, + }, + groups = {dig_immediate=3, mesecon=3, not_in_creative_inventory=1}, + mesecons = { + conductor = { + states = crossover_states, + rules = crossover_get_rules(), + } + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_extrawires:crossover_off", + recipe = { + "mesecons_insulated:insulated_off", + "mesecons_insulated:insulated_off", + }, +}) + +minetest.register_craft({ + type = "shapeless", + output = "mesecons_insulated:insulated_off 2", + recipe = { + "mesecons_extrawires:crossover_off", + }, +}) diff --git a/mods/mesecons/mesecons_extrawires/depends.txt b/mods/mesecons/mesecons_extrawires/depends.txt new file mode 100644 index 0000000..aca967d --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/depends.txt @@ -0,0 +1,2 @@ +default +mesecons diff --git a/mods/mesecons/mesecons_extrawires/init.lua b/mods/mesecons/mesecons_extrawires/init.lua new file mode 100644 index 0000000..b22f2e5 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/init.lua @@ -0,0 +1,5 @@ +dofile(minetest.get_modpath("mesecons_extrawires").."/crossover.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/tjunction.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/corner.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/vertical.lua"); +dofile(minetest.get_modpath("mesecons_extrawires").."/mesewire.lua"); diff --git a/mods/mesecons/mesecons_extrawires/mesewire.lua b/mods/mesecons/mesecons_extrawires/mesewire.lua new file mode 100644 index 0000000..150178c --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/mesewire.lua @@ -0,0 +1,30 @@ +local mesewire_rules = +{ + {x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}, +} + +minetest.override_item("default:mese", { + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:mese_powered", + rules = mesewire_rules + }} +}) + +minetest.register_node("mesecons_extrawires:mese_powered", { + tiles = {minetest.registered_nodes["default:mese"].tiles[1].."^[brighten"}, + is_ground_content = true, + groups = {cracky=1, not_in_creative_inventory = 1}, + sounds = default.node_sound_stone_defaults(), + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "default:mese", + rules = mesewire_rules + }}, + drop = "default:mese" +}) diff --git a/mods/mesecons/mesecons_extrawires/tjunction.lua b/mods/mesecons/mesecons_extrawires/tjunction.lua new file mode 100644 index 0000000..31777a1 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/tjunction.lua @@ -0,0 +1,84 @@ +local tjunction_nodebox = { + type = "fixed", + fixed = {{ -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 }, + { -3/32, -17/32, -16/32+0.001, 3/32, -13/32, -3/32},} +} + +local tjunction_selectionbox = { + type = "fixed", + fixed = { -16/32-0.001, -18/32, -16/32, 16/32+0.001, -12/32, 7/32 }, +} + +local tjunction_get_rules = function (node) + local rules = + {{x = 0, y = 0, z = 1}, + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = -1}} + + for i = 0, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + + return rules +end + +minetest.register_node("mesecons_extrawires:tjunction_on", { + drawtype = "nodebox", + tiles = { + "jeija_insulated_wire_tjunction_tb_on.png", + "jeija_insulated_wire_tjunction_tb_on.png^[transformR180", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png" + }, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + selection_box = tjunction_selectionbox, + node_box = tjunction_nodebox, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_extrawires:tjunction_off", + mesecons = {conductor = + { + state = mesecon.state.on, + rules = tjunction_get_rules, + offstate = "mesecons_extrawires:tjunction_off" + }} +}) + +minetest.register_node("mesecons_extrawires:tjunction_off", { + drawtype = "nodebox", + description = "T-junction", + tiles = { + "jeija_insulated_wire_tjunction_tb_off.png", + "jeija_insulated_wire_tjunction_tb_off.png^[transformR180", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png" + }, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + selection_box = tjunction_selectionbox, + node_box = tjunction_nodebox, + groups = {dig_immediate = 3}, + mesecons = {conductor = + { + state = mesecon.state.off, + rules = tjunction_get_rules, + onstate = "mesecons_extrawires:tjunction_on" + }} +}) + +minetest.register_craft({ + output = "mesecons_extrawires:tjunction_off 3", + recipe = { + {"", "", ""}, + {"mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off", "mesecons_insulated:insulated_off"}, + {"", "mesecons_insulated:insulated_off", ""}, + } +}) diff --git a/mods/mesecons/mesecons_extrawires/vertical.lua b/mods/mesecons/mesecons_extrawires/vertical.lua new file mode 100644 index 0000000..cac2ae2 --- /dev/null +++ b/mods/mesecons/mesecons_extrawires/vertical.lua @@ -0,0 +1,183 @@ +local vertical_box = { + type = "fixed", + fixed = {-1/16, -8/16, -1/16, 1/16, 8/16, 1/16} +} + +local top_box = { + type = "fixed", + fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}} +} + +local bottom_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, + {-1/16, -7/16, -1/16, 1/16, 8/16, 1/16}, + } +} + +local vertical_rules = { + {x=0, y=1, z=0}, + {x=0, y=-1, z=0} +} + +local top_rules = { + {x=1,y=0, z=0}, + {x=-1,y=0, z=0}, + {x=0,y=0, z=1}, + {x=0,y=0, z=-1}, + {x=0,y=-1, z=0} +} + +local bottom_rules = { + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=0, y=0, z=-1}, + {x=0, y=1, z=0}, + {x=0, y=2, z=0} -- receive power from pressure plate / detector / ... 2 nodes above +} + +local vertical_updatepos = function (pos) + local node = minetest.get_node(pos) + if minetest.registered_nodes[node.name] + and minetest.registered_nodes[node.name].is_vertical_conductor then + local node_above = minetest.get_node(mesecon.addPosRule(pos, vertical_rules[1])) + local node_below = minetest.get_node(mesecon.addPosRule(pos, vertical_rules[2])) + local namestate = minetest.registered_nodes[node.name].vertical_conductor_state + + local above = minetest.registered_nodes[node_above.name] + and minetest.registered_nodes[node_above.name].is_vertical_conductor + local below = minetest.registered_nodes[node_below.name] + and minetest.registered_nodes[node_below.name].is_vertical_conductor + + local basename = "mesecons_extrawires:vertical_" + if above and below then -- above and below: vertical mesecon + minetest.add_node(pos, {name = basename .. namestate}) + elseif above and not below then -- above only: bottom + minetest.add_node(pos, {name = basename .. "bottom_" .. namestate}) + elseif not above and below then -- below only: top + minetest.add_node(pos, {name = basename .. "top_" .. namestate}) + else -- no vertical wire above, no vertical wire below: use bottom + minetest.add_node(pos, {name = basename .. "bottom_" .. namestate}) + end + mesecon.update_autoconnect(pos) + end +end + +local vertical_update = function (pos, node) + vertical_updatepos(pos) -- this one + vertical_updatepos(mesecon.addPosRule(pos, vertical_rules[1])) -- above + vertical_updatepos(mesecon.addPosRule(pos, vertical_rules[2])) -- below +end + +-- Vertical wire +mesecon.register_node("mesecons_extrawires:vertical", { + description = "Vertical mesecon", + drawtype = "nodebox", + walkable = false, + paramtype = "light", + sunlight_propagates = true, + selection_box = vertical_box, + node_box = vertical_box, + is_vertical_conductor = true, + drop = "mesecons_extrawires:vertical_off", + after_place_node = vertical_update, + after_dig_node = vertical_update +},{ + tiles = {"mesecons_wire_off.png"}, + groups = {dig_immediate=3}, + vertical_conductor_state = "off", + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:vertical_on", + rules = vertical_rules, + }} +},{ + tiles = {"mesecons_wire_on.png"}, + groups = {dig_immediate=3, not_in_creative_inventory=1}, + vertical_conductor_state = "on", + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_extrawires:vertical_off", + rules = vertical_rules, + }} +}) + +-- Vertical wire top +mesecon.register_node("mesecons_extrawires:vertical_top", { + description = "Vertical mesecon", + drawtype = "nodebox", + walkable = false, + paramtype = "light", + sunlight_propagates = true, + groups = {dig_immediate=3, not_in_creative_inventory=1}, + selection_box = top_box, + node_box = top_box, + is_vertical_conductor = true, + drop = "mesecons_extrawires:vertical_off", + after_place_node = vertical_update, + after_dig_node = vertical_update +},{ + tiles = {"mesecons_wire_off.png"}, + vertical_conductor_state = "off", + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:vertical_top_on", + rules = top_rules, + }} +},{ + tiles = {"mesecons_wire_on.png"}, + vertical_conductor_state = "on", + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_extrawires:vertical_top_off", + rules = top_rules, + }} +}) + +-- Vertical wire bottom +mesecon.register_node("mesecons_extrawires:vertical_bottom", { + description = "Vertical mesecon", + drawtype = "nodebox", + walkable = false, + paramtype = "light", + sunlight_propagates = true, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + selection_box = bottom_box, + node_box = bottom_box, + is_vertical_conductor = true, + drop = "mesecons_extrawires:vertical_off", + after_place_node = vertical_update, + after_dig_node = vertical_update +},{ + tiles = {"mesecons_wire_off.png"}, + vertical_conductor_state = "off", + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_extrawires:vertical_bottom_on", + rules = bottom_rules, + }} +},{ + tiles = {"mesecons_wire_on.png"}, + vertical_conductor_state = "on", + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_extrawires:vertical_bottom_off", + rules = bottom_rules, + }} +}) + +minetest.register_craft({ + output = "mesecons_extrawires:vertical_off 3", + recipe = { + {"mesecons:wire_00000000_off"}, + {"mesecons:wire_00000000_off"}, + {"mesecons:wire_00000000_off"} + } +}) + +minetest.register_craft({ + output = "mesecons:wire_00000000_off", + recipe = {{"mesecons_extrawires:vertical_off"}} +}) diff --git a/mods/mesecons/mesecons_gates/depends.txt b/mods/mesecons/mesecons_gates/depends.txt new file mode 100644 index 0000000..f3e0392 --- /dev/null +++ b/mods/mesecons/mesecons_gates/depends.txt @@ -0,0 +1,6 @@ +mesecons +mesecons_microcontroller +mesecons_delayer + +mesecons_torch +mesecons_materials diff --git a/mods/mesecons/mesecons_gates/init.lua b/mods/mesecons/mesecons_gates/init.lua new file mode 100644 index 0000000..78a3e83 --- /dev/null +++ b/mods/mesecons/mesecons_gates/init.lua @@ -0,0 +1,124 @@ +local nodebox = { + type = "fixed", + fixed = {{-8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }}, +} + +local function gate_rotate_rules(node, rules) + for rotations = 0, node.param2 - 1 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + +local function gate_get_output_rules(node) + return gate_rotate_rules(node, {{x=1, y=0, z=0}}) +end + +local function gate_get_input_rules_oneinput(node) + return gate_rotate_rules(node, {{x=-1, y=0, z=0}}) +end + +local function gate_get_input_rules_twoinputs(node) + return gate_rotate_rules(node, {{x=0, y=0, z=1, name="input1"}, + {x=0, y=0, z=-1, name="input2"}}) +end + +local function set_gate(pos, node, state) + local gate = minetest.registered_nodes[node.name] + + if mesecon.do_overheat(pos) then + minetest.remove_node(pos) + mesecon.receptor_off(pos, gate_get_output_rules(node)) + minetest.add_item(pos, gate.drop) + elseif state then + minetest.swap_node(pos, {name = gate.onstate, param2=node.param2}) + mesecon.receptor_on(pos, gate_get_output_rules(node)) + else + minetest.swap_node(pos, {name = gate.offstate, param2=node.param2}) + mesecon.receptor_off(pos, gate_get_output_rules(node)) + end +end + +local function update_gate(pos, node, link, newstate) + local gate = minetest.registered_nodes[node.name] + + if gate.inputnumber == 1 then + set_gate(pos, node, gate.assess(newstate == "on")) + elseif gate.inputnumber == 2 then + local meta = minetest.get_meta(pos) + meta:set_int(link.name, newstate == "on" and 1 or 0) + + local val1 = meta:get_int("input1") == 1 + local val2 = meta:get_int("input2") == 1 + set_gate(pos, node, gate.assess(val1, val2)) + end +end + +function register_gate(name, inputnumber, assess, recipe) + local get_inputrules = inputnumber == 2 and gate_get_input_rules_twoinputs or + gate_get_input_rules_oneinput + local description = "Mesecons Logic Gate: "..name + + local basename = "mesecons_gates:"..name + mesecon.register_node(basename, { + description = description, + inventory_image = "jeija_gate_off.png^jeija_gate_"..name..".png", + paramtype = "light", + paramtype2 = "facedir", + drawtype = "nodebox", + drop = basename.."_off", + selection_box = nodebox, + node_box = nodebox, + walkable = true, + sounds = default.node_sound_stone_defaults(), + assess = assess, + onstate = basename.."_on", + offstate = basename.."_off", + inputnumber = inputnumber + },{ + tiles = {"jeija_microcontroller_bottom.png^".."jeija_gate_off.png^".. + "jeija_gate_"..name..".png"}, + groups = {dig_immediate = 2, overheat = 1}, + mesecons = { receptor = { + state = "off", + rules = gate_get_output_rules + }, effector = { + rules = get_inputrules, + action_change = update_gate + }} + },{ + tiles = {"jeija_microcontroller_bottom.png^".."jeija_gate_on.png^".. + "jeija_gate_"..name..".png"}, + groups = {dig_immediate = 2, not_in_creative_inventory = 1, overheat = 1}, + mesecons = { receptor = { + state = "on", + rules = gate_get_output_rules + }, effector = { + rules = get_inputrules, + action_change = update_gate + }} + }) + + minetest.register_craft({output = basename.."_off", recipe = recipe}) +end + +register_gate("diode", 1, function (input) return input end, + {{"mesecons:mesecon", "mesecons_torch:mesecon_torch_on", "mesecons_torch:mesecon_torch_on"}}) + +register_gate("not", 1, function (input) return not input end, + {{"mesecons:mesecon", "mesecons_torch:mesecon_torch_on", "mesecons:mesecon"}}) + +register_gate("and", 2, function (val1, val2) return val1 and val2 end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons_materials:silicon", "mesecons:mesecon"}, + {"mesecons:mesecon", "", ""}}) + +register_gate("nand", 2, function (val1, val2) return not (val1 and val2) end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons_materials:silicon", "mesecons_torch:mesecon_torch_on"}, + {"mesecons:mesecon", "", ""}}) + +register_gate("xor", 2, function (val1, val2) return (val1 or val2) and not (val1 and val2) end, + {{"mesecons:mesecon", "", ""}, + {"", "mesecons_materials:silicon", "mesecons_materials:silicon"}, + {"mesecons:mesecon", "", ""}}) diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_and.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_and.png new file mode 100644 index 0000000..0ddc043 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_and.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png new file mode 100644 index 0000000..ffa403f Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_diode.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png new file mode 100644 index 0000000..0e4294e Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_nand.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_not.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_not.png new file mode 100644 index 0000000..939fb76 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_not.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_off.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_off.png new file mode 100644 index 0000000..44017b0 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_off.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_on.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_on.png new file mode 100644 index 0000000..47028a8 Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_on.png differ diff --git a/mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png b/mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png new file mode 100644 index 0000000..afbd6ab Binary files /dev/null and b/mods/mesecons/mesecons_gates/textures/jeija_gate_xor.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/depends.txt b/mods/mesecons/mesecons_hydroturbine/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_hydroturbine/init.lua b/mods/mesecons/mesecons_hydroturbine/init.lua new file mode 100644 index 0000000..d1c08f7 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/init.lua @@ -0,0 +1,92 @@ +-- HYDRO_TURBINE +-- Water turbine: +-- Active if flowing >water< above it +-- (does not work with other liquids) + +minetest.register_node("mesecons_hydroturbine:hydro_turbine_off", { + drawtype = "mesh", + mesh = "jeija_hydro_turbine.obj", + tiles = { + "jeija_hydro_turbine_sides_off.png", + "jeija_hydro_turbine_top_bottom.png", + "jeija_hydro_turbine_turbine_top_bottom.png", + "jeija_hydro_turbine_turbine_misc.png" + }, + inventory_image = "jeija_hydro_turbine_inv.png", + wield_scale = {x=0.75, y=0.75, z=0.75}, + groups = {dig_immediate=2}, + description="Water Turbine", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }, + }, + sounds = default.node_sound_stone_defaults(), + mesecons = {receptor = { + state = mesecon.state.off + }} +}) + +minetest.register_node("mesecons_hydroturbine:hydro_turbine_on", { + drawtype = "mesh", + mesh = "jeija_hydro_turbine.obj", + wield_scale = {x=0.75, y=0.75, z=0.75}, + tiles = { + "jeija_hydro_turbine_sides_on.png", + "jeija_hydro_turbine_top_bottom.png", + "jeija_hydro_turbine_turbine_top_bottom.png", + "jeija_hydro_turbine_turbine_misc.png" + }, + inventory_image = "jeija_hydro_turbine_inv.png", + drop = "mesecons_hydroturbine:hydro_turbine_off 1", + groups = {dig_immediate=2,not_in_creative_inventory=1}, + description="Water Turbine", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = { -0.5, -0.5, -0.5, 0.5, 1.5, 0.5 }, + }, + sounds = default.node_sound_stone_defaults(), + mesecons = {receptor = { + state = mesecon.state.on + }} +}) + + +minetest.register_abm({ +nodenames = {"mesecons_hydroturbine:hydro_turbine_off"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local waterpos={x=pos.x, y=pos.y+1, z=pos.z} + if minetest.get_node(waterpos).name=="default:water_flowing" then + minetest.add_node(pos, {name="mesecons_hydroturbine:hydro_turbine_on"}) + nodeupdate(pos) + mesecon.receptor_on(pos) + end + end, +}) + +minetest.register_abm({ +nodenames = {"mesecons_hydroturbine:hydro_turbine_on"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local waterpos={x=pos.x, y=pos.y+1, z=pos.z} + if minetest.get_node(waterpos).name~="default:water_flowing" then + minetest.add_node(pos, {name="mesecons_hydroturbine:hydro_turbine_off"}) + nodeupdate(pos) + mesecon.receptor_off(pos) + end + end, +}) + +minetest.register_craft({ + output = "mesecons_hydroturbine:hydro_turbine_off 2", + recipe = { + {"","default:stick", ""}, + {"default:stick", "default:steel_ingot", "default:stick"}, + {"","default:stick", ""}, + } +}) + diff --git a/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine.obj b/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine.obj new file mode 100644 index 0000000..84a1a44 --- /dev/null +++ b/mods/mesecons/mesecons_hydroturbine/models/jeija_hydro_turbine.obj @@ -0,0 +1,429 @@ +# Blender v2.73 (sub 0) OBJ File: 'mesecons-water-turbine.blend' +# www.blender.org +o Cylinder.002_Cylinder.003 +v 0.000000 0.500000 -0.150000 +v 0.000000 0.562500 -0.150000 +v 0.106066 0.500000 -0.106066 +v 0.106066 0.562500 -0.106066 +v 0.150000 0.500000 0.000000 +v 0.150000 0.562500 0.000000 +v 0.106066 0.500000 0.106066 +v 0.106066 0.562500 0.106066 +v -0.000000 0.500000 0.150000 +v -0.000000 0.562500 0.150000 +v -0.106066 0.500000 0.106066 +v -0.106066 0.562500 0.106066 +v -0.150000 0.500000 -0.000000 +v -0.150000 0.562500 -0.000000 +v -0.106066 0.500000 -0.106066 +v -0.106066 0.562500 -0.106066 +v 0.097545 0.625000 -0.490393 +v -0.097545 0.625000 -0.490393 +v -0.277785 0.625000 -0.415735 +v -0.415735 0.625000 -0.277785 +v -0.490393 0.625000 -0.097545 +v -0.490393 0.625000 0.097545 +v -0.415735 0.625000 0.277785 +v -0.277785 0.625000 0.415735 +v -0.097545 0.625000 0.490393 +v 0.097545 0.625000 0.490393 +v 0.277785 0.625000 0.415735 +v 0.415735 0.625000 0.277785 +v 0.490393 0.625000 0.097545 +v 0.490393 0.625000 -0.097545 +v 0.415735 0.625000 -0.277785 +v 0.277785 0.625000 -0.415735 +v 0.097545 0.656250 -0.490393 +v -0.097545 0.656250 -0.490393 +v -0.277785 0.656250 -0.415735 +v -0.415735 0.656250 -0.277785 +v -0.490393 0.656250 -0.097545 +v -0.490393 0.656250 0.097545 +v -0.415735 0.656250 0.277785 +v -0.277785 0.656250 0.415735 +v -0.097545 0.656250 0.490393 +v 0.097545 0.656250 0.490393 +v 0.277785 0.656250 0.415735 +v 0.415735 0.656250 0.277785 +v 0.490393 0.656250 0.097545 +v 0.490393 0.656250 -0.097545 +v 0.415735 0.656250 -0.277785 +v 0.277785 0.656250 -0.415735 +v 0.116233 0.634645 -0.436100 +v 0.116233 1.482640 -0.436100 +v 0.299524 0.634645 -0.186124 +v 0.299524 1.482640 -0.186124 +v 0.343405 0.634645 0.080186 +v 0.343405 1.482640 0.080186 +v 0.186124 0.634645 0.299524 +v 0.186124 1.482640 0.299524 +v -0.080186 0.634645 0.343405 +v -0.080186 1.482640 0.343405 +v -0.299524 0.634645 0.186124 +v -0.299524 1.482640 0.186124 +v -0.343405 0.634645 -0.080186 +v -0.343405 1.482640 -0.080186 +v -0.186124 0.634645 -0.299524 +v -0.186124 1.482640 -0.299524 +v 0.080186 0.634645 -0.343405 +v 0.080186 1.482640 -0.343405 +v 0.390559 1.482640 -0.226180 +v 0.390559 0.634645 -0.226180 +v 0.436100 1.482640 0.116233 +v 0.436100 0.634645 0.116233 +v 0.226180 1.482640 0.390559 +v 0.226180 0.634645 0.390559 +v -0.116233 1.482640 0.436100 +v -0.116233 0.634645 0.436100 +v -0.390559 1.482640 0.226180 +v -0.390559 0.634645 0.226180 +v -0.436100 1.482640 -0.116233 +v -0.436100 0.634645 -0.116233 +v -0.226180 1.482640 -0.390559 +v -0.226180 0.634645 -0.390559 +v 0.108975 0.634645 -0.430778 +v 0.292266 0.634645 -0.180802 +v 0.292266 1.482640 -0.180802 +v 0.108975 1.482640 -0.430778 +v 0.381664 0.634645 -0.227549 +v 0.334509 0.634645 0.078817 +v 0.334509 1.482640 0.078817 +v 0.381664 1.482640 -0.227549 +v 0.430778 0.634645 0.108975 +v 0.180802 0.634645 0.292266 +v 0.180802 1.482640 0.292266 +v 0.430778 1.482640 0.108975 +v 0.227549 0.634645 0.381664 +v -0.078817 0.634645 0.334509 +v -0.078817 1.482640 0.334509 +v 0.227549 1.482640 0.381664 +v -0.108975 0.634645 0.430778 +v -0.292266 0.634645 0.180802 +v -0.292266 1.482640 0.180802 +v -0.108975 1.482640 0.430778 +v -0.381664 0.634645 0.227549 +v -0.334509 0.634645 -0.078817 +v -0.334509 1.482640 -0.078817 +v -0.381664 1.482640 0.227549 +v -0.227549 0.634645 -0.381663 +v 0.078817 0.634645 -0.334509 +v 0.078817 1.482640 -0.334509 +v -0.227549 1.482640 -0.381663 +v -0.430779 0.634645 -0.108975 +v -0.180802 0.634645 -0.292266 +v -0.180802 1.482640 -0.292266 +v -0.430779 1.482640 -0.108975 +v 0.097545 1.500000 -0.490393 +v -0.097545 1.500000 -0.490393 +v -0.277785 1.500000 -0.415735 +v -0.415735 1.500000 -0.277785 +v -0.490393 1.500000 -0.097545 +v -0.490393 1.500000 0.097545 +v -0.415735 1.500000 0.277785 +v -0.277785 1.500000 0.415735 +v -0.097545 1.500000 0.490393 +v 0.097545 1.500000 0.490393 +v 0.277785 1.500000 0.415735 +v 0.415735 1.500000 0.277785 +v 0.490393 1.500000 0.097545 +v 0.490393 1.500000 -0.097545 +v 0.415735 1.500000 -0.277785 +v 0.277785 1.500000 -0.415735 +v 0.097545 1.468750 -0.490393 +v -0.097545 1.468750 -0.490393 +v -0.277785 1.468750 -0.415735 +v -0.415735 1.468750 -0.277785 +v -0.490393 1.468750 -0.097545 +v -0.490393 1.468750 0.097545 +v -0.415735 1.468750 0.277785 +v -0.277785 1.468750 0.415735 +v -0.097545 1.468750 0.490393 +v 0.097545 1.468750 0.490393 +v 0.277785 1.468750 0.415735 +v 0.415735 1.468750 0.277785 +v 0.490393 1.468750 0.097545 +v 0.490393 1.468750 -0.097545 +v 0.415735 1.468750 -0.277785 +v 0.277785 1.468750 -0.415735 +v 0.025624 0.559630 -0.061863 +v 0.025624 1.481372 -0.061863 +v 0.061863 0.559630 -0.025624 +v 0.061863 1.481372 -0.025624 +v 0.061863 0.559630 0.025624 +v 0.061863 1.481372 0.025624 +v 0.025624 0.559630 0.061863 +v 0.025624 1.481372 0.061863 +v -0.025624 0.559630 0.061863 +v -0.025624 1.481372 0.061863 +v -0.061863 0.559630 0.025624 +v -0.061863 1.481372 0.025624 +v -0.061863 0.559630 -0.025624 +v -0.061863 1.481372 -0.025624 +v -0.025624 0.559630 -0.061863 +v -0.025624 1.481372 -0.061863 +v 0.499775 -0.499550 -0.499775 +v 0.499775 -0.499550 0.499775 +v -0.499775 -0.499550 0.499775 +v -0.499775 -0.499550 -0.499775 +v 0.499775 0.500000 -0.499775 +v 0.499775 0.500000 0.499775 +v -0.499775 0.500000 0.499775 +v -0.499775 0.500000 -0.499775 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 0.400544 1.000000 +vt 0.599456 1.000000 +vt 0.783227 0.923880 +vt 0.923880 0.783227 +vt 1.000000 0.599456 +vt 1.000000 0.400544 +vt 0.923880 0.216773 +vt 0.783227 0.076120 +vt 0.599456 0.000000 +vt 0.400544 0.000000 +vt 0.216773 0.076121 +vt 0.076120 0.216773 +vt 0.000000 0.400544 +vt 0.000000 0.599456 +vt 0.076121 0.783227 +vt 0.216773 0.923880 +vt 0.500000 0.343750 +vt 0.531250 0.343750 +vt 0.531250 0.375000 +vt 0.500000 0.375000 +vt 0.531250 0.406250 +vt 0.500000 0.406250 +vt 0.500000 0.531250 +vt 0.531250 0.531250 +vt 0.531250 0.500000 +vt 0.500000 0.500000 +vt 0.531250 0.468750 +vt 0.500000 0.468750 +vt 0.531250 0.437500 +vt 0.500000 0.437500 +vt 0.593750 0.468750 +vt 0.625000 0.437500 +vt 0.656250 0.437500 +vt 0.687500 0.468750 +vt 0.687500 0.500000 +vt 0.656250 0.531250 +vt 0.625000 0.531250 +vt 0.593750 0.500000 +vt 0.500000 0.312500 +vt 0.531250 0.312500 +vt 0.500000 0.281250 +vt 0.531250 0.281250 +vt 0.156250 0.750000 +vt 0.156250 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.750000 +vt 0.156250 0.625000 +vt 0.125000 0.625000 +vt 0.156250 0.500000 +vt 0.125000 0.500000 +vt 0.156250 0.375000 +vt 0.125000 0.375000 +vt 0.156250 0.250000 +vt 0.125000 0.250000 +vt 0.250000 0.500000 +vt 0.250000 0.625000 +vt 0.218750 0.625000 +vt 0.218750 0.500000 +vt 0.156250 0.125000 +vt 0.125000 0.125000 +vt 0.156250 -0.000000 +vt 0.125000 -0.000000 +vt 0.250000 0.375000 +vt 0.218750 0.375000 +vt 0.250000 0.875000 +vt 0.250000 1.000000 +vt 0.218750 1.000000 +vt 0.218750 0.875000 +vt 0.250000 0.250000 +vt 0.218750 0.250000 +vt 0.250000 0.750000 +vt 0.218750 0.750000 +vt 0.250000 0.125000 +vt 0.218750 0.125000 +vt 0.250000 -0.000000 +vt 0.218750 -0.000000 +vt 0.156250 1.000000 +vt 0.125000 1.000000 +vt 0.781250 0.593750 +vt 0.781250 0.968750 +vt 0.656250 0.968750 +vt 0.656250 0.593750 +vt 0.625000 0.593750 +vt 0.625000 0.968750 +vt 0.500000 0.968750 +vt 0.500000 0.593750 +vt 0.406250 -0.000000 +vt 0.437500 -0.000000 +vt 0.437500 0.125000 +vt 0.406250 0.125000 +vt 0.312500 0.875000 +vt 0.343750 0.875000 +vt 0.343750 1.000000 +vt 0.312500 1.000000 +vt 0.312500 0.750000 +vt 0.343750 0.750000 +vt 0.312500 0.625000 +vt 0.343750 0.625000 +vt 0.312500 0.500000 +vt 0.343750 0.500000 +vt 0.406250 0.750000 +vt 0.437500 0.750000 +vt 0.437500 0.875000 +vt 0.406250 0.875000 +vt 0.312500 0.375000 +vt 0.343750 0.375000 +vt 0.312500 0.250000 +vt 0.343750 0.250000 +vt 0.406250 0.625000 +vt 0.437500 0.625000 +vt 0.312500 0.125000 +vt 0.343750 0.125000 +vt 0.406250 0.500000 +vt 0.437500 0.500000 +vt 0.312500 -0.000000 +vt 0.343750 -0.000000 +vt 0.406250 0.375000 +vt 0.437500 0.375000 +vt 0.437500 1.000000 +vt 0.406250 1.000000 +vt 0.406250 0.250000 +vt 0.437500 0.250000 +vt 0.031250 0.937500 +vt 0.062500 0.937500 +vt 0.062500 0.968750 +vt 0.031250 0.968750 +vt 0.031250 0.718750 +vt 0.062500 0.718750 +vt 0.062500 0.750000 +vt 0.031250 0.750000 +vt 0.062500 0.781250 +vt 0.031250 0.781250 +vt 0.062500 0.812500 +vt 0.031250 0.812500 +vt 0.062500 0.843750 +vt 0.031250 0.843750 +vt 0.062500 0.875000 +vt 0.031250 0.875000 +vt 0.031250 0.906250 +vt 0.062500 0.906250 +vn 1.000000 0.000000 0.000000 +vn -0.000000 -0.000000 1.000000 +vn -1.000000 -0.000000 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 0.000000 +vn 0.382700 0.000000 -0.923900 +vn 0.923900 0.000000 -0.382700 +vn 0.923900 0.000000 0.382700 +vn 0.382700 0.000000 0.923900 +vn -0.382700 0.000000 0.923900 +vn -0.923900 0.000000 0.382700 +vn -0.382700 0.000000 -0.923900 +vn -0.923900 0.000000 -0.382700 +vn 0.707100 0.000000 0.707100 +vn -0.707100 0.000000 0.707100 +vn 0.707100 0.000000 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.806400 0.000000 -0.591300 +vn 0.988400 0.000000 0.152100 +vn 0.591300 0.000000 0.806400 +vn -0.152100 0.000000 0.988400 +vn -0.806400 0.000000 0.591300 +vn -0.988400 0.000000 -0.152100 +vn 0.152100 0.000000 -0.988400 +vn -0.591300 0.000000 -0.806400 +g Cylinder.002_Cylinder.003_sides +s off +f 161/1/1 165/2/1 166/3/1 162/4/1 +f 162/1/2 166/2/2 167/3/2 163/4/2 +f 163/4/3 167/3/3 168/2/3 164/1/3 +f 165/2/4 161/1/4 164/4/4 168/3/4 +g Cylinder.002_Cylinder.003_top-bottom +f 161/2/5 162/1/5 163/4/5 164/3/5 +f 165/2/6 168/3/6 167/4/6 166/1/6 +g Cylinder.002_Cylinder.003_turbine-top-bottom +f 130/5/5 129/6/5 144/7/5 143/8/5 142/9/5 141/10/5 140/11/5 139/12/5 138/13/5 137/14/5 136/15/5 135/16/5 134/17/5 133/18/5 132/19/5 131/20/5 +f 18/5/5 17/6/5 32/7/5 31/8/5 30/9/5 29/10/5 28/11/5 27/12/5 26/13/5 25/14/5 24/15/5 23/16/5 22/17/5 21/18/5 20/19/5 19/20/5 +f 33/6/6 34/5/6 35/20/6 36/19/6 37/18/6 38/17/6 39/16/6 40/15/6 41/14/6 42/13/6 43/12/6 44/11/6 45/10/6 46/9/6 47/8/6 48/7/6 +f 113/6/6 114/5/6 115/20/6 116/19/6 117/18/6 118/17/6 119/16/6 120/15/6 121/14/6 122/13/6 123/12/6 124/11/6 125/10/6 126/9/6 127/8/6 128/7/6 +g Cylinder.002_Cylinder.003_turbine-blades-etc +f 1/21/7 2/22/7 4/23/7 3/24/7 +f 3/24/8 4/23/8 6/25/8 5/26/8 +f 5/27/9 6/28/9 8/29/9 7/30/9 +f 7/30/10 8/29/10 10/31/10 9/32/10 +f 9/32/11 10/31/11 12/33/11 11/34/11 +f 11/34/12 12/33/12 14/25/12 13/26/12 +f 4/35/6 2/36/6 16/37/6 14/38/6 12/39/6 10/40/6 8/41/6 6/42/6 +f 15/43/13 16/44/13 2/22/13 1/21/13 +f 13/45/14 14/46/14 16/44/14 15/43/14 +f 27/47/15 28/48/15 44/49/15 43/50/15 +f 26/51/10 27/47/10 43/50/10 42/52/10 +f 25/53/2 26/51/2 42/52/2 41/54/2 +f 24/55/11 25/53/11 41/54/11 40/56/11 +f 23/57/16 24/55/16 40/56/16 39/58/16 +f 17/59/4 18/60/4 34/61/4 33/62/4 +f 22/63/12 23/57/12 39/58/12 38/64/12 +f 21/65/3 22/63/3 38/64/3 37/66/3 +f 32/67/7 17/59/7 33/62/7 48/68/7 +f 20/69/14 21/70/14 37/71/14 36/72/14 +f 31/73/17 32/67/17 48/68/17 47/74/17 +f 19/75/18 20/69/18 36/72/18 35/76/18 +f 30/77/8 31/73/8 47/74/8 46/78/8 +f 18/60/13 19/75/13 35/76/13 34/61/13 +f 29/79/1 30/77/1 46/78/1 45/80/1 +f 28/48/9 29/81/9 45/82/9 44/49/9 +f 49/83/19 50/84/19 52/85/19 51/86/19 +f 68/86/20 67/83/20 54/84/20 53/85/20 +f 70/83/21 69/84/21 56/85/21 55/86/21 +f 72/84/22 71/85/22 58/86/22 57/83/22 +f 74/83/23 73/84/23 60/85/23 59/86/23 +f 76/83/24 75/84/24 62/85/24 61/86/24 +f 80/84/25 79/85/25 66/86/25 65/83/25 +f 78/83/26 77/84/26 64/85/26 63/86/26 +f 81/87/23 82/88/23 83/89/23 84/90/23 +f 85/88/24 86/89/24 87/90/24 88/87/24 +f 89/89/26 90/90/26 91/87/26 92/88/26 +f 93/90/25 94/87/25 95/88/25 96/89/25 +f 97/90/19 98/87/19 99/88/19 100/89/19 +f 101/87/20 102/88/20 103/89/20 104/90/20 +f 105/90/22 106/87/22 107/88/22 108/89/22 +f 109/89/21 110/90/21 111/87/21 112/88/21 +f 75/88/22 76/87/22 101/86/22 104/85/22 +f 71/88/20 72/87/20 93/86/20 96/85/20 +f 67/86/25 68/85/25 85/88/25 88/87/25 +f 79/86/24 80/85/24 105/88/24 108/87/24 +f 77/88/23 78/87/23 109/86/23 112/85/23 +f 73/88/21 74/87/21 97/86/21 100/85/21 +f 69/86/19 70/85/19 89/88/19 92/87/19 +f 50/86/26 49/85/26 81/88/26 84/87/26 +f 123/91/15 139/92/15 140/93/15 124/94/15 +f 122/95/10 138/96/10 139/97/10 123/98/10 +f 121/99/2 137/100/2 138/96/2 122/95/2 +f 120/101/11 136/102/11 137/100/11 121/99/11 +f 119/103/16 135/104/16 136/102/16 120/101/16 +f 113/105/4 129/106/4 130/107/4 114/108/4 +f 118/109/12 134/110/12 135/104/12 119/103/12 +f 117/111/3 133/112/3 134/110/3 118/109/3 +f 128/113/7 144/114/7 129/106/7 113/105/7 +f 116/115/14 132/116/14 133/112/14 117/111/14 +f 127/117/17 143/118/17 144/114/17 128/113/17 +f 115/119/18 131/120/18 132/116/18 116/115/18 +f 126/121/8 142/122/8 143/118/8 127/117/8 +f 114/108/13 130/107/13 131/123/13 115/124/13 +f 125/125/1 141/126/1 142/122/1 126/121/1 +f 124/94/9 140/93/9 141/126/9 125/125/9 +f 145/127/17 146/128/17 148/129/17 147/130/17 +f 147/131/1 148/132/1 150/133/1 149/134/1 +f 149/134/15 150/133/15 152/135/15 151/136/15 +f 151/136/2 152/135/2 154/137/2 153/138/2 +f 153/138/16 154/137/16 156/139/16 155/140/16 +f 155/140/3 156/139/3 158/141/3 157/142/3 +f 159/143/4 160/144/4 146/128/4 145/127/4 +f 157/142/18 158/141/18 160/144/18 159/143/18 diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png new file mode 100644 index 0000000..4cc9f20 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_inv.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png new file mode 100644 index 0000000..89975e8 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_off.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png new file mode 100644 index 0000000..759388a Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_sides_on.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png new file mode 100644 index 0000000..37d634f Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_top_bottom.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc.png new file mode 100644 index 0000000..45a720b Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_misc.png differ diff --git a/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom.png b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom.png new file mode 100644 index 0000000..fa76591 Binary files /dev/null and b/mods/mesecons/mesecons_hydroturbine/textures/jeija_hydro_turbine_turbine_top_bottom.png differ diff --git a/mods/mesecons/mesecons_insulated/depends.txt b/mods/mesecons/mesecons_insulated/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_insulated/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_insulated/init.lua b/mods/mesecons/mesecons_insulated/init.lua new file mode 100644 index 0000000..c6fc05e --- /dev/null +++ b/mods/mesecons/mesecons_insulated/init.lua @@ -0,0 +1,80 @@ +function insulated_wire_get_rules(node) + local rules = {{x = 1, y = 0, z = 0}, + {x =-1, y = 0, z = 0}} + if node.param2 == 1 or node.param2 == 3 then + return mesecon.rotate_rules_right(rules) + end + return rules +end + +minetest.register_node("mesecons_insulated:insulated_on", { + drawtype = "nodebox", + description = "Insulated Mesecon", + tiles = { + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_ends_on.png", + "jeija_insulated_wire_sides_on.png", + "jeija_insulated_wire_sides_on.png" + }, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -16/32-0.001, -18/32, -7/32, 16/32+0.001, -12/32, 7/32 } + }, + node_box = { + type = "fixed", + fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 } + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_insulated:insulated_off", + mesecons = {conductor = { + state = mesecon.state.on, + offstate = "mesecons_insulated:insulated_off", + rules = insulated_wire_get_rules + }} +}) + +minetest.register_node("mesecons_insulated:insulated_off", { + drawtype = "nodebox", + description = "Insulated Mesecon", + tiles = { + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_ends_off.png", + "jeija_insulated_wire_sides_off.png", + "jeija_insulated_wire_sides_off.png" + }, + paramtype = "light", + paramtype2 = "facedir", + walkable = false, + sunlight_propagates = true, + selection_box = { + type = "fixed", + fixed = { -16/32-0.001, -18/32, -7/32, 16/32+0.001, -12/32, 7/32 } + }, + node_box = { + type = "fixed", + fixed = { -16/32-0.001, -17/32, -3/32, 16/32+0.001, -13/32, 3/32 } + }, + groups = {dig_immediate = 3}, + mesecons = {conductor = { + state = mesecon.state.off, + onstate = "mesecons_insulated:insulated_on", + rules = insulated_wire_get_rules + }} +}) + +minetest.register_craft({ + output = "mesecons_insulated:insulated_off 3", + recipe = { + {"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, + {"mesecons:wire_00000000_off", "mesecons:wire_00000000_off", "mesecons:wire_00000000_off"}, + {"mesecons_materials:fiber", "mesecons_materials:fiber", "mesecons_materials:fiber"}, + } +}) diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_01.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_01.png new file mode 100644 index 0000000..d872b2b Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_01.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_10.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_10.png new file mode 100644 index 0000000..ae06dea Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_10.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_off.png new file mode 100644 index 0000000..41b5ff4 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_on.png new file mode 100644 index 0000000..154288b Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_crossing_tb_on.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_curved_tb_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_curved_tb_off.png new file mode 100644 index 0000000..85ca90b Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_curved_tb_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_curved_tb_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_curved_tb_on.png new file mode 100644 index 0000000..772d9a6 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_curved_tb_on.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_01x.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_01x.png new file mode 100644 index 0000000..b742152 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_01x.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_01z.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_01z.png new file mode 100644 index 0000000..497a467 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_01z.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_10x.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_10x.png new file mode 100644 index 0000000..d407cff Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_10x.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_10z.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_10z.png new file mode 100644 index 0000000..830d390 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_10z.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png new file mode 100644 index 0000000..89a8385 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png new file mode 100644 index 0000000..75cf435 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_ends_on.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png new file mode 100644 index 0000000..db33f14 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png new file mode 100644 index 0000000..f76e9a8 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_sides_on.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png new file mode 100644 index 0000000..a897b29 Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_off.png differ diff --git a/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png new file mode 100644 index 0000000..8fc312b Binary files /dev/null and b/mods/mesecons/mesecons_insulated/textures/jeija_insulated_wire_tjunction_tb_on.png differ diff --git a/mods/mesecons/mesecons_lamp/depends.txt b/mods/mesecons/mesecons_lamp/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_lamp/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_lamp/init.lua b/mods/mesecons/mesecons_lamp/init.lua new file mode 100644 index 0000000..362453c --- /dev/null +++ b/mods/mesecons/mesecons_lamp/init.lua @@ -0,0 +1,61 @@ +-- MESELAMPS +-- A lamp is "is an electrical device used to create artificial light" (wikipedia) +-- guess what? + +mesecon_lamp_box = { + type = "wallmounted", + wall_top = {-0.3125,0.375,-0.3125,0.3125,0.5,0.3125}, + wall_bottom = {-0.3125,-0.5,-0.3125,0.3125,-0.375,0.3125}, + wall_side = {-0.375,-0.3125,-0.3125,-0.5,0.3125,0.3125}, +} + +minetest.register_node("mesecons_lamp:lamp_on", { + drawtype = "nodebox", + tiles = {"jeija_meselamp_on.png"}, + paramtype = "light", + paramtype2 = "wallmounted", + legacy_wallmounted = true, + sunlight_propagates = true, + walkable = true, + light_source = default.LIGHT_MAX, + node_box = mesecon_lamp_box, + selection_box = mesecon_lamp_box, + groups = {dig_immediate=3,not_in_creative_inventory=1, mesecon_effector_on = 1}, + drop="mesecons_lamp:lamp_off 1", + sounds = default.node_sound_glass_defaults(), + mesecons = {effector = { + action_off = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lamp:lamp_off", param2 = node.param2}) + end + }} +}) + +minetest.register_node("mesecons_lamp:lamp_off", { + drawtype = "nodebox", + tiles = {"jeija_meselamp_off.png"}, + inventory_image = "jeija_meselamp.png", + wield_image = "jeija_meselamp.png", + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = true, + node_box = mesecon_lamp_box, + selection_box = mesecon_lamp_box, + groups = {dig_immediate=3, mesecon_receptor_off = 1, mesecon_effector_off = 1}, + description="Meselamp", + sounds = default.node_sound_glass_defaults(), + mesecons = {effector = { + action_on = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lamp:lamp_on", param2 = node.param2}) + end + }} +}) + +minetest.register_craft({ + output = "mesecons_lamp:lamp_off 1", + recipe = { + {"", "default:glass", ""}, + {"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"}, + {"", "default:glass", ""}, + } +}) diff --git a/mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png new file mode 100644 index 0000000..5456ee9 Binary files /dev/null and b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp.png differ diff --git a/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png new file mode 100644 index 0000000..67bd7fd Binary files /dev/null and b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_off.png differ diff --git a/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png new file mode 100644 index 0000000..2316e00 Binary files /dev/null and b/mods/mesecons/mesecons_lamp/textures/jeija_meselamp_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/depends.txt b/mods/mesecons/mesecons_lightstone/depends.txt new file mode 100644 index 0000000..f9705e0 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/depends.txt @@ -0,0 +1,2 @@ +mesecons +dye diff --git a/mods/mesecons/mesecons_lightstone/init.lua b/mods/mesecons/mesecons_lightstone/init.lua new file mode 100644 index 0000000..da7cc41 --- /dev/null +++ b/mods/mesecons/mesecons_lightstone/init.lua @@ -0,0 +1,60 @@ +local lightstone_rules = { + {x=0, y=0, z=-1}, + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=1, y=1, z=0}, + {x=1, y=-1, z=0}, + {x=-1, y=1, z=0}, + {x=-1, y=-1, z=0}, + {x=0, y=1, z=1}, + {x=0, y=-1, z=1}, + {x=0, y=1, z=-1}, + {x=0, y=-1, z=-1}, + {x=0, y=-1, z=0}, +} + +function mesecon.lightstone_add(name, base_item, texture_off, texture_on) + minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_off", { + tiles = {texture_off}, + groups = {cracky=2, mesecon_effector_off = 1, mesecon = 2}, + description=name.." Lightstone", + sounds = default.node_sound_stone_defaults(), + mesecons = {effector = { + rules = lightstone_rules, + action_on = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lightstone:lightstone_" .. name .. "_on", param2 = node.param2}) + end, + }} + }) + minetest.register_node("mesecons_lightstone:lightstone_" .. name .. "_on", { + tiles = {texture_on}, + groups = {cracky=2,not_in_creative_inventory=1, mesecon = 2}, + drop = "mesecons_lightstone:lightstone_" .. name .. "_off", + light_source = default.LIGHT_MAX-2, + sounds = default.node_sound_stone_defaults(), + mesecons = {effector = { + rules = lightstone_rules, + action_off = function (pos, node) + minetest.swap_node(pos, {name = "mesecons_lightstone:lightstone_" .. name .. "_off", param2 = node.param2}) + end, + }} + }) + + minetest.register_craft({ + output = "mesecons_lightstone:lightstone_" .. name .. "_off", + recipe = { + {"",base_item,""}, + {base_item,"default:torch",base_item}, + {"","group:mesecon_conductor_craftable",""} + } + }) +end + + +mesecon.lightstone_add("red", "dye:red", "jeija_lightstone_red_off.png", "jeija_lightstone_red_on.png") +mesecon.lightstone_add("green", "dye:green", "jeija_lightstone_green_off.png", "jeija_lightstone_green_on.png") +mesecon.lightstone_add("blue", "dye:blue", "jeija_lightstone_blue_off.png", "jeija_lightstone_blue_on.png") +mesecon.lightstone_add("gray", "dye:grey", "jeija_lightstone_gray_off.png", "jeija_lightstone_gray_on.png") +mesecon.lightstone_add("darkgray", "dye:dark_grey", "jeija_lightstone_darkgray_off.png", "jeija_lightstone_darkgray_on.png") +mesecon.lightstone_add("yellow", "dye:yellow", "jeija_lightstone_yellow_off.png", "jeija_lightstone_yellow_on.png") diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png new file mode 100644 index 0000000..09acc22 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png new file mode 100644 index 0000000..93c8638 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_blue_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png new file mode 100644 index 0000000..7e5aae7 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png new file mode 100644 index 0000000..e6d4d00 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_darkgray_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png new file mode 100644 index 0000000..f168fc2 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png new file mode 100644 index 0000000..24c5470 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_gray_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png new file mode 100644 index 0000000..2f214fa Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png new file mode 100644 index 0000000..225bf4e Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_green_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png new file mode 100644 index 0000000..3c828b2 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png new file mode 100644 index 0000000..512b0fe Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_red_on.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png new file mode 100644 index 0000000..2e7fed0 Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_off.png differ diff --git a/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png new file mode 100644 index 0000000..8943aca Binary files /dev/null and b/mods/mesecons/mesecons_lightstone/textures/jeija_lightstone_yellow_on.png differ diff --git a/mods/mesecons/mesecons_luacontroller/depends.txt b/mods/mesecons/mesecons_luacontroller/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_luacontroller/init.lua b/mods/mesecons/mesecons_luacontroller/init.lua new file mode 100644 index 0000000..df681d9 --- /dev/null +++ b/mods/mesecons/mesecons_luacontroller/init.lua @@ -0,0 +1,630 @@ +-- ______ +-- | +-- | +-- | __ ___ _ __ _ _ +-- | | | | | |\ | | |_| | | | | |_ |_| +-- |___| |______ |__| | \| | | \ |__| |_ |_ |_ |\ +-- | +-- | +-- + +-- Reference +-- ports = get_real_port_states(pos): gets if inputs are powered from outside +-- newport = merge_port_states(state1, state2): just does result = state1 or state2 for every port +-- set_port(pos, rule, state): activates/deactivates the mesecons according to the port states +-- set_port_states(pos, ports): Applies new port states to a LuaController at pos +-- run(pos): runs the code in the controller at pos +-- reset_meta(pos, code, errmsg): performs a software-reset, installs new code and prints error messages +-- resetn(pos): performs a hardware reset, turns off all ports +-- +-- The Sandbox +-- The whole code of the controller runs in a sandbox, +-- a very restricted environment. +-- However, as this does not prevent you from using e.g. loops, +-- we need to check for these prohibited commands first. +-- Actually the only way to damage the server is to +-- use too much memory from the sandbox. +-- You can add more functions to the environment +-- (see where local env is defined) +-- Something nice to play is is appending minetest.env to it. + +local BASENAME = "mesecons_luacontroller:luacontroller" + +local rules = { + a = {x = -1, y = 0, z = 0, name="A"}, + b = {x = 0, y = 0, z = 1, name="B"}, + c = {x = 1, y = 0, z = 0, name="C"}, + d = {x = 0, y = 0, z = -1, name="D"}, +} + + +------------------ +-- Action stuff -- +------------------ +-- These helpers are required to set the port states of the luacontroller + +local function update_real_port_states(pos, rule_name, new_state) + local meta = minetest.get_meta(pos) + if rule_name == nil then + meta:set_int("real_portstates", 1) + return + end + local n = meta:get_int("real_portstates") - 1 + local L = {} + for i = 1, 4 do + L[i] = n % 2 + n = math.floor(n / 2) + end + -- (0,-1) (-1,0) (1,0) (0,1) + local pos_to_side = { 4, 1, nil, 3, 2 } + if rule_name.x == nil then + for _, rname in ipairs(rule_name) do + local port = pos_to_side[rname.x + (2 * rname.z) + 3] + L[port] = (newstate == "on") and 1 or 0 + end + else + local port = pos_to_side[rule_name.x + (2 * rule_name.z) + 3] + L[port] = (new_state == "on") and 1 or 0 + end + meta:set_int("real_portstates", + 1 + + 1 * L[1] + + 2 * L[2] + + 4 * L[3] + + 8 * L[4]) +end + + +local port_names = {"a", "b", "c", "d"} + +local function get_real_port_states(pos) + -- Determine if ports are powered (by itself or from outside) + local meta = minetest.get_meta(pos) + local L = {} + local n = meta:get_int("real_portstates") - 1 + for _, name in ipairs(port_names) do + L[name] = ((n % 2) == 1) + n = math.floor(n / 2) + end + return L +end + + +local function merge_port_states(ports, vports) + return { + a = ports.a or vports.a, + b = ports.b or vports.b, + c = ports.c or vports.c, + d = ports.d or vports.d, + } +end + +local function generate_name(ports) + local d = ports.d and 1 or 0 + local c = ports.c and 1 or 0 + local b = ports.b and 1 or 0 + local a = ports.a and 1 or 0 + return BASENAME..d..c..b..a +end + + +local function set_port(pos, rule, state) + if state then + mesecon.receptor_on(pos, {rule}) + else + mesecon.receptor_off(pos, {rule}) + end +end + + +local function clean_port_states(ports) + ports.a = ports.a and true or false + ports.b = ports.b and true or false + ports.c = ports.c and true or false + ports.d = ports.d and true or false +end + + +local function set_port_states(pos, ports) + local node = minetest.get_node(pos) + local name = node.name + clean_port_states(ports) + local vports = minetest.registered_nodes[name].virtual_portstates + local new_name = generate_name(ports) + + if name ~= new_name and vports then + -- Problem: + -- We need to place the new node first so that when turning + -- off some port, it won't stay on because the rules indicate + -- there is an onstate output port there. + -- When turning the output off then, it will however cause feedback + -- so that the luacontroller will receive an "off" event by turning + -- its output off. + -- Solution / Workaround: + -- Remember which output was turned off and ignore next "off" event. + local meta = minetest.get_meta(pos) + local ign = minetest.deserialize(meta:get_string("ignore_offevents")) or {} + if ports.a and not vports.a and not mesecon.is_powered(pos, rules.a) then ign.A = true end + if ports.b and not vports.b and not mesecon.is_powered(pos, rules.b) then ign.B = true end + if ports.c and not vports.c and not mesecon.is_powered(pos, rules.c) then ign.C = true end + if ports.d and not vports.d and not mesecon.is_powered(pos, rules.d) then ign.D = true end + meta:set_string("ignore_offevents", minetest.serialize(ign)) + + minetest.swap_node(pos, {name = new_name, param2 = node.param2}) + + if ports.a ~= vports.a then set_port(pos, rules.a, ports.a) end + if ports.b ~= vports.b then set_port(pos, rules.b, ports.b) end + if ports.c ~= vports.c then set_port(pos, rules.c, ports.c) end + if ports.d ~= vports.d then set_port(pos, rules.d, ports.d) end + end +end + + +----------------- +-- Overheating -- +----------------- + +local function overheat_off(pos) + mesecon.receptor_off(pos, mesecon.rules.flat) +end + + +local function overheat(pos, meta) + if mesecon.do_overheat(pos) then -- If too hot + local node = minetest.get_node(pos) + node.name = BASENAME.."_burnt" + minetest.swap_node(pos, node) + -- Wait for pending operations + minetest.after(0.2, overheat_off, pos) + return true + end +end + +------------------------ +-- Ignored off events -- +------------------------ + +local function ignore_event(event, meta) + if event.type ~= "off" then return false end + local ignore_offevents = minetest.deserialize(meta:get_string("ignore_offevents")) or {} + if ignore_offevents[event.pin.name] then + ignore_offevents[event.pin.name] = nil + meta:set_string("ignore_offevents", minetest.serialize(ignore_offevents)) + return true + end +end + +------------------------- +-- Parsing and running -- +------------------------- + +local function safe_print(param) + print(dump(param)) +end + +local function remove_functions(x) + local tp = type(x) + if tp == "table" then + for key, value in pairs(x) do + local key_t, val_t = type(key), type(value) + if key_t == "function" or val_t == "function" then + x[key] = nil + else + if key_t == "table" then + remove_functions(key) + end + if val_t == "table" then + remove_functions(value) + end + end + end + elseif tp == "function" then + return nil + end + return x +end + +local function get_interrupt(pos) + -- iid = interrupt id + local function interrupt(time, iid) + if type(time) ~= "number" then return end + local luac_id = minetest.get_meta(pos):get_int("luac_id") + mesecon.queue:add_action(pos, "lc_interrupt", {luac_id, iid}, time, iid, 1) + end + return interrupt +end + + +local function get_digiline_send(pos) + if not digiline then return end + return function(channel, msg) + minetest.after(0, function() + digiline:receptor_send(pos, digiline.rules.default, channel, msg) + end) + end +end + + +local safe_globals = { + "assert", "error", "ipairs", "next", "pairs", "pcall", "select", + "tonumber", "tostring", "type", "unpack", "_VERSION", "xpcall", +} +local function create_environment(pos, mem, event) + -- Gather variables for the environment + local vports = minetest.registered_nodes[minetest.get_node(pos).name].virtual_portstates + local vports_copy = {} + for k, v in pairs(vports) do vports_copy[k] = v end + local rports = get_real_port_states(pos) + + -- Create new library tables on each call to prevent one LuaController + -- from breaking a library and messing up other LuaControllers. + local env = { + pin = merge_port_states(vports, rports), + port = vports_copy, + event = event, + mem = mem, + heat = minetest.get_meta(pos):get_int("heat"), + heat_max = mesecon.setting("overheat_max", 20), + print = safe_print, + interrupt = get_interrupt(pos), + digiline_send = get_digiline_send(pos), + string = { + byte = string.byte, + char = string.char, + format = string.format, + gsub = string.gsub, + len = string.len, + lower = string.lower, + upper = string.upper, + rep = string.rep, + reverse = string.reverse, + sub = string.sub, + }, + math = { + abs = math.abs, + acos = math.acos, + asin = math.asin, + atan = math.atan, + atan2 = math.atan2, + ceil = math.ceil, + cos = math.cos, + cosh = math.cosh, + deg = math.deg, + exp = math.exp, + floor = math.floor, + fmod = math.fmod, + frexp = math.frexp, + huge = math.huge, + ldexp = math.ldexp, + log = math.log, + log10 = math.log10, + max = math.max, + min = math.min, + modf = math.modf, + pi = math.pi, + pow = math.pow, + rad = math.rad, + random = math.random, + sin = math.sin, + sinh = math.sinh, + sqrt = math.sqrt, + tan = math.tan, + tanh = math.tanh, + }, + table = { + concat = table.concat, + insert = table.insert, + maxn = table.maxn, + remove = table.remove, + sort = table.sort, + }, + os = { + clock = os.clock, + difftime = os.difftime, + time = os.time, + }, + } + env._G = env + + for _, name in pairs(safe_globals) do + env[name] = _G[name] + end + + return env +end + + +local function timeout() + debug.sethook() -- Clear hook + error("Code timed out!") +end + + +local function code_prohibited(code) + -- LuaJIT doesn't increment the instruction counter when running + -- loops, so we have to sanitize inputs if we're using LuaJIT. + if not jit then + return false + end + local prohibited = {"while", "for", "do", "repeat", "until", "goto"} + code = " "..code.." " + for _, p in ipairs(prohibited) do + if string.find(code, "[^%w_]"..p.."[^%w_]") then + return "Prohibited command: "..p + end + end +end + + +local function create_sandbox(code, env) + if code:byte(1) == 27 then + return nil, "Binary code prohibited." + end + local f, msg = loadstring(code) + if not f then return nil, msg end + setfenv(f, env) + + return function(...) + debug.sethook(timeout, "", 10000) + local ok, ret = pcall(f, ...) + debug.sethook() -- Clear hook + if not ok then error(ret) end + return ret + end +end + + +local function load_memory(meta) + return minetest.deserialize(meta:get_string("lc_memory")) or {} +end + + +local function save_memory(meta, mem) + meta:set_string("lc_memory", + minetest.serialize( + remove_functions(mem) + ) + ) +end + + +local function run(pos, event) + local meta = minetest.get_meta(pos) + if overheat(pos) then return end + if ignore_event(event, meta) then return end + + -- Load code & mem from meta + local mem = load_memory(meta) + local code = meta:get_string("code") + + local err = code_prohibited(code) + if err then return err end + + -- Create environment + local env = create_environment(pos, mem, event) + + -- Create the sandbox and execute code + local f, msg = create_sandbox(code, env) + if not f then return msg end + local success, msg = pcall(f) + if not success then return msg end + if type(env.port) ~= "table" then + return "Ports set are invalid." + end + + save_memory(meta, env.mem) + + -- Actually set the ports + set_port_states(pos, env.port) +end + +mesecon.queue:add_function("lc_interrupt", function (pos, luac_id, iid) + -- There is no luacontroller anymore / it has been reprogrammed / replaced + if (minetest.get_meta(pos):get_int("luac_id") ~= luac_id) then return end + run(pos, {type="interrupt", iid = iid}) +end) + +local function reset_meta(pos, code, errmsg) + local meta = minetest.get_meta(pos) + meta:set_string("code", code) + code = minetest.formspec_escape(code or "") + errmsg = minetest.formspec_escape(errmsg or "") + meta:set_string("formspec", "size[10,8]".. + "background[-0.2,-0.25;10.4,8.75;jeija_luac_background.png]".. + "textarea[0.2,0.6;10.2,5;code;;"..code.."]".. + "image_button[3.75,6;2.5,1;jeija_luac_runbutton.png;program;]".. + "image_button_exit[9.72,-0.25;0.425,0.4;jeija_close_window.png;exit;]".. + "label[0.1,5;"..errmsg.."]") + meta:set_int("heat", 0) + meta:set_int("luac_id", math.random(1, 65535)) +end + +local function reset(pos) + set_port_states(pos, {a=false, b=false, c=false, d=false}) +end + + +----------------------- +-- Node Registration -- +----------------------- + +local output_rules = {} +local input_rules = {} + +local node_box = { + type = "fixed", + fixed = { + {-8/16, -8/16, -8/16, 8/16, -7/16, 8/16}, -- Bottom slab + {-5/16, -7/16, -5/16, 5/16, -6/16, 5/16}, -- Circuit board + {-3/16, -6/16, -3/16, 3/16, -5/16, 3/16}, -- IC + } +} + +local selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 }, +} + +local digiline = { + receptor = {}, + effector = { + action = function(pos, node, channel, msg) + run(pos, {type = "digiline", channel = channel, msg = msg}) + end + } +} +local function on_receive_fields(pos, form_name, fields) + if not fields.program then + return + end + reset(pos) + reset_meta(pos, fields.code) + local err = run(pos, {type="program"}) + if err then + print(err) + reset_meta(pos, fields.code, err) + end +end + +for a = 0, 1 do -- 0 = off 1 = on +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do + local cid = tostring(d)..tostring(c)..tostring(b)..tostring(a) + local node_name = BASENAME..cid + local top = "jeija_luacontroller_top.png" + if a == 1 then + top = top.."^jeija_luacontroller_LED_A.png" + end + if b == 1 then + top = top.."^jeija_luacontroller_LED_B.png" + end + if c == 1 then + top = top.."^jeija_luacontroller_LED_C.png" + end + if d == 1 then + top = top.."^jeija_luacontroller_LED_D.png" + end + + local groups + if a + b + c + d ~= 0 then + groups = {dig_immediate=2, not_in_creative_inventory=1, overheat = 1} + else + groups = {dig_immediate=2, overheat = 1} + end + + output_rules[cid] = {} + input_rules[cid] = {} + if a == 1 then table.insert(output_rules[cid], rules.a) end + if b == 1 then table.insert(output_rules[cid], rules.b) end + if c == 1 then table.insert(output_rules[cid], rules.c) end + if d == 1 then table.insert(output_rules[cid], rules.d) end + + if a == 0 then table.insert( input_rules[cid], rules.a) end + if b == 0 then table.insert( input_rules[cid], rules.b) end + if c == 0 then table.insert( input_rules[cid], rules.c) end + if d == 0 then table.insert( input_rules[cid], rules.d) end + + local mesecons = { + effector = { + rules = input_rules[cid], + action_change = function (pos, _, rule_name, new_state) + update_real_port_states(pos, rule_name, new_state) + run(pos, {type=new_state, pin=rule_name}) + end, + }, + receptor = { + state = mesecon.state.on, + rules = output_rules[cid] + } + } + + minetest.register_node(node_name, { + description = "LuaController", + drawtype = "nodebox", + tiles = { + top, + "jeija_microcontroller_bottom.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png" + }, + inventory_image = top, + paramtype = "light", + groups = groups, + drop = BASENAME.."0000", + sunlight_propagates = true, + selection_box = selection_box, + node_box = node_box, + on_construct = reset_meta, + on_receive_fields = on_receive_fields, + sounds = default.node_sound_stone_defaults(), + mesecons = mesecons, + digiline = digiline, + -- Virtual portstates are the ports that + -- the node shows as powered up (light up). + virtual_portstates = { + a = a == 1, + b = b == 1, + c = c == 1, + d = d == 1, + }, + after_dig_node = function (pos, node) + mesecon.receptor_off(pos, output_rules) + end, + is_luacontroller = true, + }) +end +end +end +end + +------------------------------ +-- Overheated LuaController -- +------------------------------ + +minetest.register_node(BASENAME .. "_burnt", { + drawtype = "nodebox", + tiles = { + "jeija_luacontroller_burnt_top.png", + "jeija_microcontroller_bottom.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png" + }, + inventory_image = "jeija_luacontroller_burnt_top.png", + paramtype = "light", + groups = {dig_immediate=2, not_in_creative_inventory=1}, + drop = BASENAME.."0000", + sunlight_propagates = true, + selection_box = selection_box, + node_box = node_box, + on_construct = reset_meta, + on_receive_fields = on_receive_fields, + sounds = default.node_sound_stone_defaults(), + virtual_portstates = {a = false, b = false, c = false, d = false}, + mesecons = { + effector = { + rules = mesecon.rules.flat, + action_change = function(pos, _, rule_name, new_state) + update_real_port_states(pos, rule_name, new_state) + end, + }, + }, +}) + +------------------------ +-- Craft Registration -- +------------------------ + +minetest.register_craft({ + output = BASENAME.."0000 2", + recipe = { + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''}, + } +}) + diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png new file mode 100644 index 0000000..40e316c Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_background.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png new file mode 100644 index 0000000..157507f Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luac_runbutton.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_A.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_A.png new file mode 100644 index 0000000..a187e8e Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_A.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_B.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_B.png new file mode 100644 index 0000000..738ba96 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_B.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_C.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_C.png new file mode 100644 index 0000000..abe0fe6 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_C.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_D.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_D.png new file mode 100644 index 0000000..cc10170 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_LED_D.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png new file mode 100644 index 0000000..d1a17af Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_burnt_top.png differ diff --git a/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png new file mode 100644 index 0000000..3128230 Binary files /dev/null and b/mods/mesecons/mesecons_luacontroller/textures/jeija_luacontroller_top.png differ diff --git a/mods/mesecons/mesecons_materials/depends.txt b/mods/mesecons/mesecons_materials/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_materials/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_materials/init.lua b/mods/mesecons/mesecons_materials/init.lua new file mode 100644 index 0000000..5ebf605 --- /dev/null +++ b/mods/mesecons/mesecons_materials/init.lua @@ -0,0 +1,41 @@ +--GLUE +minetest.register_craftitem("mesecons_materials:glue", { + image = "jeija_glue.png", + on_place_on_ground = minetest.craftitem_place_item, + description="Glue", +}) + +minetest.register_craftitem("mesecons_materials:fiber", { + image = "jeija_fiber.png", + on_place_on_ground = minetest.craftitem_place_item, + description="Fiber", +}) + +minetest.register_craft({ + output = "mesecons_materials:glue 2", + type = "cooking", + recipe = "group:sapling", + cooktime = 2 +}) + +minetest.register_craft({ + output = "mesecons_materials:fiber 6", + type = "cooking", + recipe = "mesecons_materials:glue", + cooktime = 4 +}) + +-- Silicon +minetest.register_craftitem("mesecons_materials:silicon", { + image = "jeija_silicon.png", + on_place_on_ground = minetest.craftitem_place_item, + description="Silicon", +}) + +minetest.register_craft({ + output = "mesecons_materials:silicon 4", + recipe = { + {"group:sand", "group:sand"}, + {"group:sand", "default:steel_ingot"}, + } +}) diff --git a/mods/mesecons/mesecons_microcontroller/MeseconMicro.odt b/mods/mesecons/mesecons_microcontroller/MeseconMicro.odt new file mode 100644 index 0000000..be82d1b Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/MeseconMicro.odt differ diff --git a/mods/mesecons/mesecons_microcontroller/MeseconMicro.pdf b/mods/mesecons/mesecons_microcontroller/MeseconMicro.pdf new file mode 100644 index 0000000..7ab7484 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/MeseconMicro.pdf differ diff --git a/mods/mesecons/mesecons_microcontroller/depends.txt b/mods/mesecons/mesecons_microcontroller/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_microcontroller/init.lua b/mods/mesecons/mesecons_microcontroller/init.lua new file mode 100644 index 0000000..7e290a3 --- /dev/null +++ b/mods/mesecons/mesecons_microcontroller/init.lua @@ -0,0 +1,692 @@ +EEPROM_SIZE = 255 + +local microc_rules = {} + +for a = 0, 1 do +for b = 0, 1 do +for c = 0, 1 do +for d = 0, 1 do +local nodename = "mesecons_microcontroller:microcontroller"..tostring(d)..tostring(c)..tostring(b)..tostring(a) +local top = "jeija_microcontroller_top.png" +if tostring(a) == "1" then + top = top.."^jeija_microcontroller_LED_A.png" +end +if tostring(b) == "1" then + top = top.."^jeija_microcontroller_LED_B.png" +end +if tostring(c) == "1" then + top = top.."^jeija_microcontroller_LED_C.png" +end +if tostring(d) == "1" then + top = top.."^jeija_microcontroller_LED_D.png" +end +if tostring(d)..tostring(c)..tostring(b)..tostring(a) ~= "0000" then + groups = {dig_immediate=2, not_in_creative_inventory=1, mesecon = 3, overheat = 1} +else + groups = {dig_immediate=2, mesecon = 3, overheat = 1} +end +local rules={} +if (a == 1) then table.insert(rules, {x = -1, y = 0, z = 0}) end +if (b == 1) then table.insert(rules, {x = 0, y = 0, z = 1}) end +if (c == 1) then table.insert(rules, {x = 1, y = 0, z = 0}) end +if (d == 1) then table.insert(rules, {x = 0, y = 0, z = -1}) end + +local input_rules={} +if (a == 0) then table.insert(input_rules, {x = -1, y = 0, z = 0, name = "A"}) end +if (b == 0) then table.insert(input_rules, {x = 0, y = 0, z = 1, name = "B"}) end +if (c == 0) then table.insert(input_rules, {x = 1, y = 0, z = 0, name = "C"}) end +if (d == 0) then table.insert(input_rules, {x = 0, y = 0, z = -1, name = "D"}) end +microc_rules[nodename] = rules + +local mesecons = {effector = +{ + rules = input_rules, + action_change = function (pos, node, rulename, newstate) + yc_update_real_portstates(pos, node, rulename, newstate) + update_yc(pos) + end +}} +if nodename ~= "mesecons_microcontroller:microcontroller0000" then + mesecons.receptor = { + state = mesecon.state.on, + rules = rules + } +end + +minetest.register_node(nodename, { + description = "Microcontroller", + drawtype = "nodebox", + tiles = { + top, + "jeija_microcontroller_bottom.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png", + "jeija_microcontroller_sides.png" + }, + + sunlight_propagates = true, + paramtype = "light", + walkable = true, + groups = groups, + drop = "mesecons_microcontroller:microcontroller0000 1", + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, -8/16, 8/16, -5/16, 8/16 }, + }, + node_box = { + type = "fixed", + fixed = { + { -8/16, -8/16, -8/16, 8/16, -7/16, 8/16 }, -- bottom slab + { -5/16, -7/16, -5/16, 5/16, -6/16, 5/16 }, -- circuit board + { -3/16, -6/16, -3/16, 3/16, -5/16, 3/16 }, -- IC + } + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("code", "") + meta:set_string("formspec", "size[9,2.5]".. + "field[0.256,-0.2;9,2;code;Code:;]".. + "button[0 ,0.2;1.5,3;band;AND]".. + "button[1.5,0.2;1.5,3;bxor;XOR]".. + "button[3 ,0.2;1.5,3;bnot;NOT]".. + "button[4.5,0.2;1.5,3;bnand;NAND]".. + "button[6 ,0.2;1.5,3;btflop;T-Flop]".. + "button[7.5,0.2;1.5,3;brsflop;RS-Flop]".. + "button_exit[3.5,1;2,3;program;Program]") + meta:set_string("infotext", "Unprogrammed Microcontroller") + local r = "" + for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0" + meta:set_string("eeprom", r) + end, + on_receive_fields = function(pos, formanme, fields, sender) + local meta = minetest.get_meta(pos) + if fields.band then + fields.code = "sbi(C, A&B) :A and B are inputs, C is output" + elseif fields.bxor then + fields.code = "sbi(C, A~B) :A and B are inputs, C is output" + elseif fields.bnot then + fields.code = "sbi(B, !A) :A is input, B is output" + elseif fields.bnand then + fields.code = "sbi(C, !A|!B) :A and B are inputs, C is output" + elseif fields.btflop then + fields.code = "if(A)sbi(1,1);if(!A)sbi(B,!B)sbi(1,0); if(C)off(B,1); :A is input, B is output (Q), C is reset, toggles with falling edge" + elseif fields.brsflop then + fields.code = "if(A)on(C);if(B)off(C); :A is S (Set), B is R (Reset), C is output (R dominates)" + end + if fields.code == nil then return end + + meta:set_string("code", fields.code) + meta:set_string("formspec", "size[9,2.5]".. + "field[0.256,-0.2;9,2;code;Code:;"..minetest.formspec_escape(fields.code).."]".. + "button[0 ,0.2;1.5,3;band;AND]".. + "button[1.5,0.2;1.5,3;bxor;XOR]".. + "button[3 ,0.2;1.5,3;bnot;NOT]".. + "button[4.5,0.2;1.5,3;bnand;NAND]".. + "button[6 ,0.2;1.5,3;btflop;T-Flop]".. + "button[7.5,0.2;1.5,3;brsflop;RS-Flop]".. + "button_exit[3.5,1;2,3;program;Program]") + meta:set_string("infotext", "Programmed Microcontroller") + yc_reset (pos) + update_yc(pos) + end, + sounds = default.node_sound_stone_defaults(), + mesecons = mesecons, + after_dig_node = function (pos, node) + rules = microc_rules[node.name] + mesecon.receptor_off(pos, rules) + end, +}) +end +end +end +end + +minetest.register_craft({ + output = 'craft "mesecons_microcontroller:microcontroller0000" 2', + recipe = { + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'mesecons_materials:silicon', 'mesecons_materials:silicon', 'group:mesecon_conductor_craftable'}, + {'group:mesecon_conductor_craftable', 'group:mesecon_conductor_craftable', ''}, + } +}) + +function yc_reset(pos) + yc_action(pos, {a=false, b=false, c=false, d=false}) + local meta = minetest.get_meta(pos) + meta:set_int("afterid", 0) + local r = "" + for i=1, EEPROM_SIZE+1 do r=r.."0" end --Generate a string with EEPROM_SIZE*"0" + meta:set_string("eeprom", r) +end + +function update_yc(pos) + local meta = minetest.get_meta(pos) + + if (mesecon.do_overheat(pos)) then + minetest.remove_node(pos) + minetest.after(0.2, function (pos) + mesecon.receptor_off(pos, mesecon.rules.flat) + end , pos) -- wait for pending parsings + minetest.add_item(pos, "mesecons_microcontroller:microcontroller0000") + end + + local code = meta:get_string("code") + code = yc_code_remove_commentary(code) + code = string.gsub(code, " ", "") --Remove all spaces + code = string.gsub(code, " ", "") --Remove all tabs + if yc_parsecode(code, pos) == nil then + meta:set_string("infotext", "Code not valid!\n"..code) + else + meta:set_string("infotext", "Working Microcontroller\n"..code) + end +end + + +--Code Parsing +function yc_code_remove_commentary(code) + local is_string = false + for i = 1, #code do + if code:sub(i, i) == '"' then + is_string = not is_string --toggle is_string + elseif code:sub(i, i) == ":" and not is_string then + return code:sub(1, i-1) + end + end + return code +end + +function yc_parsecode(code, pos) + local meta = minetest.get_meta(pos) + local endi = 1 + local Lreal = yc_get_real_portstates(pos) + local Lvirtual = yc_get_virtual_portstates(pos) + if Lvirtual == nil then return nil end + local c + local eeprom = meta:get_string("eeprom") + while true do + local command, params + command, endi = parse_get_command(code, endi) + if command == nil then return nil end + if command == true then break end --end of code + if command == "if" then + local r + r, endi = yc_command_if(code, endi, yc_merge_portstates(Lreal, Lvirtual), eeprom) + if r == nil then return nil end + if r == true then -- nothing + elseif r == false then + local endi_new = yc_skip_to_else (code, endi) + if endi_new == nil then --else > not found + endi = yc_skip_to_endif(code, endi) + else + endi = endi_new + end + if endi == nil then return nil end + end + else + params, endi = parse_get_params(code, endi) + if not params then return nil end + end + if command == "on" then + L = yc_command_on (params, Lvirtual) + elseif command == "off" then + L = yc_command_off(params, Lvirtual) + elseif command == "print" then + local su = yc_command_print(params, eeprom, yc_merge_portstates(Lreal, Lvirtual)) + if su ~= true then return nil end + elseif command == "after" then + local su = yc_command_after(params, pos) + if su == nil then return nil end + elseif command == "sbi" then + local new_eeprom + new_eeprom, Lvirtual = yc_command_sbi (params, eeprom, yc_merge_portstates(Lreal, Lvirtual), Lvirtual) + if new_eeprom == nil then return nil + else eeprom = new_eeprom end + elseif command == "if" then --nothing + else + return nil + end + if Lvirtual == nil then return nil end + if eeprom == nil then return nil else + minetest.get_meta(pos):set_string("eeprom", eeprom) end + end + yc_action(pos, Lvirtual) + return true +end + +function parse_get_command(code, starti) + i = starti + local s + while s ~= "" do + s = string.sub(code, i, i) + if s == "(" then + return string.sub(code, starti, i-1), i + 1 -- i: ( i+1 after ( + end + if s == ";" and starti == i then + starti = starti + 1 + i = starti + elseif s == ">" then + starti = yc_skip_to_endif(code, starti) + if starti == nil then return nil end + i = starti + else + i = i + 1 + end + end + + if starti == i-1 then + return true, true + end + return nil, nil +end + +function parse_get_params(code, starti) + i = starti + local s + local params = {} + local is_string = false + while s ~= "" do + s = string.sub(code, i, i) + if code:sub(i, i) == '"' then + is_string = (is_string==false) --toggle is_string + end + if s == ")" and is_string == false then + table.insert(params, string.sub(code, starti, i-1)) -- i: ) i+1 after ) + return params, i + 1 + end + if s == "," and is_string == false then + table.insert(params, string.sub(code, starti, i-1)) -- i: ) i+1 after ) + starti = i + 1 + end + i = i + 1 + end + return nil, nil +end + +function yc_parse_get_eeprom_param(cond, starti) + i = starti + local s + local addr + while s ~= "" do + s = string.sub(cond, i, i) + if string.find("0123456789", s) == nil or s == "" then + addr = string.sub(cond, starti, i-1) -- i: last number i+1 after last number + return addr, i + end + if s == "," then return nil, nil end + i = i + 1 + end + return nil, nil +end + +function yc_skip_to_endif(code, starti) + local i = starti + local s = false + local open_ifs = 1 + while s ~= nil and s~= "" do + s = code:sub(i, i) + if s == "i" and code:sub(i+1, i+1) == "f" then --if in µCScript + open_ifs = open_ifs + 1 + end + if s == ";" then + open_ifs = open_ifs - 1 + end + if open_ifs == 0 then + return i + 1 + end + i = i + 1 + end + return nil +end + +function yc_skip_to_else(code, starti) + local i = starti + local s = false + local open_ifs = 1 + while s ~= nil and s~= "" do + s = code:sub(i, i) + if s == "i" and code:sub(i+1, i+1) == "f" then --if in µCScript + open_ifs = open_ifs + 1 + end + if s == ";" then + open_ifs = open_ifs - 1 + end + if open_ifs == 1 and s == ">" then + return i + 1 + end + i = i + 1 + end + return nil +end + +--Commands +function yc_command_on(params, L) + local rules = {} + for i, port in ipairs(params) do + L = yc_set_portstate (port, true, L) + end + return L +end + +function yc_command_off(params, L) + local rules = {} + for i, port in ipairs(params) do + L = yc_set_portstate (port, false, L) + end + return L +end + +function yc_command_print(params, eeprom, L) + local s = "" + for i, param in ipairs(params) do + if param:sub(1,1) == '"' and param:sub(#param, #param) == '"' then + s = s..param:sub(2, #param-1) + else + r = yc_command_parsecondition(param, L, eeprom) + if r == "1" or r == "0" then + s = s..r + else return nil end + end + end + print(s) --don't remove + return true +end + +function yc_command_sbi(params, eeprom, L, Lv) + if params[1]==nil or params[2]==nil or params[3] ~=nil then return nil end + local status = yc_command_parsecondition(params[2], L, eeprom) + + if status == nil then return nil, nil end + + if string.find("ABCD", params[1])~=nil and #params[1]==1 then --is a port + if status == "1" then + Lv = yc_set_portstate (params[1], true, Lv) + else + Lv = yc_set_portstate (params[1], false, Lv) + end + return eeprom, Lv; + end + + --is an eeprom address + local new_eeprom = ""; + for i=1, #eeprom do + if tonumber(params[1])==i then + new_eeprom = new_eeprom..status + else + new_eeprom = new_eeprom..eeprom:sub(i, i) + end + end + return new_eeprom, Lv +end + +-- after (delay) +function yc_command_after(params, pos) + if params[1] == nil or params[2] == nil or params[3] ~= nil then return nil end + + --get time (maximum time is 200) + local time = tonumber(params[1]) + if time == nil or time > 200 then + return nil + end + + --get code in quotes "code" + if string.sub(params[2], 1, 1) ~= '"' or string.sub(params[2], #params[2], #params[2]) ~= '"' then return nil end + local code = string.sub(params[2], 2, #params[2] - 1) + + local afterid = math.random(10000) + local meta = minetest.get_meta(pos) + meta:set_int("afterid", afterid) + minetest.after(time, yc_command_after_execute, {pos = pos, code = code, afterid = afterid}) + return true +end + +function yc_command_after_execute(params) + local meta = minetest.get_meta(params.pos) + if meta:get_int("afterid") == params.afterid then --make sure the node has not been changed + if yc_parsecode(params.code, params.pos) == nil then + meta:set_string("infotext", "Code in after() not valid!") + else + if code ~= nil then + meta:set_string("infotext", "Working Microcontroller\n"..code) + else + meta:set_string("infotext", "Working Microcontroller") + end + end + end +end + +--If +function yc_command_if(code, starti, L, eeprom) + local cond, endi = yc_command_if_getcondition(code, starti) + if cond == nil then return nil end + + cond = yc_command_parsecondition(cond, L, eeprom) + + local result + if cond == "0" then result = false + elseif cond == "1" then result = true end + if not result then end + return result, endi --endi from local cond, endi = yc_command_if_getcondition(code, starti) +end + +--Condition parsing +function yc_command_if_getcondition(code, starti) + i = starti + local s + local brackets = 1 --1 Bracket to close + while s ~= "" do + s = string.sub(code, i, i) + + if s == ")" then + brackets = brackets - 1 + end + + if s == "(" then + brackets = brackets + 1 + end + + if brackets == 0 then + return string.sub(code, starti, i-1), i + 1 -- i: ( i+1 after ( + end + + i = i + 1 + end + return nil, nil +end + +function yc_command_parsecondition(cond, L, eeprom) + cond = string.gsub(cond, "A", tonumber(L.a and 1 or 0)) + cond = string.gsub(cond, "B", tonumber(L.b and 1 or 0)) + cond = string.gsub(cond, "C", tonumber(L.c and 1 or 0)) + cond = string.gsub(cond, "D", tonumber(L.d and 1 or 0)) + + + local i = 1 + local l = string.len(cond) + while i<=l do + local s = cond:sub(i,i) + if s == "#" then + local addr, endi = yc_parse_get_eeprom_param(cond, i+1) + local buf = yc_eeprom_read(tonumber(addr), eeprom) + if buf == nil then return nil end + local call = cond:sub(i, endi-1) + cond = string.gsub(cond, call, buf) + i = 0 + l = string.len(cond) + end + i = i + 1 + end + + cond = string.gsub(cond, "!0", "1") + cond = string.gsub(cond, "!1", "0") + + local i = 2 + local l = string.len(cond) + while i<=l do + local s = cond:sub(i,i) + local b = tonumber(cond:sub(i-1, i-1)) + local a = tonumber(cond:sub(i+1, i+1)) + if cond:sub(i+1, i+1) == nil then break end + if s == "=" then + if a==nil then return nil end + if b==nil then return nil end + if a == b then buf = "1" end + if a ~= b then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + i = i + 1 + end + + local i = 2 + local l = string.len(cond) + while i<=l do + local s = cond:sub(i,i) + local b = tonumber(cond:sub(i-1, i-1)) + local a = tonumber(cond:sub(i+1, i+1)) + if cond:sub(i+1, i+1) == nil then break end + if s == "&" then + if a==nil then return nil end + local buf = ((a==1) and (b==1)) + if buf == true then buf = "1" end + if buf == false then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + if s == "|" then + if a==nil then return nil end + local buf = ((a == 1) or (b == 1)) + if buf == true then buf = "1" end + if buf == false then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + if s == "~" then + if a==nil then return nil end + local buf = (((a == 1) or (b == 1)) and not((a==1) and (b==1))) + if buf == true then buf = "1" end + if buf == false then buf = "0" end + cond = string.gsub(cond, b..s..a, buf) + i = 1 + l = string.len(cond) + end + i = i + 1 + end + + return cond +end + +--Virtual-Hardware functions +function yc_eeprom_read(number, eeprom) + if not number then return end + return eeprom:sub(number, number) +end + +--Real I/O functions +function yc_action(pos, L) --L-->Lvirtual + local Lv = yc_get_virtual_portstates(pos) + local name = "mesecons_microcontroller:microcontroller" + ..tonumber(L.d and 1 or 0) + ..tonumber(L.c and 1 or 0) + ..tonumber(L.b and 1 or 0) + ..tonumber(L.a and 1 or 0) + local node = minetest.get_node(pos) + minetest.swap_node(pos, {name = name, param2 = node.param2}) + + yc_action_setports(pos, L, Lv) +end + +function yc_action_setports(pos, L, Lv) + local name = "mesecons_microcontroller:microcontroller" + local rules + if Lv.a ~= L.a then + rules = microc_rules[name.."0001"] + if L.a == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end + if Lv.b ~= L.b then + rules = microc_rules[name.."0010"] + if L.b == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end + if Lv.c ~= L.c then + rules = microc_rules[name.."0100"] + if L.c == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end + if Lv.d ~= L.d then + rules = microc_rules[name.."1000"] + if L.d == true then mesecon.receptor_on(pos, rules) + else mesecon.receptor_off(pos, rules) end + end +end + +function yc_set_portstate(port, state, L) + if port == "A" then L.a = state + elseif port == "B" then L.b = state + elseif port == "C" then L.c = state + elseif port == "D" then L.d = state + else return nil end + return L +end + +function yc_update_real_portstates(pos, node, rulename, newstate) + local meta = minetest.get_meta(pos) + if rulename == nil then + meta:set_int("real_portstates", 1) + return + end + local n = meta:get_int("real_portstates") - 1 + local L = {} + for i = 1, 4 do + L[i] = n%2 + n = math.floor(n/2) + end + if rulename.x == nil then + for _, rname in ipairs(rulename) do + local port = ({4, 1, nil, 3, 2})[rname.x+2*rname.z+3] + L[port] = (newstate == "on") and 1 or 0 + end + else + local port = ({4, 1, nil, 3, 2})[rulename.x+2*rulename.z+3] + L[port] = (newstate == "on") and 1 or 0 + end + meta:set_int("real_portstates", 1 + L[1] + 2*L[2] + 4*L[3] + 8*L[4]) +end + +function yc_get_real_portstates(pos) -- determine if ports are powered (by itself or from outside) + local meta = minetest.get_meta(pos) + local L = {} + local n = meta:get_int("real_portstates") - 1 + for _, index in ipairs({"a", "b", "c", "d"}) do + L[index] = ((n%2) == 1) + n = math.floor(n/2) + end + return L +end + +function yc_get_virtual_portstates(pos) -- portstates according to the name + local name = minetest.get_node(pos).name + local b, a = string.find(name, ":microcontroller") + if a == nil then return nil end + a = a + 1 + + local Lvirtual = {a=false, b=false, c=false, d=false} + if name:sub(a , a ) == "1" then Lvirtual.d = true end + if name:sub(a+1, a+1) == "1" then Lvirtual.c = true end + if name:sub(a+2, a+2) == "1" then Lvirtual.b = true end + if name:sub(a+3, a+3) == "1" then Lvirtual.a = true end + return Lvirtual +end + +function yc_merge_portstates(Lreal, Lvirtual) + local L = {a=false, b=false, c=false, d=false} + if Lvirtual.a or Lreal.a then L.a = true end + if Lvirtual.b or Lreal.b then L.b = true end + if Lvirtual.c or Lreal.c then L.c = true end + if Lvirtual.d or Lreal.d then L.d = true end + return L +end diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_A.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_A.png new file mode 100644 index 0000000..64526cf Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_A.png differ diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_B.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_B.png new file mode 100644 index 0000000..1f7b451 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_B.png differ diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_C.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_C.png new file mode 100644 index 0000000..399cc2c Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_C.png differ diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_D.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_D.png new file mode 100644 index 0000000..506389c Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_LED_D.png differ diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_bottom.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_bottom.png new file mode 100644 index 0000000..3a9161e Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_bottom.png differ diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_sides.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_sides.png new file mode 100644 index 0000000..b367644 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_sides.png differ diff --git a/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png new file mode 100644 index 0000000..438c934 Binary files /dev/null and b/mods/mesecons/mesecons_microcontroller/textures/jeija_microcontroller_top.png differ diff --git a/mods/mesecons/mesecons_movestones/depends.txt b/mods/mesecons/mesecons_movestones/depends.txt new file mode 100644 index 0000000..a596cf8 --- /dev/null +++ b/mods/mesecons/mesecons_movestones/depends.txt @@ -0,0 +1,3 @@ +mesecons +mesecons_materials +mesecons_mvps diff --git a/mods/mesecons/mesecons_movestones/init.lua b/mods/mesecons/mesecons_movestones/init.lua new file mode 100644 index 0000000..69b8c5d --- /dev/null +++ b/mods/mesecons/mesecons_movestones/init.lua @@ -0,0 +1,156 @@ +-- MOVESTONE +-- Non-sticky: +-- Moves along mesecon lines +-- Pushes all blocks in front of it +-- +-- Sticky one +-- Moves along mesecon lines +-- Pushes all block in front of it +-- Pull all blocks in its back + +function mesecon.get_movestone_direction(pos) + local lpos + local rules = { + {x=0, y=1, z=-1}, + {x=0, y=0, z=-1}, + {x=0, y=-1, z=-1}, + {x=0, y=1, z=1}, + {x=0, y=-1, z=1}, + {x=0, y=0, z=1}, + {x=1, y=0, z=0}, + {x=1, y=1, z=0}, + {x=1, y=-1, z=0}, + {x=-1, y=1, z=0}, + {x=-1, y=-1, z=0}, + {x=-1, y=0, z=0}} + + lpos = {x=pos.x+1, y=pos.y, z=pos.z} + for n = 1, 3 do + if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then + return {x=0, y=0, z=-1} + end + end + + lpos = {x = pos.x-1, y = pos.y, z = pos.z} + for n=4, 6 do + if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then + return {x=0, y=0, z=1} + end + end + + lpos = {x = pos.x, y = pos.y, z = pos.z+1} + for n=7, 9 do + if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then + return {x=-1, y=0, z=0} + end + end + + lpos = {x = pos.x, y = pos.y, z = pos.z-1} + for n=10, 12 do + if mesecon.is_power_on(lpos, rules[n].x, rules[n].y, rules[n].z) then + return {x=1, y=0, z=0} + end + end +end + +function mesecon.register_movestone(name, def, is_sticky) + local timer_interval = 1 / mesecon.setting("movestone_speed", 3) + local name_active = name.."_active" + + local function movestone_move (pos) + if minetest.get_node(pos).name ~= name_active then + return + end + + local direction = mesecon.get_movestone_direction(pos) + if not direction then + minetest.set_node(pos, {name = name}) + return + end + local frontpos = vector.add(pos, direction) + local backpos = vector.subtract(pos, direction) + + -- ### Step 1: Push nodes in front ### + local maxpush = mesecon.setting("movestone_max_push", 50) + local maxpull = mesecon.setting("movestone_max_pull", 50) + local success, stack, oldstack = mesecon.mvps_push(frontpos, direction, maxpush) + if success then + mesecon.mvps_process_stack(stack) + mesecon.mvps_move_objects(frontpos, direction, oldstack) + -- Too large stack/stopper in the way: try again very soon + else + minetest.after(0.05, movestone_move, pos) + return + end + + -- ### Step 2: Move the movestone ### + local node = minetest.get_node(pos) + minetest.set_node(frontpos, node) + minetest.remove_node(pos) + mesecon.on_dignode(pos, node) + mesecon.on_placenode(frontpos, node) + minetest.after(timer_interval, movestone_move, frontpos) + + -- ### Step 3: If sticky, pull stack behind ### + if is_sticky then + mesecon.mvps_pull_all(backpos, direction, maxpull) + end + end + + def.mesecons = {effector = { + action_on = function (pos) + if minetest.get_node(pos).name ~= name_active then + minetest.set_node(pos, {name = name_active}) + movestone_move(pos) + end + end, + action_off = function (pos) + minetest.set_node(pos, {name = name}) + end + }} + + def.drop = name + + minetest.register_node(name, def) + + -- active node only + local def_active = table.copy(def) + def_active.groups.not_in_creative_inventory = 1 + minetest.register_node(name_active, def_active) +end + +mesecon.register_movestone("mesecons_movestones:movestone", { + tiles = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_arrows.png", "jeija_movestone_arrows.png"}, + groups = {cracky=3}, + description="Movestone", + sounds = default.node_sound_stone_defaults() +}, false) + +minetest.register_craft({ + output = "mesecons_movestones:movestone 2", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable", "group:mesecon_conductor_craftable"}, + {"default:stone", "default:stone", "default:stone"}, + } +}) + +-- STICKY_MOVESTONE +mesecon.register_movestone("mesecons_movestones:sticky_movestone", { + tiles = {"jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_movestone_side.png", "jeija_sticky_movestone.png", "jeija_sticky_movestone.png"}, + inventory_image = minetest.inventorycube("jeija_sticky_movestone.png", "jeija_movestone_side.png", "jeija_movestone_side.png"), + groups = {cracky=3}, + description="Sticky Movestone", + sounds = default.node_sound_stone_defaults(), +}, true) + +minetest.register_craft({ + output = "mesecons_movestones:sticky_movestone 2", + recipe = { + {"mesecons_materials:glue", "mesecons_movestones:movestone", "mesecons_materials:glue"}, + } +}) + +-- Don't allow pushing movestones while they're active +mesecon.register_mvps_stopper("mesecons_movestones:movestone_active") +mesecon.register_mvps_stopper("mesecons_movestones:sticky_movestone_active") diff --git a/mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png new file mode 100644 index 0000000..358c357 Binary files /dev/null and b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_arrows.png differ diff --git a/mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png new file mode 100644 index 0000000..de753ef Binary files /dev/null and b/mods/mesecons/mesecons_movestones/textures/jeija_movestone_side.png differ diff --git a/mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png b/mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png new file mode 100644 index 0000000..8953cf1 Binary files /dev/null and b/mods/mesecons/mesecons_movestones/textures/jeija_sticky_movestone.png differ diff --git a/mods/mesecons/mesecons_mvps/depends.txt b/mods/mesecons/mesecons_mvps/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_mvps/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_mvps/init.lua b/mods/mesecons/mesecons_mvps/init.lua new file mode 100644 index 0000000..beec94b --- /dev/null +++ b/mods/mesecons/mesecons_mvps/init.lua @@ -0,0 +1,238 @@ +--register stoppers for movestones/pistons + +mesecon.mvps_stoppers = {} +mesecon.on_mvps_move = {} +mesecon.mvps_unmov = {} + +--- Objects (entities) that cannot be moved +function mesecon.register_mvps_unmov(objectname) + mesecon.mvps_unmov[objectname] = true; +end + +function mesecon.is_mvps_unmov(objectname) + return mesecon.mvps_unmov[objectname] +end + +-- Nodes that cannot be pushed / pulled by movestones, pistons +function mesecon.is_mvps_stopper(node, pushdir, stack, stackid) + local get_stopper = mesecon.mvps_stoppers[node.name] + if type (get_stopper) == "function" then + get_stopper = get_stopper(node, pushdir, stack, stackid) + end + return get_stopper +end + +function mesecon.register_mvps_stopper(nodename, get_stopper) + if get_stopper == nil then + get_stopper = true + end + mesecon.mvps_stoppers[nodename] = get_stopper +end + +-- Functions to be called on mvps movement +function mesecon.register_on_mvps_move(callback) + mesecon.on_mvps_move[#mesecon.on_mvps_move+1] = callback +end + +local function on_mvps_move(moved_nodes) + for _, callback in ipairs(mesecon.on_mvps_move) do + callback(moved_nodes) + end +end + +function mesecon.mvps_process_stack(stack) + -- update mesecons for placed nodes ( has to be done after all nodes have been added ) + for _, n in ipairs(stack) do + mesecon.on_placenode(n.pos, minetest.get_node(n.pos)) + end +end + +function mesecon.mvps_get_stack(pos, dir, maximum, all_pull_sticky) + -- determine the number of nodes to be pushed + local nodes = {} + local frontiers = {pos} + + while #frontiers > 0 do + local np = frontiers[1] + local nn = minetest.get_node(np) + + if nn.name ~= "air" + and minetest.registered_nodes[nn.name] + and minetest.registered_nodes[nn.name].liquidtype == "none" then + table.insert(nodes, {node = nn, pos = np}) + if #nodes > maximum then return nil end + + -- add connected nodes to frontiers, connected is a vector list + -- the vectors must be absolute positions + local connected = {} + if minetest.registered_nodes[nn.name] + and minetest.registered_nodes[nn.name].mvps_sticky then + connected = minetest.registered_nodes[nn.name].mvps_sticky(np, nn) + end + + table.insert(connected, vector.add(np, dir)) + + -- If adjacent node is sticky block and connects add that + -- position to the connected table + for _, r in ipairs(mesecon.rules.alldirs) do + local adjpos = vector.add(np, r) + local adjnode = minetest.get_node(adjpos) + if minetest.registered_nodes[adjnode.name] + and minetest.registered_nodes[adjnode.name].mvps_sticky then + local sticksto = minetest.registered_nodes[adjnode.name] + .mvps_sticky(adjpos, adjnode) + + -- connects to this position? + for _, link in ipairs(sticksto) do + if vector.equals(link, np) then + table.insert(connected, adjpos) + end + end + end + end + + if all_pull_sticky then + table.insert(connected, vector.subtract(np, dir)) + end + + -- Make sure there are no duplicates in frontiers / nodes before + -- adding nodes in "connected" to frontiers + for _, cp in ipairs(connected) do + local duplicate = false + for _, rp in ipairs(nodes) do + if vector.equals(cp, rp.pos) then + duplicate = true + end + end + for _, fp in ipairs(frontiers) do + if vector.equals(cp, fp) then + duplicate = true + end + end + if not duplicate then + table.insert(frontiers, cp) + end + end + end + table.remove(frontiers, 1) + end + + return nodes +end + +function mesecon.mvps_push(pos, dir, maximum) + return mesecon.mvps_push_or_pull(pos, dir, dir, maximum) +end + +function mesecon.mvps_pull_all(pos, dir, maximum) + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum, true) +end + +function mesecon.mvps_pull_single(pos, dir, maximum) + return mesecon.mvps_push_or_pull(pos, vector.multiply(dir, -1), dir, maximum) +end + +-- pos: pos of mvps; stackdir: direction of building the stack +-- movedir: direction of actual movement +-- maximum: maximum nodes to be pushed +-- all_pull_sticky: All nodes are sticky in the direction that they are pulled from +function mesecon.mvps_push_or_pull(pos, stackdir, movedir, maximum, all_pull_sticky) + local nodes = mesecon.mvps_get_stack(pos, movedir, maximum, all_pull_sticky) + + if not nodes then return end + -- determine if one of the nodes blocks the push / pull + for id, n in ipairs(nodes) do + if mesecon.is_mvps_stopper(n.node, movedir, nodes, id) then + return + end + end + + -- remove all nodes + for _, n in ipairs(nodes) do + n.meta = minetest.get_meta(n.pos):to_table() + minetest.remove_node(n.pos) + end + + -- update mesecons for removed nodes ( has to be done after all nodes have been removed ) + for _, n in ipairs(nodes) do + mesecon.on_dignode(n.pos, n.node) + end + + -- add nodes + for _, n in ipairs(nodes) do + local np = mesecon.addPosRule(n.pos, movedir) + + minetest.add_node(np, n.node) + minetest.get_meta(np):from_table(n.meta) + end + + local moved_nodes = {} + local oldstack = mesecon.tablecopy(nodes) + for i in ipairs(nodes) do + moved_nodes[i] = {} + moved_nodes[i].oldpos = nodes[i].pos + nodes[i].pos = mesecon.addPosRule(nodes[i].pos, movedir) + moved_nodes[i].pos = nodes[i].pos + moved_nodes[i].node = nodes[i].node + moved_nodes[i].meta = nodes[i].meta + end + + on_mvps_move(moved_nodes) + + return true, nodes, oldstack +end + +mesecon.register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + mesecon.on_placenode(n.pos, n.node) + mesecon.update_autoconnect(n.pos) + end +end) + +function mesecon.mvps_move_objects(pos, dir, nodestack) + local objects_to_move = {} + + -- Move object at tip of stack + local pushpos = mesecon.addPosRule(pos, -- get pos at tip of stack + {x = dir.x * #nodestack, + y = dir.y * #nodestack, + z = dir.z * #nodestack}) + + + local objects = minetest.get_objects_inside_radius(pushpos, 1) + for _, obj in ipairs(objects) do + table.insert(objects_to_move, obj) + end + + -- Move objects lying/standing on the stack (before it was pushed - oldstack) + if tonumber(minetest.setting_get("movement_gravity")) > 0 and dir.y == 0 then + -- If gravity positive and dir horizontal, push players standing on the stack + for _, n in ipairs(nodestack) do + local p_above = mesecon.addPosRule(n.pos, {x=0, y=1, z=0}) + local objects = minetest.get_objects_inside_radius(p_above, 1) + for _, obj in ipairs(objects) do + table.insert(objects_to_move, obj) + end + end + end + + for _, obj in ipairs(objects_to_move) do + local entity = obj:get_luaentity() + if not entity or not mesecon.is_mvps_unmov(entity.name) then + local np = mesecon.addPosRule(obj:getpos(), dir) + + --move only if destination is not solid + local nn = minetest.get_node(np) + if not ((not minetest.registered_nodes[nn.name]) + or minetest.registered_nodes[nn.name].walkable) then + obj:setpos(np) + end + end + end +end + +mesecon.register_mvps_stopper("doors:door_steel_b_1") +mesecon.register_mvps_stopper("doors:door_steel_t_1") +mesecon.register_mvps_stopper("doors:door_steel_b_2") +mesecon.register_mvps_stopper("doors:door_steel_t_2") +mesecon.register_mvps_stopper("default:chest_locked") diff --git a/mods/mesecons/mesecons_noteblock/depends.txt b/mods/mesecons/mesecons_noteblock/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_noteblock/init.lua b/mods/mesecons/mesecons_noteblock/init.lua new file mode 100644 index 0000000..6321882 --- /dev/null +++ b/mods/mesecons/mesecons_noteblock/init.lua @@ -0,0 +1,87 @@ +minetest.register_node("mesecons_noteblock:noteblock", { + description = "Noteblock", + tiles = {"mesecons_noteblock.png"}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, + visual_scale = 1.3, + paramtype="light", + after_place_node = function(pos) + minetest.add_node(pos, {name="mesecons_noteblock:noteblock", param2=0}) + end, + on_punch = function (pos, node) -- change sound when punched + local param2 = node.param2+1 + if param2==12 then param2=0 end + minetest.add_node(pos, {name = node.name, param2 = param2}) + mesecon.noteblock_play(pos, param2) + end, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector = { -- play sound when activated + action_on = function (pos, node) + mesecon.noteblock_play(pos, node.param2) + end + }} +}) + +minetest.register_craft({ + output = "mesecons_noteblock:noteblock 1", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"group:mesecon_conductor_craftable", "default:steel_ingot", "group:mesecon_conductor_craftable"}, + {"group:wood", "group:wood", "group:wood"}, + } +}) + +mesecon.noteblock_play = function (pos, param2) + local soundname + if param2==8 then + soundname="mesecons_noteblock_a" + elseif param2==9 then + soundname="mesecons_noteblock_asharp" + elseif param2==10 then + soundname="mesecons_noteblock_b" + elseif param2==11 then + soundname="mesecons_noteblock_c" + elseif param2==0 then + soundname="mesecons_noteblock_csharp" + elseif param2==1 then + soundname="mesecons_noteblock_d" + elseif param2==2 then + soundname="mesecons_noteblock_dsharp" + elseif param2==3 then + soundname="mesecons_noteblock_e" + elseif param2==4 then + soundname="mesecons_noteblock_f" + elseif param2==5 then + soundname="mesecons_noteblock_fsharp" + elseif param2==6 then + soundname="mesecons_noteblock_g" + elseif param2==7 then + soundname="mesecons_noteblock_gsharp" + end + local block_below_name = minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name + if block_below_name == "default:glass" then + soundname="mesecons_noteblock_hihat" + end + if block_below_name == "default:steelblock" then + soundname=soundname.."2" -- Go up an octave. + end + if block_below_name == "default:stone" then + soundname="mesecons_noteblock_kick" + end + if block_below_name == "default:lava_source" then + soundname="fire_large" + end + if block_below_name == "default:chest" then + soundname="mesecons_noteblock_snare" + end + if block_below_name == "default:tree" then + soundname="mesecons_noteblock_crash" + end + if block_below_name == "default:wood" then + soundname="mesecons_noteblock_litecrash" + end + if block_below_name == "default:coalblock" then + soundname="tnt_explode" + end + minetest.sound_play(soundname, + {pos = pos, gain = 1.0, max_hear_distance = 32,}) +end diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg new file mode 100644 index 0000000..5668a8a Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg new file mode 100644 index 0000000..1113500 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_a2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg new file mode 100644 index 0000000..4cd2dcc Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg new file mode 100644 index 0000000..fda84eb Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_asharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg new file mode 100644 index 0000000..621a6b5 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg new file mode 100644 index 0000000..35a742f Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_b2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg new file mode 100644 index 0000000..e235978 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg new file mode 100644 index 0000000..8468541 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_c2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg new file mode 100644 index 0000000..d33027a Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_crash.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg new file mode 100644 index 0000000..50ba835 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg new file mode 100644 index 0000000..8d76cda Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_csharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg new file mode 100644 index 0000000..f1227ba Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg new file mode 100644 index 0000000..f1ded77 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_d2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg new file mode 100644 index 0000000..817728e Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg new file mode 100644 index 0000000..45f199c Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_dsharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg new file mode 100644 index 0000000..c91d1a6 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg new file mode 100644 index 0000000..0dd495c Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_e2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg new file mode 100644 index 0000000..3f1eaea Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg new file mode 100644 index 0000000..3d5931b Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_f2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg new file mode 100644 index 0000000..9f13797 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg new file mode 100644 index 0000000..edc06d6 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_fsharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg new file mode 100644 index 0000000..d2a90dd Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg new file mode 100644 index 0000000..a798206 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_g2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg new file mode 100644 index 0000000..6177b8c Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg new file mode 100644 index 0000000..94ccdfe Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_gsharp2.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg new file mode 100644 index 0000000..d05a870 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_hihat.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg new file mode 100644 index 0000000..108e89e Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_kick.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg new file mode 100644 index 0000000..21aecfa Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_litecrash.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg new file mode 100644 index 0000000..25d7b78 Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/sounds/mesecons_noteblock_snare.ogg differ diff --git a/mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png b/mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png new file mode 100644 index 0000000..d13e61b Binary files /dev/null and b/mods/mesecons/mesecons_noteblock/textures/mesecons_noteblock.png differ diff --git a/mods/mesecons/mesecons_pistons/depends.txt b/mods/mesecons/mesecons_pistons/depends.txt new file mode 100644 index 0000000..01f085b --- /dev/null +++ b/mods/mesecons/mesecons_pistons/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_mvps diff --git a/mods/mesecons/mesecons_pistons/init.lua b/mods/mesecons/mesecons_pistons/init.lua new file mode 100644 index 0000000..678adca --- /dev/null +++ b/mods/mesecons/mesecons_pistons/init.lua @@ -0,0 +1,761 @@ +-- Get mesecon rules of pistons +piston_rules = +{{x=0, y=0, z=1}, --everything apart from z- (pusher side) + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=1, y=1, z=0}, + {x=1, y=-1, z=0}, + {x=-1, y=1, z=0}, + {x=-1, y=-1, z=0}, + {x=0, y=1, z=1}, + {x=0, y=-1, z=1}} + +local piston_up_rules = +{{x=0, y=0, z=-1}, --everything apart from y+ (pusher side) + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=1, y=-1, z=0}, + {x=-1, y=-1, z=0}, + {x=0, y=-1, z=1}, + {x=0, y=-1, z=-1}} + +local piston_down_rules = +{{x=0, y=0, z=-1}, --everything apart from y- (pusher side) + {x=1, y=0, z=0}, + {x=-1, y=0, z=0}, + {x=0, y=0, z=1}, + {x=1, y=1, z=0}, + {x=-1, y=1, z=0}, + {x=0, y=1, z=1}, + {x=0, y=1, z=-1}} + +local piston_get_rules = function (node) + local rules = piston_rules + for i = 1, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules +end + +piston_facedir_direction = function (node) + local rules = {{x = 0, y = 0, z = -1}} + for i = 1, node.param2 do + rules = mesecon.rotate_rules_left(rules) + end + return rules[1] +end + +piston_get_direction = function(dir, node) + if type(dir) == "function" then + return dir(node) + else + return dir + end +end + +local piston_remove_pusher = function(pos, node) + local pistonspec = minetest.registered_nodes[node.name].mesecons_piston + local dir = piston_get_direction(pistonspec.dir, node) + local pusherpos = mesecon.addPosRule(pos, dir) + local pushername = minetest.get_node(pusherpos).name + + -- make sure there actually is a pusher (for compatibility reasons mainly) + if pushername ~= pistonspec.pusher then + return + end + + minetest.remove_node(pusherpos) + minetest.sound_play("piston_retract", { + pos = pos, + max_hear_distance = 20, + gain = 0.3, + }) + nodeupdate(pusherpos) +end + +local piston_on = function(pos, node) + local pistonspec = minetest.registered_nodes[node.name].mesecons_piston + + local dir = piston_get_direction(pistonspec.dir, node) + local np = mesecon.addPosRule(pos, dir) + local maxpush = mesecon.setting("piston_max_push", 15) + local success, stack, oldstack = mesecon.mvps_push(np, dir, maxpush) + if success then + minetest.add_node(pos, {param2 = node.param2, name = pistonspec.onname}) + minetest.add_node(np, {param2 = node.param2, name = pistonspec.pusher}) + minetest.sound_play("piston_extend", { + pos = pos, + max_hear_distance = 20, + gain = 0.3, + }) + mesecon.mvps_process_stack(stack) + mesecon.mvps_move_objects(np, dir, oldstack) + end +end + +local piston_off = function(pos, node) + local pistonspec = minetest.registered_nodes[node.name].mesecons_piston + minetest.add_node(pos, {param2 = node.param2, name = pistonspec.offname}) + piston_remove_pusher(pos, node) + + if pistonspec.sticky then + local maxpull = mesecon.setting("piston_max_pull", 15) + local dir = piston_get_direction(pistonspec.dir, node) + local pullpos = vector.add(pos, vector.multiply(dir, 2)) + local stack = mesecon.mvps_pull_single(pullpos, vector.multiply(dir, -1), maxpull) + mesecon.mvps_process_stack(pos, dir, stack) + end +end + +local piston_orientate = function(pos, placer) + -- not placed by player + if not placer then return end + + -- placer pitch in degrees + local pitch = placer:get_look_pitch() * (180 / math.pi) + + local node = minetest.get_node(pos) + local pistonspec = minetest.registered_nodes[node.name].mesecons_piston + if pitch > 55 then --looking upwards + minetest.add_node(pos, {name=pistonspec.piston_down}) + elseif pitch < -55 then --looking downwards + minetest.add_node(pos, {name=pistonspec.piston_up}) + end +end + + +-- Horizontal pistons + +local pt = 3/16 -- pusher thickness + +local piston_pusher_box = { + type = "fixed", + fixed = { + {-2/16, -2/16, -.5 + pt, 2/16, 2/16, .5 + pt}, + {-.5 , -.5 , -.5 , .5 , .5 , -.5 + pt}, + } +} + +local piston_on_box = { + type = "fixed", + fixed = { + {-.5, -.5, -.5 + pt, .5, .5, .5} + } +} + + +-- Normal (non-sticky) ones: + +local pistonspec_normal = { + offname = "mesecons_pistons:piston_normal_off", + onname = "mesecons_pistons:piston_normal_on", + dir = piston_facedir_direction, + pusher = "mesecons_pistons:piston_pusher_normal", + piston_down = "mesecons_pistons:piston_down_normal_off", + piston_up = "mesecons_pistons:piston_up_normal_off", +} + +-- offstate +minetest.register_node("mesecons_pistons:piston_normal_off", { + description = "Piston", + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_bottom.png", + "mesecons_piston_left.png", + "mesecons_piston_right.png", + "mesecons_piston_back.png", + "mesecons_piston_pusher_front.png" + }, + groups = {cracky = 3}, + paramtype2 = "facedir", + after_place_node = piston_orientate, + mesecons_piston = pistonspec_normal, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_on = piston_on, + rules = piston_get_rules + }} +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_normal_on", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_bottom.png", + "mesecons_piston_left.png", + "mesecons_piston_right.png", + "mesecons_piston_back.png", + "mesecons_piston_on_front.png" + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_normal_off", + after_dig_node = piston_remove_pusher, + node_box = piston_on_box, + selection_box = piston_on_box, + mesecons_piston = pistonspec_normal, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_off = piston_off, + rules = piston_get_rules + }} +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_pusher_normal", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_top.png", + "mesecons_piston_pusher_bottom.png", + "mesecons_piston_pusher_left.png", + "mesecons_piston_pusher_right.png", + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_front.png" + }, + paramtype = "light", + paramtype2 = "facedir", + diggable = false, + corresponding_piston = "mesecons_pistons:piston_normal_on", + selection_box = piston_pusher_box, + node_box = piston_pusher_box, +}) + +-- Sticky ones + +local pistonspec_sticky = { + offname = "mesecons_pistons:piston_sticky_off", + onname = "mesecons_pistons:piston_sticky_on", + dir = piston_facedir_direction, + pusher = "mesecons_pistons:piston_pusher_sticky", + sticky = true, + piston_down = "mesecons_pistons:piston_down_sticky_off", + piston_up = "mesecons_pistons:piston_up_sticky_off", +} + +-- offstate +minetest.register_node("mesecons_pistons:piston_sticky_off", { + description = "Sticky Piston", + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_bottom.png", + "mesecons_piston_left.png", + "mesecons_piston_right.png", + "mesecons_piston_back.png", + "mesecons_piston_pusher_front_sticky.png" + }, + groups = {cracky = 3}, + paramtype2 = "facedir", + after_place_node = piston_orientate, + mesecons_piston = pistonspec_sticky, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_on = piston_on, + rules = piston_get_rules + }} +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_sticky_on", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_top.png", + "mesecons_piston_bottom.png", + "mesecons_piston_left.png", + "mesecons_piston_right.png", + "mesecons_piston_back.png", + "mesecons_piston_on_front.png" + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_sticky_off", + after_dig_node = piston_remove_pusher, + node_box = piston_on_box, + selection_box = piston_on_box, + mesecons_piston = pistonspec_sticky, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_off = piston_off, + rules = piston_get_rules + }} +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_pusher_sticky", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_top.png", + "mesecons_piston_pusher_bottom.png", + "mesecons_piston_pusher_left.png", + "mesecons_piston_pusher_right.png", + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_front_sticky.png" + }, + paramtype = "light", + paramtype2 = "facedir", + diggable = false, + corresponding_piston = "mesecons_pistons:piston_sticky_on", + selection_box = piston_pusher_box, + node_box = piston_pusher_box, +}) + +-- +-- +-- UP +-- +-- + +local piston_up_pusher_box = { + type = "fixed", + fixed = { + {-2/16, -.5 - pt, -2/16, 2/16, .5 - pt, 2/16}, + {-.5 , .5 - pt, -.5 , .5 , .5 , .5}, + } +} + +local piston_up_on_box = { + type = "fixed", + fixed = { + {-.5, -.5, -.5 , .5, .5-pt, .5} + } +} + +-- Normal + +local pistonspec_normal_up = { + offname = "mesecons_pistons:piston_up_normal_off", + onname = "mesecons_pistons:piston_up_normal_on", + dir = {x = 0, y = 1, z = 0}, + pusher = "mesecons_pistons:piston_up_pusher_normal" +} + +-- offstate +minetest.register_node("mesecons_pistons:piston_up_normal_off", { + tiles = { + "mesecons_piston_pusher_front.png", + "mesecons_piston_back.png", + "mesecons_piston_left.png^[transformR270", + "mesecons_piston_right.png^[transformR90", + "mesecons_piston_bottom.png", + "mesecons_piston_top.png^[transformR180", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_normal_off", + mesecons_piston = pistonspec_normal_up, + mesecons = {effector={ + action_on = piston_on, + rules = piston_up_rules, + }} +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_up_normal_on", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_on_front.png", + "mesecons_piston_back.png", + "mesecons_piston_left.png^[transformR270", + "mesecons_piston_right.png^[transformR90", + "mesecons_piston_bottom.png", + "mesecons_piston_top.png^[transformR180", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_normal_off", + after_dig_node = piston_remove_pusher, + node_box = piston_up_on_box, + selection_box = piston_up_on_box, + mesecons_piston = pistonspec_normal_up, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_off = piston_off, + rules = piston_up_rules, + }} +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_up_pusher_normal", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_front.png", + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_left.png^[transformR270", + "mesecons_piston_pusher_right.png^[transformR90", + "mesecons_piston_pusher_bottom.png", + "mesecons_piston_pusher_top.png^[transformR180", + }, + paramtype = "light", + paramtype2 = "facedir", + diggable = false, + corresponding_piston = "mesecons_pistons:piston_up_normal_on", + selection_box = piston_up_pusher_box, + node_box = piston_up_pusher_box, +}) + + + +-- Sticky + + +local pistonspec_sticky_up = { + offname = "mesecons_pistons:piston_up_sticky_off", + onname = "mesecons_pistons:piston_up_sticky_on", + dir = {x = 0, y = 1, z = 0}, + pusher = "mesecons_pistons:piston_up_pusher_sticky", + sticky = true +} + +-- offstate +minetest.register_node("mesecons_pistons:piston_up_sticky_off", { + tiles = { + "mesecons_piston_pusher_front_sticky.png", + "mesecons_piston_back.png", + "mesecons_piston_left.png^[transformR270", + "mesecons_piston_right.png^[transformR90", + "mesecons_piston_bottom.png", + "mesecons_piston_top.png^[transformR180", + "mesecons_piston_tb.png" + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_sticky_off", + mesecons_piston = pistonspec_sticky_up, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_on = piston_on, + rules = piston_up_rules, + }} +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_up_sticky_on", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_on_front.png", + "mesecons_piston_back.png", + "mesecons_piston_left.png^[transformR270", + "mesecons_piston_right.png^[transformR90", + "mesecons_piston_bottom.png", + "mesecons_piston_top.png^[transformR180", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_normal_off", + after_dig_node = piston_remove_pusher, + node_box = piston_up_on_box, + selection_box = piston_up_on_box, + mesecons_piston = pistonspec_sticky_up, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_off = piston_off, + rules = piston_up_rules, + }} +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_up_pusher_sticky", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_front_sticky.png", + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_left.png^[transformR270", + "mesecons_piston_pusher_right.png^[transformR90", + "mesecons_piston_pusher_bottom.png", + "mesecons_piston_pusher_top.png^[transformR180", + }, + paramtype = "light", + paramtype2 = "facedir", + diggable = false, + corresponding_piston = "mesecons_pistons:piston_up_sticky_on", + selection_box = piston_up_pusher_box, + node_box = piston_up_pusher_box, +}) + +-- +-- +-- DOWN +-- +-- + +local piston_down_pusher_box = { + type = "fixed", + fixed = { + {-2/16, -.5 + pt, -2/16, 2/16, .5 + pt, 2/16}, + {-.5 , -.5 , -.5 , .5 , -.5 + pt, .5}, + } +} + +local piston_down_on_box = { + type = "fixed", + fixed = { + {-.5, -.5+pt, -.5 , .5, .5, .5} + } +} + + + +-- Normal + +local pistonspec_normal_down = { + offname = "mesecons_pistons:piston_down_normal_off", + onname = "mesecons_pistons:piston_down_normal_on", + dir = {x = 0, y = -1, z = 0}, + pusher = "mesecons_pistons:piston_down_pusher_normal", +} + +-- offstate +minetest.register_node("mesecons_pistons:piston_down_normal_off", { + tiles = { + "mesecons_piston_back.png", + "mesecons_piston_pusher_front.png", + "mesecons_piston_left.png^[transformR90", + "mesecons_piston_right.png^[transformR270", + "mesecons_piston_bottom.png^[transformR180", + "mesecons_piston_top.png", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_normal_off", + mesecons_piston = pistonspec_normal_down, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_on = piston_on, + rules = piston_down_rules, + }} +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_down_normal_on", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_back.png", + "mesecons_piston_on_front.png", + "mesecons_piston_left.png^[transformR90", + "mesecons_piston_right.png^[transformR270", + "mesecons_piston_bottom.png^[transformR180", + "mesecons_piston_top.png", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_normal_off", + after_dig_node = piston_remove_pusher, + node_box = piston_down_on_box, + selection_box = piston_down_on_box, + mesecons_piston = pistonspec_normal_down, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_off = piston_off, + rules = piston_down_rules, + }} +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_down_pusher_normal", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_front.png", + "mesecons_piston_pusher_left.png^[transformR90", + "mesecons_piston_pusher_right.png^[transformR270", + "mesecons_piston_pusher_bottom.png^[transformR180", + "mesecons_piston_pusher_top.png", + }, + paramtype = "light", + paramtype2 = "facedir", + diggable = false, + corresponding_piston = "mesecons_pistons:piston_down_normal_on", + selection_box = piston_down_pusher_box, + node_box = piston_down_pusher_box, +}) + +-- Sticky + +local pistonspec_sticky_down = { + onname = "mesecons_pistons:piston_down_sticky_on", + offname = "mesecons_pistons:piston_down_sticky_off", + dir = {x = 0, y = -1, z = 0}, + pusher = "mesecons_pistons:piston_down_pusher_sticky", + sticky = true +} + +-- offstate +minetest.register_node("mesecons_pistons:piston_down_sticky_off", { + tiles = { + "mesecons_piston_back.png", + "mesecons_piston_pusher_front_sticky.png", + "mesecons_piston_left.png^[transformR90", + "mesecons_piston_right.png^[transformR270", + "mesecons_piston_bottom.png^[transformR180", + "mesecons_piston_top.png", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_sticky_off", + mesecons_piston = pistonspec_sticky_down, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_on = piston_on, + rules = piston_down_rules, + }} +}) + +-- onstate +minetest.register_node("mesecons_pistons:piston_down_sticky_on", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_back.png", + "mesecons_piston_on_front.png", + "mesecons_piston_left.png^[transformR90", + "mesecons_piston_right.png^[transformR270", + "mesecons_piston_bottom.png^[transformR180", + "mesecons_piston_top.png", + }, + inventory_image = "mesecons_piston_top.png", + wield_image = "mesecons_piston_top.png", + groups = {cracky = 3, not_in_creative_inventory = 1}, + paramtype = "light", + paramtype2 = "facedir", + drop = "mesecons_pistons:piston_sticky_off", + after_dig_node = piston_remove_pusher, + node_box = piston_down_on_box, + selection_box = piston_down_on_box, + mesecons_piston = pistonspec_sticky_down, + sounds = default.node_sound_wood_defaults(), + mesecons = {effector={ + action_off = piston_off, + rules = piston_down_rules, + }} +}) + +-- pusher +minetest.register_node("mesecons_pistons:piston_down_pusher_sticky", { + drawtype = "nodebox", + tiles = { + "mesecons_piston_pusher_back.png", + "mesecons_piston_pusher_front_sticky.png", + "mesecons_piston_pusher_left.png^[transformR90", + "mesecons_piston_pusher_right.png^[transformR270", + "mesecons_piston_pusher_bottom.png^[transformR180", + "mesecons_piston_pusher_top.png", + }, + paramtype = "light", + paramtype2 = "facedir", + diggable = false, + corresponding_piston = "mesecons_pistons:piston_down_sticky_on", + selection_box = piston_down_pusher_box, + node_box = piston_down_pusher_box, +}) + + +-- Register pushers as stoppers if they would be seperated from the piston +local piston_pusher_get_stopper = function (node, dir, stack, stackid) + if (stack[stackid + 1] + and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].corresponding_piston + and stack[stackid + 1].node.param2 == node.param2) + or (stack[stackid - 1] + and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].corresponding_piston + and stack[stackid - 1].node.param2 == node.param2) then + return false + end + return true +end + +local piston_pusher_up_down_get_stopper = function (node, dir, stack, stackid) + if (stack[stackid + 1] + and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].corresponding_piston) + or (stack[stackid - 1] + and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].corresponding_piston) then + return false + end + return true +end + +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_normal", piston_pusher_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_pusher_sticky", piston_pusher_get_stopper) + +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_pusher_normal", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_pusher_sticky", piston_pusher_up_down_get_stopper) + +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_pusher_normal", piston_pusher_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_pusher_sticky", piston_pusher_up_down_get_stopper) + + +-- Register pistons as stoppers if they would be seperated from the stopper +local piston_up_down_get_stopper = function (node, dir, stack, stackid) + if (stack[stackid + 1] + and stack[stackid + 1].node.name == minetest.registered_nodes[node.name].mesecons_piston.pusher) + or (stack[stackid - 1] + and stack[stackid - 1].node.name == minetest.registered_nodes[node.name].mesecons_piston.pusher) then + return false + end + return true +end + +local piston_get_stopper = function (node, dir, stack, stackid) + pistonspec = minetest.registered_nodes[node.name].mesecons_piston + dir = piston_get_direction(pistonspec.dir, node) + local pusherpos = mesecon.addPosRule(stack[stackid].pos, dir) + local pushernode = minetest.get_node(pusherpos) + + if minetest.registered_nodes[node.name].mesecons_piston.pusher == pushernode.name then + for _, s in ipairs(stack) do + if mesecon.cmpPos(s.pos, pusherpos) -- pusher is also to be pushed + and s.node.param2 == node.param2 then + return false + end + end + end + return true +end + +mesecon.register_mvps_stopper("mesecons_pistons:piston_normal_on", piston_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_sticky_on", piston_get_stopper) + +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_normal_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_up_sticky_on", piston_up_down_get_stopper) + +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_normal_on", piston_up_down_get_stopper) +mesecon.register_mvps_stopper("mesecons_pistons:piston_down_sticky_on", piston_up_down_get_stopper) + +--craft recipes +minetest.register_craft({ + output = "mesecons_pistons:piston_normal_off 2", + recipe = { + {"group:wood", "group:wood", "group:wood"}, + {"default:cobble", "default:steel_ingot", "default:cobble"}, + {"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"}, + } +}) + +minetest.register_craft({ + output = "mesecons_pistons:piston_sticky_off", + recipe = { + {"mesecons_materials:glue"}, + {"mesecons_pistons:piston_normal_off"}, + } +}) diff --git a/mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg b/mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg new file mode 100644 index 0000000..e234ad9 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/sounds/piston_extend.ogg differ diff --git a/mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg b/mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg new file mode 100644 index 0000000..feb9f04 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/sounds/piston_retract.ogg differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png new file mode 100644 index 0000000..6a57dce Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_back.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_bottom.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_bottom.png new file mode 100644 index 0000000..5a3af9b Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_bottom.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_left.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_left.png new file mode 100644 index 0000000..215dd73 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_left.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png new file mode 100644 index 0000000..0ade67e Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_on_front.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png new file mode 100644 index 0000000..fe87943 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_back.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_bottom.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_bottom.png new file mode 100644 index 0000000..87c4e81 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_bottom.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png new file mode 100644 index 0000000..8ec9dc6 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png new file mode 100644 index 0000000..e38b4e6 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_front_sticky.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_left.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_left.png new file mode 100644 index 0000000..bc5495b Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_left.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_right.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_right.png new file mode 100644 index 0000000..32ee32f Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_right.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png new file mode 100644 index 0000000..72f04e9 Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_pusher_top.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_right.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_right.png new file mode 100644 index 0000000..176463c Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_right.png differ diff --git a/mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png new file mode 100644 index 0000000..5c8bace Binary files /dev/null and b/mods/mesecons/mesecons_pistons/textures/mesecons_piston_top.png differ diff --git a/mods/mesecons/mesecons_powerplant/depends.txt b/mods/mesecons/mesecons_powerplant/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_powerplant/init.lua b/mods/mesecons/mesecons_powerplant/init.lua new file mode 100644 index 0000000..a5e3327 --- /dev/null +++ b/mods/mesecons/mesecons_powerplant/init.lua @@ -0,0 +1,31 @@ +-- The POWER_PLANT +-- Just emits power. always. + +minetest.register_node("mesecons_powerplant:power_plant", { + drawtype = "plantlike", + visual_scale = 1, + tiles = {"jeija_power_plant.png"}, + inventory_image = "jeija_power_plant.png", + paramtype = "light", + walkable = false, + groups = {dig_immediate=3, mesecon = 2}, + light_source = default.LIGHT_MAX-9, + description="Power Plant", + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, -0.5+0.7, 0.3}, + }, + sounds = default.node_sound_leaves_defaults(), + mesecons = {receptor = { + state = mesecon.state.on + }} +}) + +minetest.register_craft({ + output = "mesecons_powerplant:power_plant 1", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"group:mesecon_conductor_craftable"}, + {"group:sapling"}, + } +}) diff --git a/mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png b/mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png new file mode 100644 index 0000000..edc8891 Binary files /dev/null and b/mods/mesecons/mesecons_powerplant/textures/jeija_power_plant.png differ diff --git a/mods/mesecons/mesecons_pressureplates/depends.txt b/mods/mesecons/mesecons_pressureplates/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_pressureplates/init.lua b/mods/mesecons/mesecons_pressureplates/init.lua new file mode 100644 index 0000000..b00db9a --- /dev/null +++ b/mods/mesecons/mesecons_pressureplates/init.lua @@ -0,0 +1,94 @@ +local pp_box_off = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, +} + +local pp_box_on = { + type = "fixed", + fixed = { -7/16, -8/16, -7/16, 7/16, -7.5/16, 7/16 }, +} + +pp_on_timer = function (pos, elapsed) + local node = minetest.get_node(pos) + local basename = minetest.registered_nodes[node.name].pressureplate_basename + + -- This is a workaround for a strange bug that occurs when the server is started + -- For some reason the first time on_timer is called, the pos is wrong + if not basename then return end + + local objs = minetest.get_objects_inside_radius(pos, 1) + local two_below = mesecon.addPosRule(pos, {x = 0, y = -2, z = 0}) + + if objs[1] == nil and node.name == basename .. "_on" then + minetest.add_node(pos, {name = basename .. "_off"}) + mesecon.receptor_off(pos, mesecon.rules.pplate) + elseif node.name == basename .. "_off" then + for k, obj in pairs(objs) do + local objpos = obj:getpos() + if objpos.y > pos.y-1 and objpos.y < pos.y then + minetest.add_node(pos, {name = basename .. "_on"}) + mesecon.receptor_on(pos, mesecon.rules.pplate ) + end + end + end + return true +end + +-- Register a Pressure Plate +-- offstate: name of the pressure plate when inactive +-- onstate: name of the pressure plate when active +-- description: description displayed in the player's inventory +-- tiles_off: textures of the pressure plate when inactive +-- tiles_on: textures of the pressure plate when active +-- image: inventory and wield image of the pressure plate +-- recipe: crafting recipe of the pressure plate + +function mesecon.register_pressure_plate(basename, description, textures_off, textures_on, image_w, image_i, recipe) + mesecon.register_node(basename, { + drawtype = "nodebox", + inventory_image = image_i, + wield_image = image_w, + paramtype = "light", + description = description, + pressureplate_basename = basename, + on_timer = pp_on_timer, + on_construct = function(pos) + minetest.get_node_timer(pos):start(mesecon.setting("pplate_interval", 0.1)) + end, + },{ + mesecons = {receptor = { state = mesecon.state.off, rules = mesecon.rules.pplate }}, + node_box = pp_box_off, + selection_box = pp_box_off, + groups = {snappy = 2, oddly_breakable_by_hand = 3}, + tiles = textures_off + },{ + mesecons = {receptor = { state = mesecon.state.on, rules = mesecon.rules.pplate }}, + node_box = pp_box_on, + selection_box = pp_box_on, + groups = {snappy = 2, oddly_breakable_by_hand = 3, not_in_creative_inventory = 1}, + tiles = textures_on + }) + + minetest.register_craft({ + output = basename .. "_off", + recipe = recipe, + }) +end + +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_wood", + "Wooden Pressure Plate", + {"jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off.png","jeija_pressure_plate_wood_off_edges.png"}, + {"jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on.png","jeija_pressure_plate_wood_on_edges.png"}, + "jeija_pressure_plate_wood_wield.png", + "jeija_pressure_plate_wood_inv.png", + {{"group:wood", "group:wood"}}) + +mesecon.register_pressure_plate( + "mesecons_pressureplates:pressure_plate_stone", + "Stone Pressure Plate", + {"jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off.png","jeija_pressure_plate_stone_off_edges.png"}, + {"jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on.png","jeija_pressure_plate_stone_on_edges.png"}, + "jeija_pressure_plate_stone_wield.png", + "jeija_pressure_plate_stone_inv.png", + {{"default:cobble", "default:cobble"}}) diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png new file mode 100644 index 0000000..bfe5a1d Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_inv.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png new file mode 100644 index 0000000..46140da Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png new file mode 100644 index 0000000..2ad9acc Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_off_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png new file mode 100644 index 0000000..dc64931 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png new file mode 100644 index 0000000..51add95 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_on_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png new file mode 100644 index 0000000..c533567 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_stone_wield.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png new file mode 100644 index 0000000..36dacd0 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_inv.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png new file mode 100644 index 0000000..ca98757 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png new file mode 100644 index 0000000..665ae97 Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_off_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png new file mode 100644 index 0000000..e1a7d8e Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png new file mode 100644 index 0000000..358f2ea Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_on_edges.png differ diff --git a/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png new file mode 100644 index 0000000..50b321d Binary files /dev/null and b/mods/mesecons/mesecons_pressureplates/textures/jeija_pressure_plate_wood_wield.png differ diff --git a/mods/mesecons/mesecons_random/depends.txt b/mods/mesecons/mesecons_random/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_random/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_random/init.lua b/mods/mesecons/mesecons_random/init.lua new file mode 100644 index 0000000..0136309 --- /dev/null +++ b/mods/mesecons/mesecons_random/init.lua @@ -0,0 +1,85 @@ +-- REMOVESTONE + +minetest.register_node("mesecons_random:removestone", { + tiles = {"jeija_removestone.png"}, + inventory_image = minetest.inventorycube("jeija_removestone_inv.png"), + groups = {cracky=3}, + description="Removestone", + sounds = default.node_sound_stone_defaults(), + mesecons = {effector = { + action_on = function (pos, node) + minetest.remove_node(pos) + mesecon.update_autoconnect(pos) + end + }} +}) + +minetest.register_craft({ + output = 'mesecons_random:removestone 4', + recipe = { + {"", "default:cobble", ""}, + {"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"}, + {"", "default:cobble", ""}, + } +}) + +-- GHOSTSTONE + +minetest.register_node("mesecons_random:ghoststone", { + description="ghoststone", + tiles = {"jeija_ghoststone.png"}, + is_ground_content = true, + inventory_image = minetest.inventorycube("jeija_ghoststone_inv.png"), + groups = {cracky=3}, + sounds = default.node_sound_stone_defaults(), + mesecons = {conductor = { + state = mesecon.state.off, + rules = { --axes + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + }, + onstate = "mesecons_random:ghoststone_active" + }} +}) + +minetest.register_node("mesecons_random:ghoststone_active", { + drawtype = "airlike", + pointable = false, + walkable = false, + diggable = false, + sunlight_propagates = true, + paramtype = "light", + mesecons = {conductor = { + state = mesecon.state.on, + rules = { + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1}, + }, + offstate = "mesecons_random:ghoststone" + }}, + on_construct = function(pos) + --remove shadow + pos2 = {x = pos.x, y = pos.y + 1, z = pos.z} + if ( minetest.get_node(pos2).name == "air" ) then + minetest.dig_node(pos2) + end + end +}) + + +minetest.register_craft({ + output = 'mesecons_random:ghoststone 4', + recipe = { + {"default:steel_ingot", "default:cobble", "default:steel_ingot"}, + {"default:cobble", "group:mesecon_conductor_craftable", "default:cobble"}, + {"default:steel_ingot", "default:cobble", "default:steel_ingot"}, + } +}) diff --git a/mods/mesecons/mesecons_random/textures/jeija_ghoststone.png b/mods/mesecons/mesecons_random/textures/jeija_ghoststone.png new file mode 100644 index 0000000..1917b7c Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_ghoststone.png differ diff --git a/mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png b/mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png new file mode 100644 index 0000000..c715d7f Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_ghoststone_inv.png differ diff --git a/mods/mesecons/mesecons_random/textures/jeija_removestone.png b/mods/mesecons/mesecons_random/textures/jeija_removestone.png new file mode 100644 index 0000000..1917b7c Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_removestone.png differ diff --git a/mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png b/mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png new file mode 100644 index 0000000..c715d7f Binary files /dev/null and b/mods/mesecons/mesecons_random/textures/jeija_removestone_inv.png differ diff --git a/mods/mesecons/mesecons_receiver/depends.txt b/mods/mesecons/mesecons_receiver/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_receiver/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_receiver/init.lua b/mods/mesecons/mesecons_receiver/init.lua new file mode 100644 index 0000000..b5c79e7 --- /dev/null +++ b/mods/mesecons/mesecons_receiver/init.lua @@ -0,0 +1,158 @@ +rcvboxes = { + { -3/16, -3/16, -8/16 , 3/16, 3/16 , -13/32 }, -- the smaller bump + { -1/32, -1/32, -3/2 , 1/32, 1/32 , -1/2 }, -- the wire through the block + { -2/32, -1/2 , -.5 , 2/32, 0 , -.5002+3/32 }, -- the vertical wire bit + { -2/32, -1/2 , -7/16+0.002 , 2/32, -14/32, 16/32+0.001 } -- the horizontal wire +} + +local receiver_get_rules = function (node) + local rules = { {x = 1, y = 0, z = 0}, + {x = -2, y = 0, z = 0}} + if node.param2 == 2 then + rules = mesecon.rotate_rules_left(rules) + elseif node.param2 == 3 then + rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) + elseif node.param2 == 0 then + rules = mesecon.rotate_rules_right(rules) + end + return rules +end + +minetest.register_node("mesecons_receiver:receiver_on", { + drawtype = "nodebox", + tiles = { + "receiver_top_on.png", + "receiver_bottom_on.png", + "receiver_lr_on.png", + "receiver_lr_on.png", + "receiver_fb_on.png", + "receiver_fb_on.png", + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = rcvboxes + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons:wire_00000000_off", + mesecons = {conductor = { + state = mesecon.state.on, + rules = receiver_get_rules, + offstate = "mesecons_receiver:receiver_off" + }} +}) + +minetest.register_node("mesecons_receiver:receiver_off", { + drawtype = "nodebox", + description = "You hacker you", + tiles = { + "receiver_top_off.png", + "receiver_bottom_off.png", + "receiver_lr_off.png", + "receiver_lr_off.png", + "receiver_fb_off.png", + "receiver_fb_off.png", + }, + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { -3/16, -8/16, -8/16, 3/16, 3/16, 8/16 } + }, + node_box = { + type = "fixed", + fixed = rcvboxes + }, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons:wire_00000000_off", + mesecons = {conductor = { + state = mesecon.state.off, + rules = receiver_get_rules, + onstate = "mesecons_receiver:receiver_on" + }} +}) + +function mesecon.receiver_get_pos_from_rcpt(pos, param2) + local rules = {{x = 2, y = 0, z = 0}} + if param2 == nil then param2 = minetest.get_node(pos).param2 end + if param2 == 2 then + rules = mesecon.rotate_rules_left(rules) + elseif param2 == 3 then + rules = mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) + elseif param2 == 0 then + rules = mesecon.rotate_rules_right(rules) + end + local np = { x = pos.x + rules[1].x, + y = pos.y + rules[1].y, + z = pos.z + rules[1].z} + return np +end + +function mesecon.receiver_place(rcpt_pos) + local node = minetest.get_node(rcpt_pos) + local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, node.param2) + local nn = minetest.get_node(pos) + + if string.find(nn.name, "mesecons:wire_") ~= nil then + minetest.dig_node(pos) + if mesecon.is_power_on(rcpt_pos) then + minetest.add_node(pos, {name = "mesecons_receiver:receiver_on", param2 = node.param2}) + mesecon.receptor_on(pos, receiver_get_rules(node)) + else + minetest.add_node(pos, {name = "mesecons_receiver:receiver_off", param2 = node.param2}) + end + mesecon.update_autoconnect(pos) + end +end + +function mesecon.receiver_remove(rcpt_pos, dugnode) + local pos = mesecon.receiver_get_pos_from_rcpt(rcpt_pos, dugnode.param2) + local nn = minetest.get_node(pos) + if string.find(nn.name, "mesecons_receiver:receiver_") ~=nil then + minetest.dig_node(pos) + local node = {name = "mesecons:wire_00000000_off"} + minetest.add_node(pos, node) + mesecon.update_autoconnect(pos) + mesecon.on_placenode(pos, node) + end +end + +minetest.register_on_placenode(function (pos, node) + if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then + mesecon.receiver_place(pos) + end +end) + +minetest.register_on_dignode(function(pos, node) + if minetest.get_item_group(node.name, "mesecon_needs_receiver") == 1 then + mesecon.receiver_remove(pos, node) + end +end) + +minetest.register_on_placenode(function (pos, node) + if string.find(node.name, "mesecons:wire_") ~=nil then + local rules = { {x = 2, y = 0, z = 0}, + {x =-2, y = 0, z = 0}, + {x = 0, y = 0, z = 2}, + {x = 0, y = 0, z =-2}} + local i = 1 + while rules[i] ~= nil do + local np = { x = pos.x + rules[i].x, + y = pos.y + rules[i].y, + z = pos.z + rules[i].z} + if minetest.get_item_group(minetest.get_node(np).name, "mesecon_needs_receiver") == 1 then + mesecon.receiver_place(np) + end + i = i + 1 + end + end +end) diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png new file mode 100644 index 0000000..b95903e Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png new file mode 100644 index 0000000..d0b7006 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_bottom_on.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png new file mode 100644 index 0000000..aed3008 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_fb_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png new file mode 100644 index 0000000..0916736 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_fb_on.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png new file mode 100644 index 0000000..1fb2b3a Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_lr_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png new file mode 100644 index 0000000..087c0b4 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_lr_on.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_top_off.png b/mods/mesecons/mesecons_receiver/textures/receiver_top_off.png new file mode 100644 index 0000000..ae50106 Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_top_off.png differ diff --git a/mods/mesecons/mesecons_receiver/textures/receiver_top_on.png b/mods/mesecons/mesecons_receiver/textures/receiver_top_on.png new file mode 100644 index 0000000..5b48cac Binary files /dev/null and b/mods/mesecons/mesecons_receiver/textures/receiver_top_on.png differ diff --git a/mods/mesecons/mesecons_solarpanel/depends.txt b/mods/mesecons/mesecons_solarpanel/depends.txt new file mode 100644 index 0000000..bc7b062 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_materials diff --git a/mods/mesecons/mesecons_solarpanel/init.lua b/mods/mesecons/mesecons_solarpanel/init.lua new file mode 100644 index 0000000..bc5a408 --- /dev/null +++ b/mods/mesecons/mesecons_solarpanel/init.lua @@ -0,0 +1,95 @@ +-- Solar Panel +minetest.register_node("mesecons_solarpanel:solar_panel_on", { + drawtype = "nodebox", + tiles = { "jeija_solar_panel.png", }, + inventory_image = "jeija_solar_panel.png", + wield_image = "jeija_solar_panel.png", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + is_ground_content = true, + node_box = { + type = "wallmounted", + wall_bottom = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + wall_top = { -7/16, 7/16, -7/16, 7/16, 8/16, 7/16 }, + wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 }, + }, + selection_box = { + type = "wallmounted", + wall_bottom = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + wall_top = { -7/16, 7/16, -7/16, 7/16, 8/16, 7/16 }, + wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 }, + }, + drop = "mesecons_solarpanel:solar_panel_off", + groups = {dig_immediate=3, not_in_creative_inventory = 1}, + sounds = default.node_sound_glass_defaults(), + mesecons = {receptor = { + state = mesecon.state.on + }} +}) + +-- Solar Panel +minetest.register_node("mesecons_solarpanel:solar_panel_off", { + drawtype = "nodebox", + tiles = { "jeija_solar_panel.png", }, + inventory_image = "jeija_solar_panel.png", + wield_image = "jeija_solar_panel.png", + paramtype = "light", + paramtype2 = "wallmounted", + walkable = false, + is_ground_content = true, + node_box = { + type = "wallmounted", + wall_bottom = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + wall_top = { -7/16, 7/16, -7/16, 7/16, 8/16, 7/16 }, + wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 }, + }, + selection_box = { + type = "wallmounted", + wall_bottom = { -7/16, -8/16, -7/16, 7/16, -7/16, 7/16 }, + wall_top = { -7/16, 7/16, -7/16, 7/16, 8/16, 7/16 }, + wall_side = { -8/16, -7/16, -7/16, -7/16, 7/16, 7/16 }, + }, + groups = {dig_immediate=3}, + description="Solar Panel", + sounds = default.node_sound_glass_defaults(), + mesecons = {receptor = { + state = mesecon.state.off + }} +}) + +minetest.register_craft({ + output = "mesecons_solarpanel:solar_panel_off 1", + recipe = { + {"mesecons_materials:silicon", "mesecons_materials:silicon"}, + {"mesecons_materials:silicon", "mesecons_materials:silicon"}, + } +}) + +minetest.register_abm( + {nodenames = {"mesecons_solarpanel:solar_panel_off"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local light = minetest.get_node_light(pos, nil) + + if light >= 12 then + minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_on", param2=node.param2}) + mesecon.receptor_on(pos) + end + end, +}) + +minetest.register_abm( + {nodenames = {"mesecons_solarpanel:solar_panel_on"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local light = minetest.get_node_light(pos, nil) + + if light < 12 then + minetest.set_node(pos, {name="mesecons_solarpanel:solar_panel_off", param2=node.param2}) + mesecon.receptor_off(pos) + end + end, +}) diff --git a/mods/mesecons/mesecons_solarpanel/textures/jeija_solar_panel.png b/mods/mesecons/mesecons_solarpanel/textures/jeija_solar_panel.png new file mode 100644 index 0000000..a7b0f75 Binary files /dev/null and b/mods/mesecons/mesecons_solarpanel/textures/jeija_solar_panel.png differ diff --git a/mods/mesecons/mesecons_stickyblocks/depends.txt b/mods/mesecons/mesecons_stickyblocks/depends.txt new file mode 100644 index 0000000..01f085b --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_mvps diff --git a/mods/mesecons/mesecons_stickyblocks/init.lua b/mods/mesecons/mesecons_stickyblocks/init.lua new file mode 100644 index 0000000..c1eb121 --- /dev/null +++ b/mods/mesecons/mesecons_stickyblocks/init.lua @@ -0,0 +1,16 @@ +-- Sticky blocks can be used together with pistons or movestones to push / pull +-- structures that are "glued" together using sticky blocks + +-- All sides sticky block +minetest.register_node("mesecons_stickyblocks:sticky_block_all", { + description = "All-sides sticky block", + tiles = {"default_grass_footsteps.png"}, + groups = {dig_immediate=2}, + mvps_sticky = function (pos, node) + local connected = {} + for _, r in ipairs(mesecon.rules.alldirs) do + table.insert(connected, vector.add(pos, r)) + end + return connected + end +}) diff --git a/mods/mesecons/mesecons_switch/depends.txt b/mods/mesecons/mesecons_switch/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_switch/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_switch/init.lua b/mods/mesecons/mesecons_switch/init.lua new file mode 100644 index 0000000..2b3c3ee --- /dev/null +++ b/mods/mesecons/mesecons_switch/init.lua @@ -0,0 +1,35 @@ +-- MESECON_SWITCH + +mesecon.register_node("mesecons_switch:mesecon_switch", { + paramtype2="facedir", + description="Switch", + sounds = default.node_sound_stone_defaults(), + on_punch = function (pos, node) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos) + else + mesecon.receptor_off(pos) + end + minetest.sound_play("mesecons_switch", {pos=pos}) + end +},{ + groups = {dig_immediate=2}, + tiles = { "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", + "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", + "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_off.png"}, + mesecons = {receptor = { state = mesecon.state.off }} +},{ + groups = {dig_immediate=2, not_in_creative_inventory=1}, + tiles = { "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", + "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_side.png", + "jeija_mesecon_switch_side.png", "jeija_mesecon_switch_on.png"}, + mesecons = {receptor = { state = mesecon.state.on }} +}) + +minetest.register_craft({ + output = "mesecons_switch:mesecon_switch_off 2", + recipe = { + {"default:steel_ingot", "default:cobble", "default:steel_ingot"}, + {"group:mesecon_conductor_craftable","", "group:mesecon_conductor_craftable"}, + } +}) diff --git a/mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg b/mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg new file mode 100644 index 0000000..53d45c1 Binary files /dev/null and b/mods/mesecons/mesecons_switch/sounds/mesecons_switch.ogg differ diff --git a/mods/mesecons/mesecons_torch/depends.txt b/mods/mesecons/mesecons_torch/depends.txt new file mode 100644 index 0000000..acaa924 --- /dev/null +++ b/mods/mesecons/mesecons_torch/depends.txt @@ -0,0 +1 @@ +mesecons diff --git a/mods/mesecons/mesecons_torch/init.lua b/mods/mesecons/mesecons_torch/init.lua new file mode 100644 index 0000000..5d1ad8f --- /dev/null +++ b/mods/mesecons/mesecons_torch/init.lua @@ -0,0 +1,118 @@ +--MESECON TORCHES + +local rotate_torch_rules = function (rules, param2) + if param2 == 5 then + return mesecon.rotate_rules_right(rules) + elseif param2 == 2 then + return mesecon.rotate_rules_right(mesecon.rotate_rules_right(rules)) --180 degrees + elseif param2 == 4 then + return mesecon.rotate_rules_left(rules) + elseif param2 == 1 then + return mesecon.rotate_rules_down(rules) + elseif param2 == 0 then + return mesecon.rotate_rules_up(rules) + else + return rules + end +end + +local torch_get_output_rules = function(node) + local rules = { + {x = 1, y = 0, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z =-1}, + {x = 0, y = 1, z = 0}, + {x = 0, y =-1, z = 0}} + + return rotate_torch_rules(rules, node.param2) +end + +local torch_get_input_rules = function(node) + local rules = {{x = -2, y = 0, z = 0}, + {x = -1, y = 1, z = 0}} + + return rotate_torch_rules(rules, node.param2) +end + +minetest.register_craft({ + output = "mesecons_torch:mesecon_torch_on 4", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"default:stick"},} +}) + +local torch_selectionbox = +{ + type = "wallmounted", + wall_top = {-0.1, 0.5-0.6, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, -0.5+0.6, 0.1}, + wall_side = {-0.5, -0.1, -0.1, -0.5+0.6, 0.1, 0.1}, +} + +minetest.register_node("mesecons_torch:mesecon_torch_off", { + drawtype = "torchlike", + tiles = {"jeija_torches_off.png", "jeija_torches_off_ceiling.png", "jeija_torches_off_side.png"}, + inventory_image = "jeija_torches_off.png", + paramtype = "light", + walkable = false, + paramtype2 = "wallmounted", + selection_box = torch_selectionbox, + groups = {dig_immediate = 3, not_in_creative_inventory = 1}, + drop = "mesecons_torch:mesecon_torch_on", + mesecons = {receptor = { + state = mesecon.state.off, + rules = torch_get_output_rules + }} +}) + +minetest.register_node("mesecons_torch:mesecon_torch_on", { + drawtype = "torchlike", + tiles = {"jeija_torches_on.png", "jeija_torches_on_ceiling.png", "jeija_torches_on_side.png"}, + inventory_image = "jeija_torches_on.png", + wield_image = "jeija_torches_on.png", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + paramtype2 = "wallmounted", + selection_box = torch_selectionbox, + groups = {dig_immediate=3}, + light_source = default.LIGHT_MAX-5, + description="Mesecon Torch", + mesecons = {receptor = { + state = mesecon.state.on, + rules = torch_get_output_rules + }}, +}) + +minetest.register_abm({ + nodenames = {"mesecons_torch:mesecon_torch_off","mesecons_torch:mesecon_torch_on"}, + interval = 1, + chance = 1, + action = function(pos, node) + local is_powered = false + for _, rule in ipairs(torch_get_input_rules(node)) do + local src = mesecon.addPosRule(pos, rule) + if mesecon.is_power_on(src) then + is_powered = true + end + end + + if is_powered then + if node.name == "mesecons_torch:mesecon_torch_on" then + minetest.swap_node(pos, {name = "mesecons_torch:mesecon_torch_off", param2 = node.param2}) + mesecon.receptor_off(pos, torch_get_output_rules(node)) + end + elseif node.name == "mesecons_torch:mesecon_torch_off" then + minetest.swap_node(pos, {name = "mesecons_torch:mesecon_torch_on", param2 = node.param2}) + mesecon.receptor_on(pos, torch_get_output_rules(node)) + end + end +}) + +-- Param2 Table (Block Attached To) +-- 5 = z-1 +-- 3 = x-1 +-- 4 = z+1 +-- 2 = x+1 +-- 0 = y+1 +-- 1 = y-1 diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_off.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_off.png new file mode 100644 index 0000000..537920c Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_off.png differ diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_off_ceiling.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_off_ceiling.png new file mode 100644 index 0000000..3934e6e Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_off_ceiling.png differ diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_off_side.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_off_side.png new file mode 100644 index 0000000..ecb2951 Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_off_side.png differ diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_on.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_on.png new file mode 100644 index 0000000..a93dcc2 Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_on.png differ diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_on_ceiling.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_on_ceiling.png new file mode 100644 index 0000000..24fe201 Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_on_ceiling.png differ diff --git a/mods/mesecons/mesecons_torch/textures/jeija_torches_on_side.png b/mods/mesecons/mesecons_torch/textures/jeija_torches_on_side.png new file mode 100644 index 0000000..fe7dfd2 Binary files /dev/null and b/mods/mesecons/mesecons_torch/textures/jeija_torches_on_side.png differ diff --git a/mods/mesecons/mesecons_walllever/depends.txt b/mods/mesecons/mesecons_walllever/depends.txt new file mode 100644 index 0000000..19c798c --- /dev/null +++ b/mods/mesecons/mesecons_walllever/depends.txt @@ -0,0 +1,2 @@ +mesecons +mesecons_receiver diff --git a/mods/mesecons/mesecons_walllever/init.lua b/mods/mesecons/mesecons_walllever/init.lua new file mode 100644 index 0000000..5ebb6f8 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/init.lua @@ -0,0 +1,61 @@ +-- WALL LEVER +-- Basically a switch that can be attached to a wall +-- Powers the block 2 nodes behind (using a receiver) +mesecon.register_node("mesecons_walllever:wall_lever", { + description="Lever", + drawtype = "mesh", + inventory_image = "jeija_wall_lever_inv.png", + wield_image = "jeija_wall_lever_inv.png", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = { -8/16, -8/16, 3/16, 8/16, 8/16, 8/16 }, + }, + sounds = default.node_sound_wood_defaults(), + on_punch = function (pos, node) + if(mesecon.flipstate(pos, node) == "on") then + mesecon.receptor_on(pos, mesecon.rules.buttonlike_get(node)) + else + mesecon.receptor_off(pos, mesecon.rules.buttonlike_get(node)) + end + minetest.sound_play("mesecons_lever", {pos=pos}) + end +},{ + tiles = { + "jeija_wall_lever_lever_light_off.png", + "jeija_wall_lever_front.png", + "jeija_wall_lever_front_bump.png", + "jeija_wall_lever_back_edges.png" + }, + mesh="jeija_wall_lever_off.obj", + mesecons = {receptor = { + rules = mesecon.rules.buttonlike_get, + state = mesecon.state.off + }}, + groups = {dig_immediate = 2, mesecon_needs_receiver = 1} +},{ + tiles = { + "jeija_wall_lever_lever_light_on.png", + "jeija_wall_lever_front.png", + "jeija_wall_lever_front_bump.png", + "jeija_wall_lever_back_edges.png" + }, + mesh="jeija_wall_lever_on.obj", + mesecons = {receptor = { + rules = mesecon.rules.buttonlike_get, + state = mesecon.state.on + }}, + groups = {dig_immediate = 2, mesecon_needs_receiver = 1, not_in_creative_inventory = 1} +}) + +minetest.register_craft({ + output = "mesecons_walllever:wall_lever_off 2", + recipe = { + {"group:mesecon_conductor_craftable"}, + {"default:stone"}, + {"default:stick"}, + } +}) diff --git a/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj new file mode 100644 index 0000000..334b54b --- /dev/null +++ b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_off.obj @@ -0,0 +1,216 @@ +# Blender v2.73 (sub 0) OBJ File: 'mesecons-wall-lever-off.blend' +# www.blender.org +o nodebox-5 +v 0.281250 0.156250 0.312500 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.343751 0.218750 0.375000 +v 0.343751 -0.218752 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.281250 -0.156250 0.312500 +v -0.062500 -0.055586 0.191789 +v -0.062500 -0.087939 0.312529 +v -0.062500 -0.413939 0.225178 +v -0.062500 -0.381586 0.104437 +v -0.343751 0.218750 0.375000 +v 0.062500 -0.055586 0.191789 +v 0.062500 -0.087939 0.312529 +v -0.343751 -0.218752 0.375000 +v 0.062500 -0.413939 0.225178 +v 0.062500 -0.381586 0.104437 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +v -0.281250 0.156250 0.312500 +v -0.281250 -0.156250 0.312500 +v -0.250000 0.125000 0.312500 +v -0.250000 -0.125000 0.312500 +v 0.250000 0.125000 0.312500 +v 0.250000 -0.125000 0.312500 +v -0.250000 0.125000 0.250000 +v -0.250000 -0.125000 0.250000 +v 0.250000 0.125000 0.250000 +v 0.250000 -0.125000 0.250000 +v 0.125000 -0.062500 0.187500 +v 0.125000 0.062500 0.187500 +v -0.125000 -0.062500 0.187500 +v -0.125000 0.062500 0.187500 +v 0.062500 -0.031251 0.176992 +v 0.062500 0.031250 0.176992 +v -0.062498 -0.031251 0.176992 +v -0.062498 0.031250 0.176992 +v -0.187500 -0.093750 0.208750 +v 0.187500 0.093750 0.208750 +v 0.187500 -0.093750 0.208750 +v -0.187500 0.093750 0.208750 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +vt 0.312500 0.437500 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.437500 +vt 0.687500 0.187500 +vt 0.812500 0.187500 +vt 0.812500 0.312500 +vt 0.687500 0.312500 +vt 0.187500 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.796875 +vt 0.375000 0.796875 +vt 0.343750 0.765625 +vt 0.906250 0.765625 +vt 0.203125 0.875000 +vt 0.203125 0.625000 +vt 0.234375 0.593750 +vt 0.234375 0.906250 +vt 0.875000 0.890625 +vt 0.906250 0.921875 +vt 0.343750 0.921875 +vt 0.375000 0.890625 +vt 0.109375 0.875000 +vt 0.078125 0.906250 +vt 0.078125 0.593750 +vt 0.109375 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.000000 +vt 0.218880 0.343823 +vt 0.218880 0.656178 +vt 0.156408 0.718649 +vt 0.156408 0.281350 +vt 0.968592 0.718649 +vt 0.968592 0.281350 +vt 0.999827 0.125174 +vt 0.999827 0.874827 +vt 0.781120 0.656178 +vt 0.843592 0.718649 +vt 0.843592 0.281350 +vt 0.781120 0.343823 +vt 0.843592 0.156350 +vt 0.156408 0.156350 +vt 0.125173 0.000174 +vt 0.874827 0.000174 +vt 0.031408 0.718649 +vt 0.000173 0.874827 +vt 0.000173 0.125174 +vt 0.031408 0.281350 +vt 0.843592 0.843649 +vt 0.874827 0.999827 +vt 0.125173 0.999827 +vt 0.156408 0.843649 +vt 0.250000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.625000 +vt 0.187500 0.625000 +vt 0.187500 0.375000 +vt 0.625000 0.562500 +vt 0.562500 0.531250 +vt 0.562500 0.468750 +vt 0.625000 0.437500 +vt 0.437500 0.468750 +vt 0.437500 0.531250 +vt 0.375000 0.437500 +vt 0.375000 0.562500 +vt 0.312500 0.406250 +vt 0.687500 0.406250 +vt 0.312500 0.593750 +vt 0.687500 0.593750 +vt 1.000000 0.000000 +vt 1.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.000000 +vt 0.000000 0.875000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.125000 1.000000 +vn 0.000000 -0.258800 0.965900 +vn 0.000000 -0.965900 -0.258800 +vn 0.000000 0.258800 -0.965900 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.707100 -0.707100 +vn 0.000000 -0.707100 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.141100 0.273900 -0.951300 +vn -0.054600 0.137500 -0.989000 +vn -0.054600 -0.137500 -0.989000 +vn -0.141100 -0.273900 -0.951300 +vn 0.054600 -0.137500 -0.989000 +vn 0.054600 0.137500 -0.989000 +vn 0.141100 -0.273900 -0.951300 +vn 0.141100 0.273900 -0.951300 +vn 0.269900 -0.421500 -0.865700 +vn -0.269900 -0.421500 -0.865700 +vn 0.269900 0.421500 -0.865700 +vn -0.269900 0.421500 -0.865700 +vn -0.395600 0.336800 -0.854500 +vn 0.395600 0.336800 -0.854500 +vn 0.395600 -0.336800 -0.854500 +vn -0.395600 -0.336800 -0.854500 +vn 0.000000 -0.000000 1.000000 +g nodebox-5_nodebox-5_lever-light +s off +f 17/1/1 15/2/1 10/3/1 11/4/1 +f 18/5/2 17/6/2 11/7/2 12/8/2 +f 18/9/3 12/10/3 9/11/3 14/12/3 +f 26/13/4 28/14/4 8/15/4 24/16/4 +f 25/17/4 26/18/4 24/19/4 23/20/4 +f 25/21/4 23/22/4 1/23/4 27/24/4 +f 27/25/4 1/26/4 8/27/4 28/28/4 +f 12/29/5 11/4/5 10/3/5 9/30/5 +f 18/9/6 14/12/6 15/2/6 17/1/6 +g nodebox-5_nodebox-5_front +f 8/31/7 1/32/7 4/33/7 5/34/7 +f 13/35/4 16/36/4 3/37/4 2/38/4 +f 1/32/8 23/39/8 13/40/8 4/33/8 +f 8/31/9 5/34/9 16/41/9 24/42/9 +f 24/42/10 16/41/10 13/40/10 23/39/10 +f 16/43/4 5/44/4 7/45/4 3/46/4 +f 4/47/4 6/48/4 7/49/4 5/50/4 +f 13/51/4 2/52/4 6/53/4 4/54/4 +g nodebox-5_nodebox-5_front-bump +f 31/55/11 29/56/11 25/57/11 27/58/11 +f 32/59/12 28/60/12 26/61/12 30/62/12 +f 30/62/5 26/63/5 25/64/5 29/56/5 +f 32/59/6 31/55/6 27/65/6 28/66/6 +s 1 +f 36/67/13 40/68/14 39/69/15 35/70/16 +f 37/71/17 39/69/15 40/68/14 38/72/18 +f 35/70/16 39/69/15 37/71/17 33/73/19 +f 33/73/19 37/71/17 38/72/18 34/74/20 +f 34/74/20 38/72/18 40/68/14 36/67/13 +f 33/73/19 43/75/21 41/76/22 35/70/16 +f 33/73/19 34/74/20 42/77/23 43/75/21 +f 35/70/16 41/76/22 44/78/24 36/67/13 +f 42/77/23 44/78/24 29/56/25 31/55/26 +f 43/75/21 32/59/27 30/62/28 41/76/22 +f 43/75/21 42/77/23 31/55/26 32/59/27 +f 41/76/22 30/62/28 29/56/25 44/78/24 +f 34/74/20 36/67/13 44/78/24 42/77/23 +g nodebox-5_nodebox-5_back-edges +s off +f 19/79/29 20/80/29 22/81/29 21/82/29 +f 7/82/6 6/81/6 20/83/6 19/84/6 +f 3/82/5 21/84/5 22/83/5 2/81/5 +f 48/85/12 49/80/12 51/81/12 46/86/12 +f 47/85/11 45/86/11 52/81/11 50/80/11 diff --git a/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj new file mode 100644 index 0000000..a806be8 --- /dev/null +++ b/mods/mesecons/mesecons_walllever/models/jeija_wall_lever_on.obj @@ -0,0 +1,216 @@ +# Blender v2.73 (sub 0) OBJ File: 'mesecons-wall-lever.blend' +# www.blender.org +o nodebox-5 +v 0.281250 0.156250 0.312500 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.343751 0.218750 0.375000 +v 0.343751 -0.218752 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.281250 -0.156250 0.312500 +v -0.062500 0.075354 0.315617 +v -0.062500 0.043002 0.194876 +v -0.062500 0.369002 0.107525 +v -0.062500 0.401354 0.228266 +v -0.343751 0.218750 0.375000 +v 0.062500 0.075354 0.315617 +v 0.062500 0.043002 0.194876 +v -0.343751 -0.218752 0.375000 +v 0.062500 0.369002 0.107525 +v 0.062500 0.401354 0.228266 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +v -0.281250 0.156250 0.312500 +v -0.281250 -0.156250 0.312500 +v -0.250000 0.125000 0.312500 +v -0.250000 -0.125000 0.312500 +v 0.250000 0.125000 0.312500 +v 0.250000 -0.125000 0.312500 +v -0.250000 0.125000 0.250000 +v -0.250000 -0.125000 0.250000 +v 0.250000 0.125000 0.250000 +v 0.250000 -0.125000 0.250000 +v 0.125000 -0.062500 0.187500 +v 0.125000 0.062500 0.187500 +v -0.125000 -0.062500 0.187500 +v -0.125000 0.062500 0.187500 +v 0.062500 -0.031251 0.176992 +v 0.062500 0.031250 0.176992 +v -0.062498 -0.031251 0.176992 +v -0.062498 0.031250 0.176992 +v -0.187500 -0.093750 0.208750 +v 0.187500 0.093750 0.208750 +v 0.187500 -0.093750 0.208750 +v -0.187500 0.093750 0.208750 +v -0.375000 0.375000 0.375000 +v -0.375000 -0.375000 0.375000 +v 0.375000 0.375000 0.375000 +v 0.375000 -0.375000 0.375000 +v 0.375000 -0.375000 0.500000 +v 0.375000 0.375000 0.500000 +v -0.375000 -0.375000 0.500000 +v -0.375000 0.375000 0.500000 +vt 0.312500 0.437500 +vt 0.312500 0.000000 +vt 0.437500 0.000000 +vt 0.437500 0.437500 +vt 0.687500 0.187500 +vt 0.812500 0.187500 +vt 0.812500 0.312500 +vt 0.687500 0.312500 +vt 0.187500 0.437500 +vt 0.062500 0.437500 +vt 0.062500 0.000000 +vt 0.187500 0.000000 +vt 0.875000 0.796875 +vt 0.375000 0.796875 +vt 0.343750 0.765625 +vt 0.906250 0.765625 +vt 0.203125 0.875000 +vt 0.203125 0.625000 +vt 0.234375 0.593750 +vt 0.234375 0.906250 +vt 0.875000 0.890625 +vt 0.906250 0.921875 +vt 0.343750 0.921875 +vt 0.375000 0.890625 +vt 0.109375 0.875000 +vt 0.078125 0.906250 +vt 0.078125 0.593750 +vt 0.109375 0.625000 +vt 0.562500 0.437500 +vt 0.562500 0.000000 +vt 0.218880 0.343823 +vt 0.218880 0.656178 +vt 0.156408 0.718649 +vt 0.156408 0.281350 +vt 0.968592 0.718649 +vt 0.968592 0.281350 +vt 0.999827 0.125174 +vt 0.999827 0.874827 +vt 0.781120 0.656178 +vt 0.843592 0.718649 +vt 0.843592 0.281350 +vt 0.781120 0.343823 +vt 0.843592 0.156350 +vt 0.156408 0.156350 +vt 0.125173 0.000174 +vt 0.874827 0.000174 +vt 0.031408 0.718649 +vt 0.000173 0.874827 +vt 0.000173 0.125174 +vt 0.031408 0.281350 +vt 0.843592 0.843649 +vt 0.874827 0.999827 +vt 0.125173 0.999827 +vt 0.156408 0.843649 +vt 0.250000 0.625000 +vt 0.750000 0.625000 +vt 0.750000 0.687500 +vt 0.250000 0.687500 +vt 0.250000 0.375000 +vt 0.250000 0.312500 +vt 0.750000 0.312500 +vt 0.750000 0.375000 +vt 0.812500 0.375000 +vt 0.812500 0.625000 +vt 0.187500 0.625000 +vt 0.187500 0.375000 +vt 0.625000 0.562500 +vt 0.562500 0.531250 +vt 0.562500 0.468750 +vt 0.625000 0.437500 +vt 0.437500 0.468750 +vt 0.437500 0.531250 +vt 0.375000 0.437500 +vt 0.375000 0.562500 +vt 0.312500 0.406250 +vt 0.687500 0.406250 +vt 0.312500 0.593750 +vt 0.687500 0.593750 +vt 1.000000 0.000000 +vt 1.000000 0.875000 +vt 0.125000 0.875000 +vt 0.125000 0.000000 +vt 0.000000 0.875000 +vt 0.000000 0.000000 +vt 1.000000 1.000000 +vt 0.125000 1.000000 +vn 0.000000 -0.258800 -0.965900 +vn 0.000000 0.965900 -0.258800 +vn 0.000000 0.258800 0.965900 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 0.000000 +vn 1.000000 0.000000 0.000000 +vn 0.707100 0.000000 -0.707100 +vn 0.000000 0.707100 -0.707100 +vn 0.000000 -0.707100 -0.707100 +vn -0.707100 0.000000 -0.707100 +vn 0.000000 1.000000 0.000000 +vn 0.000000 -1.000000 0.000000 +vn -0.141100 0.273900 -0.951300 +vn -0.054600 0.137500 -0.989000 +vn -0.054600 -0.137500 -0.989000 +vn -0.141100 -0.273900 -0.951300 +vn 0.054600 -0.137500 -0.989000 +vn 0.054600 0.137500 -0.989000 +vn 0.141100 -0.273900 -0.951300 +vn 0.141100 0.273900 -0.951300 +vn 0.269900 -0.421500 -0.865700 +vn -0.269900 -0.421500 -0.865700 +vn 0.269900 0.421500 -0.865700 +vn -0.269900 0.421500 -0.865700 +vn -0.395600 0.336800 -0.854500 +vn 0.395600 0.336800 -0.854500 +vn 0.395600 -0.336800 -0.854500 +vn -0.395600 -0.336800 -0.854500 +vn 0.000000 -0.000000 1.000000 +g nodebox-5_nodebox-5_lever-light +s off +f 17/1/1 15/2/1 10/3/1 11/4/1 +f 18/5/2 17/6/2 11/7/2 12/8/2 +f 18/9/3 12/10/3 9/11/3 14/12/3 +f 26/13/4 28/14/4 8/15/4 24/16/4 +f 25/17/4 26/18/4 24/19/4 23/20/4 +f 25/21/4 23/22/4 1/23/4 27/24/4 +f 27/25/4 1/26/4 8/27/4 28/28/4 +f 12/29/5 11/4/5 10/3/5 9/30/5 +f 18/9/6 14/12/6 15/2/6 17/1/6 +g nodebox-5_nodebox-5_front +f 8/31/7 1/32/7 4/33/7 5/34/7 +f 13/35/4 16/36/4 3/37/4 2/38/4 +f 1/32/8 23/39/8 13/40/8 4/33/8 +f 8/31/9 5/34/9 16/41/9 24/42/9 +f 24/42/10 16/41/10 13/40/10 23/39/10 +f 16/43/4 5/44/4 7/45/4 3/46/4 +f 4/47/4 6/48/4 7/49/4 5/50/4 +f 13/51/4 2/52/4 6/53/4 4/54/4 +g nodebox-5_nodebox-5_front-bump +f 31/55/11 29/56/11 25/57/11 27/58/11 +f 32/59/12 28/60/12 26/61/12 30/62/12 +f 30/62/5 26/63/5 25/64/5 29/56/5 +f 32/59/6 31/55/6 27/65/6 28/66/6 +s 1 +f 36/67/13 40/68/14 39/69/15 35/70/16 +f 37/71/17 39/69/15 40/68/14 38/72/18 +f 35/70/16 39/69/15 37/71/17 33/73/19 +f 33/73/19 37/71/17 38/72/18 34/74/20 +f 34/74/20 38/72/18 40/68/14 36/67/13 +f 33/73/19 43/75/21 41/76/22 35/70/16 +f 33/73/19 34/74/20 42/77/23 43/75/21 +f 35/70/16 41/76/22 44/78/24 36/67/13 +f 42/77/23 44/78/24 29/56/25 31/55/26 +f 43/75/21 32/59/27 30/62/28 41/76/22 +f 43/75/21 42/77/23 31/55/26 32/59/27 +f 41/76/22 30/62/28 29/56/25 44/78/24 +f 34/74/20 36/67/13 44/78/24 42/77/23 +g nodebox-5_nodebox-5_back-edges +s off +f 19/79/29 20/80/29 22/81/29 21/82/29 +f 7/82/6 6/81/6 20/83/6 19/84/6 +f 3/82/5 21/84/5 22/83/5 2/81/5 +f 48/85/12 49/80/12 51/81/12 46/86/12 +f 47/85/11 45/86/11 52/81/11 50/80/11 diff --git a/mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg b/mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg new file mode 100644 index 0000000..53d45c1 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/sounds/mesecons_lever.ogg differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png new file mode 100644 index 0000000..936b454 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_back_edges.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png new file mode 100644 index 0000000..1bd747a Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png new file mode 100644 index 0000000..5c2a88a Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_front_bump.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png new file mode 100644 index 0000000..474f8c1 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_inv.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png new file mode 100644 index 0000000..2b47c7d Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_off.png differ diff --git a/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png new file mode 100644 index 0000000..83b83a0 Binary files /dev/null and b/mods/mesecons/mesecons_walllever/textures/jeija_wall_lever_lever_light_on.png differ diff --git a/mods/mesecons/modpack.txt b/mods/mesecons/modpack.txt new file mode 100644 index 0000000..33d91f5 --- /dev/null +++ b/mods/mesecons/modpack.txt @@ -0,0 +1 @@ +The presence of this file indicates that the current folder is a modpack. \ No newline at end of file diff --git a/mods/mines_with_shafts/README.md b/mods/mines_with_shafts/README.md new file mode 100644 index 0000000..ad62d60 --- /dev/null +++ b/mods/mines_with_shafts/README.md @@ -0,0 +1 @@ +This mod is a work in progress. diff --git a/mods/mines_with_shafts/config.lua b/mods/mines_with_shafts/config.lua new file mode 100644 index 0000000..3fcd126 --- /dev/null +++ b/mods/mines_with_shafts/config.lua @@ -0,0 +1,58 @@ + +-- nodes that may be found at the side of the tunnels randomly; +-- * increase the first number to increase (relative) frequency of that node +-- * set the second number to -1 in order to bury the node in the ground +-- (or 1 to put it up one node higher) +mines_with_shafts.deco = { + ["tnt:tnt" ] = {1,0}, + ["default:chest" ] = {5,0}, + ["default:desert_stone" ] = {1,0}, + ["default:stone" ] = {1,0}, + ["default:stone_with_coal" ] = {1,0}, + ["default:stone_with_iron" ] = {1,0}, + ["default:stone_with_copper" ] = {1,0}, + ["default:stone_with_mese" ] = {1,0}, + ["default:stone_with_diamond"] = {1,0}, + ["default:sand" ] = {1,0}, + ["default:gravel" ] = {2,0}, + ["default:ladder" ] = {2,0}, + ["default:ladder" ] = {2,1}, -- ladder on the wall + ["default:sandstone" ] = {1,0}, + ["default:coalblock" ] = {2,0}, + ["default:steelblock" ] = {1,0}, + ["default:copperblock" ] = {1,0}, + ["default:sign_wall" ] = {2,1}, -- a sign at eye level + ["default:sign_wall" ] = {1,0}, -- a sign on floor level + ["default:torch" ] = {2,1}, + ["cottages:shelf" ] = {4,0}, + ["cottages:barrel" ] = {2,0}, + ["cottages:tub" ] = {1,0}, + ["cottages:table" ] = {1,0}, + ["cottages:bench" ] = {3,0}, + -- burried decorations + ["default:water_source" ] = {2,-1}, + ["air" ] = {2,-1}, + ["stairs:slab_wood" ] = {1,-1}, + ["stairs:slab_stone" ] = {1,-1}, + ["stairs:slab_cobble" ] = {1,-1}, + ["stairs:stair_wood" ] = {1,-1}, + ["stairs:stair_stone" ] = {1,-1}, + ["stairs:stair_cobble" ] = {1,-1}, +} + + +-- how many nodes ought to be between two randomly placed decos? +mines_with_shafts.deco_average_distance = 15; + +-- set to true in order to get meselamps in vertical shafts all 20 nodes +mines_with_shafts.place_meselamps = false; + +-- some tunnels are above ground; +-- they may require a bridge in order to reach further parts of the network; +-- the entrances also become better visible that way +mines_with_shafts.MIN_BRIDGE_LENGTH = 5 +-- bridges can never grow longer than this size +mines_with_shafts.MAX_BRIDGE_LENGTH = 12 + +-- put a mese lamp where a tunnel would be placed above ground (only for debugging purposes) +mines_with_shafts.MARK_TUNNELS = nil; --minetest.get_content_id('default:meselamp'); diff --git a/mods/mines_with_shafts/depends.txt b/mods/mines_with_shafts/depends.txt new file mode 100644 index 0000000..1370a05 --- /dev/null +++ b/mods/mines_with_shafts/depends.txt @@ -0,0 +1,5 @@ +default +cottages? +tnt? +stairs? +carts? diff --git a/mods/mines_with_shafts/init.lua b/mods/mines_with_shafts/init.lua new file mode 100644 index 0000000..ff20bfd --- /dev/null +++ b/mods/mines_with_shafts/init.lua @@ -0,0 +1,70 @@ +-- the namespace +mines_with_shafts = {}; + +mines_with_shafts.modpath = minetest.get_modpath( "mines_with_shafts"); + +-- the mod comes with its own ladder and rope; both act as rails for carts +dofile(mines_with_shafts.modpath.."/nodes.lua") + + +-- TODO: give credits to the texture creator(s) + +-- use the powerrail from carts if available +mines_with_shafts.rail_typ_name = 'default:rail'; +if( minetest.get_modpath( 'carts' ) + and minetest.registered_nodes[ 'carts:powerrail' ]) then + mines_with_shafts.rail_typ_name = 'carts:powerrail'; +end + +dofile(mines_with_shafts.modpath.."/config.lua") +dofile(mines_with_shafts.modpath.."/mines_horizontal_tunnels.lua") +dofile(mines_with_shafts.modpath.."/mines_vertical_shafts.lua") +dofile(mines_with_shafts.modpath.."/mines_create.lua") + +-- create a list containing all possible decorations for the sides of the mines +mines_with_shafts.init_deco_list = function() + + mines_with_shafts.deco_list = {}; + + for k,v in pairs( mines_with_shafts.deco ) do + local reg_node = minetest.registered_nodes[ k ]; + if( reg_node ) then + + mines_with_shafts.deco[k][3] = minetest.get_content_id( k ); + + -- nodes with wallmounted or facedir need to be treated diffrently + mines_with_shafts.deco[k][4] = 0; + if( reg_node.paramtype2 and reg_node.paramtype2=='facedir' ) then + mines_with_shafts.deco[k][4] = 1; + elseif( reg_node.paramtype2 and reg_node.paramtype2=='wallmounted' ) then + mines_with_shafts.deco[k][4] = 2; + end + + mines_with_shafts.deco[k][5] = nil; + -- nodes with on_construct need special treatment as welll + if( reg_node.on_construct ) then + mines_with_shafts.deco[k][5] = reg_node.on_construct; + end + + -- now add the node to the list as often as requested + for i=1,mines_with_shafts.deco[k][1] do + mines_with_shafts.deco_list[ #mines_with_shafts.deco_list+1 ] = k; + end + end + end + + -- make sure the average distance remains constant even if we add more nodes + mines_with_shafts.deco_average_distance = mines_with_shafts.deco_average_distance + * #mines_with_shafts.deco_list; +end +mines_with_shafts.init_deco_list(); + + +-- adjust some node definitions in order to avoid cavegen griefing +local def = minetest.registered_nodes['default:wood']; +def.is_ground_content = false; +minetest.register_node( ':default:wood', def ); + +def = minetest.registered_nodes[mines_with_shafts.rail_typ_name]; +def.is_ground_content = false; +minetest.register_node( ':'..mines_with_shafts.rail_typ_name, def ); diff --git a/mods/mines_with_shafts/mines_create.lua b/mods/mines_with_shafts/mines_create.lua new file mode 100644 index 0000000..53f2df3 --- /dev/null +++ b/mods/mines_with_shafts/mines_create.lua @@ -0,0 +1,360 @@ + +local cid_mines = {}; + +cid_mines.c_ignore = minetest.get_content_id('ignore'); +cid_mines.c_air = minetest.get_content_id('air'); + +-- basic material used for the tunnels +cid_mines.c_wood = minetest.get_content_id('default:wood'); +cid_mines.c_fence = minetest.get_content_id('default:fence_wood'); +cid_mines.c_torch = minetest.get_content_id('default:torch'); +cid_mines.c_rail = minetest.get_content_id( mines_with_shafts.rail_typ_name ); + +-- basic additional material used for the shafts +cid_mines.c_mineladder = minetest.get_content_id('mines_with_shafts:ladder'); +cid_mines.c_rope = minetest.get_content_id('mines_with_shafts:rope'); +cid_mines.c_meselamp = minetest.get_content_id('default:meselamp'); + +-- node types that force mine shafts to end there (floodings are still possible) +cid_mines.c_lava = minetest.get_content_id('default:lava_source'); +cid_mines.c_lava_flowing = minetest.get_content_id('default:lava_flowing'); +cid_mines.c_water = minetest.get_content_id('default:water_source'); +cid_mines.c_cobble = minetest.get_content_id('default:cobble'); + + + +mines_with_shafts.get_mines_at = function( minp, maxp, check_range ) + if( true ) then return {{x=100,y=5,z=100, seed=100*64000+100}}; end + local mine_positions = {}; +if(true) then return {{x=-72,y=5,z=168, seed=-72*64000+168}}; end + + local chunk_size = maxp.x - minp.x; + -- for now: no check for chunks in y direction + local cy=0; + for cx=-1*check_range,check_range do + for cz=-1*check_range,check_range do + + local pos = { x=(minp.x+40+cx*chunk_size), y=20, z=(minp.z+40+cz*chunk_size) }; + if( math.abs(pos.x)%3==0 and math.abs(pos.z)%3==0 + and pos.x>=(minp.x+cx*chunk_size) and pos.x<=(maxp.x+cx*chunk_size) + and pos.z>=(minp.z+cz*chunk_size) and pos.z<=(maxp.z+cz*chunk_size)) then + mine_positions[ #mine_positions+1 ] = {x=pos.x,y=pos.y,z=pos.z, seed = pos.x * 64000 + pos.z}; + end + end + end + return mine_positions; +end + + + + +mines_with_shafts.create_mine = function( minp, maxp, data, param2_data, a, heightmap, pos, extra_calls_mines ) + + -- the main level may have levels of tunnels above and below it; + -- each mine has its own deterministic value (else we get into trouble with chunks generated below or above) + local pr = PseudoRandom( pos.seed ); + local main_level_at = pr:next( -128, -50 ); + -- make sure all levels are at heights that are multitudes of 10 + main_level_at = main_level_at - (main_level_at%10) +5; + + local surface_level_at = pr:next( 20,30 ); + surface_level_at = surface_level_at - (surface_level_at%10) +5; + + local chunksize = maxp.x - minp.x + 1; + + -- this is a mapchunk that contains part of the vertical shaft + if( pos.x >= minp.x and pos.x <= maxp.x + and pos.z >= minp.z and pos.z <= maxp.z) then + local surface_height = 35; + -- this is the level that (may) contain the surface + if( maxp.y >0 ) then + -- determine average surface height + local sum_height = 0; + local count = 0; + for ax=pos.x-1,pos.x+1 do + for az=pos.z-1,pos.z+1 do + local height = 1; + if( heightmap ) then + height = heightmap[(az-minp.z)*chunksize+(ax-minp.x)+1]; + -- TODO: add alternate way in case of heightmap not defined + end + if( height and ax>=minp.x and ax<=maxp.x and az>=minp.z and az<=maxp.z) then + if( height > 0 ) then + sum_height = sum_height + height; + end + count = count+1; + end + end + end + if( count>0 and sum_height>=0 + and data[ a:index( pos.x, minp.y, pos.z)] ~= cid_mines.c_rope + and data[ a:index( pos.x, minp.y, pos.z)] ~= cid_mines.c_fence) then + surface_height = math.max(1, sum_height/count); + surface_height = surface_height - (surface_height%10)+4; +--print('SURFACE HEIGHT: '..tostring( surface_height )..' COUNT: '..tostring(count)..' sum: '..tostring(sum_height)); + local spos = {x=pos.x, y=surface_height, z=pos.z}; + -- the schematic for the mining tower will be placed later on (after voxelmanip has been dealt with) + table.insert( extra_calls_mines.schems, {x=pos.x-5, y=surface_height-6, z=pos.z-5, file='mining_tower_1_7_90'}); + else + surface_height = maxp.y+1; + end + + if( surface_height < 1 ) then + surface_height = 1; + end + end + + -- that part of the vertical shaft that goes through this chunk may not be longer than the vertical chunk size + local y_start = math.min( maxp.y, surface_height ); + local y_end = math.max( minp.y, main_level_at ); + local vlength = math.min( maxp.y-minp.y, y_start - y_end); + + -- actually place the VERTICAL shaft + local vpos = {x=pos.x, y=y_start, z=pos.z}; + mines_with_shafts.place_mineshaft_vertical(minp, maxp, data, param2_data, a, cid_mines, vpos, vlength, extra_calls_mines ); + end + + local npos = {x=pos.x, y=main_level_at; z=pos.z}; + +if( surface_level_at > 15 ) then + surface_level_at = surface_level_at - 5; +end + for i=5,-5,-1 do + local iteration_depth = 0; + if( i==0 ) then + iteration_depth = 0; + elseif( math.abs(i)<3 ) then + iteration_depth = 1; + else + iteration_depth = 2; + end + if( pr:next(1,5)<4 ) then + npos.y = surface_level_at+i*5; + mines_with_shafts.create_branches_at_level( minp, maxp, data, param2_data, a, cid_mines, npos, extra_calls_mines, pr, 1, iteration_depth, heightmap ); + end + if( pr:next(1,5)<3 ) then + npos.y = main_level_at+25+i*5; + mines_with_shafts.create_branches_at_level( minp, maxp, data, param2_data, a, cid_mines, npos, extra_calls_mines, pr, 1, iteration_depth, heightmap ); + end + end +end + + +mines_with_shafts.create_branches_at_level = function( minp, maxp, data, param2_data, a, cid_mines, pos, extra_calls_mines, pr, primary_axis, initial_iteration_depth, heightmap ) + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, pos, extra_calls_mines, pr, 1, primary_axis, initial_iteration_depth, heightmap ); + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, pos, extra_calls_mines, pr,-1, primary_axis, initial_iteration_depth, heightmap ); + -- smaller branches at the side + if( primary_axis == 1 ) then + primary_axis = 0; + else + primary_axis = 1; + end + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, pos, extra_calls_mines, pr, 1, primary_axis, math.min(3,initial_iteration_depth+2 ), heightmap); + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, pos, extra_calls_mines, pr,-1, primary_axis, math.min(3,initial_iteration_depth+2 ), heightmap); +end + + + + +mines_with_shafts.create_branch = function( minp, maxp, data, param2_data, a, cid_mines, pos, extra_calls_mines, pr, d1, d2, iteration_depth, heightmap ) + -- abort - do not create branches without limit + if( iteration_depth > 3 ) then + return; + end + local l1=40; + if( iteration_depth==1 ) then + l1 = 35; + elseif( iteration_depth==2 ) then + l1 = 25; + else + l1 = 15; + end + -- branches at heigher iteration levels get shorter + local length = 4*pr:next(1,math.max(1,l1)); + if( iteration_depth == 1 ) then + length = length+(4+3); + end + +local material = 'default:wood'; +if( iteration_depth == 1 ) then material = 'default:meselamp'; elseif (iteration_depth==2 ) then material = 'wool:pink'; end + -- create the main tunnel + mines_with_shafts.place_minetunnel_horizontal(minp, maxp, data, param2_data, a, cid_mines, pos, d1*length, d2, extra_calls_mines, heightmap, material ); + + -- if we went into z direction before, let the branches go into x direction (and vice versa) + local nd2 = 0; + if( d2==0 ) then + nd2 = 1; + end + + local last_right = true; + local last_left = true; + local dist_last_shaft = 0; + for i=4,length,4 do + local p = pr:next(1,30); + local npos = {x=pos.x, y=pos.y, z=pos.z}; + if( d2==1 ) then + npos.x = pos.x+i*d1; + else + npos.z = pos.z+i*d1; + end + -- new branches at both sides + if( p==1 and not(last_right or last_left)) then + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, npos, extra_calls_mines, pr, d1, nd2, iteration_depth+1, heightmap ); + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, npos, extra_calls_mines, pr, d1*-1, nd2, iteration_depth+1, heightmap ); + last_right = true; + last_left = true; + -- new branch at one side + elseif( (p==2 or p==3) and not(last_left)) then + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, npos, extra_calls_mines, pr, d1, nd2, iteration_depth+1, heightmap ); + last_right = false; + last_left = true; + -- new branch at the other side + elseif( (p==4 or p==5) and not(last_right)) then + mines_with_shafts.create_branch( minp, maxp, data, param2_data, a, cid_mines, npos, extra_calls_mines, pr, d1*-1, nd2, iteration_depth+1, heightmap ); + last_right = true; + last_left = false; + + elseif( pr:next(1,6)>3 ) then + last_right = false; + last_left = false; + end + + -- allow two branches in the same direction - but only rarely + if( pr:next(1,8)==1 ) then + last_right = false; + last_left = false; + end + + if false and (pr:next(1,10)==1 or (dist_last_shaft>3 and iteration_depth==0 and pr:next(1,3)==1)) then + local dir = pr:next(1,5); + local y_start = npos.y; + local y_end = npos.y; + local h_max = 5; + if( iteration_depth==0 ) then + h_max = 8; + end + if( dir==1 and dist_last_shaft>2) then + y_start = y_start + pr:next(1,h_max)*5; + elseif( dir==2 and dist_last_shaft>2) then + y_end = y_end - pr:next(1,h_max)*5; + elseif( dir==3 and dist_last_shaft>2) then + y_start = y_start + pr:next(1,h_max)*5; + y_end = y_end - pr:next(1,h_max)*5; + end + -- make sure the vertical shaft does not go up higher than the surface + local height = 1; + if( heightmap ) then + height = heightmap[(npos.z-minp.z)*( maxp.x - minp.x + 1)+(npos.x-minp.x)+1]; + else + light = minetest.get_node_light({x=npos.x, y=npos.y+2, z=npos.z}, 0.5); + if( not(light) or light<14 ) then + height = pos.y+3; + end + end + if( not( height )) then + height = 1; + -- TODO: add alternate way in case heightmap not defined + end + y_start = math.min( height, y_start ); + if( y_start > y_end ) then + local vlength = y_start - y_end +2; + local vpos = {x=npos.x, y=y_start+2, z=npos.z}; + mines_with_shafts.place_mineshaft_vertical(minp, maxp, data, param2_data, a, cid_mines, vpos, vlength, extra_calls_mines ); + dist_last_shaft = 0; + + if( height and y_start >= height and height>=minp.y and height<=maxp.y and height>=0 + and npos.x>=minp.x and npos.x<=maxp.x and npos.z>=minp.z and npos.z<=maxp.z) then + -- TODO: make that configurable + local schems = { 'mine_shaft_entrance_basic_1_90', + 'mine_shaft_entrance_stonebrick_1_90', + 'mine_shaft_entrance_simple_1_90'}; + local i = pr:next(1,#schems); + table.insert( extra_calls_mines.schems, {x=npos.x-2, y=math.max(1,height), z=npos.z-2, file=schems[i]}); + end + end + else + dist_last_shaft = dist_last_shaft + 1; + end + end +end + + +-- set up metadata by calling on_construct; +-- also places schematics for mine entrances/mining towers +mines_with_shafts.handle_metadata = function( extra_calls ) + + -- call on_construct for those nodes that need it + for _,v in pairs( extra_calls.mines ) do + if( v.typ and mines_with_shafts.deco[ v.typ ] and mines_with_shafts.deco[ v.typ ][5]) then + local on_construct = mines_with_shafts.deco[ v.typ ][5]; + on_construct( {x=v.x, y=v.y, z=v.z} ); + end + end + + local path = mines_with_shafts.modpath..'/schems/'; + for _,v in pairs( extra_calls.schems ) do + if( v.file ) then +print('PLACING SCHEM '..tostring( v.file )..' AT '..minetest.pos_to_string( v )); -- TODO + minetest.place_schematic( {x=v.x, y=v.y, z=v.z}, path..v.file..".mts", "0", {}, true); + end + end + + -- TODO: fill chests, add text to signs +end + + +minetest.register_on_generated(function(minp, maxp, seed) + + -- do not handle mapchunks which are either too heigh or too deep for a mine + if( minp.y < -128 or minp.y > 64) then + return; + end + -- check if there are any mines around which might be part of this maphunk + local mine_positions = mines_with_shafts.get_mines_at( minp, maxp, 3); + if( not( mine_positions ) or #mine_positions < 1 ) then + return; + end + + + local vm; + local a; + local data; + local param2_data; + -- get the voxelmanip object + local emin; + local emax; + -- if no voxelmanip data was passed on, read the data here + if( not( vm ) or not( a) or not( data ) or not( param2_data ) ) then + vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + if( not( vm )) then + return; + end + + a = VoxelArea:new{ + MinEdge={x=emin.x, y=emin.y, z=emin.z}, + MaxEdge={x=emax.x, y=emax.y, z=emax.z}, + } + + data = vm:get_data() + param2_data = vm:get_param2_data() + end + + local heightmap = minetest.get_mapgen_object('heightmap'); + + -- actually create the mine + local extra_calls = {mines={}, schems={}}; + for _,pos in ipairs( mine_positions ) do + mines_with_shafts.create_mine( minp, maxp, data, param2_data, a, heightmap, pos, extra_calls ); + end + + + -- store the voxelmanip data + vm:set_data(data) + vm:set_param2_data(param2_data) + + vm:calc_lighting( emin, emax); + vm:write_to_map(data); + vm:update_liquids(); + + mines_with_shafts.handle_metadata( extra_calls ); +end) diff --git a/mods/mines_with_shafts/mines_horizontal_tunnels.lua b/mods/mines_with_shafts/mines_horizontal_tunnels.lua new file mode 100644 index 0000000..3f268ed --- /dev/null +++ b/mods/mines_with_shafts/mines_horizontal_tunnels.lua @@ -0,0 +1,286 @@ +----------------------------------------------------- +-- this creates the horizontal tunnels for the mines +---------------------------------------------------- + + +-- if length is <0, the tunnel will go in the opposite direction; +-- returns the length of the new tunnel +mines_with_shafts.place_minetunnel_horizontal = function(minp, maxp, data, param2_data, a, cid, pos, length, parallel_to_x_axis, extra_calls, heightmap ) + + -- exclude those tunnels that are not part of this mapchunk + -- we are only responsible for this tunnel if the central part of it is contained in this mapchunk; + -- that way, there will always be exactly one mapchunk responsible for each tunnel, + -- and the heightmap can be used as well; + -- further boundary checks are not necessary as the tunnel will be smaller than the shell + if( pos.y < minp.y or pos.y > maxp.y + or (parallel_to_x_axis==1 and ((pos.z < minp.z or pos.z > maxp.z) or (length>0 and pos.x>maxp.x) or (length<0 and pos.x maxp.x) or (length>0 and pos.z>maxp.z) or (length<0 and pos.z= minp.x and ax <= maxp.x and az >= minp.z and az <= maxp.z and pos.y >= minp.y and pos.y <= maxp.y) then + + if( pos.y < 0 ) then + d = 0; + else + local height = 1; + if( heightmap ) then + height = heightmap[(az-minp.z)*chunksize+(ax-minp.x)+1]; + else + light = minetest.get_node_light({x=ax, y=pos.y+2, z=az}, 0.5); + if( not(light) or light<14 ) then + height = pos.y+3; + end + end + if( height and height > minp.y and height < maxp.y ) then + if( height <= pos.y+1 ) then + if( mines_with_shafts.MARK_TUNNELS ) then + data[ a:index( ax, height, az )] = mines_with_shafts.MARK_TUNNELS; + end + d = d+1; + if( d>=5) then + candidates[ #candidates+1 ] = {ax,az,seq_nr}; + end + elseif( height > pos.y+1 ) then + d = 0; + end + else + candidates[ #candidates+1 ] = {ax,az,seq_nr}; + end + end + + if( d<5 ) then + local res = mines_with_shafts.do_minetunnel_horizontal_slice( minp, maxp, data, param2_data, a, cid, + {x=ax, y=pos.y, z=az}, vector_quer, seq_nr, (length<0), extra_calls); + -- place the last 5 slices so that the entrance looks better + if( #candidates > 0 ) then + local bridge_length = mines_with_shafts.MIN_BRIDGE_LENGTH; + if( #candidates <= mines_with_shafts.MAX_BRIDGE_LENGTH ) then + bridge_length = #candidates; + end + for j=math.max(1,#candidates-bridge_length),#candidates do + local res = mines_with_shafts.do_minetunnel_horizontal_slice( minp, maxp, data, param2_data, a, cid, + {x=candidates[j][1], y=pos.y, z=candidates[j][2]}, vector_quer, candidates[j][3], (length<0), extra_calls); + end + candidates = {}; + end + end + end + ax = ax+px; + az = az+pz; + end + + return math.abs(length); +end + + +-- internal function +-- * go one node into the direction given by vector +-- * place a support beam made from wood and fences if beam_seq_nr==0 +-- * place torches and random nodes at the sides otherwise +-- * returns a value >= 0 if everything went fine +-- * returns a value <0 if the mine has to end at this place (i.e. sunlight detected, or water/lava found +mines_with_shafts.do_minetunnel_horizontal_slice = function( minp, maxp, data, param2_data, a, cid, pos, vector, beam_seq_nr, backwards, extra_calls ) + local p = {x=pos.x, y=pos.y, z=pos.y}; + + local ax=pos.x; + local az=pos.z; + + -- check if there are any nodes that force an end to the tunnel + for ax=pos.x+(vector.x*-2),pos.x+(vector.x*2) do + for az=pos.z+(vector.z*-2),pos.z+(vector.z*2) do + for y=-1,2 do + local old_node = data[ a:index( ax, pos.y+y, az)]; + -- we have hit a vertical minetunnel + if( old_node==cid.c_mineladder or old_node==cid.c_rope ) then + -- the tunnel may still continue behind this vertical tunnel +--print('MINETUNNEL abort due to shaft at '..minetest.pos_to_string( pos)); + return 0; + end + + -- we do not want to build a tunnel through lava or water; though both may flow in if we digged too far + -- (the poor inhabitants will have given up the tunnel) + if( old_node==cid.c_lava or old_node==cid.c_lava_flowing or old_node==cid.c_water ) then + -- the tunnel has to end here +--print('MINETUNNEL abort due to water or lava at '..minetest.pos_to_string( pos)); + return -1; + end + end + end + end + + for i=-1,1 do + local ax = pos.x+(vector.x*i ); + local az = pos.z+(vector.z*i ); + local old_node = data[ a:index( ax, pos.y-1, az)]; + -- if there is air at the bottom, place some wood to walk on (even if the tunnel will later be aborted) + if( old_node==cid.c_air or old_node==cid.c_fence or old_node==cid.c_ignore) then + data[ a:index( ax, pos.y-1, az)] = cid.c_wood; + end + if( beam_seq_nr==0 and i~=0) then + local k=-2; + local ground_found = false; + while( not( ground_found) + and pos.y+k>=minp.y-16 + and a:contains( ax, pos.y+k, az )) do + local old_node = data[ a:index( ax, pos.y+k, az)]; + if( old_node == cid.c_air ) then + data[ a:index( ax, pos.y+k, az)] = cid.c_fence; + elseif( old_node == cid.c_water + or old_node == cid.c_lava ) then + data[ a:index( ax, pos.y+k, az)] = cid.c_cobble; + else + ground_found = true; + end + k = k-1; + end + end + end + + -- there will always be a rail on the ground + data[ a:index( pos.x, pos.y, pos.z )] = cid.c_rail; + data[ a:index( pos.x, pos.y+1, pos.z )] = cid.c_air; + + -- every 4th tunnel has a wooden support beam + if( beam_seq_nr == 0 ) then + -- either vector.x or vector.z is 0; the other value will be 1 + ax = vector.x; + az = vector.z; + -- place the four fences at the sides + data[ a:index( pos.x-ax, pos.y, pos.z-az )] = cid.c_fence; + data[ a:index( pos.x-ax, pos.y+1, pos.z-az )] = cid.c_fence; + data[ a:index( pos.x+ax, pos.y, pos.z+az )] = cid.c_fence; + data[ a:index( pos.x+ax, pos.y+1, pos.z+az )] = cid.c_fence; + -- place the three wooden planks on top of the fences + data[ a:index( pos.x, pos.y+2, pos.z )] = cid.c_wood; + data[ a:index( pos.x-ax, pos.y+2, pos.z-az )] = cid.c_wood; + data[ a:index( pos.x+ax, pos.y+2, pos.z+az )] = cid.c_wood; + -- all has been placed successfully + return 1; + end + + + -- create the tunnel as such + for ax=pos.x+(vector.x*-1),pos.x+(vector.x*1) do + for az=pos.z+(vector.z*-1),pos.z+(vector.z*1) do + for ay = pos.y, pos.y+2 do + if( (ax ~= pos.x or az ~= pos.z) and ( ay>pos.y or data[a:index(ax,ay,az)]~=cid.c_rail)) then + data[ a:index( ax, ay, az )] = cid.c_air; + end + end + end + end + + -- attach a torch to the beam + local p2 = -1; + if( beam_seq_nr == 1 ) then + if( vector.x ~= 0 ) then + p2 = 5; + elseif( vector.z ~= 0 ) then + p2 = 3; + end + -- put air in the middle + elseif( beam_seq_nr == 2 ) then + data[ a:index( pos.x, pos.y+2, pos.z )] = cid.c_air; + -- attach a torch to the beam + elseif( beam_seq_nr == 3 ) then + if( vector.x ~= 0 ) then + p2 = 4; + elseif( vector.z ~= 0 ) then + p2 = 2; + end + end + if( p2 > -1 ) then + data[ a:index( pos.x, pos.y+2, pos.z )] = cid.c_torch; + param2_data[ a:index( pos.x, pos.y+2, pos.z )] = p2; + end + + + -- there may be decorative random blocks at both sides + mines_with_shafts.place_random_decoration( minp, maxp, data, param2_data, a, cid, {x=pos.x+vector.x, y=pos.y, z=pos.z+vector.z}, 1, vector, extra_calls ); + mines_with_shafts.place_random_decoration( minp, maxp, data, param2_data, a, cid, {x=pos.x-vector.x, y=pos.y, z=pos.z-vector.z}, -1, vector, extra_calls ); + + -- the tunnel has been created successfully + return 1; +end + + +-- internal function +-- * place a random decoration at one of the sides (or dig a one-node-wide hole or water source into the floor) +mines_with_shafts.place_random_decoration = function( minp, maxp, data, param2_data, a, cid, pos, side, vector, extra_calls ) + + -- only place something there if the place is currently empty + if( pos.xmaxp.x + or pos.ymaxp.y + or pos.zmaxp.z + or data[ a:index( pos.x, pos.y, pos.z )]~=cid.c_air ) then + return; + end + + -- most places remain empty + local c = math.random( 1, mines_with_shafts.deco_average_distance ); + if( c > #mines_with_shafts.deco_list + or not( #mines_with_shafts.deco_list[ c ]) + or not( mines_with_shafts.deco[ mines_with_shafts.deco_list[c]] )) then + return; + end + local deco = mines_with_shafts.deco[ mines_with_shafts.deco_list[c] ]; + + local yoff = deco[2]; + if( yoff < minp.y or yoff > maxp.y ) then + yoff = 0; + end + -- apply the offset to the y direction and set the node to its id + data[ a:index( pos.x, pos.y+yoff, pos.z )] = deco[3]; + + -- handle facedir nodes + if( deco[4]==1 ) then + local p2 = 0; + if( side==-1 and vector.x~=0 ) then p2 = 3; + elseif( side== 1 and vector.x~=0 ) then p2 = 1; + elseif( side==-1 and vector.z~=0 ) then p2 = 2; + elseif( side== 1 and vector.z~=0 ) then p2 = 0; + end + param2_data[ a:index( pos.x, pos.y+yoff, pos.z )] = p2; + -- handle wallmounted nodes + elseif( deco[4]==2 ) then + local p2 = 0; + if( side==-1 and vector.x~=0 ) then p2 = 3; + elseif( side== 1 and vector.x~=0 ) then p2 = 2; + elseif( side==-1 and vector.z~=0 ) then p2 = 5; + elseif( side== 1 and vector.z~=0 ) then p2 = 4; + end + param2_data[ a:index( pos.x, pos.y+yoff, pos.z )] = p2; + end + + -- handle nodes which require calls to on_construct (i.e. chests) + if( deco[5] ) then + table.insert( extra_calls.mines, {x=pos.x, y=pos.y+yoff, z=pos.z, typ=mines_with_shafts.deco_list[c]} ); + end +end diff --git a/mods/mines_with_shafts/mines_vertical_shafts.lua b/mods/mines_with_shafts/mines_vertical_shafts.lua new file mode 100644 index 0000000..ae5fafd --- /dev/null +++ b/mods/mines_with_shafts/mines_vertical_shafts.lua @@ -0,0 +1,73 @@ + +mines_with_shafts.place_mineshaft_vertical = function(minp, maxp, data, param2_data, a, cid, pos, length, extra_calls ) + + for i=pos.y,math.max( minp.y, pos.y-length),-1 do + -- the central place always gets a rope + if( pos.x>=minp.x and pos.x<=maxp.x and pos.z>=minp.z and pos.z<=maxp.z) then + data[ a:index( pos.x, i, pos.z ) ] = cid.c_rope; + end + + if( pos.x >minp.x and pos.x<=maxp.x) then + -- ..sourrounded by mineladders + if( pos.z> minp.z and pos.z<=maxp.z) then + data[ a:index( pos.x-1, i, pos.z-1 ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x-1, i, pos.z-1 ) ] = 5; + end + if( pos.z>=minp.z and pos.z<=maxp.z) then + data[ a:index( pos.x-1, i, pos.z ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x-1, i, pos.z ) ] = 3; + end + if( pos.z>=minp.z and pos.z< maxp.z) then + data[ a:index( pos.x-1, i, pos.z+1 ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x-1, i, pos.z+1 ) ] = 3; + end + end + + if( pos.x>=minp.x and pos.x< maxp.x ) then + if( pos.z> minp.z and pos.z<=maxp.z) then + data[ a:index( pos.x+1, i, pos.z-1 ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x+1, i, pos.z-1 ) ] = 2; + end + if( pos.z>=minp.z and pos.z<=maxp.z) then + data[ a:index( pos.x+1, i, pos.z ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x+1, i, pos.z ) ] = 2; + end + if( pos.z>=minp.z and pos.z< maxp.z) then + data[ a:index( pos.x+1, i, pos.z+1 ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x+1, i, pos.z+1 ) ] = 4; + end + end + + if( pos.x>=minp.x and pos.x<=maxp.x ) then + if( pos.z> minp.z and pos.z<=maxp.z) then + data[ a:index( pos.x, i, pos.z-1 ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x, i, pos.z-1 ) ] = 5; + end + if( pos.z>=minp.z and pos.z< maxp.z) then + data[ a:index( pos.x, i, pos.z+1 ) ] = cid.c_mineladder; + param2_data[ a:index( pos.x, i, pos.z+1 ) ] = 4; + end + end + + -- we do need a bit of light from time to time! + if( mines_with_shafts.place_meselamps==true and i%20==5 ) then + + if( pos.x-1>minp.x ) then + data[ a:index( pos.x-2, i, pos.z-1 ) ] = cid.c_meselamp; + data[ a:index( pos.x-2, i, pos.z+1 ) ] = cid.c_meselamp; + end + if( pos.x+1minp.z ) then + data[ a:index( pos.x-1, i, pos.z-2 ) ] = cid.c_meselamp; + data[ a:index( pos.x+1, i, pos.z-2 ) ] = cid.c_meselamp; + end + if( pos.z+1, a free/libre infinite +world block sandbox game. + +To install, just clone this repository into your "mods" directory. + +More Blocks code is licensed under the zlib license, textures are by Calinou and are licensed under CC BY-SA 3.0 Unported. + +**Forum topic:** diff --git a/mods/moreblocks/aliases.lua b/mods/moreblocks/aliases.lua new file mode 100644 index 0000000..15f7b6b --- /dev/null +++ b/mods/moreblocks/aliases.lua @@ -0,0 +1,78 @@ +--[[ +More Blocks: alias definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- More Blocks aliases: +minetest.register_alias("sweeper", "moreblocks:sweeper") +minetest.register_alias("circular_saw", "moreblocks:circular_saw") +minetest.register_alias("jungle_stick", "moreblocks:jungle_stick") + +-- Old block/item replacement: +minetest.register_alias("moreblocks:oerkkiblock", "default:mossycobble") +minetest.register_alias("moreblocks:screwdriver", "screwdriver:screwdriver") + +-- Node and item renaming: +minetest.register_alias("moreblocks:stone_bricks", "default:stonebrick") +minetest.register_alias("moreblocks:stonebrick", "default:stonebrick") +minetest.register_alias("moreblocks:junglewood", "default:junglewood") +minetest.register_alias("moreblocks:jungle_wood", "default:junglewood") + +for _, t in pairs(circular_saw.names) do + minetest.register_alias("moreblocks:" .. t[1] .. "_jungle_wood" .. t[2], + "moreblocks:" .. t[1] .. "_junglewood" .. t[2]) +end +minetest.register_alias("moreblocks:horizontaltree", "moreblocks:horizontal_tree") +minetest.register_alias("moreblocks:horizontaljungletree", "moreblocks:horizontal_jungle_tree") +minetest.register_alias("moreblocks:stonesquare", "moreblocks:stone_tile") +minetest.register_alias("moreblocks:circlestonebrick", "moreblocks:circle_stone_bricks") +minetest.register_alias("moreblocks:ironstonebrick", "moreblocks:iron_stone_bricks") +minetest.register_alias("moreblocks:fence_junglewood", "moreblocks:fence_jungle_wood") +minetest.register_alias("moreblocks:coalstone", "moreblocks:coal_stone") +minetest.register_alias("moreblocks:ironstone", "moreblocks:iron_stone") +minetest.register_alias("moreblocks:woodtile", "moreblocks:wood_tile") +minetest.register_alias("moreblocks:woodtile_full", "moreblocks:wood_tile_full") +minetest.register_alias("moreblocks:woodtile_centered", "moreblocks:wood_tile_centered") +minetest.register_alias("moreblocks:woodtile_up", "moreblocks:wood_tile_up") +minetest.register_alias("moreblocks:woodtile_down", "moreblocks:wood_tile_down") +minetest.register_alias("moreblocks:woodtile_left", "moreblocks:wood_tile_left") +minetest.register_alias("moreblocks:woodtile_right", "moreblocks:wood_tile_right") +minetest.register_alias("moreblocks:coalglass", "moreblocks:coal_glass") +minetest.register_alias("moreblocks:ironglass", "moreblocks:iron_glass") +minetest.register_alias("moreblocks:glowglass", "moreblocks:glow_glass") +minetest.register_alias("moreblocks:superglowglass", "moreblocks:super_glow_glass") +minetest.register_alias("moreblocks:trapglass", "moreblocks:trap_glass") +minetest.register_alias("moreblocks:trapstone", "moreblocks:trap_stone") +minetest.register_alias("moreblocks:cactuschecker", "moreblocks:cactus_checker") +minetest.register_alias("moreblocks:coalchecker", "moreblocks:coal_checker") +minetest.register_alias("moreblocks:ironchecker", "moreblocks:iron_checker") +minetest.register_alias("moreblocks:cactusbrick", "moreblocks:cactus_brick") +minetest.register_alias("moreblocks:cleanglass", "moreblocks:clean_glass") +minetest.register_alias("moreblocks:emptybookshelf", "moreblocks:empty_bookshelf") +minetest.register_alias("moreblocks:junglestick", "moreblocks:jungle_stick") +minetest.register_alias("moreblocks:splitstonesquare","moreblocks:split_stone_tile") +minetest.register_alias("moreblocks:allfacestree","moreblocks:all_faces_tree") + +-- ABM for horizontal trees (fix facedir): +local horizontal_tree_convert_facedir = {7, 12, 9, 18} + +minetest.register_abm({ + nodenames = {"moreblocks:horizontal_tree","moreblocks:horizontal_jungle_tree"}, + interval = 1, + chance = 1, + action = function(pos, node) + if node.name == "moreblocks:horizontal_tree" then + node.name = "default:tree" + else + node.name = "default:jungletree" + end + node.param2 = node.param2 < 3 and node.param2 or 0 + minetest.set_node(pos, { + name = node.name, + param2 = horizontal_tree_convert_facedir[node.param2 + 1] + }) + end, +}) + diff --git a/mods/moreblocks/circular_saw.lua b/mods/moreblocks/circular_saw.lua new file mode 100644 index 0000000..88c6260 --- /dev/null +++ b/mods/moreblocks/circular_saw.lua @@ -0,0 +1,396 @@ +--[[ +More Blocks: circular saw + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +circular_saw = {} + +circular_saw.known_stairs = setmetatable({}, { + __newindex = function(k, v) + local modname = minetest.get_current_modname() + print(("WARNING: mod %s tried to add node %s to the circular saw" + .. " manually."):format(modname, v)) + end, +}) + +-- This is populated by stairsplus:register_all: +circular_saw.known_nodes = {} + +-- How many microblocks does this shape at the output inventory cost: +-- It may cause slight loss, but no gain. +circular_saw.cost_in_microblocks = { + 1, 1, 1, 1, 1, 1, 1, 2, + 2, 3, 2, 4, 2, 4, 5, 6, + 7, 1, 1, 2, 4, 6, 7, 8, + 3, 1, 1, 2, 4, 4, 2, 6, + 7, 3, 7, 7, 4, 8, 3, 2, + 6, 2, 1, 3, 4, +} + +circular_saw.names = { + {"micro", "_1"}, + {"panel", "_1"}, + {"micro", "_2"}, + {"panel", "_2"}, + {"micro", "_4"}, + {"panel", "_4"}, + {"micro", ""}, + {"panel", ""}, + {"micro", "_12"}, + {"panel", "_12"}, + {"micro", "_14"}, + {"panel", "_14"}, + {"micro", "_15"}, + {"panel", "_15"}, + {"stair", "_outer"}, + {"stair", ""}, + {"stair", "_inner"}, + {"slab", "_1"}, + {"slab", "_2"}, + {"slab", "_quarter"}, + {"slab", ""}, + {"slab", "_three_quarter"}, + {"slab", "_14"}, + {"slab", "_15"}, + {"stair", "_half"}, + {"stair", "_alt_1"}, + {"stair", "_alt_2"}, + {"stair", "_alt_4"}, + {"stair", "_alt"}, + {"slope", ""}, + {"slope", "_half"}, + {"slope", "_half_raised"}, + {"slope", "_inner"}, + {"slope", "_inner_half"}, + {"slope", "_inner_half_raised"}, + {"slope", "_inner_cut"}, + {"slope", "_inner_cut_half"}, + {"slope", "_inner_cut_half_raised"}, + {"slope", "_outer"}, + {"slope", "_outer_half"}, + {"slope", "_outer_half_raised"}, + {"slope", "_outer_cut"}, + {"slope", "_outer_cut_half"}, + {"slope", "_outer_cut_half_raised"}, + {"slope", "_cut"}, +} + +function circular_saw:get_cost(inv, stackname) + for i, item in pairs(inv:get_list("output")) do + if item:get_name() == stackname then + return circular_saw.cost_in_microblocks[i] + end + end +end + +function circular_saw:get_output_inv(modname, material, amount, max) + if (not max or max < 1 or max > 99) then max = 99 end + + local list = {} + local pos = #list + + -- If there is nothing inside, display empty inventory: + if amount < 1 then + return list + end + + for i = 1, #circular_saw.names do + local t = circular_saw.names[i] + local cost = circular_saw.cost_in_microblocks[i] + local balance = math.min(math.floor(amount/cost), max) + pos = pos + 1 + list[pos] = modname .. ":" .. t[1] .. "_" .. material .. t[2] + .. " " .. balance + end + return list +end + + +-- Reset empty circular_saw after last full block has been taken out +-- (or the circular_saw has been placed the first time) +-- Note: max_offered is not reset: +function circular_saw:reset(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + inv:set_list("input", {}) + inv:set_list("micro", {}) + inv:set_list("output", {}) + meta:set_int("anz", 0) + + meta:set_string("infotext", + S("Circular Saw is empty (owned by %s)") + :format(meta:get_string("owner") or "")) +end + + +-- Player has taken something out of the box or placed something inside +-- that amounts to count microblocks: +function circular_saw:update_inventory(pos, amount) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + + amount = meta:get_int("anz") + amount + + -- The material is recycled automaticly. + inv:set_list("recycle", {}) + + if amount < 1 then -- If the last block is taken out. + self:reset(pos) + return + end + + local stack = inv:get_stack("input", 1) + -- At least one "normal" block is necessary to see what kind of stairs are requested. + if stack:is_empty() then + -- Any microblocks not taken out yet are now lost. + -- (covers material loss in the machine) + self:reset(pos) + return + + end + local node_name = stack:get_name() or "" + local name_parts = circular_saw.known_nodes[node_name] or "" + local modname = name_parts[1] or "" + local material = name_parts[2] or "" + + inv:set_list("input", { -- Display as many full blocks as possible: + node_name.. " " .. math.floor(amount / 8) + }) + + -- The stairnodes made of default nodes use moreblocks namespace, other mods keep own: + if modname == "default" then + modname = "moreblocks" + end + -- print("circular_saw set to " .. modname .. " : " + -- .. material .. " with " .. (amount) .. " microblocks.") + + -- 0-7 microblocks may remain left-over: + inv:set_list("micro", { + modname .. ":micro_" .. material .. "_bottom " .. (amount % 8) + }) + -- Display: + inv:set_list("output", + self:get_output_inv(modname, material, amount, + meta:get_int("max_offered"))) + -- Store how many microblocks are available: + meta:set_int("anz", amount) + + meta:set_string("infotext", + S("Circular Saw is working on %s (owned by %s)") + :format(material, meta:get_string("owner") or "")) +end + + +-- The amount of items offered per shape can be configured: +function circular_saw.on_receive_fields(pos, formname, fields, sender) + local meta = minetest.get_meta(pos) + local max = tonumber(fields.max_offered) + if max and max > 0 then + meta:set_string("max_offered", max) + -- Update to show the correct number of items: + circular_saw:update_inventory(pos, 0) + end +end + + +-- Moving the inventory of the circular_saw around is not allowed because it +-- is a fictional inventory. Moving inventory around would be rather +-- impractical and make things more difficult to calculate: +function circular_saw.allow_metadata_inventory_move( + pos, from_list, from_index, to_list, to_index, count, player) + return 0 +end + + +-- Only input- and recycle-slot are intended as input slots: +function circular_saw.allow_metadata_inventory_put( + pos, listname, index, stack, player) + -- The player is not allowed to put something in there: + if listname == "output" or listname == "micro" then + return 0 + end + + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stackname = stack:get_name() + local count = stack:get_count() + + -- Only alow those items that are offered in the output inventory to be recycled: + if listname == "recycle" then + if not inv:contains_item("output", stackname) then + return 0 + end + local stackmax = stack:get_stack_max() + local instack = inv:get_stack("input", 1) + local microstack = inv:get_stack("micro", 1) + local incount = instack:get_count() + local incost = (incount * 8) + microstack:get_count() + local maxcost = (stackmax * 8) + 7 + local cost = circular_saw:get_cost(inv, stackname) + if (incost + cost) > maxcost then + return math.max((maxcost - incost) / cost, 0) + end + return count + end + + -- Only accept certain blocks as input which are known to be craftable into stairs: + if listname == "input" then + if not inv:is_empty("input") then + if inv:get_stack("input", index):get_name() ~= stackname then + return 0 + end + end + if not inv:is_empty("micro") then + local microstackname = inv:get_stack("micro", 1):get_name():gsub("^.+:micro_", "", 1) + local cutstackname = stackname:gsub("^.+:", "", 1) + if microstackname ~= cutstackname then + return 0 + end + end + for name, t in pairs(circular_saw.known_nodes) do + if name == stackname and inv:room_for_item("input", stack) then + return count + end + end + return 0 + end +end + +-- Taking is allowed from all slots (even the internal microblock slot). +-- Putting something in is slightly more complicated than taking anything +-- because we have to make sure it is of a suitable material: +function circular_saw.on_metadata_inventory_put( + pos, listname, index, stack, player) + -- We need to find out if the circular_saw is already set to a + -- specific material or not: + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stackname = stack:get_name() + local count = stack:get_count() + + -- Putting something into the input slot is only possible if that had + -- been empty before or did contain something of the same material: + if listname == "input" then + -- Each new block is worth 8 microblocks: + circular_saw:update_inventory(pos, 8 * count) + elseif listname == "recycle" then + -- Lets look which shape this represents: + local cost = circular_saw:get_cost(inv, stackname) + circular_saw:update_inventory(pos, cost * count) + end +end + +function circular_saw.on_metadata_inventory_take( + pos, listname, index, stack, player) + -- If it is one of the offered stairs: find out how many + -- microblocks have to be substracted: + if listname == "output" then + -- We do know how much each block at each position costs: + local cost = circular_saw.cost_in_microblocks[index] + * stack:get_count() + + circular_saw:update_inventory(pos, -cost) + elseif listname == "micro" then + -- Each microblock costs 1 microblock: + circular_saw:update_inventory(pos, -stack:get_count()) + elseif listname == "input" then + -- Each normal (= full) block taken costs 8 microblocks: + circular_saw:update_inventory(pos, 8 * -stack:get_count()) + end + -- The recycle field plays no role here since it is processed immediately. +end + +gui_slots = "listcolors[#606060AA;#808080;#101010;#202020;#FFF]" + +function circular_saw.on_construct(pos) + local meta = minetest.get_meta(pos) + local fancy_inv = default.gui_bg..default.gui_bg_img..default.gui_slots + meta:set_string("formspec", "size[11,10]"..fancy_inv.. + "label[0,0;" ..S("Input\nmaterial").. "]" .. + "list[current_name;input;1.5,0;1,1;]" .. + "label[0,1;" ..S("Left-over").. "]" .. + "list[current_name;micro;1.5,1;1,1;]" .. + "label[0,2;" ..S("Recycle\noutput").. "]" .. + "list[current_name;recycle;1.5,2;1,1;]" .. + "field[0.3,3.5;1,1;max_offered;" ..S("Max").. ":;${max_offered}]" .. + "button[1,3.2;1,1;Set;" ..S("Set").. "]" .. + "list[current_name;output;2.8,0;8,6;]" .. + "list[current_player;main;1.5,6.25;8,4;]") + + meta:set_int("anz", 0) -- No microblocks inside yet. + meta:set_string("max_offered", 99) -- How many items of this kind are offered by default? + meta:set_string("infotext", S("Circular Saw is empty")) + + local inv = meta:get_inventory() + inv:set_size("input", 1) -- Input slot for full blocks of material x. + inv:set_size("micro", 1) -- Storage for 1-7 surplus microblocks. + inv:set_size("recycle", 1) -- Surplus partial blocks can be placed here. + inv:set_size("output", 6*8) -- 6x8 versions of stair-parts of material x. + + circular_saw:reset(pos) +end + + +function circular_saw.can_dig(pos,player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if not inv:is_empty("input") or + not inv:is_empty("micro") or + not inv:is_empty("recycle") then + return false + end + -- Can be dug by anyone when empty, not only by the owner: + return true +end + +minetest.register_node("moreblocks:circular_saw", { + description = S("Circular Saw"), + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + {-0.4, -0.5, -0.4, -0.25, 0.25, -0.25}, -- Leg + {0.25, -0.5, 0.25, 0.4, 0.25, 0.4}, -- Leg + {-0.4, -0.5, 0.25, -0.25, 0.25, 0.4}, -- Leg + {0.25, -0.5, -0.4, 0.4, 0.25, -0.25}, -- Leg + {-0.5, 0.25, -0.5, 0.5, 0.375, 0.5}, -- Tabletop + {-0.01, 0.4375, -0.125, 0.01, 0.5, 0.125}, -- Saw blade (top) + {-0.01, 0.375, -0.1875, 0.01, 0.4375, 0.1875}, -- Saw blade (bottom) + {-0.25, -0.0625, -0.25, 0.25, 0.25, 0.25}, -- Motor case + }, + }, + tiles = {"moreblocks_circular_saw_top.png", + "moreblocks_circular_saw_bottom.png", + "moreblocks_circular_saw_side.png"}, + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + groups = {choppy = 2,oddly_breakable_by_hand = 2}, + sounds = default.node_sound_wood_defaults(), + on_construct = circular_saw.on_construct, + can_dig = circular_saw.can_dig, + -- Set the owner of this circular saw. + after_place_node = function(pos, placer) + local meta = minetest.get_meta(pos) + local owner = placer and placer:get_player_name() or "" + meta:set_string("owner", owner) + meta:set_string("infotext", + S("Circular Saw is empty (owned by %s)") + :format(owner)) + end, + + -- The amount of items offered per shape can be configured: + on_receive_fields = circular_saw.on_receive_fields, + allow_metadata_inventory_move = circular_saw.allow_metadata_inventory_move, + -- Only input- and recycle-slot are intended as input slots: + allow_metadata_inventory_put = circular_saw.allow_metadata_inventory_put, + -- Taking is allowed from all slots (even the internal microblock slot). Moving is forbidden. + -- Putting something in is slightly more complicated than taking anything because we have to make sure it is of a suitable material: + on_metadata_inventory_put = circular_saw.on_metadata_inventory_put, + on_metadata_inventory_take = circular_saw.on_metadata_inventory_take, +}) diff --git a/mods/moreblocks/config.lua b/mods/moreblocks/config.lua new file mode 100644 index 0000000..d646dac --- /dev/null +++ b/mods/moreblocks/config.lua @@ -0,0 +1,29 @@ +--[[ +More Blocks: configuration handling + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +moreblocks.config = {} + +local function getbool_default(setting, default) + local value = minetest.setting_getbool(setting) + if value == nil then + value = default + end + return value +end + +local function setting(settingtype, name, default) + if settingtype == "bool" then + moreblocks.config[name] = + getbool_default("moreblocks." .. name, default) + else + moreblocks.config[name] = + minetest.setting_get("moreblocks." .. name) or default + end +end + +-- Show stairs/slabs/panels/microblocks in creative inventory (true or false): +setting("bool", "stairsplus_in_creative_inventory", false) diff --git a/mods/moreblocks/crafting.lua b/mods/moreblocks/crafting.lua new file mode 100644 index 0000000..c85cc3f --- /dev/null +++ b/mods/moreblocks/crafting.lua @@ -0,0 +1,469 @@ +--[[ +More Blocks: crafting recipes + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +minetest.register_craft({ + output = "default:stick", + recipe = {{"default:dry_shrub"},} +}) + +minetest.register_craft({ + output = "default:stick", + recipe = {{"default:sapling"},} +}) + +minetest.register_craft({ + output = "default:stick", + recipe = {{"default:junglesapling"},} +}) + +minetest.register_craft({ + output = "default:wood", + recipe = { + {"default:stick", "default:stick"}, + {"default:stick", "default:stick"}, + } +}) + +minetest.register_craft({ + output = "default:junglewood", + recipe = { + {"moreblocks:jungle_stick", "moreblocks:jungle_stick"}, + {"moreblocks:jungle_stick", "moreblocks:jungle_stick"}, + } +}) + +minetest.register_craft({ + output = "default:dirt_with_grass", + type = "shapeless", + recipe = {"default:junglegrass", "default:dirt"}, +}) + +minetest.register_craft({ + output = "default:dirt_with_grass", + type = "shapeless", + recipe = {"default:mese", "default:dirt"}, +}) + +minetest.register_craft({ + output = "default:mossycobble", + type = "shapeless", + recipe = {"default:junglegrass", "default:cobble"}, +}) + +minetest.register_craft({ + output = "default:mossycobble", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:cobble"}, +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile 9", + recipe = { + {"default:wood", "default:wood", "default:wood"}, + {"default:wood", "default:wood", "default:wood"}, + {"default:wood", "default:wood", "default:wood"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_flipped", + recipe = {{"moreblocks:wood_tile"},} +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_center 9", + recipe = { + {"default:wood", "default:wood", "default:wood"}, + {"default:wood", "moreblocks:wood_tile", "default:wood"}, + {"default:wood", "default:wood", "default:wood"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_full 4", + recipe = { + {"moreblocks:wood_tile", "moreblocks:wood_tile"}, + {"moreblocks:wood_tile", "moreblocks:wood_tile"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_up", + recipe = { + {"default:stick"}, + {"moreblocks:wood_tile_center"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_down", + recipe = { + {"moreblocks:wood_tile_center"}, + {"default:stick"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_left", + recipe = { + {"default:stick", "moreblocks:wood_tile_center"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:wood_tile_right", + recipe = { + {"moreblocks:wood_tile_center", "default:stick"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:junglestick 4", + recipe = {{"default:junglewood"},} +}) + +minetest.register_craft({ + output = "moreblocks:fence_jungle_wood 2", + recipe = { + {"moreblocks:jungle_stick", "moreblocks:jungle_stick", "moreblocks:jungle_stick"}, + {"moreblocks:jungle_stick", "moreblocks:jungle_stick", "moreblocks:jungle_stick"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:circle_stone_bricks 8", + recipe = { + {"default:stone", "default:stone", "default:stone"}, + {"default:stone", "", "default:stone"}, + {"default:stone", "default:stone", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:all_faces_tree 8", + recipe = { + {"default:tree", "default:tree", "default:tree"}, + {"default:tree", "", "default:tree"}, + {"default:tree", "default:tree", "default:tree"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:all_faces_jungle_tree 8", + recipe = { + {"default:jungletree", "default:jungletree", "default:jungletree"}, + {"default:jungletree", "", "default:jungletree"}, + {"default:jungletree", "default:jungletree", "default:jungletree"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:sweeper 4", + recipe = { + {"default:junglegrass"}, + {"default:stick"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:stone_tile 4", + recipe = { + {"default:cobble", "default:cobble"}, + {"default:cobble", "default:cobble"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:split_stone_tile", + recipe = { + {"moreblocks:stone_tile"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:split_stone_tile_alt", + recipe = { + {"moreblocks:split_stone_tile"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:grey_bricks 2", + type = "shapeless", + recipe = {"default:stone", "default:brick"}, +}) + +minetest.register_craft({ + output = "moreblocks:grey_bricks 2", + type = "shapeless", + recipe = {"default:stonebrick", "default:brick"}, +}) + +minetest.register_craft({ + output = "moreblocks:empty_bookshelf", + type = "shapeless", + recipe = {"moreblocks:sweeper", "default:bookshelf"}, +}) + +minetest.register_craft({ + output = "moreblocks:coal_stone_bricks 4", + recipe = { + {"moreblocks:coal_stone", "moreblocks:coal_stone"}, + {"moreblocks:coal_stone", "moreblocks:coal_stone"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:iron_stone_bricks 4", + recipe = { + {"moreblocks:iron_stone", "moreblocks:iron_stone"}, + {"moreblocks:iron_stone", "moreblocks:iron_stone"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:plankstone 4", + recipe = { + {"default:stone", "default:wood"}, + {"default:wood", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:plankstone 4", + recipe = { + {"default:wood", "default:stone"}, + {"default:stone", "default:wood"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:coal_checker 4", + recipe = { + {"default:stone", "default:coal_lump"}, + {"default:coal_lump", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:coal_checker 4", + recipe = { + {"default:coal_lump", "default:stone"}, + {"default:stone", "default:coal_lump"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:iron_checker 4", + recipe = { + {"default:steel_ingot", "default:stone"}, + {"default:stone", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:iron_checker 4", + recipe = { + {"default:stone", "default:steel_ingot"}, + {"default:steel_ingot", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:steel_ingot", "default:chest"}, +}) +minetest.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:copper_ingot", "default:chest"}, +}) + +minetest.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:bronze_ingot", "default:chest"}, +}) + +minetest.register_craft({ + output = "default:chest_locked", + type = "shapeless", + recipe = {"default:gold_ingot", "default:chest"}, +}) + +minetest.register_craft({ + output = "moreblocks:iron_glass", + type = "shapeless", + recipe = {"default:steel_ingot", "default:glass"}, +}) + +minetest.register_craft({ + output = "default:glass", + type = "shapeless", + recipe = {"default:coal_lump", "moreblocks:iron_glass"}, +}) + + +minetest.register_craft({ + output = "moreblocks:coal_glass", + type = "shapeless", + recipe = {"default:coal_lump", "default:glass"}, +}) + +minetest.register_craft({ + output = "default:glass", + type = "shapeless", + recipe = {"default:steel_ingot", "moreblocks:coal_glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:clean_glass", + type = "shapeless", + recipe = {"moreblocks:sweeper", "default:glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:glow_glass", + type = "shapeless", + recipe = {"default:torch", "default:glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:trap_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:glass", "default:torch"}, +}) + +minetest.register_craft({ + output = "moreblocks:trap_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:glow_glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:super_glow_glass", + type = "shapeless", + recipe = {"default:torch", "default:torch", "default:glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:super_glow_glass", + type = "shapeless", + recipe = {"default:torch", "moreblocks:glow_glass"}, +}) + + +minetest.register_craft({ + output = "moreblocks:trap_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:glass", "default:torch", "default:torch"}, +}) + +minetest.register_craft({ + output = "moreblocks:trap_super_glow_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "moreblocks:super_glow_glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:coal_stone", + type = "shapeless", + recipe = {"default:coal_lump", "default:stone"}, +}) + +minetest.register_craft({ + output = "default:stone", + type = "shapeless", + recipe = {"default:steel_ingot", "moreblocks:coal_stone"}, +}) + +minetest.register_craft({ + output = "moreblocks:iron_stone", + type = "shapeless", + recipe = {"default:steel_ingot", "default:stone"}, +}) + +minetest.register_craft({ + output = "default:stone", + type = "shapeless", + recipe = {"default:coal_lump", "moreblocks:iron_stone"}, +}) + +minetest.register_craft({ + output = "moreblocks:trap_stone", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:stone"}, +}) + +minetest.register_craft({ + output = "moreblocks:trap_glass", + type = "shapeless", + recipe = {"default:mese_crystal_fragment", "default:glass"}, +}) + +minetest.register_craft({ + output = "moreblocks:cactus_brick", + type = "shapeless", + recipe = {"default:cactus", "default:brick"}, +}) + +minetest.register_craft({ + output = "moreblocks:cactus_checker 4", + recipe = { + {"default:cactus", "default:stone"}, + {"default:stone", "default:cactus"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:cactuschecker 4", + recipe = { + {"default:stone", "default:cactus"}, + {"default:cactus", "default:stone"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:rope 3", + recipe = { + {"default:junglegrass"}, + {"default:junglegrass"}, + {"default:junglegrass"}, + } +}) + +minetest.register_craft({ + output = "moreblocks:cobble_compressed", + recipe = { + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"}, + {"default:cobble", "default:cobble", "default:cobble"}, + } +}) + +minetest.register_craft({ + output = "default:cobble 9", + recipe = { + {"moreblocks:cobble_compressed"}, + } +}) + +minetest.register_craft({ + type = "cooking", output = "moreblocks:tar", recipe = "default:gravel", +}) + +if minetest.setting_getbool("moreblocks.circular_saw_crafting") ~= false then -- “If nil or true then†+ minetest.register_craft({ + output = "moreblocks:circular_saw", + recipe = { + { "", "default:steel_ingot", "" }, + { "group:wood", "group:wood", "group:wood"}, + { "group:wood", "", "group:wood"}, + } + }) +end diff --git a/mods/moreblocks/depends.txt b/mods/moreblocks/depends.txt new file mode 100644 index 0000000..9207dab --- /dev/null +++ b/mods/moreblocks/depends.txt @@ -0,0 +1,2 @@ +default +intllib? diff --git a/mods/moreblocks/init.lua b/mods/moreblocks/init.lua new file mode 100644 index 0000000..2919a30 --- /dev/null +++ b/mods/moreblocks/init.lua @@ -0,0 +1,33 @@ +--[[ +===================================================================== +** More Blocks ** +By Calinou, with the help of ShadowNinja and VanessaE. + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +===================================================================== +--]] + +moreblocks = {} + +local S +if minetest.get_modpath("intllib") then + S = intllib.Getter() +else + S = function(s) return s end +end +moreblocks.intllib = S + +local modpath = minetest.get_modpath("moreblocks") + +dofile(modpath .. "/config.lua") +dofile(modpath .. "/circular_saw.lua") +dofile(modpath .. "/stairsplus/init.lua") +dofile(modpath .. "/nodes.lua") +dofile(modpath .. "/redefinitions.lua") +dofile(modpath .. "/crafting.lua") +dofile(modpath .. "/aliases.lua") + +if minetest.setting_getbool("log_mods") then + minetest.log("action", S("[moreblocks] loaded.")) +end diff --git a/mods/moreblocks/locale/de.txt b/mods/moreblocks/locale/de.txt new file mode 100644 index 0000000..542f977 --- /dev/null +++ b/mods/moreblocks/locale/de.txt @@ -0,0 +1,67 @@ +# Translation by Xanthin + +###init.lua### +[moreblocks] loaded. = [moreblocks] geladen. + +###nodes.lua### +Jungle Wood Fence = Tropenholzzaun +Empty Bookshelf = Leeres Buecherregal +Clean Glass = Klares Glas +Plankstone = Brettstein +Wooden Tile = Holzfliese +Full Wooden Tile = Vollholzfliese +Centered Wooden Tile = Holzfliese mittig +Up Wooden Tile = Holzfliese oben +Down Wooden Tile = Holzfliese unten +Left Wooden Tile = Holzfliese links +Right Wooden Tile = Holzfliese rechts +Circle Stone Bricks = Kreissteinziegel +Stone Tile = Steinfliese +Split Stone Tile = Geteilte Steinfliese +Glow Glass = Leuchtglas +Super Glow Glass = Superleuchtglas +Coal Glass = Kohleglas +Iron Glass = Eisenglas +Coal Checker = Karierte Kohle +Iron Checker = Kariertes Eisen +Trap Stone = Steinfalle +Trap Glass = Glasfalle +Trap Glow Glass = Leuchtglasfalle +Trap Super Glow Glass = Superleuchtglasfalle +Coal Stone = Kohlestein +Iron Stone = Eisenstein +Coal Stone Bricks = Kohlesteinziegel +Iron Stone Bricks = Eisensteinziegel +Cactus Checker = Karierter Kaktus +Cactus Brick = Kaktusziegel +Sweeper = Besen +Jungle Stick = Tropenholzstock +Rope = Seil +All-faces Tree = Baumscheibenstamm + +###circular_saw.lua### +Circular Saw = Kreissaege +Circular saw, empty (owned by %s) = Kreissaege, leer (gehoert %s) +Circular saw, working with %s (owned by %s) = Kreissaege, arbeitet mit %s (gehoert %s) +Circular saw, empty = Kreissaege, leer +Circular saw is empty (owned by %s) = Kreissaege ist leer (gehoert %s) + +Input\nmaterial = Ausgangs-\nmaterial +Left-over = Rest +Max = Anzahl +Set = Ok +Recycle\noutput = Wiederver-\nwerten + +###./stairsplus/*### +%s Stairs = %streppe +%s Slab = %sstufe +%s Panel = %spaneel +%s Microblock = %smikroblock + +%s Pane = %sscheibe +%s Fence = %szaun + +###ownership.lua### +someone = jemand +Sorry, %s owns that spot. = Tut mir leid, %s gehoert diese Stelle. + diff --git a/mods/moreblocks/locale/es.txt b/mods/moreblocks/locale/es.txt new file mode 100644 index 0000000..d11ba49 --- /dev/null +++ b/mods/moreblocks/locale/es.txt @@ -0,0 +1,52 @@ +# Translation by kaeza + +[moreblocks] loaded. = [moreblocks] cargado. + +Jungle Wooden Planks = Tablones de madera de jungla +Empty Bookshelf = Estante para libros vacío +Clean Glass = Cristal Limpio +Plankstone = Tablones de piedra +Wooden Tile = Parquet +Full Wooden Tile = Parquet Completo +Centered Wooden Tile = Parquet Centrado +Up Wooden Tile = Parquet Superior +Down Wooden Tile = Parquet Inferior +Left Wooden Tile = Parquet Izquierdo +Right Wooden Tile = Parquet Derecho +Circle Stone Bricks = Bloques de Piedra Circulares +Stone Tile = Baldosa de Piedra +Split Stone Tile = Baldosas de Piedra Partida +Glow Glass = Cristal Brillante +Super Glow Glass = Cristal Súper Brillante +Coal Glass = Cristal con Carbón +Iron Glass = Cristal con Hierro +Coal Checker = Cuadros de Carbón +Iron Checker = Cuadros de Hierro +Trap Stone = Piedra Trampa +Trap Glass = Cristal Trampa +Coal Stone = Carbón y Piedra +Iron Stone = Hierro y Piedra +Cactus Checker = Cuadros de Cactus +Cactus Brick = Ladrillos de Cactus +Sweeper = Limpiador +Jungle Stick = Varita de Madera de Jungla +Horizontal Tree = Tronco de árbol horizontal +Horizontal Jungle Tree = Tronco de árbol de la jungla horizontal +Rope = Soga +All-faces Tree = Tronco de Ãrbol + +%s Stairs = Escalera de %s +%s Slab = Losa de %s +%s Panel = Panel de %s +%s Microblock = Microbloque de %s + +Wooden = Madera +Papyrus = Papiro +Dry Shrub = Arbusto Desértico +Sapling = Brote de Ãrbol +Wooden Planks = Tablones de Madera +Ladder = Escalera de Mano +Glass = Cristal + +%s Pane = Panel de %s +%s Fence = Valla de %s diff --git a/mods/moreblocks/locale/fr.txt b/mods/moreblocks/locale/fr.txt new file mode 100644 index 0000000..6bd7f98 --- /dev/null +++ b/mods/moreblocks/locale/fr.txt @@ -0,0 +1,72 @@ +# Translation by Calinou + +###init.lua### +[moreblocks] loaded. = [moreblocks] a été chargé. + +Jungle Wooden Planks = Planches de bois de jungle +Empty Bookshelf = Ètagère vide +Clean Glass = Verre propre +Plankstone = Pierre-bois +Wooden Tile = Dalle en bois +Full Wooden Tile = Dalle en bois complète +Centered Wooden Tile = Dalle en bois centrée +Up Wooden Tile = Dalle en bois vers le haut +Down Wooden Tile = Dalle en bois vers le bas +Left Wooden Tile = Dalle en bois vers la gauche +Right Wooden Tile = Dalle en bois vers la droite +Circle Stone Bricks = Briques en pierre circulaires +Stone Tile = Dalle en pierre +Split Stone Tile = Dalle en pierre découpée +Glow Glass = Verre brillant +Super Glow Glass = Verre très brillant +Coal Glass = Verre de charbon +Iron Glass = Verre de fer +Coal Checker = Damier en charbon +Iron Checker = Damier en fer +Trap Stone = Pierre traversable +Trap Glass = Verre traversable +Trap Glow Glass = Verre brillant traversable +Trap Super Glow Glass = Verre très brillant traversable +Coal Stone = Pierre de charbon +Iron Stone = Pierre de fer +Coal Stone Bricks = Briques en pierre de charbon +Iron Stone Bricks = Briques en pierre de fer +Cactus Checker = Damier en cactus +Cactus Brick = Briques de cactus +Sweeper = Balai +Jungle Stick = Bâton en bois de jungle +Horizontal Tree = Tronc d'arbre horizontal +Horizontal Jungle Tree = Tronc d'arbre de jungle horizontal +Rope = Corde +All-faces Tree = Tronc d'arbre + +###redefinition.lua### +Wooden = bois +Papyrus = Papyrus +Dry Shrub = Buisson mort +Sapling = Pousse d'arbre +Wooden Planks = Planches de bois +Ladder = Échelle +Glass = Verre + +###circular_saw.lua### +Circular Saw = Scie circulaire +Circular saw, empty (owned by %s) = Scie circulaire, vide (propriété de %s) +Circular saw, working with %s (owned by %s) = Scie circulaire, manipule %s (propriété de %s) +Circular saw, empty = Scie circulaire, vide +Circular saw is empty (owned by %s) = Scie circulaire est vide (propriété de %s) + +Input material = Entrée du matériel +Rest/microblocks = Reste/microbloc +Max: = Max: +Set = Fixer +Recycle output = Recyclage + +###./stairsplus/*### +%s Stairs = Escaliers en %s +%s Slab = Demi-dalle en %s +%s Panel = Barre en %s +%s Microblock = Microbloc en %s + +%s Pane = Panneau en %s +%s Fence = Barrière en %s \ No newline at end of file diff --git a/mods/moreblocks/locale/template.txt b/mods/moreblocks/locale/template.txt new file mode 100644 index 0000000..2b88227 --- /dev/null +++ b/mods/moreblocks/locale/template.txt @@ -0,0 +1,64 @@ +###init.lua### +[moreblocks] loaded. = + +###nodes.lua### +Jungle Wood Fence = +Empty Bookshelf = +Clean Glass = +Plankstone = +Wooden Tile = +Full Wooden Tile = +Centered Wooden Tile = +Up Wooden Tile = +Down Wooden Tile = +Left Wooden Tile = +Right Wooden Tile = +Circle Stone Bricks = +Stone Tile = +Split Stone Tile = +Glow Glass = +Super Glow Glass = +Coal Glass = +Iron Glass = +Coal Checker = +Iron Checker = +Trap Stone = +Trap Glass = +Trap Glow Glass = +Trap Super Glow Glass = +Coal Stone = +Iron Stone = +Coal Stone Bricks = +Iron Stone Bricks = +Cactus Checker = +Cactus Brick = +Sweeper = +Jungle Stick = +Rope = +All-faces Tree = + +###circular_saw.lua### +Circular Saw = +Circular saw, empty (owned by %s) = +Circular saw, working with %s (owned by %s) = +Circular saw, empty = +Circular saw is empty (owned by %s) = + +Input\nmaterial = +Left-over = +Max = +Set = +Recycle\noutput = + +###ownership.lua### +someone = +Sorry, %s owns that spot. = + +###./stairsplus/*### +%s Stairs = +%s Slab = +%s Panel = +%s Microblock = + +%s Pane = +%s Fence = diff --git a/mods/moreblocks/models/moreblocks_slope.obj b/mods/moreblocks/models/moreblocks_slope.obj new file mode 100644 index 0000000..05c853b --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope.obj @@ -0,0 +1,21 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_slope_onetexture.blend' +# www.blender.org +mtllib slope_test_slope_onetexture.mtl +o Cube_Cube.002 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +usemtl None +s off +f 1/1 2/2 3/3 4/4 +f 4/3 3/4 5/1 6/2 +f 2/1 5/3 3/4 +f 1/2 4/3 6/4 +f 2/1 1/2 6/3 5/4 diff --git a/mods/moreblocks/models/moreblocks_slope_cut.obj b/mods/moreblocks/models/moreblocks_slope_cut.obj new file mode 100644 index 0000000..5f7af5e --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_cut.obj @@ -0,0 +1,23 @@ +v 0.500000 0.500000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +vt 1.000000 1.000000 +vt 0.500000 2.000000 +s off +f 4/1 3/3 1/8 2/4 +f 3/1 6/3 5/5 1/6 +f 7/1 6/3 3/8 4/6 +f 7/2 2/8 1/9 5/6 +f 6/1 7/3 5/4 +f 7/1 4/3 2/5 diff --git a/mods/moreblocks/models/moreblocks_slope_half.obj b/mods/moreblocks/models/moreblocks_slope_half.obj new file mode 100644 index 0000000..bc96bb8 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_half.obj @@ -0,0 +1,23 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_slope_long_fronthalf_onetexture.blend' +# www.blender.org +mtllib slope_test_slope_long_fronthalf_onetexture.mtl +o Cube_Cube.002 +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +usemtl None +s off +f 1/1 2/2 3/3 4/4 +f 4/3 3/4 5/5 6/6 +f 2/1 5/3 3/4 +f 1/2 4/3 6/4 +f 2/5 1/6 6/3 5/4 diff --git a/mods/moreblocks/models/moreblocks_slope_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_half_raised.obj new file mode 100644 index 0000000..79e0dc0 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_half_raised.obj @@ -0,0 +1,26 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_slope_long_backhalf_onetexture.blend' +# www.blender.org +mtllib slope_test_slope_long_backhalf_onetexture.mtl +o Cube +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.000000 1.000000 +usemtl None +s off +f 5/1 6/2 2/3 1/4 +f 6/5 7/2 3/3 2/4 +f 7/5 8/6 4/3 3/4 +f 8/1 5/6 1/3 4/4 +f 1/4 2/1 3/6 4/3 +f 8/6 7/3 6/4 5/1 diff --git a/mods/moreblocks/models/moreblocks_slope_inner.obj b/mods/moreblocks/models/moreblocks_slope_inner.obj new file mode 100644 index 0000000..68fc170 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner.obj @@ -0,0 +1,26 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_icorner_onetexture.blend' +# www.blender.org +o Cube_Cube.000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s off +f 6/1 1/2 7/3 8/4 +f 2/1 5/3 3/4 +f 2/1 1/2 5/4 +f 6/2 8/3 9/4 +f 9/1 8/2 7/3 3/4 +f 3/3 7/4 1/1 2/2 +f 1/1 6/2 9/3 +l 1 4 +l 3 4 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_cut.obj b/mods/moreblocks/models/moreblocks_slope_inner_cut.obj new file mode 100644 index 0000000..cdc6643 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_cut.obj @@ -0,0 +1,20 @@ +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +s off +f 3/1 6/3 5/5 1/4 +f 4/1 3/3 1/5 2/4 +f 6/1 3/3 4/5 7/4 +f 2/1 1/3 5/5 +f 7/1 4/3 2/5 +f 6/1 7/3 5/4 +f 7/2 2/5 5/4 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_cut_half.obj b/mods/moreblocks/models/moreblocks_slope_inner_cut_half.obj new file mode 100644 index 0000000..1df607c --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_cut_half.obj @@ -0,0 +1,22 @@ +v 0.500000 0.000000 0.500000 +v -0.500000 0.000000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +s off +f 3/1 6/3 5/5 1/4 +f 4/1 3/3 1/5 2/4 +f 6/1 3/3 4/7 7/6 +f 2/1 1/3 5/7 +f 7/1 4/3 2/5 +f 6/1 7/3 5/4 +f 7/2 2/7 5/6 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_cut_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_inner_cut_half_raised.obj new file mode 100644 index 0000000..ba6dc5c --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_cut_half_raised.obj @@ -0,0 +1,23 @@ +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 0.500000 -0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 0.000000 0.000000 +vt 0.500000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +s off +f 3/1 7/3 5/7 1/6 +f 4/1 3/3 1/7 2/6 +f 7/1 3/3 4/7 8/6 +f 2/1 1/3 5/7 +f 8/1 4/3 2/7 6/4 +f 7/1 8/3 6/5 5/6 +f 6/2 2/7 5/6 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_half.obj b/mods/moreblocks/models/moreblocks_slope_inner_half.obj new file mode 100644 index 0000000..6decaea --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_half.obj @@ -0,0 +1,28 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_icorner_half_short_onetexture.blend' +# www.blender.org +mtllib slope_test_icorner_half_short_onetexture.mtl +o Cube_Cube.000 +v 0.500000 -0.000000 0.500000 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.000000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +usemtl None +s off +f 6/1 1/2 7/3 8/4 +f 2/1 5/3 3/4 +f 2/1 1/2 5/4 +f 6/2 8/3 9/4 +f 9/1 8/2 7/3 3/4 +f 3/3 7/4 1/1 2/2 +f 1/1 6/2 9/3 +l 1 4 +l 3 4 diff --git a/mods/moreblocks/models/moreblocks_slope_inner_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_inner_half_raised.obj new file mode 100644 index 0000000..8aff6ca --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_inner_half_raised.obj @@ -0,0 +1,31 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_icorner_half_tall_onetexture.blend' +# www.blender.org +mtllib slope_test_icorner_half_tall_onetexture.mtl +o Cube_Cube.000 +v 0.500000 0.500000 0.500000 +v -0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v -0.500000 0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +usemtl None +s off +f 6/1 1/2 7/3 8/4 +f 2/1 1/2 5/4 +f 3/3 7/4 1/1 2/2 +f 1/2 6/3 9/4 +f 3/1 10/2 8/3 7/4 +f 8/3 10/4 5/5 6/2 +f 3/4 2/1 5/6 10/3 +l 1 4 +l 3 4 diff --git a/mods/moreblocks/models/moreblocks_slope_outer.obj b/mods/moreblocks/models/moreblocks_slope_outer.obj new file mode 100644 index 0000000..383c195 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer.obj @@ -0,0 +1,18 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_ocorner_onetexture.blend' +# www.blender.org +o Cube_Cube.002 +v 0.500000 0.500000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +s off +f 3/1 2/2 4/3 5/4 +f 1/2 3/3 5/4 +f 1/1 2/3 3/4 +f 1/1 4/3 2/4 +f 1/2 5/3 4/4 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_cut.obj b/mods/moreblocks/models/moreblocks_slope_outer_cut.obj new file mode 100644 index 0000000..4608c69 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_cut.obj @@ -0,0 +1,19 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_corner_pyramid_tall_2_onetexture.blend' +# www.blender.org +mtllib slope_test_corner_pyramid_tall_2_onetexture.mtl +o Cube +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +usemtl None +s off +f 4/1 1/2 3/3 +f 2/3 4/4 3/2 +f 3/2 1/3 2/4 +f 1/3 4/5 2/2 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_cut_half.obj b/mods/moreblocks/models/moreblocks_slope_outer_cut_half.obj new file mode 100644 index 0000000..e4be882 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_cut_half.obj @@ -0,0 +1,20 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_corner_pyramid_short_2_onetexture.blend' +# www.blender.org +mtllib slope_test_corner_pyramid_short_2_onetexture.mtl +o Cube +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.000000 0.500000 +vt 1.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 0.000000 0.500000 +vt 0.000000 1.000000 +vt 0.500000 1.000000 +usemtl None +s off +f 4/1 1/2 3/3 +f 2/3 4/4 3/2 +f 3/2 1/3 2/5 +f 1/3 4/6 2/2 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_cut_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_outer_cut_half_raised.obj new file mode 100644 index 0000000..65a3b8a --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_cut_half_raised.obj @@ -0,0 +1,23 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_corner_pyramid_short_3_onetexture.blend' +# www.blender.org +mtllib slope_test_corner_pyramid_short_3_onetexture.mtl +o Cube_Cube.002 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.000000 -0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.500000 +usemtl None +s off +f 1/1 2/2 3/3 4/4 +f 4/5 3/2 5/3 6/6 +f 2/5 5/3 3/4 +f 1/2 4/3 6/4 +f 2/3 1/6 6/1 5/2 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_half.obj b/mods/moreblocks/models/moreblocks_slope_outer_half.obj new file mode 100644 index 0000000..0c56e26 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_half.obj @@ -0,0 +1,22 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_corner_pyramid_short_1_onetexture.blend' +# www.blender.org +mtllib slope_test_corner_pyramid_short_1_onetexture.mtl +o Cube +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.000000 0.500000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 0.500000 +vt 0.000000 0.500000 +usemtl None +s off +f 1/1 2/2 3/3 4/4 +f 5/5 1/3 4/4 +f 3/4 5/6 4/3 +f 2/4 5/2 3/3 +f 1/4 5/1 2/3 diff --git a/mods/moreblocks/models/moreblocks_slope_outer_half_raised.obj b/mods/moreblocks/models/moreblocks_slope_outer_half_raised.obj new file mode 100644 index 0000000..e4fa3d1 --- /dev/null +++ b/mods/moreblocks/models/moreblocks_slope_outer_half_raised.obj @@ -0,0 +1,27 @@ +# Blender v2.69 (sub 0) OBJ File: 'slope_test_corner_pyramid_tall_3_onetexture.blend' +# www.blender.org +mtllib slope_test_corner_pyramid_tall_3_onetexture.mtl +o Cube_Cube.002 +v -0.500000 -0.000000 0.500000 +v -0.500000 -0.500000 0.500000 +v 0.500000 -0.500000 0.500000 +v 0.500000 0.500000 0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.000000 -0.500000 +v -0.500000 -0.500000 -0.500000 +v -0.500000 -0.000000 -0.500000 +vt 0.000000 0.500000 +vt 0.000000 0.000000 +vt 1.000000 0.000000 +vt 1.000000 1.000000 +vt 0.000000 1.000000 +vt 1.000000 0.500000 +usemtl None +s off +f 1/1 2/2 3/3 4/4 +f 4/5 3/2 5/3 6/6 +f 8/3 4/5 6/2 +f 1/6 8/1 7/2 2/3 +f 4/5 8/3 1/4 +f 6/1 5/2 7/3 8/6 +f 5/5 3/2 2/3 7/4 diff --git a/mods/moreblocks/nodes.lua b/mods/moreblocks/nodes.lua new file mode 100644 index 0000000..810df36 --- /dev/null +++ b/mods/moreblocks/nodes.lua @@ -0,0 +1,372 @@ +--[[ +More Blocks: node definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +local sound_wood = default.node_sound_wood_defaults() +local sound_stone = default.node_sound_stone_defaults() +local sound_glass = default.node_sound_glass_defaults() +local sound_leaves = default.node_sound_leaves_defaults() + +local function tile_tiles(name) + local tex = "moreblocks_" ..name.. ".png" + return {tex, tex, tex, tex, tex.. "^[transformR90", tex.. "^[transformR90"} +end + +local nodes = { + ["wood_tile"] = { + description = S("Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90"}, + sounds = sound_wood, + }, + ["wood_tile_flipped"] = { + description = S("Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR90", + "default_wood.png^moreblocks_wood_tile.png^[transformR180", + "default_wood.png^moreblocks_wood_tile.png^[transformR180"}, + sounds = sound_wood, + no_stairs = true, + }, + ["wood_tile_center"] = { + description = S("Centered Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^moreblocks_wood_tile_center.png"}, + sounds = sound_wood, + }, + ["wood_tile_full"] = { + description = S("Full Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = tile_tiles("wood_tile_full"), + sounds = sound_wood, + }, + ["wood_tile_up"] = { + description = S("Upwards Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^moreblocks_wood_tile_up.png"}, + sounds = sound_wood, + no_stairs = true, + }, + ["wood_tile_down"] = { + description = S("Downwards Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^[transformR180^moreblocks_wood_tile_up.png^[transformR180"}, + sounds = sound_wood, + no_stairs = true, + }, + ["wood_tile_left"] = { + description = S("Leftwards Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^[transformR270^moreblocks_wood_tile_up.png^[transformR270"}, + sounds = sound_wood, + no_stairs = true, + }, + ["wood_tile_right"] = { + description = S("Rightwards Wooden Tile"), + groups = {snappy = 1, choppy = 2, oddly_breakable_by_hand = 2, flammable = 3}, + tiles = {"default_wood.png^[transformR90^moreblocks_wood_tile_up.png^[transformR90"}, + sounds = sound_wood, + no_stairs = true, + }, + ["circle_stone_bricks"] = { + description = S("Circle Stone Bricks"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["grey_bricks"] = { + description = S("Stone Bricks"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["coal_stone_bricks"] = { + description = S("Coal Stone Bricks"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["iron_stone_bricks"] = { + description = S("Iron Stone Bricks"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["stone_tile"] = { + description = S("Stone Tile"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["split_stone_tile"] = { + description = S("Split Stone Tile"), + tiles = {"moreblocks_split_stone_tile_top.png", + "moreblocks_split_stone_tile.png"}, + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["split_stone_tile_alt"] = { + description = S("Checkered Stone Tile"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["tar"] = { + description = S("Tar"), + groups = {cracky = 2, tar_block = 1}, + sounds = sound_stone, + }, + ["cobble_compressed"] = { + description = S("Compressed Cobblestone"), + groups = {cracky = 1}, + sounds = sound_stone, + }, + ["plankstone"] = { + description = S("Plankstone"), + groups = {cracky = 3}, + tiles = tile_tiles("plankstone"), + sounds = sound_stone, + }, + ["iron_glass"] = { + description = S("Iron Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_iron_glass.png", "moreblocks_iron_glass_detail.png"}, + tiles = {"moreblocks_iron_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["coal_glass"] = { + description = S("Coal Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_coal_glass.png", "moreblocks_coal_glass_detail.png"}, + tiles = {"moreblocks_coal_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["clean_glass"] = { + description = S("Clean Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_clean_glass.png", "moreblocks_clean_glass_detail.png"}, + tiles = {"moreblocks_clean_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["cactus_brick"] = { + description = S("Cactus Brick"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["cactus_checker"] = { + description = S("Cactus Checker"), + groups = {cracky = 3}, + tiles = {"default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png", + "default_stone.png^moreblocks_cactus_checker.png^[transformR90", + "default_stone.png^moreblocks_cactus_checker.png^[transformR90"}, + sounds = sound_stone, + }, + ["empty_bookshelf"] = { + description = S("Empty Bookshelf"), + tiles = {"default_wood.png", "default_wood.png", + "moreblocks_empty_bookshelf.png"}, + groups = {snappy = 2, choppy = 3, oddly_breakable_by_hand = 2, flammable = 3}, + sounds = sound_wood, + no_stairs = true, + }, + ["coal_stone"] = { + description = S("Coal Stone"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["iron_stone"] = { + description = S("Iron Stone"), + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["coal_checker"] = { + description = S("Coal Checker"), + tiles = {"default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png", + "default_stone.png^moreblocks_coal_checker.png^[transformR90", + "default_stone.png^moreblocks_coal_checker.png^[transformR90"}, + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["iron_checker"] = { + description = S("Iron Checker"), + tiles = {"default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png", + "default_stone.png^moreblocks_iron_checker.png^[transformR90", + "default_stone.png^moreblocks_iron_checker.png^[transformR90"}, + groups = {cracky = 3}, + sounds = sound_stone, + }, + ["trap_stone"] = { + description = S("Trap Stone"), + walkable = false, + groups = {cracky = 3}, + sounds = sound_stone, + no_stairs = true, + }, + ["trap_glass"] = { + description = S("Trap Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_trap_glass.png", "default_glass_detail.png"}, + tiles = {"moreblocks_trap_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["fence_jungle_wood"] = { + description = S("Jungle Wood Fence"), + drawtype = "fencelike", + tiles = {"default_junglewood.png"}, + inventory_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", + wield_image = "default_fence_overlay.png^default_junglewood.png^default_fence_overlay.png^[makealpha:255,126,126", + paramtype = "light", + selection_box = { + type = "fixed", + fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, + }, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, flammable = 2}, + sounds = sound_wood, + no_stairs = true, + }, + ["all_faces_tree"] = { + description = S("All-faces Tree"), + tiles = {"default_tree_top.png"}, + groups = {tree = 1,snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = sound_wood, + furnace_burntime = 30, + }, + ["all_faces_jungle_tree"] = { + description = S("All-faces Jungle Tree"), + tiles = {"default_jungletree_top.png"}, + groups = {tree = 1,snappy = 1, choppy = 2, oddly_breakable_by_hand = 1, flammable = 2}, + sounds = sound_wood, + furnace_burntime = 30, + }, + ["glow_glass"] = { + description = S("Glow Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_glow_glass.png", "moreblocks_glow_glass_detail.png"}, + tiles = {"moreblocks_glow_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["trap_glow_glass"] = { + description = S("Trap Glow Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_trap_glass.png", "moreblocks_glow_glass_detail.png"}, + tiles = {"moreblocks_trap_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + light_source = 11, + walkable = false, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["super_glow_glass"] = { + description = S("Super Glow Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_super_glow_glass.png", "moreblocks_super_glow_glass_detail.png"}, + tiles = {"moreblocks_super_glow_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + light_source = 15, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + }, + ["trap_super_glow_glass"] = { + description = S("Trap Super Glow Glass"), + drawtype = "glasslike_framed_optional", + --tiles = {"moreblocks_trap_super_glow_glass.png", "moreblocks_super_glow_glass_detail.png"}, + tiles = {"moreblocks_trap_super_glow_glass.png"}, + paramtype = "light", + sunlight_propagates = true, + light_source = 15, + walkable = false, + groups = {snappy = 2, cracky = 3, oddly_breakable_by_hand = 3}, + sounds = sound_glass, + no_stairs = true, + }, + ["rope"] = { + description = S("Rope"), + drawtype = "signlike", + inventory_image = "moreblocks_rope.png", + wield_image = "moreblocks_rope.png", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "wallmounted", + walkable = false, + climbable = true, + selection_box = {type = "wallmounted",}, + groups = {snappy = 3, flammable = 2}, + sounds = sound_leaves, + no_stairs = true, + }, +} + +for name, def in pairs(nodes) do + def.tiles = def.tiles or {"moreblocks_" ..name.. ".png"} + minetest.register_node("moreblocks:" ..name, def) + minetest.register_alias(name, "moreblocks:" ..name) + if not def.no_stairs then + local groups = {} + for k, v in pairs(def.groups) do groups[k] = v end + stairsplus:register_all("moreblocks", name, "moreblocks:" ..name, { + description = def.description, + groups = groups, + tiles = def.tiles, + sunlight_propagates = def.sunlight_propagates, + light_source = def.light_source, + sounds = def.sounds, + }) + end +end + + +-- Items + +minetest.register_craftitem("moreblocks:sweeper", { + description = S("Sweeper"), + inventory_image = "moreblocks_sweeper.png", +}) + +minetest.register_craftitem("moreblocks:jungle_stick", { + description = S("Jungle Stick"), + inventory_image = "moreblocks_junglestick.png", + groups = {stick= 1}, +}) + +minetest.register_craftitem("moreblocks:nothing", { + inventory_image = "invisible.png", + on_use = function() end, +}) + diff --git a/mods/moreblocks/ownership.lua b/mods/moreblocks/ownership.lua new file mode 100644 index 0000000..1c2431b --- /dev/null +++ b/mods/moreblocks/ownership.lua @@ -0,0 +1,41 @@ +--[[ +More Blocks: ownership handling + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.gettext + +function moreblocks.node_is_owned(pos, placer) + local ownername = false + if type(IsPlayerNodeOwner) == "function" then -- node_ownership mod + if HasOwner(pos, placer) then -- returns true if the node is owned + if not IsPlayerNodeOwner(pos, placer:get_player_name()) then + if type(getLastOwner) == "function" then -- ...is an old version + ownername = getLastOwner(pos) + elseif type(GetNodeOwnerName) == "function" then -- ...is a recent version + ownername = GetNodeOwnerName(pos) + else + ownername = S("someone") + end + end + end + + elseif type(isprotect)=="function" then -- glomie's protection mod + if not isprotect(5, pos, placer) then + ownername = S("someone") + end + elseif type(protector)=="table" and type(protector.can_dig)=="function" then -- Zeg9's protection mod + if not protector.can_dig(5, pos, placer) then + ownername = S("someone") + end + end + + if ownername ~= false then + minetest.chat_send_player( placer:get_player_name(), S("Sorry, %s owns that spot."):format(ownername) ) + return true + else + return false + end +end diff --git a/mods/moreblocks/redefinitions.lua b/mods/moreblocks/redefinitions.lua new file mode 100644 index 0000000..9dc7ae3 --- /dev/null +++ b/mods/moreblocks/redefinitions.lua @@ -0,0 +1,100 @@ +--[[ +More Blocks: redefinitions of default stuff + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Redefinitions of some default crafting recipes: + +minetest.register_craft({ + output = "default:sign_wall 4", + recipe = { + {"default:wood", "default:wood", "default:wood"}, + {"default:wood", "default:wood", "default:wood"}, + {"", "default:stick", ""}, + } +}) + +minetest.register_craft({ + output = "default:ladder 4", + recipe = { + {"default:stick", "", "default:stick"}, + {"default:stick", "default:stick", "default:stick"}, + {"default:stick", "", "default:stick"}, + } +}) + +minetest.register_craft({ + output = "default:paper 4", + recipe = { + {"default:papyrus", "default:papyrus", "default:papyrus"}, + } +}) + +minetest.register_craft({ + output = "default:rail 24", + recipe = { + {"default:steel_ingot", "", "default:steel_ingot"}, + {"default:steel_ingot", "default:stick", "default:steel_ingot"}, + {"default:steel_ingot", "", "default:steel_ingot"}, + } +}) + +minetest.register_craft({ + type = "toolrepair", + additional_wear = -0.10, -- Tool repair buff (10% bonus instead of 2%). +}) + +-- Redefinitions of some default nodes +-- =================================== + +-- Let there be light. This makes some nodes let light pass through: +minetest.override_item("default:ladder", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:sapling", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:dry_shrub", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:papyrus", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:fence_wood", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:junglegrass", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:junglesapling", { + paramtype = "light", + sunlight_propagates = true, +}) + +minetest.override_item("default:grass_1", { + inventory_image = "default_grass_3.png", -- Use a bigger inventory image. + wield_image = "default_grass_3.png", + paramtype = "light", + sunlight_propagates = true, +}) + +for i = 2, 5 do + minetest.override_item("default:grass_" ..i, { + paramtype = "light", + sunlight_propagates = true, + }) +end diff --git a/mods/moreblocks/stairsplus/API.md b/mods/moreblocks/stairsplus/API.md new file mode 100644 index 0000000..2db0f2b --- /dev/null +++ b/mods/moreblocks/stairsplus/API.md @@ -0,0 +1,24 @@ +API documentation for Stairs+ +============================= + +* `stairsplus:register_all(modname, subname, recipeitem, fields)` + Registers a stair, slab, panel, microblock, and any other types of + nodes to be added in the future. + This also registers the node with the circular saw. + Example: + ```lua + stairsplus:register_all("moreblocks", "wood", "defaut:wood", { + description = "Wooden", + tiles = {"default_wood.png"}, + groups = {oddly_breakabe_by_hand=1}, + sounds = default.node_sound_wood_defaults(), + }) + ``` +The following register only a particular type of microblock. +You will probably never want to use them directly: + +* `stairsplus:register_stair(modname, subname, recipeitem, fields)` +* `stairsplus:register_slab(modname, subname, recipeitem, fields)` +* `stairsplus:register_panel(modname, subname, recipeitem, fields)` +* `stairsplus:register_micro(modname, subname, recipeitem, fields)` + diff --git a/mods/moreblocks/stairsplus/aliases.lua b/mods/moreblocks/stairsplus/aliases.lua new file mode 100644 index 0000000..c235d34 --- /dev/null +++ b/mods/moreblocks/stairsplus/aliases.lua @@ -0,0 +1,70 @@ +--[[ +More Blocks: alias definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local function register_stairsplus_alias(modname, origname, newname) + minetest.register_alias(modname.. ":slab_" ..origname, "moreblocks:slab_" ..newname) + minetest.register_alias(modname.. ":slab_" ..origname.. "_inverted", "moreblocks:slab_" ..newname.. "_inverted") + minetest.register_alias(modname.. ":slab_" ..origname.. "_wall", "moreblocks:slab_" ..newname.. "_wall") + minetest.register_alias(modname.. ":slab_" ..origname.. "_quarter", "moreblocks:slab_" ..newname.. "_quarter") + minetest.register_alias(modname.. ":slab_" ..origname.. "_quarter_inverted", "moreblocks:slab_" ..newname.. "_quarter_inverted") + minetest.register_alias(modname.. ":slab_" ..origname.. "_quarter_wall", "moreblocks:slab_" ..newname.. "_quarter_wall") + minetest.register_alias(modname.. ":slab_" ..origname.. "_three_quarter", "moreblocks:slab_" ..newname.. "_three_quarter") + minetest.register_alias(modname.. ":slab_" ..origname.. "_three_quarter_inverted", "moreblocks:slab_" ..newname.. "_three_quarter_inverted") + minetest.register_alias(modname.. ":slab_" ..origname.. "_three_quarter_wall", "moreblocks:slab_" ..newname.. "_three_quarter_wall") + minetest.register_alias(modname.. ":stair_" ..origname, "moreblocks:stair_" ..newname) + minetest.register_alias(modname.. ":stair_" ..origname.. "_inverted", "moreblocks:stair_" ..newname.. "_inverted") + minetest.register_alias(modname.. ":stair_" ..origname.. "_wall", "moreblocks:stair_" ..newname.. "_wall") + minetest.register_alias(modname.. ":stair_" ..origname.. "_wall_half", "moreblocks:stair_" ..newname.. "_wall_half") + minetest.register_alias(modname.. ":stair_" ..origname.. "_wall_half_inverted", "moreblocks:stair_" ..newname.. "_wall_half_inverted") + minetest.register_alias(modname.. ":stair_" ..origname.. "_half", "moreblocks:stair_" ..newname.. "_half") + minetest.register_alias(modname.. ":stair_" ..origname.. "_half_inverted", "moreblocks:stair_" ..newname.. "_half_inverted") + minetest.register_alias(modname.. ":stair_" ..origname.. "_right_half", "moreblocks:stair_" ..newname.. "_right_half") + minetest.register_alias(modname.. ":stair_" ..origname.. "_right_half_inverted", "moreblocks:stair_" ..newname.. "_right_half_inverted") + minetest.register_alias(modname.. ":stair_" ..origname.. "_wall_half", "moreblocks:stair_" ..newname.. "_wall_half") + minetest.register_alias(modname.. ":stair_" ..origname.. "_wall_half_inverted", "moreblocks:stair_" ..newname.. "_wall_half_inverted") + minetest.register_alias(modname.. ":stair_" ..origname.. "_inner", "moreblocks:stair_" ..newname.. "_inner") + minetest.register_alias(modname.. ":stair_" ..origname.. "_inner_inverted", "moreblocks:stair_" ..newname.. "_inner_inverted") + minetest.register_alias(modname.. ":stair_" ..origname.. "_outer", "moreblocks:stair_" ..newname.. "_outer") + minetest.register_alias(modname.. ":stair_" ..origname.. "_outer_inverted", "moreblocks:stair_" ..newname.. "_outer_inverted") + minetest.register_alias(modname.. ":panel_" ..origname.. "_bottom", "moreblocks:panel_" ..newname.. "_bottom") + minetest.register_alias(modname.. ":panel_" ..origname.. "_top", "moreblocks:panel_" ..newname.. "_top") + minetest.register_alias(modname.. ":panel_" ..origname.. "_vertical", "moreblocks:panel_" ..newname.. "_vertical") + minetest.register_alias(modname.. ":micro_" ..origname.. "_bottom", "moreblocks:micro_" ..newname.. "_bottom") + minetest.register_alias(modname.. ":micro_" ..origname.. "_top", "moreblocks:micro_" ..newname.. "_top") +end + +register_stairsplus_alias("stairsplus", "stone", "stone") +register_stairsplus_alias("stairsplus", "wood", "wood") +register_stairsplus_alias("stairsplus", "pinewood", "pinewood") +register_stairsplus_alias("stairsplus", "cobble", "cobble") +register_stairsplus_alias("stairsplus", "brick", "brick") +register_stairsplus_alias("stairsplus", "sandstone", "sandstone") +register_stairsplus_alias("stairsplus", "glass", "glass") +register_stairsplus_alias("stairsplus", "tree", "tree") +register_stairsplus_alias("stairsplus", "jungletree", "jungletree") +register_stairsplus_alias("stairsplus", "pinetree", "pinetree") +register_stairsplus_alias("stairsplus", "desert_stone", "desert_stone") +register_stairsplus_alias("stairsplus", "steelblock", "steelblock") +register_stairsplus_alias("stairsplus", "mossycobble", "mossycobble") + +register_stairsplus_alias("moreblocks", "coalstone", "coal_stone") +register_stairsplus_alias("moreblocks", "junglewood", "jungle_wood") +register_stairsplus_alias("moreblocks", "circlestonebrick", "circle_stone_bricks") +register_stairsplus_alias("moreblocks", "ironstone", "iron_stone") +register_stairsplus_alias("moreblocks", "coalglass", "coal_glass") +register_stairsplus_alias("moreblocks", "ironglass", "iron_glass") +register_stairsplus_alias("moreblocks", "glowglass", "glow_glass") +register_stairsplus_alias("moreblocks", "superglowglass", "super_glow_glass") +register_stairsplus_alias("moreblocks", "coalchecker", "coal_checker") +register_stairsplus_alias("moreblocks", "ironchecker", "iron_checker") +register_stairsplus_alias("moreblocks", "cactuschecker", "cactus_checker") +register_stairsplus_alias("moreblocks", "ironstonebrick", "iron_stone_bricks") +register_stairsplus_alias("moreblocks", "stonesquare", "stone_tile") +register_stairsplus_alias("moreblocks", "splitstonesquare", "split_stone_tile") +register_stairsplus_alias("moreblocks", "woodtile", "wood_tile") +register_stairsplus_alias("moreblocks", "woodtile_centered", "wood_tile_centered") +register_stairsplus_alias("moreblocks", "woodtile_full", "wood_tile_full") diff --git a/mods/moreblocks/stairsplus/conversion.lua b/mods/moreblocks/stairsplus/conversion.lua new file mode 100644 index 0000000..13966b6 --- /dev/null +++ b/mods/moreblocks/stairsplus/conversion.lua @@ -0,0 +1,139 @@ +--[[ +More Blocks: conversion + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Function to convert all stairs/slabs/etc nodes from +-- inverted, wall, etc to regular + 6d facedir + +local dirs1 = {21, 20, 23, 22, 21} +local dirs2 = {15, 8, 17, 6, 15} +local dirs3 = {14, 11, 16, 5, 14} + +function stairsplus:register_6dfacedir_conversion(modname, material) + --print("Register stairsplus 6d facedir conversion") + --print('ABM for '..modname..' "'..material..'"') + + local objects_list1 = { + modname.. ":slab_" ..material.. "_inverted", + modname.. ":slab_" ..material.. "_quarter_inverted", + modname.. ":slab_" ..material.. "_three_quarter_inverted", + modname.. ":stair_" ..material.. "_inverted", + modname.. ":stair_" ..material.. "_wall", + modname.. ":stair_" ..material.. "_wall_half", + modname.. ":stair_" ..material.. "_wall_half_inverted", + modname.. ":stair_" ..material.. "_half_inverted", + modname.. ":stair_" ..material.. "_right_half_inverted", + modname.. ":panel_" ..material.. "_vertical", + modname.. ":panel_" ..material.. "_top", + } + + local objects_list2 = { + modname.. ":slab_" ..material.. "_wall", + modname.. ":slab_" ..material.. "_quarter_wall", + modname.. ":slab_" ..material.. "_three_quarter_wall", + modname.. ":stair_" ..material.. "_inner_inverted", + modname.. ":stair_" ..material.. "_outer_inverted", + modname.. ":micro_" ..material.. "_top" + } + + for _, object in pairs(objects_list1) do + local flip_upside_down = false + local flip_to_wall = false + + local dest_object = object + + if string.find(dest_object, "_inverted") then + flip_upside_down = true + dest_object = string.gsub(dest_object, "_inverted", "") + end + + if string.find(object, "_top") then + flip_upside_down = true + dest_object = string.gsub(dest_object, "_top", "") + end + + if string.find(dest_object, "_wall") then + flip_to_wall = true + dest_object = string.gsub(dest_object, "_wall", "") + end + + if string.find(dest_object, "_vertical") then + flip_to_wall = true + dest_object = string.gsub(dest_object, "_vertical", "") + end + + if string.find(dest_object, "_half") and not string.find(dest_object, "_right_half") then + dest_object = string.gsub(dest_object, "_half", "_right_half") + elseif string.find(dest_object, "_right_half") then + dest_object = string.gsub(dest_object, "_right_half", "_half") + end + + --print(" +---> convert " ..object) + --print(" | to " ..dest_object) + + minetest.register_abm({ + nodenames = {object}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + + if flip_upside_down and not flip_to_wall then + nfdir = dirs1[fdir + 2] + elseif flip_to_wall and not flip_upside_down then + nfdir = dirs2[fdir + 1] + elseif flip_to_wall and flip_upside_down then + nfdir = dirs3[fdir + 2] + end + minetest.set_node(pos, {name = dest_object, param2 = nfdir}) + end + }) + end + + for _, object in pairs(objects_list2) do + local flip_upside_down = false + local flip_to_wall = false + + local dest_object = object + + if string.find(dest_object, "_inverted") then + flip_upside_down = true + dest_object = string.gsub(dest_object, "_inverted", "") + end + + if string.find(dest_object, "_top") then + flip_upside_down = true + dest_object = string.gsub(dest_object, "_top", "") + end + + if string.find(dest_object, "_wall") then + flip_to_wall = true + dest_object = string.gsub(dest_object, "_wall", "") + end + + --print(" +---> convert " ..object) + --print(" | to " ..dest_object) + + minetest.register_abm({ + nodenames = {object}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 + local nfdir = 20 + + if flip_upside_down and not flip_to_wall then + nfdir = dirs1[fdir + 1] + elseif flip_to_wall and not flip_upside_down then + nfdir = dirs2[fdir + 2] + + end + minetest.set_node(pos, {name = dest_object, param2 = nfdir}) + end + }) + end +end + diff --git a/mods/moreblocks/stairsplus/init.lua b/mods/moreblocks/stairsplus/init.lua new file mode 100644 index 0000000..ffec1b7 --- /dev/null +++ b/mods/moreblocks/stairsplus/init.lua @@ -0,0 +1,52 @@ +--[[ +More Blocks: Stairs+ + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +-- Nodes will be called :{stair,slab,panel,micro}_ + +local modpath = minetest.get_modpath("moreblocks").. "/stairsplus" + +stairsplus = {} +stairsplus.expect_infinite_stacks = false + +if not minetest.get_modpath("unified_inventory") +and minetest.setting_getbool("creative_mode") then + stairsplus.expect_infinite_stacks = true +end + +function stairsplus:register_all(modname, subname, recipeitem, fields) + fields = fields or {} + fields.groups = fields.groups or {} + if not moreblocks.config.stairsplus_in_creative_inventory then + fields.groups.not_in_creative_inventory = 1 + end + self:register_stair(modname, subname, recipeitem, fields) + self:register_slab (modname, subname, recipeitem, fields) + self:register_slope(modname, subname, recipeitem, fields) + self:register_panel(modname, subname, recipeitem, fields) + self:register_micro(modname, subname, recipeitem, fields) + -- self:register_6dfacedir_conversion(modname, subname) -- Not needed as of Q3 2013, uncomment to fix old maps. + circular_saw.known_nodes[recipeitem] = {modname, subname} +end + +function register_stair_slab_panel_micro(modname, subname, recipeitem, groups, images, description, drop, light) + stairsplus:register_all(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light + }) +end + +-- dofile(modpath.. "/aliases.lua") -- Not needed as of Q2 2013, uncomment to fix old maps. +-- dofile(modpath.. "/conversion.lua") -- Not needed as of Q2 2013, uncomment to fix old maps. +dofile(modpath .. "/stairs.lua") +dofile(modpath .. "/slabs.lua") +dofile(modpath .. "/slopes.lua") +dofile(modpath .. "/panels.lua") +dofile(modpath .. "/microblocks.lua") +dofile(modpath .. "/registrations.lua") diff --git a/mods/moreblocks/stairsplus/microblocks.lua b/mods/moreblocks/stairsplus/microblocks.lua new file mode 100644 index 0000000..c5e6c63 --- /dev/null +++ b/mods/moreblocks/stairsplus/microblocks.lua @@ -0,0 +1,136 @@ +--[[ +More Blocks: microblock definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +-- Node will be called :micro_ + +function register_micro(modname, subname, recipeitem, groups, images, description, drop, light) + return stairsplus:register_micro(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = default.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_micro(modname, subname, recipeitem, fields) + local defs = { + [""] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0, 0.5}, + }, + }, + ["_1"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, -0.4375, 0.5}, + }, + }, + ["_2"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, -0.375, 0.5}, + }, + }, + ["_4"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, -0.25, 0.5}, + }, + }, + ["_12"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0.25, 0.5}, + }, + }, + ["_14"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0.375, 0.5}, + }, + }, + ["_15"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0, 0.4375, 0.5}, + }, + } + } + + local desc = S("%s Microblock"):format(fields.description) + for alternate, def in pairs(defs) do + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.on_place = minetest.rotate_node + for k, v in pairs(fields) do + def[k] = v + end + def.description = desc + if fields.drop then + def.drop = modname.. ":micro_" ..fields.drop..alternate + end + minetest.register_node(":" ..modname.. ":micro_" ..subname..alternate, def) + end + + minetest.register_alias(modname.. ":micro_" ..subname.. "_bottom", modname.. ":micro_" ..subname) + + -- Some saw-less recipes: + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 7", + recipe = {modname .. ":stair_" .. subname .. "_inner"}, + }) + + minetest.register_craft({ + output = modname .. ":micro_" .. subname .. " 6", + type = "shapeless", + recipe = {modname .. ":stair_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 5", + recipe = {modname .. ":stair_" .. subname .. "_outer"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 4", + recipe = {modname .. ":slab_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 4", + recipe = {modname .. ":stair_" .. subname .. "_alt"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 3", + recipe = {modname .. ":stair_" .. subname .. "_right_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":micro_" .. subname .. " 2", + recipe = {modname .. ":panel_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) +end diff --git a/mods/moreblocks/stairsplus/panels.lua b/mods/moreblocks/stairsplus/panels.lua new file mode 100644 index 0000000..2220fe4 --- /dev/null +++ b/mods/moreblocks/stairsplus/panels.lua @@ -0,0 +1,115 @@ +--[[ +More Blocks: panel definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +-- Node will be called :panel_ + +function register_panel(modname, subname, recipeitem, groups, images, description, drop, light) + return stairsplus:register_panel(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = default.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_panel(modname, subname, recipeitem, fields) + local defs = { + [""] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0, 0.5}, + }, + }, + ["_1"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, -0.4375, 0.5}, + }, + }, + ["_2"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, -0.375, 0.5}, + }, + }, + ["_4"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, -0.25, 0.5}, + }, + }, + ["_12"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0.25, 0.5}, + }, + }, + ["_14"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0.375, 0.5}, + }, + }, + ["_15"] = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, 0, 0.5, 0.4375, 0.5}, + }, + } + } + + local desc = S("%s Panel"):format(fields.description) + for alternate, def in pairs(defs) do + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.on_place = minetest.rotate_node + for k, v in pairs(fields) do + def[k] = v + end + def.description = desc + if fields.drop then + def.drop = modname.. ":panel_" ..fields.drop..alternate + end + minetest.register_node(":" ..modname.. ":panel_" ..subname..alternate, def) + end + minetest.register_alias(modname.. ":panel_" ..subname.. "_bottom", modname.. ":panel_" ..subname) + + -- Some saw-less recipes: + + minetest.register_craft({ + output = modname .. ":panel_" .. subname .. " 12", + recipe = { + {recipeitem, ""}, + {recipeitem, recipeitem}, + }, + }) + + minetest.register_craft({ + output = modname .. ":panel_" .. subname .. " 12", + recipe = { + {"", recipeitem}, + {recipeitem, recipeitem}, + }, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":panel_" .. subname, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + }) +end diff --git a/mods/moreblocks/stairsplus/registrations.lua b/mods/moreblocks/stairsplus/registrations.lua new file mode 100644 index 0000000..54cdcbb --- /dev/null +++ b/mods/moreblocks/stairsplus/registrations.lua @@ -0,0 +1,63 @@ +--[[ +More Blocks: registrations + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local default_nodes = { -- Default stairs/slabs/panels/microblocks: + "stone", + "cobble", + "mossycobble", + "brick", + "sandstone", + "steelblock", + "goldblock", + "copperblock", + "bronzeblock", + "diamondblock", + "desert_stone", + "desert_cobble", + "meselamp", + "glass", + "tree", + "wood", + "jungletree", + "junglewood", + "pinetree", + "pinewood", + "obsidian", + "obsidian_glass", + "stonebrick", + "desert_stonebrick", + "sandstonebrick", + "obsidianbrick", +} + +for _, name in pairs(default_nodes) do + local nodename = "default:" .. name + local ndef = minetest.registered_nodes[nodename] + if ndef then + local groups = {} + for k, v in pairs(ndef.groups) + -- Ignore wood and stone groups to not make them usable in crafting: + do if k ~= "wood" and k ~= "stone" then + groups[k] = v + end + end + local drop + if type(ndef.drop) == "string" then + drop = ndef.drop:sub(9) + end + stairsplus:register_all("moreblocks", name, nodename, { + description = ndef.description, + drop = drop, + groups = groups, + sounds = ndef.sounds, + tiles = ndef.tiles, + sunlight_propagates = true, + light_source = ndef.light_source + }) + end +end + diff --git a/mods/moreblocks/stairsplus/slabs.lua b/mods/moreblocks/stairsplus/slabs.lua new file mode 100644 index 0000000..4875f22 --- /dev/null +++ b/mods/moreblocks/stairsplus/slabs.lua @@ -0,0 +1,205 @@ +--[[ +More Blocks: slab definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +-- Node will be called :slab_ + +function register_slab(modname, subname, recipeitem, groups, images, description, drop, light) + return stairsplus:register_slab(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = default.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_slab(modname, subname, recipeitem, fields) + local defs = { + [""] = 8, + ["_quarter"] = 4, + ["_three_quarter"] = 12, + ["_1"] = 1, + ["_2"] = 2, + ["_14"] = 14, + ["_15"] = 15, + } + local desc_base = S("%s Slab"):format(fields.description) + for alternate, num in pairs(defs) do + local def = { + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, (num/16)-0.5, 0.5}, + } + } + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.on_place = minetest.rotate_node + for k, v in pairs(fields) do + def[k] = v + end + def.description = ("%s (%d/16)"):format(desc_base, num) + if fields.drop then + def.drop = modname.. ":slab_" .. fields.drop .. alternate + end + minetest.register_node(":" .. modname .. ":slab_" .. subname .. alternate, def) + end + minetest.register_alias("stairs:slab_" .. subname, modname .. ":slab_" .. subname) + + -- Some saw-less recipes: + + minetest.register_craft({ + output = modname .. ":slab_" .. subname .. " 6", + recipe = {{recipeitem, recipeitem, recipeitem}}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + -- uncomment this rule when conflict is no longer likely to happen + -- https://github.com/minetest/minetest/issues/2881 + -- minetest.register_craft({ + -- type = "shapeless", + -- output = modname .. ":slab_" .. subname, + -- recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + -- }) + + -- then remove these two + minetest.register_craft({ + output = modname .. ":slab_" .. subname, + recipe = {{modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}}, + }) + + minetest.register_craft({ + output = modname .. ":slab_" .. subname, + recipe = { + {modname .. ":panel_" .. subname}, + {modname .. ":panel_" .. subname}, + }, + }) + ------------------------------ + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname, modname .. ":slab_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_three_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_14", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slab_" .. subname .. "_15", modname .. ":slab_" .. subname .. "_1"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_quarter", + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_quarter", + recipe = {modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_2", + recipe = {modname .. ":slab_" .. subname .. "_1", modname .. ":slab_" .. subname .. "_1"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_three_quarter", + recipe = {modname .. ":slab_" .. subname, modname .. ":slab_" .. subname .. "_quarter"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_three_quarter", + recipe = {modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter", modname .. ":slab_" .. subname .. "_quarter"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_three_quarter", + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_14", + recipe = {modname .. ":slab_" .. subname .. "_three_quarter", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_14", + recipe = {modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2", modname .. ":slab_" .. subname .. "_2"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. "_15", + recipe = {modname .. ":slab_" .. subname .. "_14", modname .. ":slab_" .. subname .. "_1"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname .. " 3", + recipe = {modname .. ":stair_" .. subname, modname .. ":stair_" .. subname}, + }) +end diff --git a/mods/moreblocks/stairsplus/slopes.lua b/mods/moreblocks/stairsplus/slopes.lua new file mode 100644 index 0000000..da51657 --- /dev/null +++ b/mods/moreblocks/stairsplus/slopes.lua @@ -0,0 +1,344 @@ +--[[ +More Blocks: slope definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +local box_slope = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5} + } +} + +local box_slope_half = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.5, -0.375, -0.25, 0.5, -0.25, 0.5}, + {-0.5, -0.25, 0, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.25, 0.5, 0, 0.5}, + } +} + +local box_slope_half_raised = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, 0.125, -0.25, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0, 0.5, 0.375, 0.5}, + {-0.5, 0.375, 0.25, 0.5, 0.5, 0.5}, + } +} + +--============================================================== + +local box_slope_inner = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.5, -0.25, 0.5, 0, 0.5}, + {-0.5, -0.5, -0.5, 0.25, 0, 0.5}, + {-0.5, 0, -0.5, 0, 0.25, 0.5}, + {-0.5, 0, 0, 0.5, 0.25, 0.5}, + {-0.5, 0.25, 0.25, 0.5, 0.5, 0.5}, + {-0.5, 0.25, -0.5, -0.25, 0.5, 0.5}, + } +} + +local box_slope_inner_half = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.5, -0.375, -0.25, 0.5, -0.25, 0.5}, + {-0.5, -0.375, -0.5, 0.25, -0.25, 0.5}, + {-0.5, -0.25, -0.5, 0, -0.125, 0.5}, + {-0.5, -0.25, 0, 0.5, -0.125, 0.5}, + {-0.5, -0.125, 0.25, 0.5, 0, 0.5}, + {-0.5, -0.125, -0.5, -0.25, 0, 0.5}, + } +} + +local box_slope_inner_half_raised = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, 0.125, -0.25, 0.5, 0.25, 0.5}, + {-0.5, 0.125, -0.5, 0.25, 0.25, 0.5}, + {-0.5, 0.25, -0.5, 0, 0.375, 0.5}, + {-0.5, 0.25, 0, 0.5, 0.375, 0.5}, + {-0.5, 0.375, 0.25, 0.5, 0.5, 0.5}, + {-0.5, 0.375, -0.5, -0.25, 0.5, 0.5}, + } +} + +--============================================================== + +local box_slope_outer = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.25, 0.5}, + {-0.5, -0.25, -0.25, 0.25, 0, 0.5}, + {-0.5, 0, 0, 0, 0.25, 0.5}, + {-0.5, 0.25, 0.25, -0.25, 0.5, 0.5} + } +} + +local box_slope_outer_half = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, -0.375, 0.5}, + {-0.5, -0.375, -0.25, 0.25, -0.25, 0.5}, + {-0.5, -0.25, 0, 0, -0.125, 0.5}, + {-0.5, -0.125, 0.25, -0.25, 0, 0.5} + } +} + +local box_slope_outer_half_raised = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0.125, 0.5}, + {-0.5, 0.125, -0.25, 0.25, 0.25, 0.5}, + {-0.5, 0.25, 0, 0, 0.375, 0.5}, + {-0.5, 0.375, 0.25, -0.25, 0.5, 0.5} + } +} + +-- Node will be called :slope_ + +function register_slope(modname, subname, recipeitem, groups, images, description, drop, light) + return stairsplus:register_slope(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = default.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_slope(modname, subname, recipeitem, fields) + local defs = { + [""] = { + mesh = "moreblocks_slope.obj", + collision_box = box_slope, + selection_box = box_slope, + + }, + ["_half"] = { + mesh = "moreblocks_slope_half.obj", + collision_box = box_slope_half, + selection_box = box_slope_half, + }, + ["_half_raised"] = { + mesh = "moreblocks_slope_half_raised.obj", + collision_box = box_slope_half_raised, + selection_box = box_slope_half_raised, + }, + +--============================================================== + + ["_inner"] = { + mesh = "moreblocks_slope_inner.obj", + collision_box = box_slope_inner, + selection_box = box_slope_inner, + }, + ["_inner_half"] = { + mesh = "moreblocks_slope_inner_half.obj", + collision_box = box_slope_inner_half, + selection_box = box_slope_inner_half, + }, + ["_inner_half_raised"] = { + mesh = "moreblocks_slope_inner_half_raised.obj", + collision_box = box_slope_inner_half_raised, + selection_box = box_slope_inner_half_raised, + }, + +--============================================================== + + ["_inner_cut"] = { + mesh = "moreblocks_slope_inner_cut.obj", + collision_box = box_slope_inner, + selection_box = box_slope_inner, + }, + ["_inner_cut_half"] = { + mesh = "moreblocks_slope_inner_cut_half.obj", + collision_box = box_slope_inner_half, + selection_box = box_slope_inner_half, + }, + ["_inner_cut_half_raised"] = { + mesh = "moreblocks_slope_inner_cut_half_raised.obj", + collision_box = box_slope_inner_half_raised, + selection_box = box_slope_inner_half_raised, + }, + +--============================================================== + + ["_outer"] = { + mesh = "moreblocks_slope_outer.obj", + collision_box = box_slope_outer, + selection_box = box_slope_outer, + }, + ["_outer_half"] = { + mesh = "moreblocks_slope_outer_half.obj", + collision_box = box_slope_outer_half, + selection_box = box_slope_outer_half, + }, + ["_outer_half_raised"] = { + mesh = "moreblocks_slope_outer_half_raised.obj", + collision_box = box_slope_outer_half_raised, + selection_box = box_slope_outer_half_raised, + }, + +--============================================================== + + ["_outer_cut"] = { + mesh = "moreblocks_slope_outer_cut.obj", + collision_box = box_slope_outer, + selection_box = box_slope_outer, + }, + ["_outer_cut_half"] = { + mesh = "moreblocks_slope_outer_cut_half.obj", + collision_box = box_slope_outer_half, + selection_box = box_slope_outer_half, + }, + ["_outer_cut_half_raised"] = { + mesh = "moreblocks_slope_outer_cut_half_raised.obj", + collision_box = box_slope_outer_half_raised, + selection_box = box_slope_outer_half_raised, + }, + ["_cut"] = { + mesh = "moreblocks_slope_cut.obj", + collision_box = box_slope_outer, + selection_box = box_slope_outer, + }, + } + + local desc = S("%s Slope"):format(fields.description) + for alternate, def in pairs(defs) do + def.drawtype = "mesh" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.on_place = minetest.rotate_node + for k, v in pairs(fields) do + def[k] = v + end + def.description = desc + if fields.drop then + def.drop = modname.. ":slope_" ..fields.drop..alternate + end + minetest.register_node(":" ..modname.. ":slope_" ..subname..alternate, def) + end + + -- Some saw-less recipes: + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname, modname .. ":slope_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half_raised"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half", + modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer", modname .. ":slope_" .. subname .. "_inner"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_half", modname .. ":slope_" .. subname .. "_inner_half_raised"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_half_raised", modname .. ":slope_" .. subname .. "_inner_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_cut", modname .. ":slope_" .. subname .. "_inner_cut"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_outer_cut_half", modname .. ":slope_" .. subname .. "_inner_cut_half_raised"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = recipeitem, + recipe = {modname .. ":slope_" .. subname .. "_cut", modname .. ":slope_" .. subname .. "_cut"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slope_" .. subname .. "_outer_half", modname .. ":slope_" .. subname .. "_inner_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slab_" .. subname, + recipe = {modname .. ":slope_" .. subname .. "_outer_cut_half", modname .. ":slope_" .. subname .. "_inner_cut_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_half_raised", + recipe = {modname .. ":slope_" .. subname .. "_half", modname .. ":slope_" .. subname .. "_half", + modname .. ":slope_" .. subname .. "_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_inner_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_inner_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_outer_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_outer_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":slope_" .. subname .. "_inner_cut_half_raised", + recipe = {modname .. ":slab_" .. subname, modname .. ":slope_" .. subname .. "_inner_cut_half"}, + }) +end diff --git a/mods/moreblocks/stairsplus/stairs.lua b/mods/moreblocks/stairsplus/stairs.lua new file mode 100644 index 0000000..3be0e23 --- /dev/null +++ b/mods/moreblocks/stairsplus/stairs.lua @@ -0,0 +1,221 @@ +--[[ +More Blocks: stair definitions + +Copyright (c) 2011-2015 Calinou and contributors. +Licensed under the zlib license. See LICENSE.md for more information. +--]] + +local S = moreblocks.intllib + +-- Node will be called :stair_ + +function register_stair(modname, subname, recipeitem, groups, images, description, drop, light) + return stairsplus:register_stair(modname, subname, recipeitem, { + groups = groups, + tiles = images, + description = description, + drop = drop, + light_source = light, + sounds = default.node_sound_stone_defaults(), + }) +end + +function stairsplus:register_stair(modname, subname, recipeitem, fields) + local defs = { + [""] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_half"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0, 0, 0.5}, + {-0.5, 0, 0, 0, 0.5, 0.5}, + }, + }, + }, + ["_right_half" ]= { + node_box = { + type = "fixed", + fixed = { + {0, -0.5, -0.5, 0.5, 0, 0.5}, + {0, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_inner"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + {-0.5, 0, -0.5, 0, 0.5, 0}, + }, + }, + }, + ["_outer"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0, 0.5, 0.5}, + }, + }, + }, + ["_alt"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_alt_1"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.0625, -0.5, 0.5, 0, 0}, + {-0.5, 0.4375, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_alt_2"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.125, -0.5, 0.5, 0, 0}, + {-0.5, 0.375, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + ["_alt_4"] = { + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.25, -0.5, 0.5, 0, 0}, + {-0.5, 0.25, 0, 0.5, 0.5, 0.5}, + }, + }, + }, + } + + local desc = S("%s Stairs"):format(fields.description) + for alternate, def in pairs(defs) do + def.drawtype = "nodebox" + def.paramtype = "light" + def.paramtype2 = "facedir" + def.on_place = minetest.rotate_node + for k, v in pairs(fields) do + def[k] = v + end + def.description = desc + if fields.drop then + def.drop = modname .. ":stair_" .. fields.drop .. alternate + end + minetest.register_node(":" .. modname .. ":stair_" .. subname .. alternate, def) + end + minetest.register_alias("stairs:stair_" .. subname, modname .. ":stair_" .. subname) + + -- Some saw-less recipes: + + minetest.register_craft({ + output = modname .. ":stair_" .. subname .. " 8", + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + minetest.register_craft({ + output = modname .. ":stair_" .. subname .. " 8", + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":panel_" .. subname, modname .. ":slab_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_outer", + recipe = {modname .. ":micro_" .. subname, modname .. ":slab_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_half", + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_half", + recipe = {modname .. ":panel_" .. subname, modname .. ":micro_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_right_half", + recipe = {modname .. ":stair_" .. subname .. "_half"}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_inner", + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname .. "_outer", + recipe = {modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname, modname .. ":micro_" .. subname}, + }) + + minetest.register_craft({ + type = "shapeless", + output = modname .. ":stair_" .. subname, + recipe = {modname .. ":panel_" .. subname, modname .. ":panel_" .. subname, modname .. ":panel_" .. subname}, + }) + + minetest.register_craft({ -- See mirrored variation of the recipe below. + output = modname .. ":stair_" .. subname .. "_alt", + recipe = { + {modname .. ":panel_" .. subname, ""}, + {"" , modname .. ":panel_" .. subname}, + }, + }) + + minetest.register_craft({ -- Mirrored variation of the recipe above. + output = modname .. ":stair_" .. subname .. "_alt", + recipe = { + {"" , modname .. ":panel_" .. subname}, + {modname .. ":panel_" .. subname, ""}, + }, + }) +end diff --git a/mods/moreblocks/textures/default_brick.png b/mods/moreblocks/textures/default_brick.png new file mode 100644 index 0000000..9c76033 Binary files /dev/null and b/mods/moreblocks/textures/default_brick.png differ diff --git a/mods/moreblocks/textures/default_fence_overlay.png b/mods/moreblocks/textures/default_fence_overlay.png new file mode 100644 index 0000000..780e736 Binary files /dev/null and b/mods/moreblocks/textures/default_fence_overlay.png differ diff --git a/mods/moreblocks/textures/invisible.png b/mods/moreblocks/textures/invisible.png new file mode 100644 index 0000000..4b5b302 Binary files /dev/null and b/mods/moreblocks/textures/invisible.png differ diff --git a/mods/moreblocks/textures/moreblocks_cactus_brick.png b/mods/moreblocks/textures/moreblocks_cactus_brick.png new file mode 100644 index 0000000..0e8c2c9 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_cactus_brick.png differ diff --git a/mods/moreblocks/textures/moreblocks_cactus_checker.png b/mods/moreblocks/textures/moreblocks_cactus_checker.png new file mode 100644 index 0000000..99c2677 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_cactus_checker.png differ diff --git a/mods/moreblocks/textures/moreblocks_circle_stone_bricks.png b/mods/moreblocks/textures/moreblocks_circle_stone_bricks.png new file mode 100644 index 0000000..4ca0134 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circle_stone_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_circular_saw_bottom.png b/mods/moreblocks/textures/moreblocks_circular_saw_bottom.png new file mode 100644 index 0000000..1522829 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circular_saw_bottom.png differ diff --git a/mods/moreblocks/textures/moreblocks_circular_saw_side.png b/mods/moreblocks/textures/moreblocks_circular_saw_side.png new file mode 100644 index 0000000..ce9e16f Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circular_saw_side.png differ diff --git a/mods/moreblocks/textures/moreblocks_circular_saw_top.png b/mods/moreblocks/textures/moreblocks_circular_saw_top.png new file mode 100644 index 0000000..96f3350 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_circular_saw_top.png differ diff --git a/mods/moreblocks/textures/moreblocks_clean_glass.png b/mods/moreblocks/textures/moreblocks_clean_glass.png new file mode 100644 index 0000000..140ee2b Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_clean_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_clean_glass_detail.png b/mods/moreblocks/textures/moreblocks_clean_glass_detail.png new file mode 100644 index 0000000..71414e8 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_clean_glass_detail.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_checker.png b/mods/moreblocks/textures/moreblocks_coal_checker.png new file mode 100644 index 0000000..3df90c3 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_checker.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_glass.png b/mods/moreblocks/textures/moreblocks_coal_glass.png new file mode 100644 index 0000000..5cb7227 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_glass_detail.png b/mods/moreblocks/textures/moreblocks_coal_glass_detail.png new file mode 100644 index 0000000..5ea081f Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_glass_detail.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_coal_glass_stairsplus.png new file mode 100644 index 0000000..8086a28 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_stone.png b/mods/moreblocks/textures/moreblocks_coal_stone.png new file mode 100644 index 0000000..1e514ed Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_stone.png differ diff --git a/mods/moreblocks/textures/moreblocks_coal_stone_bricks.png b/mods/moreblocks/textures/moreblocks_coal_stone_bricks.png new file mode 100644 index 0000000..366e445 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_coal_stone_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_cobble_compressed.png b/mods/moreblocks/textures/moreblocks_cobble_compressed.png new file mode 100644 index 0000000..94d02b5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_cobble_compressed.png differ diff --git a/mods/moreblocks/textures/moreblocks_empty_bookshelf.png b/mods/moreblocks/textures/moreblocks_empty_bookshelf.png new file mode 100644 index 0000000..af874d7 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_empty_bookshelf.png differ diff --git a/mods/moreblocks/textures/moreblocks_fence_jungle_wood.png b/mods/moreblocks/textures/moreblocks_fence_jungle_wood.png new file mode 100644 index 0000000..b59db10 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_fence_jungle_wood.png differ diff --git a/mods/moreblocks/textures/moreblocks_fence_wood.png b/mods/moreblocks/textures/moreblocks_fence_wood.png new file mode 100644 index 0000000..e3510c5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_fence_wood.png differ diff --git a/mods/moreblocks/textures/moreblocks_glass.png b/mods/moreblocks/textures/moreblocks_glass.png new file mode 100644 index 0000000..912b029 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_glass_stairsplus.png new file mode 100644 index 0000000..b879ec3 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_glow_glass.png b/mods/moreblocks/textures/moreblocks_glow_glass.png new file mode 100644 index 0000000..843bebf Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glow_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_glow_glass_detail.png b/mods/moreblocks/textures/moreblocks_glow_glass_detail.png new file mode 100644 index 0000000..ea67bc3 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glow_glass_detail.png differ diff --git a/mods/moreblocks/textures/moreblocks_glow_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_glow_glass_stairsplus.png new file mode 100644 index 0000000..cdb8044 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_glow_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_grey_bricks.png b/mods/moreblocks/textures/moreblocks_grey_bricks.png new file mode 100644 index 0000000..9839ca2 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_grey_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_checker.png b/mods/moreblocks/textures/moreblocks_iron_checker.png new file mode 100644 index 0000000..d27f4df Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_checker.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_glass.png b/mods/moreblocks/textures/moreblocks_iron_glass.png new file mode 100644 index 0000000..51be0d6 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_glass_detail.png b/mods/moreblocks/textures/moreblocks_iron_glass_detail.png new file mode 100644 index 0000000..2b8fc12 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_glass_detail.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_iron_glass_stairsplus.png new file mode 100644 index 0000000..52e3bf3 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_stone.png b/mods/moreblocks/textures/moreblocks_iron_stone.png new file mode 100644 index 0000000..20c42f3 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_stone.png differ diff --git a/mods/moreblocks/textures/moreblocks_iron_stone_bricks.png b/mods/moreblocks/textures/moreblocks_iron_stone_bricks.png new file mode 100644 index 0000000..1f817f8 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_iron_stone_bricks.png differ diff --git a/mods/moreblocks/textures/moreblocks_junglestick.png b/mods/moreblocks/textures/moreblocks_junglestick.png new file mode 100644 index 0000000..7c6c462 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_junglestick.png differ diff --git a/mods/moreblocks/textures/moreblocks_obsidian_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_obsidian_glass_stairsplus.png new file mode 100644 index 0000000..3eb22d0 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_obsidian_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_plankstone.png b/mods/moreblocks/textures/moreblocks_plankstone.png new file mode 100644 index 0000000..b1a65c5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_plankstone.png differ diff --git a/mods/moreblocks/textures/moreblocks_plankstone_2.png b/mods/moreblocks/textures/moreblocks_plankstone_2.png new file mode 100644 index 0000000..953c2f5 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_plankstone_2.png differ diff --git a/mods/moreblocks/textures/moreblocks_rope.png b/mods/moreblocks/textures/moreblocks_rope.png new file mode 100644 index 0000000..19787fe Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_rope.png differ diff --git a/mods/moreblocks/textures/moreblocks_split_stone_tile.png b/mods/moreblocks/textures/moreblocks_split_stone_tile.png new file mode 100644 index 0000000..d7d69af Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_split_stone_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_split_stone_tile_alt.png b/mods/moreblocks/textures/moreblocks_split_stone_tile_alt.png new file mode 100644 index 0000000..9d11b4f Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_split_stone_tile_alt.png differ diff --git a/mods/moreblocks/textures/moreblocks_split_stone_tile_top.png b/mods/moreblocks/textures/moreblocks_split_stone_tile_top.png new file mode 100644 index 0000000..3c8eb6d Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_split_stone_tile_top.png differ diff --git a/mods/moreblocks/textures/moreblocks_stone_tile.png b/mods/moreblocks/textures/moreblocks_stone_tile.png new file mode 100644 index 0000000..c2083ea Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_stone_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_super_glow_glass.png b/mods/moreblocks/textures/moreblocks_super_glow_glass.png new file mode 100644 index 0000000..a9d4c5f Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_super_glow_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_super_glow_glass_detail.png b/mods/moreblocks/textures/moreblocks_super_glow_glass_detail.png new file mode 100644 index 0000000..e321a5c Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_super_glow_glass_detail.png differ diff --git a/mods/moreblocks/textures/moreblocks_super_glow_glass_stairsplus.png b/mods/moreblocks/textures/moreblocks_super_glow_glass_stairsplus.png new file mode 100644 index 0000000..9118c78 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_super_glow_glass_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_sweeper.png b/mods/moreblocks/textures/moreblocks_sweeper.png new file mode 100644 index 0000000..34f1cde Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_sweeper.png differ diff --git a/mods/moreblocks/textures/moreblocks_tar.png b/mods/moreblocks/textures/moreblocks_tar.png new file mode 100644 index 0000000..e1eb427 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_tar.png differ diff --git a/mods/moreblocks/textures/moreblocks_trap_glass.png b/mods/moreblocks/textures/moreblocks_trap_glass.png new file mode 100644 index 0000000..25c3387 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_trap_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_trap_glow_glass.png b/mods/moreblocks/textures/moreblocks_trap_glow_glass.png new file mode 100644 index 0000000..1096dd7 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_trap_glow_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_trap_stone.png b/mods/moreblocks/textures/moreblocks_trap_stone.png new file mode 100644 index 0000000..764aa81 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_trap_stone.png differ diff --git a/mods/moreblocks/textures/moreblocks_trap_super_glow_glass.png b/mods/moreblocks/textures/moreblocks_trap_super_glow_glass.png new file mode 100644 index 0000000..fef974b Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_trap_super_glow_glass.png differ diff --git a/mods/moreblocks/textures/moreblocks_tree_stairsplus.png b/mods/moreblocks/textures/moreblocks_tree_stairsplus.png new file mode 100644 index 0000000..60100c9 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_tree_stairsplus.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile.png b/mods/moreblocks/textures/moreblocks_wood_tile.png new file mode 100644 index 0000000..d0faa3d Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_center.png b/mods/moreblocks/textures/moreblocks_wood_tile_center.png new file mode 100644 index 0000000..02b0f84 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile_center.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_full.png b/mods/moreblocks/textures/moreblocks_wood_tile_full.png new file mode 100644 index 0000000..7ec7f05 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile_full.png differ diff --git a/mods/moreblocks/textures/moreblocks_wood_tile_up.png b/mods/moreblocks/textures/moreblocks_wood_tile_up.png new file mode 100644 index 0000000..3f6a2f2 Binary files /dev/null and b/mods/moreblocks/textures/moreblocks_wood_tile_up.png differ diff --git a/mods/moretrees/LICENSE b/mods/moretrees/LICENSE new file mode 100644 index 0000000..c4742e6 --- /dev/null +++ b/mods/moretrees/LICENSE @@ -0,0 +1,392 @@ +Minetest mod moretrees +====================== + +All source code: + © 2013, Vanessa Ezekowitz + Published under the terms and conditions of the WTFPL. +All sapling textures (textures/*_sapling.png): + © 2013, Tim Huppertz + Published under the terms and conditions of CC-BY-SA-3.0 Unported. +All other textures: + © 2013, Vanessa Ezekowitz + Published under the terms and conditions of CC-BY-SA-3.0 Unported. + +------------------------------------------------------------------------------- + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +This license is commonly known as "WTFPL". + +------------------------------------------------------------------------------- + +Creative Commons Legal Code + +Attribution-ShareAlike 3.0 Unported + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS LICENSE DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE INFORMATION PROVIDED, AND DISCLAIMS LIABILITY FOR + DAMAGES RESULTING FROM ITS USE. + +License + +THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE +COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY +COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS +AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED. + +BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE +TO BE BOUND BY THE TERMS OF THIS LICENSE. TO THE EXTENT THIS LICENSE MAY +BE CONSIDERED TO BE A CONTRACT, THE LICENSOR GRANTS YOU THE RIGHTS +CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND +CONDITIONS. + +1. Definitions + + a. "Adaptation" means a work based upon the Work, or upon the Work and + other pre-existing works, such as a translation, adaptation, + derivative work, arrangement of music or other alterations of a + literary or artistic work, or phonogram or performance and includes + cinematographic adaptations or any other form in which the Work may be + recast, transformed, or adapted including in any form recognizably + derived from the original, except that a work that constitutes a + Collection will not be considered an Adaptation for the purpose of + this License. For the avoidance of doubt, where the Work is a musical + work, performance or phonogram, the synchronization of the Work in + timed-relation with a moving image ("synching") will be considered an + Adaptation for the purpose of this License. + b. "Collection" means a collection of literary or artistic works, such as + encyclopedias and anthologies, or performances, phonograms or + broadcasts, or other works or subject matter other than works listed + in Section 1(f) below, which, by reason of the selection and + arrangement of their contents, constitute intellectual creations, in + which the Work is included in its entirety in unmodified form along + with one or more other contributions, each constituting separate and + independent works in themselves, which together are assembled into a + collective whole. A work that constitutes a Collection will not be + considered an Adaptation (as defined below) for the purposes of this + License. + c. "Creative Commons Compatible License" means a license that is listed + at http://creativecommons.org/compatiblelicenses that has been + approved by Creative Commons as being essentially equivalent to this + License, including, at a minimum, because that license: (i) contains + terms that have the same purpose, meaning and effect as the License + Elements of this License; and, (ii) explicitly permits the relicensing + of adaptations of works made available under that license under this + License or a Creative Commons jurisdiction license with the same + License Elements as this License. + d. "Distribute" means to make available to the public the original and + copies of the Work or Adaptation, as appropriate, through sale or + other transfer of ownership. + e. "License Elements" means the following high-level license attributes + as selected by Licensor and indicated in the title of this License: + Attribution, ShareAlike. + f. "Licensor" means the individual, individuals, entity or entities that + offer(s) the Work under the terms of this License. + g. "Original Author" means, in the case of a literary or artistic work, + the individual, individuals, entity or entities who created the Work + or if no individual or entity can be identified, the publisher; and in + addition (i) in the case of a performance the actors, singers, + musicians, dancers, and other persons who act, sing, deliver, declaim, + play in, interpret or otherwise perform literary or artistic works or + expressions of folklore; (ii) in the case of a phonogram the producer + being the person or legal entity who first fixes the sounds of a + performance or other sounds; and, (iii) in the case of broadcasts, the + organization that transmits the broadcast. + h. "Work" means the literary and/or artistic work offered under the terms + of this License including without limitation any production in the + literary, scientific and artistic domain, whatever may be the mode or + form of its expression including digital form, such as a book, + pamphlet and other writing; a lecture, address, sermon or other work + of the same nature; a dramatic or dramatico-musical work; a + choreographic work or entertainment in dumb show; a musical + composition with or without words; a cinematographic work to which are + assimilated works expressed by a process analogous to cinematography; + a work of drawing, painting, architecture, sculpture, engraving or + lithography; a photographic work to which are assimilated works + expressed by a process analogous to photography; a work of applied + art; an illustration, map, plan, sketch or three-dimensional work + relative to geography, topography, architecture or science; a + performance; a broadcast; a phonogram; a compilation of data to the + extent it is protected as a copyrightable work; or a work performed by + a variety or circus performer to the extent it is not otherwise + considered a literary or artistic work. + i. "You" means an individual or entity exercising rights under this + License who has not previously violated the terms of this License with + respect to the Work, or who has received express permission from the + Licensor to exercise rights under this License despite a previous + violation. + j. "Publicly Perform" means to perform public recitations of the Work and + to communicate to the public those public recitations, by any means or + process, including by wire or wireless means or public digital + performances; to make available to the public Works in such a way that + members of the public may access these Works from a place and at a + place individually chosen by them; to perform the Work to the public + by any means or process and the communication to the public of the + performances of the Work, including by public digital performance; to + broadcast and rebroadcast the Work by any means including signs, + sounds or images. + k. "Reproduce" means to make copies of the Work by any means including + without limitation by sound or visual recordings and the right of + fixation and reproducing fixations of the Work, including storage of a + protected performance or phonogram in digital form or other electronic + medium. + +2. Fair Dealing Rights. Nothing in this License is intended to reduce, +limit, or restrict any uses free from copyright or rights arising from +limitations or exceptions that are provided for in connection with the +copyright protection under copyright law or other applicable laws. + +3. License Grant. Subject to the terms and conditions of this License, +Licensor hereby grants You a worldwide, royalty-free, non-exclusive, +perpetual (for the duration of the applicable copyright) license to +exercise the rights in the Work as stated below: + + a. to Reproduce the Work, to incorporate the Work into one or more + Collections, and to Reproduce the Work as incorporated in the + Collections; + b. to create and Reproduce Adaptations provided that any such Adaptation, + including any translation in any medium, takes reasonable steps to + clearly label, demarcate or otherwise identify that changes were made + to the original Work. For example, a translation could be marked "The + original work was translated from English to Spanish," or a + modification could indicate "The original work has been modified."; + c. to Distribute and Publicly Perform the Work including as incorporated + in Collections; and, + d. to Distribute and Publicly Perform Adaptations. + e. For the avoidance of doubt: + + i. Non-waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme cannot be waived, the Licensor + reserves the exclusive right to collect such royalties for any + exercise by You of the rights granted under this License; + ii. Waivable Compulsory License Schemes. In those jurisdictions in + which the right to collect royalties through any statutory or + compulsory licensing scheme can be waived, the Licensor waives the + exclusive right to collect such royalties for any exercise by You + of the rights granted under this License; and, + iii. Voluntary License Schemes. The Licensor waives the right to + collect royalties, whether individually or, in the event that the + Licensor is a member of a collecting society that administers + voluntary licensing schemes, via that society, from any exercise + by You of the rights granted under this License. + +The above rights may be exercised in all media and formats whether now +known or hereafter devised. The above rights include the right to make +such modifications as are technically necessary to exercise the rights in +other media and formats. Subject to Section 8(f), all rights not expressly +granted by Licensor are hereby reserved. + +4. Restrictions. The license granted in Section 3 above is expressly made +subject to and limited by the following restrictions: + + a. You may Distribute or Publicly Perform the Work only under the terms + of this License. You must include a copy of, or the Uniform Resource + Identifier (URI) for, this License with every copy of the Work You + Distribute or Publicly Perform. You may not offer or impose any terms + on the Work that restrict the terms of this License or the ability of + the recipient of the Work to exercise the rights granted to that + recipient under the terms of the License. You may not sublicense the + Work. You must keep intact all notices that refer to this License and + to the disclaimer of warranties with every copy of the Work You + Distribute or Publicly Perform. When You Distribute or Publicly + Perform the Work, You may not impose any effective technological + measures on the Work that restrict the ability of a recipient of the + Work from You to exercise the rights granted to that recipient under + the terms of the License. This Section 4(a) applies to the Work as + incorporated in a Collection, but this does not require the Collection + apart from the Work itself to be made subject to the terms of this + License. If You create a Collection, upon notice from any Licensor You + must, to the extent practicable, remove from the Collection any credit + as required by Section 4(c), as requested. If You create an + Adaptation, upon notice from any Licensor You must, to the extent + practicable, remove from the Adaptation any credit as required by + Section 4(c), as requested. + b. You may Distribute or Publicly Perform an Adaptation only under the + terms of: (i) this License; (ii) a later version of this License with + the same License Elements as this License; (iii) a Creative Commons + jurisdiction license (either this or a later license version) that + contains the same License Elements as this License (e.g., + Attribution-ShareAlike 3.0 US)); (iv) a Creative Commons Compatible + License. If you license the Adaptation under one of the licenses + mentioned in (iv), you must comply with the terms of that license. If + you license the Adaptation under the terms of any of the licenses + mentioned in (i), (ii) or (iii) (the "Applicable License"), you must + comply with the terms of the Applicable License generally and the + following provisions: (I) You must include a copy of, or the URI for, + the Applicable License with every copy of each Adaptation You + Distribute or Publicly Perform; (II) You may not offer or impose any + terms on the Adaptation that restrict the terms of the Applicable + License or the ability of the recipient of the Adaptation to exercise + the rights granted to that recipient under the terms of the Applicable + License; (III) You must keep intact all notices that refer to the + Applicable License and to the disclaimer of warranties with every copy + of the Work as included in the Adaptation You Distribute or Publicly + Perform; (IV) when You Distribute or Publicly Perform the Adaptation, + You may not impose any effective technological measures on the + Adaptation that restrict the ability of a recipient of the Adaptation + from You to exercise the rights granted to that recipient under the + terms of the Applicable License. This Section 4(b) applies to the + Adaptation as incorporated in a Collection, but this does not require + the Collection apart from the Adaptation itself to be made subject to + the terms of the Applicable License. + c. If You Distribute, or Publicly Perform the Work or any Adaptations or + Collections, You must, unless a request has been made pursuant to + Section 4(a), keep intact all copyright notices for the Work and + provide, reasonable to the medium or means You are utilizing: (i) the + name of the Original Author (or pseudonym, if applicable) if supplied, + and/or if the Original Author and/or Licensor designate another party + or parties (e.g., a sponsor institute, publishing entity, journal) for + attribution ("Attribution Parties") in Licensor's copyright notice, + terms of service or by other reasonable means, the name of such party + or parties; (ii) the title of the Work if supplied; (iii) to the + extent reasonably practicable, the URI, if any, that Licensor + specifies to be associated with the Work, unless such URI does not + refer to the copyright notice or licensing information for the Work; + and (iv) , consistent with Ssection 3(b), in the case of an + Adaptation, a credit identifying the use of the Work in the Adaptation + (e.g., "French translation of the Work by Original Author," or + "Screenplay based on original Work by Original Author"). The credit + required by this Section 4(c) may be implemented in any reasonable + manner; provided, however, that in the case of a Adaptation or + Collection, at a minimum such credit will appear, if a credit for all + contributing authors of the Adaptation or Collection appears, then as + part of these credits and in a manner at least as prominent as the + credits for the other contributing authors. For the avoidance of + doubt, You may only use the credit required by this Section for the + purpose of attribution in the manner set out above and, by exercising + Your rights under this License, You may not implicitly or explicitly + assert or imply any connection with, sponsorship or endorsement by the + Original Author, Licensor and/or Attribution Parties, as appropriate, + of You or Your use of the Work, without the separate, express prior + written permission of the Original Author, Licensor and/or Attribution + Parties. + d. Except as otherwise agreed in writing by the Licensor or as may be + otherwise permitted by applicable law, if You Reproduce, Distribute or + Publicly Perform the Work either by itself or as part of any + Adaptations or Collections, You must not distort, mutilate, modify or + take other derogatory action in relation to the Work which would be + prejudicial to the Original Author's honor or reputation. Licensor + agrees that in those jurisdictions (e.g. Japan), in which any exercise + of the right granted in Section 3(b) of this License (the right to + make Adaptations) would be deemed to be a distortion, mutilation, + modification or other derogatory action prejudicial to the Original + Author's honor and reputation, the Licensor will waive or not assert, + as appropriate, this Section, to the fullest extent permitted by the + applicable national law, to enable You to reasonably exercise Your + right under Section 3(b) of this License (right to make Adaptations) + but not otherwise. + +5. Representations, Warranties and Disclaimer + +UNLESS OTHERWISE MUTUALLY AGREED TO BY THE PARTIES IN WRITING, LICENSOR +OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY +KIND CONCERNING THE WORK, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, +INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, +FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF +LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, +WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION +OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU. + +6. Limitation on Liability. EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE +LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR +ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES +ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS +BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + +7. Termination + + a. This License and the rights granted hereunder will terminate + automatically upon any breach by You of the terms of this License. + Individuals or entities who have received Adaptations or Collections + from You under this License, however, will not have their licenses + terminated provided such individuals or entities remain in full + compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will + survive any termination of this License. + b. Subject to the above terms and conditions, the license granted here is + perpetual (for the duration of the applicable copyright in the Work). + Notwithstanding the above, Licensor reserves the right to release the + Work under different license terms or to stop distributing the Work at + any time; provided, however that any such election will not serve to + withdraw this License (or any other license that has been, or is + required to be, granted under the terms of this License), and this + License will continue in full force and effect unless terminated as + stated above. + +8. Miscellaneous + + a. Each time You Distribute or Publicly Perform the Work or a Collection, + the Licensor offers to the recipient a license to the Work on the same + terms and conditions as the license granted to You under this License. + b. Each time You Distribute or Publicly Perform an Adaptation, Licensor + offers to the recipient a license to the original Work on the same + terms and conditions as the license granted to You under this License. + c. If any provision of this License is invalid or unenforceable under + applicable law, it shall not affect the validity or enforceability of + the remainder of the terms of this License, and without further action + by the parties to this agreement, such provision shall be reformed to + the minimum extent necessary to make such provision valid and + enforceable. + d. No term or provision of this License shall be deemed waived and no + breach consented to unless such waiver or consent shall be in writing + and signed by the party to be charged with such waiver or consent. + e. This License constitutes the entire agreement between the parties with + respect to the Work licensed here. There are no understandings, + agreements or representations with respect to the Work not specified + here. Licensor shall not be bound by any additional provisions that + may appear in any communication from You. This License may not be + modified without the mutual written agreement of the Licensor and You. + f. The rights granted under, and the subject matter referenced, in this + License were drafted utilizing the terminology of the Berne Convention + for the Protection of Literary and Artistic Works (as amended on + September 28, 1979), the Rome Convention of 1961, the WIPO Copyright + Treaty of 1996, the WIPO Performances and Phonograms Treaty of 1996 + and the Universal Copyright Convention (as revised on July 24, 1971). + These rights and subject matter take effect in the relevant + jurisdiction in which the License terms are sought to be enforced + according to the corresponding provisions of the implementation of + those treaty provisions in the applicable national law. If the + standard suite of rights granted under applicable copyright law + includes additional rights not granted under this License, such + additional rights are deemed to be included in the License; this + License is not intended to restrict the license of any rights under + applicable law. + + +Creative Commons Notice + + Creative Commons is not a party to this License, and makes no warranty + whatsoever in connection with the Work. Creative Commons will not be + liable to You or any party on any legal theory for any damages + whatsoever, including without limitation any general, special, + incidental or consequential damages arising in connection to this + license. Notwithstanding the foregoing two (2) sentences, if Creative + Commons has expressly identified itself as the Licensor hereunder, it + shall have all rights and obligations of Licensor. + + Except for the limited purpose of indicating to the public that the + Work is licensed under the CCPL, Creative Commons does not authorize + the use by either party of the trademark "Creative Commons" or any + related trademark or logo of Creative Commons without the prior + written consent of Creative Commons. Any permitted use will be in + compliance with Creative Commons' then-current trademark usage + guidelines, as may be published on its website or otherwise made + available upon request from time to time. For the avoidance of doubt, + this trademark restriction does not form part of the License. + + Creative Commons may be contacted at http://creativecommons.org/. diff --git a/mods/moretrees/README.md b/mods/moretrees/README.md new file mode 100644 index 0000000..8e5758b --- /dev/null +++ b/mods/moretrees/README.md @@ -0,0 +1,11 @@ +More trees! + +This mod adds a whole bunch of new types of trees to the game + +Much of the code here came from cisoun's conifers mod and bas080's +jungle trees mod, and big contributions by RealBadAngel. + +Brought together into one mod and made L-systems compatible by Vanessa +Ezekowitz. + +Dependencies: plants_lib and default diff --git a/mods/moretrees/biome_defs.lua b/mods/moretrees/biome_defs.lua new file mode 100644 index 0000000..8c50de7 --- /dev/null +++ b/mods/moretrees/biome_defs.lua @@ -0,0 +1,183 @@ + +moretrees.beech_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 8, + seed_diff = 2, + rarity = 50, + max_count = 20, +} + +moretrees.palm_biome = { + surface = "default:sand", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 5, + seed_diff = 330, + min_elevation = -1, + max_elevation = 1, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 10, + temp_min = 0.25, + temp_max = -0.15, + rarity = 50, + max_count = 10, +} + +moretrees.apple_tree_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 331, + min_elevation = 1, + max_elevation = 10, + temp_min = 0.1, + temp_max = -0.15, + rarity = 75, + max_count = 5, +} + +moretrees.oak_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 15, + seed_diff = 332, + min_elevation = 0, + max_elevation = 10, + temp_min = 0.4, + temp_max = 0.2, + rarity = 50, + max_count = 5, +} + +moretrees.sequoia_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 333, + min_elevation = 0, + max_elevation = 10, + temp_min = 1, + temp_max = -0.4, + rarity = 90, + max_count = 5, +} + +moretrees.birch_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 5, + seed_diff = 334, + min_elevation = 10, + max_elevation = 15, + temp_min = 0.9, + temp_max = 0.3, + rarity = 50, + max_count = 10, +} + +moretrees.willow_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 337, + min_elevation = -5, + max_elevation = 5, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 5, + rarity = 75, + max_count = 5, +} + +moretrees.acacia_biome = { + surface = { "default:dirt_with_grass", "default:desert_sand" }, + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 15, + seed_diff = 1, + rarity = 50, + max_count = 15, + plantlife_limit = -1, + humidity_min = 0.3, + humidity_max = 0, +} + +moretrees.rubber_tree_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 338, + min_elevation = -5, + max_elevation = 5, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 10, + temp_min = -0.15, + rarity = 75, + max_count = 10, +} + +moretrees.jungletree_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 5, + seed_diff = 329, + min_elevation = -5, + max_elevation = 10, + temp_min = 0.25, + near_nodes = {"default:water_source"}, + near_nodes_size = 20, + near_nodes_count = 7, + rarity = 10, + max_count = 10, +} + +moretrees.spruce_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 335, + min_elevation = 20, + temp_min = 0.9, + temp_max = 0.7, + rarity = 50, + max_count = 5, +} + +moretrees.pine_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 336, + near_nodes = {"default:water_source"}, + near_nodes_size = 15, + near_nodes_count = 5, + rarity = 50, + max_count = 10, +} + +moretrees.fir_biome = { + surface = "default:dirt_with_grass", + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 359, + min_elevation = 25, + temp_min = 0.9, + temp_max = 0.3, + rarity = 50, + max_count = 10, +} + +moretrees.fir_biome_snow = { + surface = {"snow:dirt_with_snow", "snow:snow"}, + below_nodes = {"default:dirt", "default:dirt_with_grass", "snow:dirt_with_snow"}, + avoid_nodes = moretrees.avoidnodes, + avoid_radius = 10, + seed_diff = 359, + rarity = 50, + max_count = 10, + check_air = false, + delete_above = true, + spawn_replace_node = true +} + diff --git a/mods/moretrees/crafts.lua b/mods/moretrees/crafts.lua new file mode 100644 index 0000000..515a097 --- /dev/null +++ b/mods/moretrees/crafts.lua @@ -0,0 +1,151 @@ +local S = moretrees.intllib + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + + minetest.register_craft({ + output = "moretrees:"..treename.."_trunk 2", + recipe = { + {"moretrees:"..treename.."_trunk_sideways"}, + {"moretrees:"..treename.."_trunk_sideways"} + } + }) + + minetest.register_craft({ + type = "shapeless", + output = "moretrees:"..treename.."_planks 4", + recipe = { + "moretrees:"..treename.."_trunk" + } + }) + + minetest.register_craft({ + type = "shapeless", + output = "moretrees:"..treename.."_planks 4", + recipe = { + "moretrees:"..treename.."_trunk_sideways" + } + }) + + minetest.register_craft({ + type = "fuel", + recipe = "moretrees:"..treename.."_sapling", + burntime = 10, + }) +end + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:rubber_tree_planks 4", + recipe = { + "moretrees:rubber_tree_trunk_empty" + } +}) + +minetest.register_craft({ + type = "fuel", + recipe = "group:moretrees_leaves", + burntime = 1, +}) + +-- Food recipes! + +minetest.register_craftitem("moretrees:coconut_milk", { + description = S("Coconut Milk"), + inventory_image = "moretrees_coconut_milk_inv.png", + wield_image = "moretrees_coconut_milk.png", + on_use = minetest.item_eat(2), +}) + +minetest.register_craftitem("moretrees:raw_coconut", { + description = S("Raw Coconut"), + inventory_image = "moretrees_raw_coconut.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:acorn_muffin_batter", { + description = S("Acorn Muffin batter"), + inventory_image = "moretrees_acorn_muffin_batter.png", +}) + +minetest.register_craftitem("moretrees:acorn_muffin", { + description = S("Acorn Muffin"), + inventory_image = "moretrees_acorn_muffin.png", + on_use = minetest.item_eat(4), +}) + +minetest.register_craftitem("moretrees:spruce_nuts", { + description = S("Roasted Spruce Cone Nuts"), + inventory_image = "moretrees_spruce_nuts.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:pine_nuts", { + description = S("Roasted Pine Cone Nuts"), + inventory_image = "moretrees_pine_nuts.png", + on_use = minetest.item_eat(1), +}) + +minetest.register_craftitem("moretrees:fir_nuts", { + description = S("Roasted Fir Cone Nuts"), + inventory_image = "moretrees_fir_nuts.png", + on_use = minetest.item_eat(1), +}) + +for i in ipairs(moretrees.cutting_tools) do + local tool = moretrees.cutting_tools[i] + minetest.register_craft({ + type = "shapeless", + output = "moretrees:coconut_milk", + recipe = { + "moretrees:coconut", + "vessels:drinking_glass", + tool + }, + replacements = { + { "moretrees:coconut", "moretrees:raw_coconut" }, + { tool, tool } + } + }) +end + +minetest.register_craft({ + type = "shapeless", + output = "moretrees:acorn_muffin_batter", + recipe = { + "moretrees:acorn", + "moretrees:acorn", + "moretrees:acorn", + "moretrees:acorn", + "moretrees:coconut_milk", + }, + replacements = { + { "moretrees:coconut_milk", "vessels:drinking_glass" } + } +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:acorn_muffin 4", + recipe = "moretrees:acorn_muffin_batter", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:spruce_nuts 4", + recipe = "moretrees:spruce_cone", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:pine_nuts 4", + recipe = "moretrees:pine_cone", +}) + +minetest.register_craft({ + type = "cooking", + output = "moretrees:fir_nuts 4", + recipe = "moretrees:fir_cone", +}) + + diff --git a/mods/moretrees/default_settings.txt b/mods/moretrees/default_settings.txt new file mode 100644 index 0000000..5c69324 --- /dev/null +++ b/mods/moretrees/default_settings.txt @@ -0,0 +1,87 @@ +-- Global configuration variables + +-- Enable the various kinds of trees. + +moretrees.enable_apple_tree = true +moretrees.enable_oak = true +moretrees.enable_sequoia = true +moretrees.enable_palm = true +moretrees.enable_pine = true +moretrees.enable_rubber_tree = true +moretrees.enable_willow = true +moretrees.enable_acacia = true +moretrees.enable_birch = true +moretrees.enable_spruce = true +moretrees.enable_jungle_tree = true +moretrees.enable_fir = true +moretrees.enable_beech = false + +-- set this to true to make moretrees spawn saplings at mapgen time instead +-- of fully-grown trees, which will grow into full trees very quickly. With +-- older versions of plants_lib, doing this will reduce mapgen lag. + +moretrees.spawn_saplings = false + +-- Set this to true to allow usage of the stairsplus mod in moreblocks + +moretrees.enable_stairsplus = true + +-- Set this to true if you want the plantlike drawtype for leaves, which +-- improves some peoples' framerates without resorting to making leaf nodes opaque. +-- Affects default leaves and default jungle leaves also. + +moretrees.plantlike_leaves = false + +-- Set this to true to enable leaf decay of all trees except the default ones. + +moretrees.enable_leafdecay = true + +-- Enable this one if you want this mod's leafdecay code to affect the old +-- default trees too; this setting is independent of the one above. You'll +-- want to manually disable the default leafdecay code in minetest_game if +-- you enable this, otherwise you'll have two sets of leaf decay code running +-- at the same time, which will just waste CPU for no benefit. + +moretrees.enable_default_leafdecay = true + +-- Enable this one for default *jungle* leaves + +moretrees.enable_default_jungle_leafdecay = true + +-- Enable this if you want moretrees to redefine default apples so that they +-- fall when leaves decay/are dug. + +moretrees.enable_redefine_apple = true + +-- various settings to configure default and default-jungle leaf decay. + +moretrees.leafdecay_delay = 2 +moretrees.leafdecay_chance = 100 +moretrees.leafdecay_radius = 5 + +moretrees.default_jungle_leafdecay_delay = 2 +moretrees.default_jungle_leafdecay_chance = 100 +moretrees.default_jungle_leafdecay_radius = 5 + +moretrees.palm_leafdecay_radius = 15 + +moretrees.default_leafdecay_delay = 3 +moretrees.default_leafdecay_chance = 50 +moretrees.default_leafdecay_radius = 4 + +-- Change these settings if you want default trees to be gradually cut down +-- above the elevation where firs normally generate. + +moretrees.firs_remove_default_trees = false +moretrees.firs_remove_interval = 2 +moretrees.firs_remove_chance = 150 + +-- Sapling settings + +moretrees.sapling_interval = 500 +moretrees.sapling_chance = 20 + +-- If this variable is set to true, drop leaves out as entities during leaf +-- decay, rather than just disappearing them. + +moretrees.decay_leaves_as_items = false diff --git a/mods/moretrees/depends.txt b/mods/moretrees/depends.txt new file mode 100644 index 0000000..1cd5974 --- /dev/null +++ b/mods/moretrees/depends.txt @@ -0,0 +1,5 @@ +default +plants_lib +moreblocks? +intllib? + diff --git a/mods/moretrees/init.lua b/mods/moretrees/init.lua new file mode 100644 index 0000000..9c36883 --- /dev/null +++ b/mods/moretrees/init.lua @@ -0,0 +1,304 @@ +-- More trees! 2013-04-07 +-- +-- This mod adds more types of trees to the game +-- +-- Some of the node definitions and textures came from cisoun's conifers mod +-- and bas080's jungle trees mod. +-- +-- Brought together into one mod and made L-systems compatible by Vanessa +-- Ezekowitz. +-- +-- Firs and Jungle tree axioms/rules by Vanessa Ezekowitz, with the +-- latter having been tweaked by RealBadAngel, most other axioms/rules written +-- by RealBadAngel. +-- +-- License: WTFPL for all parts (code and textures, including those copied +-- from the jungletree and conifers mods) except the default jungle tree trunk +-- texture, which is CC-By-SA. + +moretrees = {} + +-- Read the default config file (and if necessary, copy it to the world folder). + +local worldpath=minetest.get_worldpath() +local modpath=minetest.get_modpath("moretrees") + +dofile(modpath.."/default_settings.txt") + +if io.open(worldpath.."/moretrees_settings.txt","r") == nil then + + io.input(modpath.."/default_settings.txt") + io.output(worldpath.."/moretrees_settings.txt") + + local size = 2^13 -- good buffer size (8K) + while true do + local block = io.read(size) + if not block then + io.close() + break + end + io.write(block) + end +else + dofile(worldpath.."/moretrees_settings.txt") +end + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if minetest.get_modpath("intllib") then + S = intllib.Getter() +else + S = function(s) return s end +end +moretrees.intllib = S + +-- infinite stacks checking + +if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then + moretrees.expect_infinite_stacks = false +else + moretrees.expect_infinite_stacks = true +end + +-- tables, load other files + +moretrees.cutting_tools = { + "default:axe_bronze", + "default:axe_diamond", + "default:axe_mese", + "default:axe_steel", + "glooptest:axe_alatro", + "glooptest:axe_arol", + "moreores:axe_mithril", + "moreores:axe_silver", + "titanium:axe", +} + +dofile(modpath.."/tree_models.lua") +dofile(modpath.."/node_defs.lua") +dofile(modpath.."/biome_defs.lua") +dofile(modpath.."/saplings.lua") +dofile(modpath.."/crafts.lua") +dofile(modpath.."/leafdecay.lua") + +-- tree spawning setup + +if moretrees.spawn_saplings then + moretrees.spawn_beech_object = "moretrees:beech_sapling_ongen" + moretrees.spawn_apple_tree_object = "moretrees:apple_tree_sapling_ongen" + moretrees.spawn_oak_object = "moretrees:oak_sapling_ongen" + moretrees.spawn_sequoia_object = "moretrees:sequoia_sapling_ongen" + moretrees.spawn_palm_object = "moretrees:palm_sapling_ongen" + moretrees.spawn_pine_object = "moretrees:pine_sapling_ongen" + moretrees.spawn_rubber_tree_object = "moretrees:rubber_tree_sapling_ongen" + moretrees.spawn_willow_object = "moretrees:willow_sapling_ongen" + moretrees.spawn_acacia_object = "moretrees:acacia_sapling_ongen" + moretrees.spawn_birch_object = "moretrees:birch_sapling_ongen" + moretrees.spawn_spruce_object = "moretrees:spruce_sapling_ongen" + moretrees.spawn_jungletree_object = "moretrees:jungletree_sapling_ongen" + moretrees.spawn_fir_object = "moretrees:fir_sapling_ongen" + moretrees.spawn_fir_snow_object = "snow:sapling_pine" +else + moretrees.spawn_beech_object = moretrees.beech_model + moretrees.spawn_apple_tree_object = moretrees.apple_tree_model + moretrees.spawn_oak_object = moretrees.oak_model + moretrees.spawn_sequoia_object = moretrees.sequoia_model + moretrees.spawn_palm_object = moretrees.palm_model + moretrees.spawn_pine_object = moretrees.pine_model + moretrees.spawn_rubber_tree_object = moretrees.rubber_tree_model + moretrees.spawn_willow_object = moretrees.willow_model + moretrees.spawn_acacia_object = moretrees.acacia_model + moretrees.spawn_birch_object = "moretrees:grow_birch" + moretrees.spawn_spruce_object = "moretrees:grow_spruce" + moretrees.spawn_jungletree_object = "moretrees:grow_jungletree" + moretrees.spawn_fir_object = "moretrees:grow_fir" + moretrees.spawn_fir_snow_object = "moretrees:grow_fir_snow" +end + + +if moretrees.enable_beech then + plantslib:register_generate_plant(moretrees.beech_biome, moretrees.spawn_beech_object) +end + +if moretrees.enable_apple_tree then + plantslib:register_generate_plant(moretrees.apple_tree_biome, moretrees.spawn_apple_tree_object) +end + +if moretrees.enable_oak then + plantslib:register_generate_plant(moretrees.oak_biome, moretrees.spawn_oak_object) +end + +if moretrees.enable_sequoia then + plantslib:register_generate_plant(moretrees.sequoia_biome, moretrees.spawn_sequoia_object) +end + +if moretrees.enable_palm then + plantslib:register_generate_plant(moretrees.palm_biome, moretrees.spawn_palm_object) +end + +if moretrees.enable_pine then + plantslib:register_generate_plant(moretrees.pine_biome, moretrees.spawn_pine_object) +end + +if moretrees.enable_rubber_tree then + plantslib:register_generate_plant(moretrees.rubber_tree_biome, moretrees.spawn_rubber_tree_object) +end + +if moretrees.enable_willow then + plantslib:register_generate_plant(moretrees.willow_biome, moretrees.spawn_willow_object) +end + +if moretrees.enable_acacia then + plantslib:register_generate_plant(moretrees.acacia_biome, moretrees.spawn_acacia_object) +end + +if moretrees.enable_birch then + plantslib:register_generate_plant(moretrees.birch_biome, moretrees.spawn_birch_object) +end + +if moretrees.enable_spruce then + plantslib:register_generate_plant(moretrees.spruce_biome, moretrees.spawn_spruce_object) +end + +if moretrees.enable_jungle_tree then + plantslib:register_generate_plant(moretrees.jungletree_biome, moretrees.spawn_jungletree_object) +end + +if moretrees.enable_fir then + plantslib:register_generate_plant(moretrees.fir_biome, moretrees.spawn_fir_object) + if minetest.get_modpath("snow") then + plantslib:register_generate_plant(moretrees.fir_biome_snow, moretrees.spawn_fir_snow_object) + end +end + +-- Code to spawn a birch tree + +function moretrees:grow_birch(pos) + minetest.remove_node(pos) + if math.random(1,2) == 1 then + minetest.spawn_tree(pos, moretrees.birch_model1) + else + minetest.spawn_tree(pos, moretrees.birch_model2) + end +end + +-- Code to spawn a spruce tree + +function moretrees:grow_spruce(pos) + minetest.remove_node(pos) + if math.random(1,2) == 1 then + minetest.spawn_tree(pos, moretrees.spruce_model1) + else + minetest.spawn_tree(pos, moretrees.spruce_model2) + end +end + +-- Code to spawn jungle trees + +moretrees.jt_axiom1 = "FFFA" +moretrees.jt_rules_a1 = "FFF[&&-FBf[&&&Ff]^^^Ff][&&+FBFf[&&&FFf]^^^Ff][&&---FBFf[&&&Ff]^^^Ff][&&+++FBFf[&&&Ff]^^^Ff]F/A" +moretrees.jt_rules_b1 = "[-Ff&f][+Ff&f]B" + +moretrees.jt_axiom2 = "FFFFFA" +moretrees.jt_rules_a2 = "FFFFF[&&-FFFBF[&&&FFff]^^^FFf][&&+FFFBFF[&&&FFff]^^^FFf][&&---FFFBFF[&&&FFff]^^^FFf][&&+++FFFBFF[&&&FFff]^^^FFf]FF/A" +moretrees.jt_rules_b2 = "[-FFf&ff][+FFf&ff]B" + +moretrees.ct_rules_a1 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" +moretrees.ct_rules_b1 = "[-FBf][+FBf]" + +moretrees.ct_rules_a2 = "FF[FF][&&-FBF][&&+FBF][&&---FBF][&&+++FBF]F/A" +moretrees.ct_rules_b2 = "[-fB][+fB]" + +function moretrees:grow_jungletree(pos) + local r1 = math.random(2) + local r2 = math.random(3) + if r1 == 1 then + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_red" + else + moretrees.jungletree_model.leaves2 = "moretrees:jungletree_leaves_yellow" + end + moretrees.jungletree_model.leaves2_chance = math.random(25, 75) + + if r2 == 1 then + moretrees.jungletree_model.trunk_type = "single" + moretrees.jungletree_model.iterations = 2 + moretrees.jungletree_model.axiom = moretrees.jt_axiom1 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a1 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b1 + elseif r2 == 2 then + moretrees.jungletree_model.trunk_type = "double" + moretrees.jungletree_model.iterations = 4 + moretrees.jungletree_model.axiom = moretrees.jt_axiom2 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 + elseif r2 == 3 then + moretrees.jungletree_model.trunk_type = "crossed" + moretrees.jungletree_model.iterations = 4 + moretrees.jungletree_model.axiom = moretrees.jt_axiom2 + moretrees.jungletree_model.rules_a = moretrees.jt_rules_a2 + moretrees.jungletree_model.rules_b = moretrees.jt_rules_b2 + end + + minetest.remove_node(pos) + local leaves = minetest.find_nodes_in_area({x = pos.x-1, y = pos.y, z = pos.z-1}, {x = pos.x+1, y = pos.y+10, z = pos.z+1}, "default:leaves") + for leaf in ipairs(leaves) do + minetest.remove_node(leaves[leaf]) + end + minetest.spawn_tree(pos, moretrees.jungletree_model) +end + +-- code to spawn fir trees + +function moretrees:grow_fir(pos) + if math.random(2) == 1 then + moretrees.fir_model.leaves="moretrees:fir_leaves" + else + moretrees.fir_model.leaves="moretrees:fir_leaves_bright" + end + if math.random(2) == 1 then + moretrees.fir_model.rules_a = moretrees.ct_rules_a1 + moretrees.fir_model.rules_b = moretrees.ct_rules_b1 + else + moretrees.fir_model.rules_a = moretrees.ct_rules_a2 + moretrees.fir_model.rules_b = moretrees.ct_rules_b2 + end + + moretrees.fir_model.iterations = 7 + moretrees.fir_model.random_level = 5 + + minetest.remove_node(pos) + local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") + for leaf in ipairs(leaves) do + minetest.remove_node(leaves[leaf]) + end + minetest.spawn_tree(pos,moretrees.fir_model) +end + +-- same thing, but a smaller version that grows only in snow biomes + +function moretrees:grow_fir_snow(pos) + if math.random(2) == 1 then + moretrees.fir_model.leaves="moretrees:fir_leaves" + else + moretrees.fir_model.leaves="moretrees:fir_leaves_bright" + end + if math.random(2) == 1 then + moretrees.fir_model.rules_a = moretrees.ct_rules_a1 + moretrees.fir_model.rules_b = moretrees.ct_rules_b1 + else + moretrees.fir_model.rules_a = moretrees.ct_rules_a2 + moretrees.fir_model.rules_b = moretrees.ct_rules_b2 + end + + moretrees.fir_model.iterations = 2 + moretrees.fir_model.random_level = 2 + + minetest.remove_node(pos) + local leaves = minetest.find_nodes_in_area({x = pos.x, y = pos.y, z = pos.z}, {x = pos.x, y = pos.y+5, z = pos.z}, "default:leaves") + for leaf in ipairs(leaves) do + minetest.remove_node(leaves[leaf]) + end + minetest.spawn_tree(pos,moretrees.fir_model) +end + +print(S("[Moretrees] Loaded (2013-02-11)")) diff --git a/mods/moretrees/leafdecay.lua b/mods/moretrees/leafdecay.lua new file mode 100644 index 0000000..04ee711 --- /dev/null +++ b/mods/moretrees/leafdecay.lua @@ -0,0 +1,117 @@ +-- leaf decay + +-- this function is based on the default leafdecay code +local process_drops = function(pos, name) + local drops = minetest.get_node_drops(name) + for _,dropitem in ipairs(drops) do + if dropitem ~= name + or (string.find(name, "leaves") and moretrees.decay_leaves_as_items) then + local newpos = { + x=pos.x + math.random() - 0.5, + y=pos.y + math.random() - 0.5, + z=pos.z + math.random() - 0.5 + } + minetest.add_item(newpos, dropitem) + end + end +end + +if moretrees.enable_leafdecay then + for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + if treename ~= "jungletree" and treename ~= "fir" and treename ~= "palm" then + minetest.register_abm({ + nodenames = "moretrees:"..treename.."_leaves", + interval = moretrees.leafdecay_delay, + chance = moretrees.leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:"..treename.."_trunk" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) + end + }) + end + end + + minetest.register_abm({ + nodenames = {"moretrees:jungletree_leaves_red","moretrees:jungletree_leaves_green","moretrees:jungletree_leaves_yellow"}, + interval = moretrees.leafdecay_delay, + chance = moretrees.leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.leafdecay_radius, {"ignore", "default:jungletree", "moretrees:jungletree_trunk"}) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) + end + }) + + minetest.register_abm({ + nodenames = {"moretrees:fir_leaves", "moretrees:fir_leaves_bright"}, + interval = moretrees.leafdecay_delay, + chance = moretrees.leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:fir_trunk" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) + end + }) + + minetest.register_abm({ + nodenames = "moretrees:palm_leaves", + interval = moretrees.leafdecay_delay, + chance = moretrees.leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.palm_leafdecay_radius, { "ignore", "moretrees:palm_trunk" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) + end + }) +end + +if moretrees.enable_default_leafdecay then + + minetest.register_abm({ + nodenames = "default:leaves", + interval = moretrees.default_leafdecay_delay, + chance = moretrees.default_leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.default_leafdecay_radius, { "ignore", "default:tree" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) + end + }) +end + +-- Decay apple tree blossoms from nature_classic mod +if minetest.get_modpath("nature_classic") then + minetest.register_abm({ + nodenames = "moretrees:apple_blossoms", + interval = moretrees.default_leafdecay_delay, + chance = moretrees.default_leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.leafdecay_radius, { "ignore", "moretrees:apple_tree_trunk" }) then return end + process_drops(pos, "moretrees:apple_tree_leaves") + minetest.remove_node(pos) + nodeupdate(pos) + end + }) +end + +if moretrees.enable_default_jungle_leafdecay then + minetest.register_abm({ + nodenames = "default:jungleleaves", + interval = moretrees.default_jungle_leafdecay_delay, + chance = moretrees.default_jungle_leafdecay_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + if minetest.find_node_near(pos, moretrees.default_jungle_leafdecay_radius, { "ignore", "default:jungletree" }) then return end + process_drops(pos, node.name) + minetest.remove_node(pos) + nodeupdate(pos) + end + }) +end + diff --git a/mods/moretrees/locale/de.txt b/mods/moretrees/locale/de.txt new file mode 100644 index 0000000..b01b1db --- /dev/null +++ b/mods/moretrees/locale/de.txt @@ -0,0 +1,74 @@ +# Translation by Xanthin + +### crafts.lua ### +Coconut Milk = Kokosnussmilch +Raw Coconut = Kokosnussfleisch +Acorn Muffin batter = Eichelmuffinteig +Acorn Muffin = Eichelmuffin +Roasted Spruce Cone Nuts = Geroestete Fichtenzapfen +Roasted Pine Cone Nuts = Geroestete Kiefernzapfen +Roasted Fir Cone Nuts = Geroestete Tannenzapfen + +### node_defs.lua ### +Beech Tree Trunk = Buchenstamm +Apple Tree Trunk = Apfelbaumstamm +Oak Tree Trunk = Eichenstamm +Giant Sequoia Trunk = Riesenmammutbaumstamm +Birch Tree Trunk = Birkenstamm +Palm Tree Trunk = Palmenstamm +Spruce Tree Trunk = Fichtenstamm +Pine Tree Trunk = Kiefernstamm +Willow Tree Trunk = Weidenstamm +Rubber Tree Trunk = Gummibaumstamm +Jungle Tree Trunk = Tropenbaumstamm +Douglas Fir Trunk = Douglasienstamm +Beech Tree Planks = Buchebretter +Apple Tree Planks = Apfelbaumbretter +Oak Tree Planks = Eichenbretter +Giant Sequoia Planks = Riesenmammutbaumbretter +Birch Tree Planks = Birkebretter +Palm Tree Planks = Palmenbretter +Spruce Tree Planks = Fichtenbretter +Pine Tree Planks = Kiefernbretter +Willow Tree Planks = Weidenbretter +Rubber Tree Planks = Gummibaumbretter +Jungle Tree Planks = Tropenholzbretter +Douglas Fir Planks = Douglasienbretter +Beech Tree Sapling = Buchesetzling +Apple Tree Sapling = Apfelbaumsetzling +Oak Tree Sapling = Eichensetzling +Giant Sequoia Sapling = Riesenmammutbaumsetzling +Birch Tree Sapling = Birkensetzling +Palm Tree Sapling = Palmensetzling +Spruce Tree Sapling = Fichtensetzling +Pine Tree Sapling = Kiefernsetzling +Willow Tree Sapling = Weidensetzling +Rubber Tree Sapling = Gummibaumsetzling +Jungle Tree Sapling = Tropenbaumsetzling +Douglas Fir Sapling = Douglasiensetzling +Beech Tree Leaves = Buchenlaub +Apple Tree Leaves = Apfelbaumlaub +Oak Tree Leaves = Eichenlaub +Giant Sequoia Leaves = Riesenmammutbaumlaub +Birch Tree Leaves = Birkenlaub +Palm Tree Leaves = Palmenlaub +Spruce Tree Leaves = Fichtennadeln +Pine Tree Leaves = Kiefernnadeln +Willow Tree Leaves = Weidenlaub +Rubber Tree Leaves = Gummibaumlaub +Jungle Tree Leaves = Tropenbaumlaub +Douglas Fir Leaves = Douglasiennadeln + +Acorn = Eichel +Coconut = Kokosnuss +Spruce Cone = Fichtenzapfen +Pine Cone = Kiefernzapfen +Fir Cone = Tannenzapfen +Jungle Sapling = Tropenbaumsetzling +Jungle Tree Leaves (Green) = Tropenbaumlaub (gruen) +Jungle Tree Leaves (Yellow) = Tropenbaumlaub (gelb) +Jungle Tree Leaves (Red) = Tropenbaumlaub (rot) +Douglas Fir Leaves (Bright) = Douglasiennadeln (breit) +Rubber Tree Trunk (Empty) = Gummibaumstamm (leer) + +[Moretrees] Loaded (2013-02-11) = [Moretrees] geladen (2013-02-11) diff --git a/mods/moretrees/locale/template.txt b/mods/moretrees/locale/template.txt new file mode 100644 index 0000000..5f4bc32 --- /dev/null +++ b/mods/moretrees/locale/template.txt @@ -0,0 +1,74 @@ +# Template + +### crafts.lua ### +Coconut Milk = +Raw Coconut = +Acorn Muffin batter = +Acorn Muffin = +Roasted Spruce Cone Nuts = +Roasted Pine Cone Nuts = +Roasted Fir Cone Nuts = + +### node_defs.lua ### +Beech Tree Trunk = +Apple Tree Trunk = +Oak Tree Trunk = +Giant Sequoia Trunk = +Birch Tree Trunk = +Palm Tree Trunk = +Spruce Tree Trunk = +Pine Tree Trunk = +Willow Tree Trunk = +Rubber Tree Trunk = +Jungle Tree Trunk = +Douglas Fir Trunk = +Beech Tree Planks = +Apple Tree Planks = +Oak Tree Planks = +Giant Sequoia Planks = +Birch Tree Planks = +Palm Tree Planks = +Spruce Tree Planks = +Pine Tree Planks = +Willow Tree Planks = +Rubber Tree Planks = +Jungle Tree Planks = +Douglas Fir Planks = +Beech Tree Sapling = +Apple Tree Sapling = +Oak Tree Sapling = +Giant Sequoia Sapling = +Birch Tree Sapling = +Palm Tree Sapling = +Spruce Tree Sapling = +Pine Tree Sapling = +Willow Tree Sapling = +Rubber Tree Sapling = +Jungle Tree Sapling = +Douglas Fir Sapling = +Beech Tree Leaves = +Apple Tree Leaves = +Oak Tree Leaves = +Giant Sequoia Leaves = +Birch Tree Leaves = +Palm Tree Leaves = +Spruce Tree Leaves = +Pine Tree Leaves = +Willow Tree Leaves = +Rubber Tree Leaves = +Jungle Tree Leaves = +Douglas Fir Leaves = + +Acorn = +Coconut = +Spruce Cone = +Pine Cone = +Fir Cone = +Jungle Sapling = +Jungle Tree Leaves (Green) = +Jungle Tree Leaves (Yellow) = +Jungle Tree Leaves (Red) = +Douglas Fir Leaves (Bright) = +Rubber Tree Trunk (Empty) = + +[Moretrees] Loaded (2013-02-11) = diff --git a/mods/moretrees/node_defs.lua b/mods/moretrees/node_defs.lua new file mode 100644 index 0000000..c5ad566 --- /dev/null +++ b/mods/moretrees/node_defs.lua @@ -0,0 +1,427 @@ +local S = moretrees.intllib + +moretrees.avoidnodes = {} + +moretrees.treelist = { + {"beech", "Beech Tree"}, + {"apple_tree", "Apple Tree"}, + {"oak", "Oak Tree", "acorn", "Acorn", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"sequoia", "Giant Sequoia"}, + {"birch", "Birch Tree"}, + {"palm", "Palm Tree", "coconut", "Coconut", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 1.0 }, + {"spruce", "Spruce Tree", "spruce_cone", "Spruce Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"pine", "Pine Tree", "pine_cone", "Pine Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, + {"willow", "Willow Tree"}, + {"acacia", "Acacia Tree"}, + {"rubber_tree", "Rubber Tree"}, + {"jungletree", "Jungle Tree"}, + {"fir", "Douglas Fir", "fir_cone", "Fir Cone", {-0.2, -0.5, -0.2, 0.2, 0, 0.2}, 0.8 }, +} + +local dirs1 = { 21, 20, 23, 22, 21 } +local dirs2 = { 12, 9, 18, 7, 12 } +local dirs3 = { 14, 11, 16, 5, 14 } + +local moretrees_new_leaves_drawtype = "allfaces_optional" +local moretrees_plantlike_leaves_visual_scale = 1 + +if moretrees.plantlike_leaves then + moretrees_new_leaves_drawtype = "plantlike" + moretrees_plantlike_leaves_visual_scale = 1.189 +end + +-- redefine default leaves to handle plantlike and/or leaf decay options + +if moretrees.enable_default_leafdecay then + minetest.override_item("default:leaves", { + groups = { snappy = 3, flammable = 2, leaves = 1 } + }) +end +if moretrees.plantlike_leaves then + minetest.override_item("default:leaves", { + inventory_image = minetest.inventorycube("default_leaves.png"), + drawtype = "plantlike", + visual_scale = 1.189 + }) +else + minetest.override_item("default:leaves", { + waving = 1 + }) +end + +-- redefine default jungle leaves for same + +if moretrees.enable_default_leafdecay then + minetest.override_item("default:jungleleaves", { + groups = { snappy = 3, flammable = 2, leaves = 1 } + }) +end +if moretrees.plantlike_leaves then + minetest.override_item("default:jungleleaves", { + inventory_image = minetest.inventorycube("default_jungleleaves.png"), + drawtype = "plantlike", + visual_scale = 1.189 + }) +else + minetest.override_item("default:jungleleaves", { + waving = 1 + }) +end + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + local treedesc = moretrees.treelist[i][2] + local fruit = moretrees.treelist[i][3] + local fruitdesc = moretrees.treelist[i][4] + local selbox = moretrees.treelist[i][5] + local vscale = moretrees.treelist[i][6] + + if treename ~= "jungletree" then -- the default game provides jungle tree trunk/planks nodes. + + minetest.register_node("moretrees:"..treename.."_trunk", { + description = S(treedesc.." Trunk"), + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + paramtype2 = "facedir", + is_ground_content = true, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + on_place = minetest.rotate_node, + }) + + minetest.register_node("moretrees:"..treename.."_planks", { + description = S(treedesc.." Planks"), + tiles = {"moretrees_"..treename.."_wood.png"}, + is_ground_content = true, + groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, + sounds = default.node_sound_wood_defaults(), + }) + + minetest.register_node("moretrees:"..treename.."_sapling", { + description = S(treedesc.." Sapling"), + drawtype = "plantlike", + tiles = {"moretrees_"..treename.."_sapling.png"}, + inventory_image = "moretrees_"..treename.."_sapling.png", + paramtype = "light", + paramtype2 = "waving", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_defaults(), + }) + + minetest.register_node("moretrees:"..treename.."_sapling_ongen", { + description = S(treedesc.." Sapling"), + drawtype = "plantlike", + tiles = {"moretrees_"..treename.."_sapling.png"}, + inventory_image = "moretrees_"..treename.."_sapling.png", + paramtype = "light", + paramtype2 = "waving", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,not_in_creative_inventory=1,sapling=1}, + sounds = default.node_sound_defaults(), + drop = "moretrees:"..treename.."_sapling" + }) + + -- player will get a sapling with 1/100 chance + -- player will get leaves only if he/she gets no saplings, + -- this is because max_items is 1 + + + local droprarity = 100 + + if treename == "palm" then + droprarity = 20 + end + + local moretrees_leaves_inventory_image = nil + local moretrees_new_leaves_waving = nil + + if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_"..treename.."_leaves.png") + else + moretrees_new_leaves_waving = 1 + end + + minetest.register_node("moretrees:"..treename.."_leaves", { + description = S(treedesc.." Leaves"), + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + tiles = { "moretrees_"..treename.."_leaves.png" }, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1}, + sounds = default.node_sound_leaves_defaults(), + + drop = { + max_items = 1, + items = { + {items = {"moretrees:"..treename.."_sapling"}, rarity = droprarity }, + {items = {"moretrees:"..treename.."_leaves"} } + } + }, + }) + + if minetest.get_modpath("moreblocks") and moretrees.enable_stairsplus then + +-- stairsplus:register_all(modname, subname, recipeitem, {fields}) + + stairsplus:register_all( + "moretrees", + treename.."_trunk", + "moretrees:"..treename.."_trunk", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=1, flammable=2, not_in_creative_inventory=1 }, + tiles = { + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk_top.png", + "moretrees_"..treename.."_trunk.png" + }, + description = S(treedesc.." Trunk"), + drop = treename.."_trunk", + } + ) + + stairsplus:register_all( + "moretrees", + treename.."_planks", + "moretrees:"..treename.."_planks", + { + groups = { snappy=1, choppy=2, oddly_breakable_by_hand=2, flammable=3, not_in_creative_inventory=1 }, + tiles = { "moretrees_"..treename.."_wood.png" }, + description = S(treedesc.." Planks"), + drop = treename.."_planks", + } + ) + end + end + + if fruit then + minetest.register_node("moretrees:"..fruit, { + description = S(fruitdesc), + drawtype = "plantlike", + tiles = { "moretrees_"..fruit..".png" }, + inventory_image = "moretrees_"..fruit..".png^[transformR180", + wield_image = "moretrees_"..fruit..".png^[transformR180", + visual_scale = vscale, + paramtype = "light", + sunlight_propagates = true, + walkable = false, + selection_box = { + type = "fixed", + fixed = selbox + }, + groups = {fleshy=3,dig_immediate=3,flammable=2, attached_node=1}, + sounds = default.node_sound_defaults(), + }) + end + + minetest.register_abm({ + nodenames = { "moretrees:"..treename.."_trunk_sideways" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "moretrees:"..treename.."_trunk", param2 = nfdir}) + end, + }) + + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_trunk") + + if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling") + table.insert(moretrees.avoidnodes, "moretrees:"..treename.."_sapling_ongen") + end +end + +-- Extra nodes for jungle trees: + +minetest.register_node("moretrees:jungletree_sapling", { + description = S("Jungle Sapling"), + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + paramtype2 = "waving", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), +}) + +minetest.register_node("moretrees:jungletree_sapling_ongen", { + description = S("Jungle Sapling"), + drawtype = "plantlike", + visual_scale = 1.0, + tiles = {"default_junglesapling.png"}, + inventory_image = "default_junglesapling.png", + wield_image = "default_junglesapling.png", + paramtype = "light", + paramtype2 = "waving", + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.3, -0.5, -0.3, 0.3, 0.35, 0.3} + }, + groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1,not_in_creative_inventory=1,sapling=1}, + sounds = default.node_sound_leaves_defaults(), + drop = "moretrees:jungletree_sapling" +}) + +local jungleleaves = {"green","yellow","red"} +local jungleleavesnames = {"Green", "Yellow", "Red"} +for color = 1, 3 do + local leave_name = "moretrees:jungletree_leaves_"..jungleleaves[color] + + local moretrees_leaves_inventory_image = nil + + if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_jungletree_leaves_"..jungleleaves[color]..".png") + else + moretrees_new_leaves_waving = 1 + end + + minetest.register_node(leave_name, { + description = S("Jungle Tree Leaves ("..jungleleavesnames[color]..")"), + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + tiles = {"moretrees_jungletree_leaves_"..jungleleaves[color]..".png"}, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1}, + drop = { + max_items = 1, + items = { + {items = {'moretrees:jungletree_sapling'}, rarity = 100 }, + {items = {"moretrees:jungletree_leaves_"..jungleleaves[color]} } + } + }, + sounds = default.node_sound_leaves_defaults(), + }) +end + +-- Extra needles for firs + +local moretrees_leaves_inventory_image = nil + +if moretrees.plantlike_leaves then + moretrees_leaves_inventory_image = minetest.inventorycube("moretrees_fir_leaves_bright.png") +end + +minetest.register_node("moretrees:fir_leaves_bright", { + drawtype = moretrees_new_leaves_drawtype, + waving = moretrees_new_leaves_waving, + visual_scale = moretrees_plantlike_leaves_visual_scale, + description = S("Douglas Fir Leaves (Bright)"), + tiles = { "moretrees_fir_leaves_bright.png" }, + inventory_image = moretrees_leaves_inventory_image, + paramtype = "light", + groups = {snappy=3, flammable=2, leaves=1, moretrees_leaves=1 }, + drop = { + max_items = 1, + items = { + {items = {'moretrees:fir_sapling'}, rarity = 100 }, + {items = {'moretrees:fir_leaves_bright'} } + } + }, + sounds = default.node_sound_leaves_defaults() +}) + +if moretrees.enable_redefine_apple then + minetest.override_item("default:apple", + {groups = { fleshy=3, dig_immediate=3, flammable=2, leafdecay=3, leafdecay_drop=1, attached_node = 1} + }) +end + +table.insert(moretrees.avoidnodes, "default:jungletree") +table.insert(moretrees.avoidnodes, "moretrees:jungletree_trunk") +table.insert(moretrees.avoidnodes, "moretrees:fir_trunk") +table.insert(moretrees.avoidnodes, "default:tree") + +if moretrees.spawn_saplings then + table.insert(moretrees.avoidnodes, "snow:sapling_pine") + table.insert(moretrees.avoidnodes, "default:junglesapling") + table.insert(moretrees.avoidnodes, "moretrees:jungle_tree_sapling") + table.insert(moretrees.avoidnodes, "moretrees:jungle_tree_sapling_ongen") +end + +-- "empty" (tapped) rubber tree nodes + +minetest.register_node("moretrees:rubber_tree_trunk_empty", { + description = S("Rubber Tree Trunk (Empty)"), + tiles = { + "moretrees_rubber_tree_trunk_top.png", + "moretrees_rubber_tree_trunk_top.png", + "moretrees_rubber_tree_trunk_empty.png" + }, + is_ground_content = true, + groups = {tree=1,snappy=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, + sounds = default.node_sound_wood_defaults(), + paramtype2 = "facedir", + on_place = minetest.rotate_node, +}) + +minetest.register_abm({ + nodenames = { "moretrees:rubber_tree_trunk_empty_sideways" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "moretrees:rubber_tree_trunk_empty", param2 = nfdir}) + end, +}) + +-- For compatibility with old nodes and recently-changed nodes. + +minetest.register_alias("technic:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming_plus:rubber_tree_full", "moretrees:rubber_tree_trunk") +minetest.register_alias("farming:rubber_tree_full", "moretrees:rubber_tree_trunk") + +minetest.register_alias("technic:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming_plus:rubber_leaves", "moretrees:rubber_tree_leaves") +minetest.register_alias("farming:rubber_leaves", "moretrees:rubber_tree_leaves") + +minetest.register_alias("technic:rubber_tree_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming_plus:rubber_sapling", "moretrees:rubber_tree_sapling") +minetest.register_alias("farming:rubber_sapling", "moretrees:rubber_tree_sapling") + +minetest.register_alias("default:junglesapling","moretrees:jungletree_sapling") +minetest.register_alias("moretrees:jungletree_trunk_sideways", "moreblocks:horizontal_jungle_tree") +minetest.register_alias("moretrees:jungletree_trunk", "default:jungletree") +minetest.register_alias("moretrees:jungletree_planks", "default:junglewood") + +minetest.register_alias("jungletree:leaves_green", "moretrees:jungletree_leaves_green") +minetest.register_alias("jungletree:leaves_red", "moretrees:jungletree_leaves_red") +minetest.register_alias("jungletree:leaves_yellow", "moretrees:jungletree_leaves_yellow") + +minetest.register_alias("moretrees:conifer_trunk", "moretrees:fir_trunk") +minetest.register_alias("moretrees:conifer_trunk_sideways", "moretrees:fir_trunk_sideways") +minetest.register_alias("moretrees:conifer_leaves", "moretrees:fir_leaves") +minetest.register_alias("moretrees:conifer_leaves_bright", "moretrees:fir_leaves_bright") +minetest.register_alias("moretrees:conifer_sapling", "moretrees:fir_sapling") + +minetest.register_alias("conifers:trunk", "moretrees:fir_trunk") +minetest.register_alias("conifers:trunk_reversed", "moretrees:fir_trunk_sideways") +minetest.register_alias("conifers:leaves", "moretrees:fir_leaves") +minetest.register_alias("conifers:leaves_special", "moretrees:fir_leaves_bright") +minetest.register_alias("conifers:sapling", "moretrees:fir_sapling") + diff --git a/mods/moretrees/saplings.lua b/mods/moretrees/saplings.lua new file mode 100644 index 0000000..7d8a9b9 --- /dev/null +++ b/mods/moretrees/saplings.lua @@ -0,0 +1,93 @@ +-- sapling growth + +for i in ipairs(moretrees.treelist) do + local treename = moretrees.treelist[i][1] + local tree_model = treename.."_model" + local tree_biome = treename.."_biome" + + if treename ~= "birch" and treename ~= "spruce" and treename ~= "fir" and treename ~= "jungletree" then + + plantslib:dbg(dump(moretrees[tree_biome].surface)) + plantslib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:"..treename.."_sapling", + grow_nodes = moretrees[tree_biome].surface, + grow_function = moretrees[tree_model], + }) + + plantslib:grow_plants({ + grow_delay = 2, + grow_chance = 30, + grow_plant = "moretrees:"..treename.."_sapling_ongen", + grow_nodes = moretrees[tree_biome].surface, + grow_function = moretrees[tree_model], + }) + + end +end + +plantslib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:birch_sapling", + grow_nodes = moretrees.birch_biome.surface, + grow_function = "moretrees:grow_birch" +}) + +plantslib:grow_plants({ + grow_delay = 2, + grow_chance = 30, + grow_plant = "moretrees:birch_sapling_ongen", + grow_nodes = moretrees.birch_biome.surface, + grow_function = "moretrees:grow_birch" +}) + +plantslib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:spruce_sapling", + grow_nodes = moretrees.spruce_biome.surface, + grow_function = "moretrees:grow_spruce" +}) + +plantslib:grow_plants({ + grow_delay = 2, + grow_chance = 30, + grow_plant = "moretrees:spruce_sapling_ongen", + grow_nodes = moretrees.spruce_biome.surface, + grow_function = "moretrees:grow_spruce" +}) + +plantslib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:fir_sapling", + grow_nodes = moretrees.fir_biome.surface, + grow_function = "moretrees:grow_fir" +}) + +plantslib:grow_plants({ + grow_delay = 2, + grow_chance = 30, + grow_plant = "moretrees:fir_sapling_ongen", + grow_nodes = moretrees.fir_biome.surface, + grow_function = "moretrees:grow_fir" +}) + +plantslib:grow_plants({ + grow_delay = moretrees.sapling_interval, + grow_chance = moretrees.sapling_chance, + grow_plant = "moretrees:jungletree_sapling", + grow_nodes = moretrees.jungletree_biome.surface, + grow_function = "moretrees:grow_jungletree" +}) + +plantslib:grow_plants({ + grow_delay = 2, + grow_chance = 30, + grow_plant = "moretrees:jungletree_sapling_ongen", + grow_nodes = moretrees.jungletree_biome.surface, + grow_function = "moretrees:grow_jungletree" +}) + diff --git a/mods/moretrees/textures/moretrees_acacia_leaves.png b/mods/moretrees/textures/moretrees_acacia_leaves.png new file mode 100644 index 0000000..73a8951 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acacia_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_acacia_sapling.png b/mods/moretrees/textures/moretrees_acacia_sapling.png new file mode 100644 index 0000000..5767f64 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acacia_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_acacia_trunk.png b/mods/moretrees/textures/moretrees_acacia_trunk.png new file mode 100644 index 0000000..7e60995 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acacia_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_acacia_trunk_top.png b/mods/moretrees/textures/moretrees_acacia_trunk_top.png new file mode 100644 index 0000000..858a8a8 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acacia_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_acacia_wood.png b/mods/moretrees/textures/moretrees_acacia_wood.png new file mode 100644 index 0000000..98c4038 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acacia_wood.png differ diff --git a/mods/moretrees/textures/moretrees_acorn.png b/mods/moretrees/textures/moretrees_acorn.png new file mode 100644 index 0000000..dc2ef32 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acorn.png differ diff --git a/mods/moretrees/textures/moretrees_acorn_muffin.png b/mods/moretrees/textures/moretrees_acorn_muffin.png new file mode 100644 index 0000000..166ca83 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acorn_muffin.png differ diff --git a/mods/moretrees/textures/moretrees_acorn_muffin_batter.png b/mods/moretrees/textures/moretrees_acorn_muffin_batter.png new file mode 100644 index 0000000..b22e749 Binary files /dev/null and b/mods/moretrees/textures/moretrees_acorn_muffin_batter.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_leaves.png b/mods/moretrees/textures/moretrees_apple_tree_leaves.png new file mode 100644 index 0000000..75ec063 Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_sapling.png b/mods/moretrees/textures/moretrees_apple_tree_sapling.png new file mode 100644 index 0000000..04f93fd Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_trunk.png b/mods/moretrees/textures/moretrees_apple_tree_trunk.png new file mode 100644 index 0000000..573fd85 Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_trunk_top.png b/mods/moretrees/textures/moretrees_apple_tree_trunk_top.png new file mode 100644 index 0000000..d261753 Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_apple_tree_wood.png b/mods/moretrees/textures/moretrees_apple_tree_wood.png new file mode 100644 index 0000000..242f3ee Binary files /dev/null and b/mods/moretrees/textures/moretrees_apple_tree_wood.png differ diff --git a/mods/moretrees/textures/moretrees_beech_leaves.png b/mods/moretrees/textures/moretrees_beech_leaves.png new file mode 100644 index 0000000..8463f53 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_beech_sapling.png b/mods/moretrees/textures/moretrees_beech_sapling.png new file mode 100644 index 0000000..ff42cc4 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_beech_trunk.png b/mods/moretrees/textures/moretrees_beech_trunk.png new file mode 100644 index 0000000..06b4ae9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_beech_trunk_top.png b/mods/moretrees/textures/moretrees_beech_trunk_top.png new file mode 100644 index 0000000..7285985 Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_beech_wood.png b/mods/moretrees/textures/moretrees_beech_wood.png new file mode 100644 index 0000000..d6e3f9d Binary files /dev/null and b/mods/moretrees/textures/moretrees_beech_wood.png differ diff --git a/mods/moretrees/textures/moretrees_birch_leaves.png b/mods/moretrees/textures/moretrees_birch_leaves.png new file mode 100644 index 0000000..547f133 Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_birch_sapling.png b/mods/moretrees/textures/moretrees_birch_sapling.png new file mode 100644 index 0000000..afb03f3 Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_birch_trunk.png b/mods/moretrees/textures/moretrees_birch_trunk.png new file mode 100644 index 0000000..2b222f7 Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_birch_trunk_top.png b/mods/moretrees/textures/moretrees_birch_trunk_top.png new file mode 100644 index 0000000..6e5b3bb Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_birch_wood.png b/mods/moretrees/textures/moretrees_birch_wood.png new file mode 100644 index 0000000..621f8ee Binary files /dev/null and b/mods/moretrees/textures/moretrees_birch_wood.png differ diff --git a/mods/moretrees/textures/moretrees_coconut.png b/mods/moretrees/textures/moretrees_coconut.png new file mode 100644 index 0000000..2107b5f Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_milk.png b/mods/moretrees/textures/moretrees_coconut_milk.png new file mode 100644 index 0000000..9a54ad8 Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_milk.png differ diff --git a/mods/moretrees/textures/moretrees_coconut_milk_inv.png b/mods/moretrees/textures/moretrees_coconut_milk_inv.png new file mode 100644 index 0000000..f636578 Binary files /dev/null and b/mods/moretrees/textures/moretrees_coconut_milk_inv.png differ diff --git a/mods/moretrees/textures/moretrees_fir_cone.png b/mods/moretrees/textures/moretrees_fir_cone.png new file mode 100644 index 0000000..45eef92 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_cone.png differ diff --git a/mods/moretrees/textures/moretrees_fir_leaves.png b/mods/moretrees/textures/moretrees_fir_leaves.png new file mode 100644 index 0000000..6643b87 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_fir_leaves_bright.png b/mods/moretrees/textures/moretrees_fir_leaves_bright.png new file mode 100644 index 0000000..e3b2e6f Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_leaves_bright.png differ diff --git a/mods/moretrees/textures/moretrees_fir_nuts.png b/mods/moretrees/textures/moretrees_fir_nuts.png new file mode 100644 index 0000000..a534149 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_nuts.png differ diff --git a/mods/moretrees/textures/moretrees_fir_sapling.png b/mods/moretrees/textures/moretrees_fir_sapling.png new file mode 100644 index 0000000..642123c Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_fir_trunk.png b/mods/moretrees/textures/moretrees_fir_trunk.png new file mode 100644 index 0000000..cc0c559 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_fir_trunk_top.png b/mods/moretrees/textures/moretrees_fir_trunk_top.png new file mode 100644 index 0000000..d17decf Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_fir_wood.png b/mods/moretrees/textures/moretrees_fir_wood.png new file mode 100644 index 0000000..7f49079 Binary files /dev/null and b/mods/moretrees/textures/moretrees_fir_wood.png differ diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_green.png b/mods/moretrees/textures/moretrees_jungletree_leaves_green.png new file mode 100644 index 0000000..52d4a5a Binary files /dev/null and b/mods/moretrees/textures/moretrees_jungletree_leaves_green.png differ diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_red.png b/mods/moretrees/textures/moretrees_jungletree_leaves_red.png new file mode 100644 index 0000000..d26593e Binary files /dev/null and b/mods/moretrees/textures/moretrees_jungletree_leaves_red.png differ diff --git a/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png b/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png new file mode 100644 index 0000000..d116455 Binary files /dev/null and b/mods/moretrees/textures/moretrees_jungletree_leaves_yellow.png differ diff --git a/mods/moretrees/textures/moretrees_oak_leaves.png b/mods/moretrees/textures/moretrees_oak_leaves.png new file mode 100644 index 0000000..aa587c5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_oak_sapling.png b/mods/moretrees/textures/moretrees_oak_sapling.png new file mode 100644 index 0000000..eef6a72 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_oak_trunk.png b/mods/moretrees/textures/moretrees_oak_trunk.png new file mode 100644 index 0000000..b0ca910 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_oak_trunk_top.png b/mods/moretrees/textures/moretrees_oak_trunk_top.png new file mode 100644 index 0000000..526d302 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_oak_wood.png b/mods/moretrees/textures/moretrees_oak_wood.png new file mode 100644 index 0000000..05d02f9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_oak_wood.png differ diff --git a/mods/moretrees/textures/moretrees_palm_leaves.png b/mods/moretrees/textures/moretrees_palm_leaves.png new file mode 100644 index 0000000..90b0700 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_palm_sapling.png b/mods/moretrees/textures/moretrees_palm_sapling.png new file mode 100644 index 0000000..aaa3415 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_palm_trunk.png b/mods/moretrees/textures/moretrees_palm_trunk.png new file mode 100644 index 0000000..da255bc Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_palm_trunk_top.png b/mods/moretrees/textures/moretrees_palm_trunk_top.png new file mode 100644 index 0000000..fe07ae3 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_palm_wood.png b/mods/moretrees/textures/moretrees_palm_wood.png new file mode 100644 index 0000000..c0c0ed6 Binary files /dev/null and b/mods/moretrees/textures/moretrees_palm_wood.png differ diff --git a/mods/moretrees/textures/moretrees_pine_cone.png b/mods/moretrees/textures/moretrees_pine_cone.png new file mode 100644 index 0000000..5e1fae9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_cone.png differ diff --git a/mods/moretrees/textures/moretrees_pine_leaves.png b/mods/moretrees/textures/moretrees_pine_leaves.png new file mode 100644 index 0000000..e6de482 Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_pine_nuts.png b/mods/moretrees/textures/moretrees_pine_nuts.png new file mode 100644 index 0000000..e39f895 Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_nuts.png differ diff --git a/mods/moretrees/textures/moretrees_pine_sapling.png b/mods/moretrees/textures/moretrees_pine_sapling.png new file mode 100644 index 0000000..42f8ecc Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_pine_trunk.png b/mods/moretrees/textures/moretrees_pine_trunk.png new file mode 100644 index 0000000..ea685e3 Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_pine_trunk_top.png b/mods/moretrees/textures/moretrees_pine_trunk_top.png new file mode 100644 index 0000000..01aed1d Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_pine_wood.png b/mods/moretrees/textures/moretrees_pine_wood.png new file mode 100644 index 0000000..8680bd5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_pine_wood.png differ diff --git a/mods/moretrees/textures/moretrees_raw_coconut.png b/mods/moretrees/textures/moretrees_raw_coconut.png new file mode 100644 index 0000000..ca318ed Binary files /dev/null and b/mods/moretrees/textures/moretrees_raw_coconut.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_leaves.png b/mods/moretrees/textures/moretrees_rubber_tree_leaves.png new file mode 100644 index 0000000..e35f51b Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_sapling.png b/mods/moretrees/textures/moretrees_rubber_tree_sapling.png new file mode 100644 index 0000000..d2e06d0 Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk.png new file mode 100644 index 0000000..c5da574 Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png new file mode 100644 index 0000000..55423bc Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_trunk_empty.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png b/mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png new file mode 100644 index 0000000..25b86a9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_rubber_tree_wood.png b/mods/moretrees/textures/moretrees_rubber_tree_wood.png new file mode 100644 index 0000000..3c83f0e Binary files /dev/null and b/mods/moretrees/textures/moretrees_rubber_tree_wood.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_leaves.png b/mods/moretrees/textures/moretrees_sequoia_leaves.png new file mode 100644 index 0000000..594c958 Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_sapling.png b/mods/moretrees/textures/moretrees_sequoia_sapling.png new file mode 100644 index 0000000..b11bc0b Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_trunk.png b/mods/moretrees/textures/moretrees_sequoia_trunk.png new file mode 100644 index 0000000..552cdf5 Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_trunk_top.png b/mods/moretrees/textures/moretrees_sequoia_trunk_top.png new file mode 100644 index 0000000..d1891fd Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_sequoia_wood.png b/mods/moretrees/textures/moretrees_sequoia_wood.png new file mode 100644 index 0000000..2e43595 Binary files /dev/null and b/mods/moretrees/textures/moretrees_sequoia_wood.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_cone.png b/mods/moretrees/textures/moretrees_spruce_cone.png new file mode 100644 index 0000000..1c9da85 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_cone.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_leaves.png b/mods/moretrees/textures/moretrees_spruce_leaves.png new file mode 100644 index 0000000..6643b87 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_nuts.png b/mods/moretrees/textures/moretrees_spruce_nuts.png new file mode 100644 index 0000000..130c11c Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_nuts.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_sapling.png b/mods/moretrees/textures/moretrees_spruce_sapling.png new file mode 100644 index 0000000..0275afb Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_trunk.png b/mods/moretrees/textures/moretrees_spruce_trunk.png new file mode 100644 index 0000000..cc0c559 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_trunk_top.png b/mods/moretrees/textures/moretrees_spruce_trunk_top.png new file mode 100644 index 0000000..3876c5b Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_spruce_wood.png b/mods/moretrees/textures/moretrees_spruce_wood.png new file mode 100644 index 0000000..47aa326 Binary files /dev/null and b/mods/moretrees/textures/moretrees_spruce_wood.png differ diff --git a/mods/moretrees/textures/moretrees_willow_leaves.png b/mods/moretrees/textures/moretrees_willow_leaves.png new file mode 100644 index 0000000..e1d26d9 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_leaves.png differ diff --git a/mods/moretrees/textures/moretrees_willow_sapling.png b/mods/moretrees/textures/moretrees_willow_sapling.png new file mode 100644 index 0000000..18414de Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_sapling.png differ diff --git a/mods/moretrees/textures/moretrees_willow_trunk.png b/mods/moretrees/textures/moretrees_willow_trunk.png new file mode 100644 index 0000000..a3bd5f0 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_trunk.png differ diff --git a/mods/moretrees/textures/moretrees_willow_trunk_top.png b/mods/moretrees/textures/moretrees_willow_trunk_top.png new file mode 100644 index 0000000..c54c182 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_trunk_top.png differ diff --git a/mods/moretrees/textures/moretrees_willow_wood.png b/mods/moretrees/textures/moretrees_willow_wood.png new file mode 100644 index 0000000..21c5742 Binary files /dev/null and b/mods/moretrees/textures/moretrees_willow_wood.png differ diff --git a/mods/moretrees/tree_biomes.txt b/mods/moretrees/tree_biomes.txt new file mode 100644 index 0000000..07b639e --- /dev/null +++ b/mods/moretrees/tree_biomes.txt @@ -0,0 +1,34 @@ + + Elevation Temperature Nearness to Nearby What nodes Perlin Avoid +Tree type (m) (approx., °C) some node water to spawn on seed diff radius +----------------------------------------------------------------------------------------------------------------------- +jungle tree - 5 to +10 above +15 water, 20 10 dirt_with_grass 329 5 +fir above +25 -20 to +10 n/a n/a dirt_with_grass 359 8 +firs on snow above +15 -20 to +10 n/a n/a snow:snow 359 8 +palm - 1 to + 1 +15 to +32 water, 15 10 sand 330 5 +apple + 1 to +10 +23 to +32 n/a n/a dirt_with grass 331 15 +oak 0 to +10 + 4 to +16 n/a n/a dirt_with grass 332 15 +sequoia 0 to +10 -30 to +50 n/a n/a dirt_with grass 333 10 +birch +10 to +15 -20 to +10 n/a n/a dirt_with grass 334 5 +spruce above +20 -20 to +10 n/a n/a dirt_with grass 335 10 +pine n/a n/a water, 15 5 dirt_with grass 336 10 +willow - 5 to + 5 n/a water, 15 5 dirt_with grass 337 20 +acacia n/a n/a n/a n/a dirt_with_grass, + desert_sand n/a 15 +rubber - 5 to + 5 above +32 water, 15 10 dirt_with_grass 338 20 + +beech n/a n/a n/a n/a dirt_with_grass 2 10 + + +Notes: +------ + +Beech trees are meant to replace default trees, but are themselves disabled by default. They grow in the same areas +as the default ones do, and under the same conditions. + +Acacia trees depend on humidity as their primary control, and they don't use the fertile ground option. They grow near +the edges of a desert biome, occasionally into the grass beyond, and anywhere else on desert sand or dirt with grass, +where the humidity is low (but not bone dry). + +Fir trees appear in a snow biome only with older versions of SPlizard's Snow Biomes mod. In more recent versions, +these trees will not grow, due to an engine bug. diff --git a/mods/moretrees/tree_models.lua b/mods/moretrees/tree_models.lua new file mode 100644 index 0000000..f1cf5a5 --- /dev/null +++ b/mods/moretrees/tree_models.lua @@ -0,0 +1,246 @@ +moretrees.beech_model={ + axiom="FFFFFBFB", + rules_a="[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fd]]////[&&&GGF[++^Fd][--&Fd]//Fd[+^Fd][--&Fdd]]", + rules_b="[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&d]//d[+^d][--&d]]////[&&&F[++^Fd][--&Fd]//d[+^d][--&d]]", + rules_c="/", + rules_d="F", + trunk="moretrees:beech_trunk", + leaves="moretrees:beech_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.apple_tree_model={ + axiom="FFFFFAFFBF", + rules_a="[&&&FFFFF&&FFFF][&&&++++FFFFF&&FFFF][&&&----FFFFF&&FFFF]", + rules_b="[&&&++FFFFF&&FFFF][&&&--FFFFF&&FFFF][&&&------FFFFF&&FFFF]", + trunk="moretrees:apple_tree_trunk", + leaves="moretrees:apple_tree_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="default:apple", + fruit_chance=15, +} + +moretrees.oak_model={ + axiom="FFFFFFA", + rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b="[&FFFA]////[&FFFA]////[&FFFA]", + trunk="moretrees:oak_trunk", + leaves="moretrees:oak_leaves", + angle=30, + iterations=5, + random_level=2, + trunk_type="crossed", + thin_branches=false, + fruit="moretrees:acorn", + fruit_chance=3, +} + +moretrees.sequoia_model={ + axiom="FFFFFFFFFFddccA///cccFddcFA///ddFcFA/cFFddFcdBddd/A/ccdcddd/ccAddddcFBcccAccFdFcFBcccc/BFdFFcFFdcccc/B", + rules_a="[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]////[&&&GGF[++^FFdd][--&Fddd]//Fdd[+^Fd][--&Fdd]]", + rules_b="[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]////[&&&GGF[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", + rules_c="/", + rules_d="F", + trunk="moretrees:sequoia_trunk", + leaves="moretrees:sequoia_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true +} + +moretrees.birch_model1={ + axiom="FFFFFdddccA/FFFFFFcA/FFFFFFcB", + rules_a="[&&&dddd^^ddddddd][&&&---dddd^^ddddddd][&&&+++dddd^^ddddddd][&&&++++++dddd^^ddddddd]", + rules_b="[&&&ddd^^ddddd][&&&---ddd^^ddddd][&&&+++ddd^^ddddd][&&&++++++ddd^^ddddd]", + rules_c="/", + rules_d="F", + trunk="moretrees:birch_trunk", + leaves="moretrees:birch_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.birch_model2={ + axiom="FFFdddccA/FFFFFccA/FFFFFccB", + rules_a="[&&&dFFF^^FFFdd][&&&---dFFF^^FFFdd][&&&+++dFFF^^FFFdd][&&&++++++dFFF^^FFFdd]", + rules_b="[&&&dFF^^FFFd][&&&---dFFF^^FFFd][&&&+++dFF^^FFFd][&&&++++++dFF^^FFFd]", + rules_c="/", + rules_d="F", + trunk="moretrees:birch_trunk", + leaves="moretrees:birch_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true +} + +moretrees.palm_model={ + axiom="FFcccccc&FFFFFddd[^&&&GR][^///&&&GR][^//////&&&GR][^***&&&GR]FA//A//A//A//A//A", + rules_a="[&fb&bbb[++f--&ffff&ff][--f++&ffff&ff]&ffff&bbbb&b]", + rules_b="f", + rules_c="/", + rules_d="F", + trunk="moretrees:palm_trunk", + leaves="moretrees:palm_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="moretrees:coconut", + fruit_chance=0 +} + +moretrees.spruce_model1={ + axiom="FFFFFAFFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", + rules_a="[&&&FFFFFF^^FFF][&&&++FFFFFF^^FFF][&&&++++FFFFFF^^FFF][&&&++++++FFFFFF^^FFF][&&&--FFFFFF^^FFF][&&&----FFFFFF^^FFF]", + rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", + rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", + rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]", + trunk="moretrees:spruce_trunk", + leaves="moretrees:spruce_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true, + fruit="moretrees:spruce_cone", + fruit_chance=8 +} + +moretrees.spruce_model2={ + axiom="FFFFFFBFFFFFFCFFFFFFDFFFFFF[&&&F^^FF][&&&++F^^FF][&&&++++F^^FF][&&&++++++F^^FF][&&&--F^^FF][&&&----F^^FF][FFFFf]", + rules_b="[&&&FFFFF^^FFF][&&&++FFFFF^^FFF][&&&++++FFFFF^^FFF][&&&++++++FFFFF^^FFF][&&&--FFFFF^^FFF][&&&----FFFFF^^FFF]", + rules_c="[&&&FFFF^^FFF][&&&++FFFF^^FFF][&&&++++FFFF^^FFF][&&&++++++FFFF^^FFF][&&&--FFFF^^FFF][&&&----FFFF^^FFF]", + rules_d="[&&&FFF^^FFF][&&&++FFF^^FFF][&&&++++FFF^^FFF][&&&++++++FFF^^FFF][&&&--FFF^^FFF][&&&----FFF^^FFF]", + trunk="moretrees:spruce_trunk", + leaves="moretrees:spruce_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true, + fruit="moretrees:spruce_cone", + fruit_chance=8 +} + +moretrees.pine_model={ + axiom="FFFFFcccdddB///cFdFB////cFdFB///cFdFB///cFdFA///cFdFA///cFdFB[FF]f", + rules_a="[&&&TTTT[++^TFdd][--&TFd]//Tdd[+^Fd][--&Fdd]]", + rules_b="[&&&TTT[++^Fdd][--&Fdd]//dd[+^d][--&Fd]]", + rules_c="/", + rules_d="F", + trunk="moretrees:pine_trunk", + leaves="moretrees:pine_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="single", + thin_branches=true, + fruit="moretrees:pine_cone", + fruit_chance=8 +} + +moretrees.willow_model={ + axiom="FFFFFFFFccA", + rules_a="[&FF&FFFF&&F&FFFFFFFdddd][**&FF&FFFF&&F&FFFFFFFdddd][//&FF&FFFF&&F&FFFFFFFdddd][////&FF&FFFF&&F&FFFFFFFdddd][//////&FF&FFFF&&F&FFFFFFFdddd][////////&FF&FFFF&&F&FFFFFFFdddd]", + rules_c="/", + rules_d="F", + trunk="moretrees:willow_trunk", + leaves="moretrees:willow_leaves", + angle=30, + iterations=2, + random_level=0, + trunk_type="crossed", + thin_branches=true +} + +moretrees.acacia_model={ + axiom="FFFFFFccccA", + rules_a = "[B]//[B]//[B]//[B]", + rules_b = "&TTTT&TT^^G&&----GGGGGG++GGG++" -- line up with the "canvas" edge + .."fffffffGG++G++" -- first layer, drawn in a zig-zag raster pattern + .."Gffffffff--G--" + .."ffffffffG++G++" + .."fffffffff--G--" + .."fffffffff++G++" + .."fffffffff--G--" + .."ffffffffG++G++" + .."Gffffffff--G--" + .."fffffffGG" + .."^^G&&----GGGGGGG++GGGGGG++" -- re-align to second layer canvas edge + .."ffffGGG++G++" -- second layer + .."GGfffff--G--" + .."ffffffG++G++" + .."fffffff--G--" + .."ffffffG++G++" + .."GGfffff--G--" + .."ffffGGG", + rules_c = "/", + trunk="moretrees:acacia_trunk", + leaves="moretrees:acacia_leaves", + angle=45, + iterations=3, + random_level=0, + trunk_type="single", + thin_branches=true, +} + +moretrees.rubber_tree_model={ + axiom="FFFFA", + rules_a="[&FFBFA]////[&BFFFA]////[&FBFFA]", + rules_b="[&FFA]////[&FFA]////[&FFA]", + trunk="moretrees:rubber_tree_trunk", + leaves="moretrees:rubber_tree_leaves", + angle=35, + iterations=3, + random_level=1, + trunk_type="double", + thin_branches=true +} + +moretrees.jungletree_model={ + axiom=nil, + rules_a=nil, + rules_b=nil, + trunk="default:jungletree", + leaves="moretrees:jungletree_leaves_green", + leaves2=nil, + leaves2_chance=nil, + angle=45, + iterations=nil, + random_level=2, + trunk_type=nil, + thin_branches=true, + fruit_chance=15, + fruit="vines:vine" +} + +moretrees.fir_model={ + axiom="FFFAF[&&-F][&&+F][&&---F][&&+++F]Fff", + rules_a=nil, + rules_b=nil, + trunk="moretrees:fir_trunk", + leaves=nil, + angle=45, + iterations=7, + random_level=5, + trunk_type="single", + thin_branches=true, + fruit="moretrees:fir_cone", + fruit_chance=8 +} diff --git a/mods/nether/README.txt b/mods/nether/README.txt new file mode 100644 index 0000000..4206d0e --- /dev/null +++ b/mods/nether/README.txt @@ -0,0 +1,25 @@ +Minetest 0.4 mod: nether +======================== + +License of source code: +----------------------- +Copyright (C) 2013 PilzAdam + +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. + +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) 2013 PilzAdam + +nether_rack.png: Zeg9 +nether_glowstone.png: BlockMen diff --git a/mods/nether/depends.txt b/mods/nether/depends.txt new file mode 100644 index 0000000..c5f1f37 --- /dev/null +++ b/mods/nether/depends.txt @@ -0,0 +1,2 @@ +default +stairs? diff --git a/mods/nether/init.lua b/mods/nether/init.lua new file mode 100644 index 0000000..fc0d887 --- /dev/null +++ b/mods/nether/init.lua @@ -0,0 +1,422 @@ +-- Minetest 0.4 Mod: Nether + +local NETHER_DEPTH = -5000 + +minetest.register_node("nether:portal", { + description = "Nether Portal", + tiles = { + "nether_transparent.png", + "nether_transparent.png", + "nether_transparent.png", + "nether_transparent.png", + { + name = "nether_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + { + name = "nether_portal.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.5, + }, + }, + }, + drawtype = "nodebox", + paramtype = "light", + paramtype2 = "facedir", + sunlight_propagates = true, + use_texture_alpha = true, + walkable = false, + digable = false, + pointable = false, + buildable_to = false, + drop = "", + light_source = 5, + post_effect_color = {a=180, r=128, g=0, b=128}, + alpha = 192, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.1, 0.5, 0.5, 0.1}, + }, + }, + groups = {not_in_creative_inventory=1} +}) + +local function build_portal(pos, target) + local p = {x=pos.x-1, y=pos.y-1, z=pos.z} + local p1 = {x=pos.x-1, y=pos.y-1, z=pos.z} + local p2 = {x=p1.x+3, y=p1.y+4, z=p1.z} + for i=1,4 do + minetest.set_node(p, {name="default:obsidian"}) + p.y = p.y+1 + end + for i=1,3 do + minetest.set_node(p, {name="default:obsidian"}) + p.x = p.x+1 + end + for i=1,4 do + minetest.set_node(p, {name="default:obsidian"}) + p.y = p.y-1 + end + for i=1,3 do + minetest.set_node(p, {name="default:obsidian"}) + p.x = p.x-1 + end + for x=p1.x,p2.x do + for y=p1.y,p2.y do + p = {x=x, y=y, z=p1.z} + if not (x == p1.x or x == p2.x or y==p1.y or y==p2.y) then + minetest.set_node(p, {name="nether:portal", param2=0}) + end + local meta = minetest.get_meta(p) + meta:set_string("p1", minetest.pos_to_string(p1)) + meta:set_string("p2", minetest.pos_to_string(p2)) + meta:set_string("target", minetest.pos_to_string(target)) + + if y ~= p1.y then + for z=-2,2 do + if z ~= 0 then + p.z = p.z+z + if minetest.registered_nodes[minetest.get_node(p).name].is_ground_content then + minetest.remove_node(p) + end + p.z = p.z-z + end + end + end + + end + end +end + +minetest.register_abm({ + nodenames = {"nether:portal"}, + interval = 1, + chance = 2, + action = function(pos, node) + minetest.add_particlespawner( + 32, --amount + 4, --time + {x=pos.x-0.25, y=pos.y-0.25, z=pos.z-0.25}, --minpos + {x=pos.x+0.25, y=pos.y+0.25, z=pos.z+0.25}, --maxpos + {x=-0.8, y=-0.8, z=-0.8}, --minvel + {x=0.8, y=0.8, z=0.8}, --maxvel + {x=0,y=0,z=0}, --minacc + {x=0,y=0,z=0}, --maxacc + 0.5, --minexptime + 1, --maxexptime + 1, --minsize + 2, --maxsize + false, --collisiondetection + "nether_particle.png" --texture + ) + for _,obj in ipairs(minetest.get_objects_inside_radius(pos, 1)) do + if obj:is_player() then + local meta = minetest.get_meta(pos) + local target = minetest.string_to_pos(meta:get_string("target")) + if target then + minetest.after(3, function(obj, pos, target) + local objpos = obj:getpos() + objpos.y = objpos.y+0.1 -- Fix some glitches at -8000 + if minetest.get_node(objpos).name ~= "nether:portal" then + return + end + + obj:setpos(target) + + local function check_and_build_portal(pos, target) + local n = minetest.get_node_or_nil(target) + if n and n.name ~= "nether:portal" then + build_portal(target, pos) + minetest.after(2, check_and_build_portal, pos, target) + minetest.after(4, check_and_build_portal, pos, target) + elseif not n then + minetest.after(1, check_and_build_portal, pos, target) + end + end + + minetest.after(1, check_and_build_portal, pos, target) + + end, obj, pos, target) + end + end + end + end, +}) + +local function move_check(p1, max, dir) + local p = {x=p1.x, y=p1.y, z=p1.z} + local d = math.abs(max-p1[dir]) / (max-p1[dir]) + while p[dir] ~= max do + p[dir] = p[dir] + d + if minetest.get_node(p).name ~= "default:obsidian" then + return false + end + end + return true +end + +local function check_portal(p1, p2) + if p1.x ~= p2.x then + if not move_check(p1, p2.x, "x") then + return false + end + if not move_check(p2, p1.x, "x") then + return false + end + elseif p1.z ~= p2.z then + if not move_check(p1, p2.z, "z") then + return false + end + if not move_check(p2, p1.z, "z") then + return false + end + else + return false + end + + if not move_check(p1, p2.y, "y") then + return false + end + if not move_check(p2, p1.y, "y") then + return false + end + + return true +end + +local function is_portal(pos) + for d=-3,3 do + for y=-4,4 do + local px = {x=pos.x+d, y=pos.y+y, z=pos.z} + local pz = {x=pos.x, y=pos.y+y, z=pos.z+d} + if check_portal(px, {x=px.x+3, y=px.y+4, z=px.z}) then + return px, {x=px.x+3, y=px.y+4, z=px.z} + end + if check_portal(pz, {x=pz.x, y=pz.y+4, z=pz.z+3}) then + return pz, {x=pz.x, y=pz.y+4, z=pz.z+3} + end + end + end +end + +local function make_portal(pos) + local p1, p2 = is_portal(pos) + if not p1 or not p2 then + return false + end + + for d=1,2 do + for y=p1.y+1,p2.y-1 do + local p + if p1.z == p2.z then + p = {x=p1.x+d, y=y, z=p1.z} + else + p = {x=p1.x, y=y, z=p1.z+d} + end + if minetest.get_node(p).name ~= "air" then + return false + end + end + end + + local param2 + if p1.z == p2.z then param2 = 0 else param2 = 1 end + + local target = {x=p1.x, y=p1.y, z=p1.z} + target.x = target.x + 1 + if target.y < NETHER_DEPTH then + target.y = math.random(-50, 20) + else + target.y = NETHER_DEPTH - math.random(500, 1500) + end + + for d=0,3 do + for y=p1.y,p2.y do + local p = {} + if param2 == 0 then p = {x=p1.x+d, y=y, z=p1.z} else p = {x=p1.x, y=y, z=p1.z+d} end + if minetest.get_node(p).name == "air" then + minetest.set_node(p, {name="nether:portal", param2=param2}) + end + local meta = minetest.get_meta(p) + meta:set_string("p1", minetest.pos_to_string(p1)) + meta:set_string("p2", minetest.pos_to_string(p2)) + meta:set_string("target", minetest.pos_to_string(target)) + end + end + return true +end + +minetest.register_node(":default:obsidian", { + description = "Obsidian", + tiles = {"default_obsidian.png"}, + is_ground_content = true, + sounds = default.node_sound_stone_defaults(), + groups = {cracky=1,level=2}, + + on_destruct = function(pos) + local meta = minetest.get_meta(pos) + local p1 = minetest.string_to_pos(meta:get_string("p1")) + local p2 = minetest.string_to_pos(meta:get_string("p2")) + local target = minetest.string_to_pos(meta:get_string("target")) + if not p1 or not p2 then + return + end + for x=p1.x,p2.x do + for y=p1.y,p2.y do + for z=p1.z,p2.z do + local nn = minetest.get_node({x=x,y=y,z=z}).name + if nn == "default:obsidian" or nn == "nether:portal" then + if nn == "nether:portal" then + minetest.remove_node({x=x,y=y,z=z}) + end + local m = minetest.get_meta({x=x,y=y,z=z}) + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target", "") + end + end + end + end + meta = minetest.get_meta(target) + if not meta then + return + end + p1 = minetest.string_to_pos(meta:get_string("p1")) + p2 = minetest.string_to_pos(meta:get_string("p2")) + if not p1 or not p2 then + return + end + for x=p1.x,p2.x do + for y=p1.y,p2.y do + for z=p1.z,p2.z do + local nn = minetest.get_node({x=x,y=y,z=z}).name + if nn == "default:obsidian" or nn == "nether:portal" then + if nn == "nether:portal" then + minetest.remove_node({x=x,y=y,z=z}) + end + local m = minetest.get_meta({x=x,y=y,z=z}) + m:set_string("p1", "") + m:set_string("p2", "") + m:set_string("target", "") + end + end + end + end + end, +}) + +minetest.register_craftitem(":default:mese_crystal_fragment", { + description = "Mese Crystal Fragment", + inventory_image = "default_mese_crystal_fragment.png", + on_place = function(stack,_, pt) + if pt.under and minetest.get_node(pt.under).name == "default:obsidian" then + local done = make_portal(pt.under) + if done and not minetest.setting_getbool("creative_mode") then + stack:take_item() + end + end + return stack + end, +}) + +minetest.register_node("nether:rack", { + description = "Netherrack", + tiles = {"nether_rack.png"}, + is_ground_content = true, + drop = { + max_items = 1, + items = {{ + rarity = 3, + items = {"nether:rack"}, + }} + }, + groups = {cracky=3,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_node("nether:sand", { + description = "Nethersand", + tiles = {"nether_sand.png"}, + is_ground_content = true, + groups = {crumbly=3,level=2,falling_node=1}, + sounds = default.node_sound_dirt_defaults({ + footstep = {name="default_gravel_footstep", gain=0.45}, + }), +}) + +minetest.register_node("nether:glowstone", { + description = "Glowstone", + tiles = {"nether_glowstone.png"}, + is_ground_content = true, + light_source = 13, + groups = {cracky=3,oddly_breakable_by_hand=3}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_node("nether:brick", { + description = "Nether Brick", + tiles = {"nether_brick.png"}, + groups = {cracky=2,level=2}, + sounds = default.node_sound_stone_defaults(), +}) + +local air = minetest.get_content_id("air") +local stone_with_coal = minetest.get_content_id("default:stone_with_coal") +local stone_with_iron = minetest.get_content_id("default:stone_with_iron") +local stone_with_mese = minetest.get_content_id("default:stone_with_mese") +local stone_with_diamond = minetest.get_content_id("default:stone_with_diamond") +local stone_with_gold = minetest.get_content_id("default:stone_with_gold") +local stone_with_copper = minetest.get_content_id("default:stone_with_copper") +local gravel = minetest.get_content_id("default:gravel") +local dirt = minetest.get_content_id("default:dirt") +local sand = minetest.get_content_id("default:sand") +local cobble = minetest.get_content_id("default:cobble") +local mossycobble = minetest.get_content_id("default:mossycobble") +local stair_cobble = minetest.get_content_id("stairs:stair_cobble") +local lava_source = minetest.get_content_id("default:lava_source") +local lava_flowing = minetest.get_content_id("default:lava_flowing") +local glowstone = minetest.get_content_id("nether:glowstone") +local nethersand = minetest.get_content_id("nether:sand") +local netherbrick = minetest.get_content_id("nether:brick") +local netherrack = minetest.get_content_id("nether:rack") + +minetest.register_on_generated(function(minp, maxp, seed) + if maxp.y > NETHER_DEPTH then + return + end + local vm, emin, emax = minetest.get_mapgen_object("voxelmanip") + local data = vm:get_data() + local area = VoxelArea:new{MinEdge=emin, MaxEdge=emax} + for i in area:iterp(minp, maxp) do + local d = data[i] + if d == air or d == stone_with_coal or d == stone_with_iron then + data[i] = air + elseif d == stone_with_mese or d == stone_with_diamond or d == lava_source then + data[i] = lava_source + elseif d == lava_flowing then + -- nothing + elseif d == stone_with_gold then + data[i] = glowstone + elseif d == stone_with_copper or d == gravel or d == dirt or d == sand then + data[i] = nethersand + elseif d == cobble or d == mossycobble or d == stair_cobble then + data[i] = netherbrick + else + data[i] = netherrack + end + end + vm:set_data(data) + --vm:set_lighting({day=0, night=0}) + vm:calc_lighting() + vm:update_liquids() + vm:write_to_map() +end) diff --git a/mods/nether/textures/nether_brick.png b/mods/nether/textures/nether_brick.png new file mode 100644 index 0000000..3e8c803 Binary files /dev/null and b/mods/nether/textures/nether_brick.png differ diff --git a/mods/nether/textures/nether_glowstone.png b/mods/nether/textures/nether_glowstone.png new file mode 100644 index 0000000..9016eac Binary files /dev/null and b/mods/nether/textures/nether_glowstone.png differ diff --git a/mods/nether/textures/nether_particle.png b/mods/nether/textures/nether_particle.png new file mode 100644 index 0000000..56a5b78 Binary files /dev/null and b/mods/nether/textures/nether_particle.png differ diff --git a/mods/nether/textures/nether_portal.png b/mods/nether/textures/nether_portal.png new file mode 100644 index 0000000..824d652 Binary files /dev/null and b/mods/nether/textures/nether_portal.png differ diff --git a/mods/nether/textures/nether_rack.png b/mods/nether/textures/nether_rack.png new file mode 100644 index 0000000..201a11a Binary files /dev/null and b/mods/nether/textures/nether_rack.png differ diff --git a/mods/nether/textures/nether_sand.png b/mods/nether/textures/nether_sand.png new file mode 100644 index 0000000..8ec343d Binary files /dev/null and b/mods/nether/textures/nether_sand.png differ diff --git a/mods/nether/textures/nether_transparent.png b/mods/nether/textures/nether_transparent.png new file mode 100644 index 0000000..4883728 Binary files /dev/null and b/mods/nether/textures/nether_transparent.png differ diff --git a/mods/pipeworks/LICENSE b/mods/pipeworks/LICENSE new file mode 100644 index 0000000..eb930e9 --- /dev/null +++ b/mods/pipeworks/LICENSE @@ -0,0 +1,17 @@ + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. + +---------- + +This license is commonly known as "WTFPL". diff --git a/mods/pipeworks/README b/mods/pipeworks/README new file mode 100644 index 0000000..7a34618 --- /dev/null +++ b/mods/pipeworks/README @@ -0,0 +1,22 @@ +This mod uses nodeboxes to supply a complete set of 3D pipes and tubes, +along devices that work with them. + +See https://github.com/VanessaE/pipeworks/wiki/ for detailed information about usage of this mod. + +Unlike the previous version of this mod, these pipes are rounded, and when +placed, they'll automatically join together as needed. Pipes can go vertically +or horizontally, and there are enough nodes defined to allow for all possible +connections. Valves and pumps can only be placed horizontally, and will +automatically rotate and join with neighboring pipes as objects are added, as +well as joining with each other under certain circumstances. + +Pipes come in two variants: one type bears one or more dark windows on each +pipe, suggesting they're empty, while the other type bears green-tinted +windows, as if full (the two colors should also be easy to select if you want +to change them in a paint program). These windows only appear on straight +lengths and on certain junctions. + +This mod is a work in progress. + +Please note that owing to the nature of this mod, I have opted to use 64px +textures. Anything less just looks terrible. diff --git a/mods/pipeworks/autocrafter.lua b/mods/pipeworks/autocrafter.lua new file mode 100644 index 0000000..3609068 --- /dev/null +++ b/mods/pipeworks/autocrafter.lua @@ -0,0 +1,368 @@ +local autocrafterCache = {} -- caches some recipe data to avoid to call the slow function minetest.get_craft_result() every second + +local craft_time = 1 + +local function count_index(invlist) + local index = {} + for _, stack in pairs(invlist) do + if not stack:is_empty() then + local stack_name = stack:get_name() + index[stack_name] = (index[stack_name] or 0) + stack:get_count() + end + end + return index +end + +local function get_item_info(stack) + local name = stack:get_name() + local def = minetest.registered_items[name] + local description = def and def.description or "Unknown item" + return description, name +end + +local function get_craft(pos, inventory, hash) + local hash = hash or minetest.hash_node_position(pos) + local craft = autocrafterCache[hash] + if not craft then + local recipe = inventory:get_list("recipe") + local output, decremented_input = minetest.get_craft_result({method = "normal", width = 3, items = recipe}) + craft = {recipe = recipe, consumption=count_index(recipe), output = output, decremented_input = decremented_input} + autocrafterCache[hash] = craft + end + return craft +end + +local function autocraft(inventory, craft) + if not craft then return false end + local output_item = craft.output.item + + -- check if we have enough room in dst + if not inventory:room_for_item("dst", output_item) then return false end + local consumption = craft.consumption + local inv_index = count_index(inventory:get_list("src")) + -- check if we have enough material available + for itemname, number in pairs(consumption) do + if (not inv_index[itemname]) or inv_index[itemname] < number then return false end + end + -- consume material + for itemname, number in pairs(consumption) do + for i = 1, number do -- We have to do that since remove_item does not work if count > stack_max + inventory:remove_item("src", ItemStack(itemname)) + end + end + + -- craft the result into the dst inventory and add any "replacements" as well + inventory:add_item("dst", output_item) + for i = 1, 9 do + inventory:add_item("dst", craft.decremented_input.items[i]) + end + return true +end + +-- returns false to stop the timer, true to continue running +-- is started only from start_autocrafter(pos) after sanity checks and cached recipe +local function run_autocrafter(pos, elapsed) + local meta = minetest.get_meta(pos) + local inventory = meta:get_inventory() + local craft = get_craft(pos, inventory) + local output_item = craft.output.item + -- only use crafts that have an actual result + if output_item:is_empty() then + meta:set_string("infotext", "unconfigured Autocrafter: unknown recipe") + return false + end + + for step = 1, math.floor(elapsed/craft_time) do + local continue = autocraft(inventory, craft) + if not continue then return false end + end + return true +end + +local function start_crafter(pos) + local meta = minetest.get_meta(pos) + if meta:get_int("enabled") == 1 then + local timer = minetest.get_node_timer(pos) + if not timer:is_started() then + timer:start(craft_time) + end + end +end + +local function after_inventory_change(pos) + start_crafter(pos) +end + +-- note, that this function assumes allready being updated to virtual items +-- and doesn't handle recipes with stacksizes > 1 +local function after_recipe_change(pos, inventory) + local meta = minetest.get_meta(pos) + -- if we emptied the grid, there's no point in keeping it running or cached + if inventory:is_empty("recipe") then + minetest.get_node_timer(pos):stop() + autocrafterCache[minetest.hash_node_position(pos)] = nil + meta:set_string("infotext", "unconfigured Autocrafter") + return + end + local recipe_changed = false + local recipe = inventory:get_list("recipe") + + local hash = minetest.hash_node_position(pos) + local craft = autocrafterCache[hash] + + if craft then + -- check if it changed + local cached_recipe = craft.recipe + for i = 1, 9 do + if recipe[i]:get_name() ~= cached_recipe[i]:get_name() then + autocrafterCache[hash] = nil -- invalidate recipe + craft = nil + break + end + end + end + + craft = craft or get_craft(pos, inventory, hash) + local output_item = craft.output.item + local description, name = get_item_info(output_item) + meta:set_string("infotext", string.format("'%s' Autocrafter (%s)", description, name)) + inventory:set_stack("output", 1, output_item) + + after_inventory_change(pos) +end + +-- clean out unknown items and groups, which would be handled like unknown items in the crafting grid +-- if minetest supports query by group one day, this might replace them +-- with a canonical version instead +local function normalize(item_list) + for i = 1, #item_list do + local name = item_list[i] + if not minetest.registered_items[name] then + item_list[i] = "" + end + end + return item_list +end + +local function on_output_change(pos, inventory, stack) + if not stack then + inventory:set_list("output", {}) + inventory:set_list("recipe", {}) + else + local input = minetest.get_craft_recipe(stack:get_name()) + if not input.items or input.type ~= "normal" then return end + local items, width = normalize(input.items), input.width + local item_idx, width_idx = 1, 1 + for i = 1, 9 do + if width_idx <= width then + inventory:set_stack("recipe", i, items[item_idx]) + item_idx = item_idx + 1 + else + inventory:set_stack("recipe", i, ItemStack("")) + end + width_idx = (width_idx < 3) and (width_idx + 1) or 1 + end + -- we'll set the output slot in after_recipe_change to the actual result of the new recipe + end + after_recipe_change(pos, inventory) +end + +-- returns false if we shouldn't bother attempting to start the timer again after this +local function update_meta(meta, enabled) + local state = enabled and "on" or "off" + meta:set_int("enabled", enabled and 1 or 0) + meta:set_string("formspec", + "size[8,11]".. + "list[context;recipe;0,0;3,3;]".. + "image[3,1;1,1;gui_hb_bg.png^[colorize:#141318:255]".. + "list[context;output;3,1;1,1;]".. + "image_button[3,2;1,1;pipeworks_button_" .. state .. ".png;" .. state .. ";;;false;pipeworks_button_interm.png]" .. + "list[context;src;0,3.5;8,3;]".. + "list[context;dst;4,0;4,3;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + default.get_hotbar_bg(0,7) .. + "list[current_player;main;0,7;8,4;]") + + -- toggling the button doesn't quite call for running a recipe change check + -- so instead we run a minimal version for infotext setting only + -- this might be more written code, but actually executes less + local output = meta:get_inventory():get_stack("output", 1) + if output:is_empty() then -- doesn't matter if paused or not + meta:set_string("infotext", "unconfigured Autocrafter") + return false + end + + local description, name = get_item_info(output) + local infotext = enabled and string.format("'%s' Autocrafter (%s)", description, name) + or string.format("paused '%s' Autocrafter", description) + + meta:set_string("infotext", infotext) + return enabled +end + +-- 1st version of the autocrafter had actual items in the crafting grid +-- the 2nd replaced these with virtual items, dropped the content on update and set "virtual_items" to string "1" +-- the third added an output inventory, changed the formspec and added a button for enabling/disabling +-- so we work out way backwards on this history and update each single case to the newest version +local function upgrade_autocrafter(pos, meta) + local meta = meta or minetest.get_meta(pos) + local inv = meta:get_inventory() + + if inv:get_size("output") == 0 then -- we are version 2 or 1 + inv:set_size("output", 1) + -- migrate the old autocrafters into an "enabled" state + update_meta(meta, true) + + if meta:get_string("virtual_items") == "1" then -- we are version 2 + -- we allready dropped stuff, so lets remove the metadatasetting (we are not being called again for this node) + meta:set_string("virtual_items", "") + else -- we are version 1 + local recipe = inv:get_list("recipe") + if not recipe then return end + for idx, stack in ipairs(recipe) do + if not stack:is_empty() then + minetest.item_drop(stack, "", pos) + stack:set_count(1) + stack:set_wear(0) + inv:set_stack("recipe", idx, stack) + end + end + end + + -- update the recipe, cache, and start the crafter + autocrafterCache[minetest.hash_node_position(pos)] = nil + after_recipe_change(pos, inv) + end +end + +minetest.register_node("pipeworks:autocrafter", { + description = "Autocrafter", + drawtype = "normal", + tiles = {"pipeworks_autocrafter.png"}, + groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1}, + tube = {insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local added = inv:add_item("src", stack) + after_inventory_change(pos) + return added + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("src", stack) + end, + input_inventory = "dst", + connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("src", 3*8) + inv:set_size("recipe", 3*3) + inv:set_size("dst", 4*3) + inv:set_size("output", 1) + update_meta(meta, false) + end, + on_receive_fields = function(pos, formname, fields, sender) + if not pipeworks.may_configure(pos, sender) then return end + local meta = minetest.get_meta(pos) + if fields.on then + update_meta(meta, false) + minetest.get_node_timer(pos):stop() + elseif fields.off then + if update_meta(meta, true) then + start_crafter(pos) + end + end + end, + can_dig = function(pos, player) + upgrade_autocrafter(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return (inv:is_empty("src") and inv:is_empty("dst")) + end, + after_place_node = pipeworks.scan_for_tube_objects, + after_dig_node = function(pos) + pipeworks.scan_for_tube_objects(pos) + end, + on_destruct = function(pos) + autocrafterCache[minetest.hash_node_position(pos)] = nil + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + upgrade_autocrafter(pos) + local inv = minetest.get_meta(pos):get_inventory() + if listname == "recipe" then + stack:set_count(1) + inv:set_stack(listname, index, stack) + after_recipe_change(pos, inv) + return 0 + elseif listname == "output" then + on_output_change(pos, inv, stack) + return 0 + end + after_inventory_change(pos) + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then + minetest.log("action", string.format("%s attempted to take from autocrafter at %s", player:get_player_name(), minetest.pos_to_string(pos))) + return 0 + end + upgrade_autocrafter(pos) + local inv = minetest.get_meta(pos):get_inventory() + if listname == "recipe" then + inv:set_stack(listname, index, ItemStack("")) + after_recipe_change(pos, inv) + return 0 + elseif listname == "output" then + on_output_change(pos, inv, nil) + return 0 + end + after_inventory_change(pos) + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not pipeworks.may_configure(pos, player) then return 0 end + upgrade_autocrafter(pos) + local inv = minetest.get_meta(pos):get_inventory() + local stack = inv:get_stack(from_list, from_index) + + if to_list == "output" then + on_output_change(pos, inv, stack) + return 0 + elseif from_list == "output" then + on_output_change(pos, inv, nil) + if to_list ~= "recipe" then + return 0 + end -- else fall through to recipe list handling + end + + if from_list == "recipe" or to_list == "recipe" then + if from_list == "recipe" then + inv:set_stack(from_list, from_index, ItemStack("")) + end + if to_list == "recipe" then + stack:set_count(1) + inv:set_stack(to_list, to_index, stack) + end + after_recipe_change(pos, inv) + return 0 + end + + after_inventory_change(pos) + return count + end, + on_timer = run_autocrafter +}) + +minetest.register_craft( { + output = "pipeworks:autocrafter 2", + recipe = { + { "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" }, + { "homedecor:plastic_sheeting", "default:steel_ingot", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "default:mese_crystal", "default:steel_ingot" } + }, +}) diff --git a/mods/pipeworks/autoplace_pipes.lua b/mods/pipeworks/autoplace_pipes.lua new file mode 100644 index 0000000..4fc3665 --- /dev/null +++ b/mods/pipeworks/autoplace_pipes.lua @@ -0,0 +1,200 @@ +-- autorouting for pipes +local tube_table = {[0] = 1, 2, 2, 4, 2, 4, 4, 5, 2, 3, 4, 6, 4, 6, 5, 7, 2, 4, 3, 6, 4, 5, 6, 7, 4, 6, 6, 8, 5, 7, 7, 9, 2, 4, 4, 5, 3, 6, 6, 7, 4, 6, 5, 7, 6, 8, 7, 9, 4, 5, 6, 7, 6, 7, 8, 9, 5, 7, 7, 9, 7, 9, 9, 10} +local tube_table_facedirs = {[0] = 0, 0, 5, 0, 3, 4, 3, 0, 2, 0, 2, 0, 6, 4, 3, 0, 7, 12, 5, 12, 7, 4, 5, 5, 18, 20, 16, 0, 7, 4, 7, 0, 1, 8, 1, 1, 1, 13, 1, 1, 10, 8, 2, 2, 17, 4, 3, 6, 9, 9, 9, 9, 21, 13, 1, 1, 10, 10, 11, 2, 19, 4, 3, 0} +local function autoroute_pipes(pos) + local nctr = minetest.get_node(pos) + local state = "_empty" + if (string.find(nctr.name, "pipeworks:pipe_") == nil) then return end + if (string.find(nctr.name, "_loaded") ~= nil) then state = "_loaded" end + local nsurround = pipeworks.scan_pipe_surroundings(pos) + + if nsurround == 0 then nsurround = 9 end + minetest.swap_node(pos, {name = "pipeworks:pipe_"..tube_table[nsurround]..state, + param2 = tube_table_facedirs[nsurround]}) +end + +function pipeworks.scan_for_pipe_objects(pos) + autoroute_pipes({ x=pos.x-1, y=pos.y , z=pos.z }) + autoroute_pipes({ x=pos.x+1, y=pos.y , z=pos.z }) + autoroute_pipes({ x=pos.x , y=pos.y-1, z=pos.z }) + autoroute_pipes({ x=pos.x , y=pos.y+1, z=pos.z }) + autoroute_pipes({ x=pos.x , y=pos.y , z=pos.z-1 }) + autoroute_pipes({ x=pos.x , y=pos.y , z=pos.z+1 }) + autoroute_pipes(pos) +end + +-- auto-rotation code for various devices the tubes attach to + +function pipeworks.scan_pipe_surroundings(pos) + local pxm=0 + local pxp=0 + local pym=0 + local pyp=0 + local pzm=0 + local pzp=0 + + local nxm = minetest.get_node({ x=pos.x-1, y=pos.y , z=pos.z }) + local nxp = minetest.get_node({ x=pos.x+1, y=pos.y , z=pos.z }) + local nym = minetest.get_node({ x=pos.x , y=pos.y-1, z=pos.z }) + local nyp = minetest.get_node({ x=pos.x , y=pos.y+1, z=pos.z }) + local nzm = minetest.get_node({ x=pos.x , y=pos.y , z=pos.z-1 }) + local nzp = minetest.get_node({ x=pos.x , y=pos.y , z=pos.z+1 }) + + if (string.find(nxm.name, "pipeworks:pipe_") ~= nil) then pxm=1 end + if (string.find(nxp.name, "pipeworks:pipe_") ~= nil) then pxp=1 end + if (string.find(nym.name, "pipeworks:pipe_") ~= nil) then pym=1 end + if (string.find(nyp.name, "pipeworks:pipe_") ~= nil) then pyp=1 end + if (string.find(nzm.name, "pipeworks:pipe_") ~= nil) then pzm=1 end + if (string.find(nzp.name, "pipeworks:pipe_") ~= nil) then pzp=1 end + +-- Special handling for valves... + + if (string.find(nxm.name, "pipeworks:valve") ~= nil) + and (nxm.param2 == 0 or nxm.param2 == 2) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:valve") ~= nil) + and (nxp.param2 == 0 or nxp.param2 == 2) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:valve") ~= nil) + and (nzm.param2 == 1 or nzm.param2 == 3) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:valve") ~= nil) + and (nzp.param2 == 1 or nzp.param2 == 3) then + pzp=1 + end + +-- ...flow sensors... + + if (string.find(nxm.name, "pipeworks:flow_sensor") ~= nil) + and (nxm.param2 == 0 or nxm.param2 == 2) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:flow_sensor") ~= nil) + and (nxp.param2 == 0 or nxp.param2 == 2) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:flow_sensor") ~= nil) + and (nzm.param2 == 1 or nzm.param2 == 3) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:flow_sensor") ~= nil) + and (nzp.param2 == 1 or nzp.param2 == 3) then + pzp=1 + end + +-- ...spigots... + + if (string.find(nxm.name, "pipeworks:spigot") ~= nil) + and nxm.param2 == 1 then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:spigot") ~= nil) + and nxp.param2 == 3 then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:spigot") ~= nil) + and nzm.param2 == 0 then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:spigot") ~= nil) + and nzp.param2 == 2 then + pzp=1 + end + +-- ...sealed pipe entry/exit... + + if (string.find(nxm.name, "pipeworks:entry_panel") ~= nil) + and (nxm.param2 == 1 or nxm.param2 == 3) then + pxm=1 + end + + if (string.find(nxp.name, "pipeworks:entry_panel") ~= nil) + and (nxp.param2 == 1 or nxp.param2 == 3) then + pxp=1 + end + + if (string.find(nzm.name, "pipeworks:entry_panel") ~= nil) + and (nzm.param2 == 0 or nzm.param2 == 2) then + pzm=1 + end + + if (string.find(nzp.name, "pipeworks:entry_panel") ~= nil) + and (nzp.param2 == 0 or nzp.param2 == 2) then + pzp=1 + end + + if (string.find(nym.name, "pipeworks:entry_panel") ~= nil) + and nym.param2 == 13 then + pym=1 + end + + if (string.find(nyp.name, "pipeworks:entry_panel") ~= nil) + and nyp.param2 == 13 then + pyp=1 + end + + +-- ...pumps, grates... + + if (string.find(nym.name, "pipeworks:grating") ~= nil) or + (string.find(nym.name, "pipeworks:pump") ~= nil) then + pym=1 + end + +-- ...fountainheads... + + if (string.find(nyp.name, "pipeworks:fountainhead") ~= nil) then + pyp=1 + end + +-- ... and storage tanks. + + if (string.find(nym.name, "pipeworks:storage_tank_") ~= nil) then + pym=1 + end + + if (string.find(nyp.name, "pipeworks:storage_tank_") ~= nil) then + pyp=1 + end + +-- ...extra devices specified via the function's parameters +-- ...except that this part is not implemented yet +-- +-- xxx = nxm, nxp, nym, nyp, nzm, or nzp depending on the direction to check +-- yyy = pxm, pxp, pym, pyp, pzm, or pzp accordingly. +-- +-- if string.find(xxx.name, "modname:nodename") ~= nil then +-- yyy = 1 +-- end +-- +-- for example: +-- +-- if string.find(nym.name, "aero:outlet") ~= nil then +-- pym = 1 +-- end +-- + + return pxm+8*pxp+2*pym+16*pyp+4*pzm+32*pzp +end + +function pipeworks.look_for_stackable_tanks(pos) + local tym = minetest.get_node({ x=pos.x , y=pos.y-1, z=pos.z }) + + if string.find(tym.name, "pipeworks:storage_tank_") ~= nil or + string.find(tym.name, "pipeworks:expansion_tank_") ~= nil then + minetest.add_node(pos, { name = "pipeworks:expansion_tank_0", param2 = tym.param2}) + end +end + diff --git a/mods/pipeworks/autoplace_tubes.lua b/mods/pipeworks/autoplace_tubes.lua new file mode 100644 index 0000000..280bd60 --- /dev/null +++ b/mods/pipeworks/autoplace_tubes.lua @@ -0,0 +1,122 @@ +-- autorouting for pneumatic tubes + +local function is_tube(nodename) + return table.contains(pipeworks.tubenodes, nodename) +end + +--a function for determining which side of the node we are on +local function nodeside(node, tubedir) + if node.param2 < 0 or node.param2 > 23 then + node.param2 = 0 + end + + local backdir = minetest.facedir_to_dir(node.param2) + local back = vector.dot(backdir, tubedir) + if back == 1 then + return "back" + elseif back == -1 then + return "front" + end + + local topdir = minetest.facedir_to_top_dir(node.param2) + local top = vector.dot(topdir, tubedir) + if top == 1 then + return "top" + elseif top == -1 then + return "bottom" + end + + local rightdir = minetest.facedir_to_right_dir(node.param2) + local right = vector.dot(rightdir, tubedir) + if right == 1 then + return "right" + else + return "left" + end +end + +local vts = {0, 3, 1, 4, 2, 5} +local tube_table = {[0] = 1, 2, 2, 4, 2, 4, 4, 5, 2, 3, 4, 6, 4, 6, 5, 7, 2, 4, 3, 6, 4, 5, 6, 7, 4, 6, 6, 8, 5, 7, 7, 9, 2, 4, 4, 5, 3, 6, 6, 7, 4, 6, 5, 7, 6, 8, 7, 9, 4, 5, 6, 7, 6, 7, 8, 9, 5, 7, 7, 9, 7, 9, 9, 10} +local tube_table_facedirs = {[0] = 0, 0, 5, 0, 3, 4, 3, 0, 2, 0, 2, 0, 6, 4, 3, 0, 7, 12, 5, 12, 7, 4, 5, 5, 18, 20, 16, 0, 7, 4, 7, 0, 1, 8, 1, 1, 1, 13, 1, 1, 10, 8, 2, 2, 17, 4, 3, 6, 9, 9, 9, 9, 21, 13, 1, 1, 10, 10, 11, 2, 19, 4, 3, 0} +local function tube_autoroute(pos) + local active = {0, 0, 0, 0, 0, 0} + local nctr = minetest.get_node(pos) + if not is_tube(nctr.name) then return end + + local adjustments = { + {x = -1, y = 0, z = 0}, + {x = 1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}, + {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = -1}, + {x = 0, y = 0, z = 1} + } + -- xm = 1, xp = 2, ym = 3, yp = 4, zm = 5, zp = 6 + + local positions = {} + local nodes = {} + for i, adj in ipairs(adjustments) do + positions[i] = vector.add(pos, adj) + nodes[i] = minetest.get_node(positions[i]) + end + + for i, node in ipairs(nodes) do + local idef = minetest.registered_nodes[node.name] + -- handle the tubes themselves + if is_tube(node.name) then + active[i] = 1 + -- handle new style connectors + elseif idef and idef.tube and idef.tube.connect_sides then + local dir = adjustments[i] + if idef.tube.connect_sides[nodeside(node, vector.multiply(dir, -1))] then + active[i] = 1 + end + end + end + + -- all sides checked, now figure which tube to use. + + local nodedef = minetest.registered_nodes[nctr.name] + local basename = nodedef.basename + if nodedef.style == "old" then + local nsurround = "" + for i, n in ipairs(active) do + nsurround = nsurround..n + end + nctr.name = basename.."_"..nsurround + elseif nodedef.style == "6d" then + local s = 0 + for i, n in ipairs(active) do + if n == 1 then + s = s + 2^vts[i] + end + end + nctr.name = basename.."_"..tube_table[s] + nctr.param2 = tube_table_facedirs[s] + end + minetest.swap_node(pos, nctr) +end + +function pipeworks.scan_for_tube_objects(pos) + for side = 0, 6 do + tube_autoroute(vector.add(pos, directions.side_to_dir(side))) + end +end + +function pipeworks.after_place(pos) + pipeworks.scan_for_tube_objects(pos) +end + +function pipeworks.after_dig(pos) + pipeworks.scan_for_tube_objects(pos) +end + +if minetest.get_modpath("mesecons_mvps") then + mesecon.register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + pipeworks.scan_for_tube_objects(n.pos) + pipeworks.scan_for_tube_objects(n.oldpos) + end + end) +end + diff --git a/mods/pipeworks/changelog.txt b/mods/pipeworks/changelog.txt new file mode 100644 index 0000000..251df29 --- /dev/null +++ b/mods/pipeworks/changelog.txt @@ -0,0 +1,93 @@ +Changelog +--------- + +2013-01-13: Tubes can transport items now! Namely, I added Novatux/Nore's item +transport mod as a default part of this mod, to make tubes do something useful! +Thanks to Nore and RealBadAngel for the code contributions! + +2013-01-05: made storage tanks connect from top/bottom, made storage tank and +pipe textures use the ^ combine operator so they can show the actual liquid +going through the pipes/tanks. + +2013-01-04 (a bit later): Made pipes able to carry water! It was just a minor +logic error resulting from moving the water flowing code into it's own file +when I originally imported it. Many thanks to Mauvebic for writing it! + +2013-01-04: First stage of integrating Mauvebic's water flowing code. This is +experimental and doesn't move water yet - but at least it doesn't break +anything :-) + +2013-01-01: Various minor tweaks to textures, facedir settings, some other +stuff. Changed crafting recipes to account for revamped pumps, valves, etc. +Now requires the moreores mod and most recent git (for mese crystal fragments) +to craft a pump. Added a "sealed" entry/exit panel (really just a horizontal +pipe with a metal panel overlayed into the middle). Also, tweaked pipes to +always drop the empty ones. Revamped pumps so that now they should sit in/on +liquid and be connected only from the top, relegated grates to decorational- +only, added outlet spigot. Got rid of a few obsolete textures. Got rid of +that whole _x and _z naming thing - now all directional devices (pumps, valves, +spigots, tanks) use facedir. Valves, spigots no longer auto-rotate to find +nearby pipes. + +2012-09-17: Added test object for pneumatic tube autorouting code, made tubes +connect to it and any object that bears groups={tubedevice=1} (connects to any +side) + +2012-09-05: All recipes doubled except for junglegrass -> plastic sheet (since +that is derived from home decor) + +2012-09-02: Fixed plastic sheeting recipe. Added crafting recipes for various +objects, with options: If homedecor is installed, use the plastic sheeting +therein. If not, we define it manually. If the Technic mod is installed, +don't define any recipes at all. Also removed the extra "loaded!" messages and +tweaked the default pipe alias to point to something that is actually visible +:-) + +2012-09-01: flattened wielded pipe segment. + +2012-08-24: Added square-ish pneumatic tubes with their own autoplace code +(does not connect to steel pipes or pipe-oriented devices), then revised their +textures shortly after. Fixed a recursion bug that sometimes caused a stack +overflow. Old pipes were overriding the pipeworks:pipe defintion that belongs +with the new pipes. + +2012-08-22: Added outlet grate, made it participate in autoplace algorithm. +Extended storage tank to show fill level in 10% steps (0% to 100%). Added +"expansion tank" that appears if the user stacks tanks upwards. (Downwards is +not checked). + +2012-08-21: Made storage tank participate in autoplace algorithm. Tuned API a +little to allow for more flexible placement. Re-organized code a bit to allow +for some upcoming rules changes. Made storage tanks' upper/lower fittins and +intake grate participate in autoplace algorithm. + +2012-08-20: Added temporary nodes for storage tank and intake grating, but +without autoplace. + +2012-08-19: Pumps and valves now fully participate in the +auto-rotate/auto-place algorithm. + +2012-08-18: Total rewrite again. All pipes are now nice and round-looking, and +they auto-connect! Also added temporary nodes for pump and valve (each with an +on/off setting - punch to change). No crafting recipes yet and the pipes still +don't do anything useful yet. Soon. + +2012-08-06: Moved this changelog off the forum post and into a separate file. + +2012-08-05 (multiple updates): Rewrote pipeworks to use loops and tables to +create the nodes. Requires far less code now. Added -X, +X, -Y, +Y, -Z, +Z +capped stubs and a short centered horizontal segment. Changed node definitions +so that the aforementioned "short centered" segment is given on dig/drop. +Renamed it to just "pipeworks:pipe" (and pipe_loaded). Added empty/loaded +indicator images to the capped ends, removed some redundant comments. Made the +empty/loaded indication at the capped end more prominent. + +2012-07-21: Added screenshot showing pipes as they look now that nodebox +texture rotation is fixed. + +2012-07-18: Changed the mod name and all internals to 'pipeworks' instead of +'pipes'... after a couple of mistakes :-) + +2012-07-12: moved project to github. + +2012-06-23: Initial release, followed by reworking the textures a bit. diff --git a/mods/pipeworks/common.lua b/mods/pipeworks/common.lua new file mode 100644 index 0000000..1ee734f --- /dev/null +++ b/mods/pipeworks/common.lua @@ -0,0 +1,157 @@ +---------------------- +-- Vector functions -- +---------------------- + +function vector.cross(a, b) + return { + x = a.y * b.z - a.z * b.y, + y = a.z * b.x - a.x * b.z, + z = a.x * b.y - a.y * b.x + } +end + +function vector.dot(a, b) + return a.x * b.x + a.y * b.y + a.z * b.z +end + +----------------------- +-- Facedir functions -- +----------------------- + +function minetest.facedir_to_top_dir(facedir) + return ({[0] = {x = 0, y = 1, z = 0}, + {x = 0, y = 0, z = 1}, + {x = 0, y = 0, z = -1}, + {x = 1, y = 0, z = 0}, + {x = -1, y = 0, z = 0}, + {x = 0, y = -1, z = 0}}) + [math.floor(facedir / 4)] +end + +function minetest.facedir_to_right_dir(facedir) + return vector.cross( + minetest.facedir_to_top_dir(facedir), + minetest.facedir_to_dir(facedir) + ) +end + +directions = {} +function directions.side_to_dir(side) + return ({[0] = vector.new(), + vector.new( 0, 1, 0), + vector.new( 0, -1, 0), + vector.new( 1, 0, 0), + vector.new(-1, 0, 0), + vector.new( 0, 0, 1), + vector.new( 0, 0, -1) + })[side] +end + +function directions.dir_to_side(dir) + local c = vector.dot(dir, vector.new(1, 2, 3)) + 4 + return ({6, 2, 4, 0, 3, 1, 5})[c] +end + +---------------------- +-- String functions -- +---------------------- + +--[[function string.split(str, sep) + local fields = {} + local index = 1 + local expr = "([^"..sep.."])+" + string.gsub(str, expr, function(substring) + fields[index] = substring + index = index + 1 + end) + return fields +end]] + +function string.startswith(str, substr) + return str:sub(1, substr:len()) == substr +end + +--------------------- +-- Table functions -- +--------------------- + +function table.contains(tbl, element) + for _, elt in pairs(tbl) do + if elt == element then + return true + end + end + return false +end + +function table.extend(tbl, tbl2) + local index = #tbl + 1 + for _, elt in ipairs(tbl2) do + tbl[index] = elt + index = index + 1 + end +end + +function table.recursive_replace(tbl, pattern, replace_with) + if type(tbl) == "table" then + local tbl2 = {} + for key, value in pairs(tbl) do + tbl2[key] = table.recursive_replace(value, pattern, replace_with) + end + return tbl2 + elseif type(tbl) == "string" then + return tbl:gsub(pattern, replace_with) + else + return tbl + end +end + +------------------------ +-- Formspec functions -- +------------------------ + +fs_helpers = {} +function fs_helpers.on_receive_fields(pos, fields) + local meta = minetest.get_meta(pos) + for field, value in pairs(fields) do + if field:startswith("fs_helpers_cycling:") then + local l = field:split(":") + local new_value = tonumber(l[2]) + local meta_name = l[3] + meta:set_int(meta_name, new_value) + end + end +end + +function fs_helpers.cycling_button(meta, base, meta_name, values) + local current_value = meta:get_int(meta_name) + local new_value = (current_value + 1) % (#values) + local val = values[current_value + 1] + local text + local texture_name = nil + local addopts = nil + --when we get a table, we know the caller wants an image_button + if type(val) == "table" then + text = val["text"] + texture_name = val["texture"] + addopts = val["addopts"] + else + text = val + end + local field = "fs_helpers_cycling:"..new_value..":"..meta_name + return base..";"..(texture_name and texture_name..";" or "")..field..";"..minetest.formspec_escape(text)..(addopts and ";"..addopts or "").."]" +end + +--------- +-- Env -- +--------- + +function minetest.load_position(pos) + if pos.x < -30912 or pos.y < -30912 or pos.z < -30912 or + pos.x > 30927 or pos.y > 30927 or pos.z > 30927 then return end + if minetest.get_node_or_nil(pos) then + return + end + local vm = minetest.get_voxel_manip() + vm:read_from_map(pos, pos) +end diff --git a/mods/pipeworks/compat.lua b/mods/pipeworks/compat.lua new file mode 100644 index 0000000..c89e492 --- /dev/null +++ b/mods/pipeworks/compat.lua @@ -0,0 +1,145 @@ +-- this bit of code modifies the default chests and furnaces to be compatible +-- with pipeworks. + +minetest.override_item("default:furnace", { + tiles = { + "default_furnace_top.png^pipeworks_tube_connection_stony.png", + "default_furnace_bottom.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_front.png" + }, + groups = {cracky = 2, tubedevice = 1, tubedevice_receiver = 1}, + tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:add_item("fuel",stack) + else + return inv:add_item("src",stack) + end + end, + can_insert = function(pos,node,stack,direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:room_for_item("fuel", stack) + else + return inv:room_for_item("src", stack) + end + end, + input_inventory = "dst", + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig +}) + +minetest.override_item("default:furnace_active", { + tiles = { + "default_furnace_top.png^pipeworks_tube_connection_stony.png", + "default_furnace_bottom.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + "default_furnace_side.png^pipeworks_tube_connection_stony.png", + { + image = "default_furnace_front_active.png", + backface_culling = false, + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1.5 + }, + } + }, + groups = {cracky = 2, tubedevice = 1, tubedevice_receiver = 1, not_in_creative_inventory = 1}, + tube = { + insert_object = function(pos,node,stack,direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:add_item("fuel", stack) + else + return inv:add_item("src", stack) + end + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + if direction.y == 1 then + return inv:room_for_item("fuel", stack) + else + return inv:room_for_item("src", stack) + end + end, + input_inventory = "dst", + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig +}) + +minetest.override_item("default:chest", { + tiles = { + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_front.png" + }, + groups = {choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1}, + tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main", stack) + end, + input_inventory = "main", + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig +}) + +minetest.override_item("default:chest_locked", { + tiles = { + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_top.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_side.png^pipeworks_tube_connection_wooden.png", + "default_chest_lock.png" + }, + groups = {choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1, tubedevice_receiver = 1}, + tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item("main", stack) + end, + can_insert = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("main", stack) + end, + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, + after_place_node = function (pos, placer) + local meta = minetest.get_meta(pos) + meta:set_string("owner", placer:get_player_name() or "") + meta:set_string("infotext", "Locked Chest (owned by ".. + meta:get_string("owner")..")") + pipeworks.after_place(pos) + end, + after_dig_node = pipeworks.after_dig +}) + diff --git a/mods/pipeworks/crafts.lua b/mods/pipeworks/crafts.lua new file mode 100644 index 0000000..63a04b7 --- /dev/null +++ b/mods/pipeworks/crafts.lua @@ -0,0 +1,151 @@ +-- Crafting recipes for pipes + +minetest.register_craft( { + output = "pipeworks:pipe_1_empty 12", + recipe = { + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + { "", "", "" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:spigot 3", + recipe = { + { "pipeworks:pipe_1_empty", "" }, + { "", "pipeworks:pipe_1_empty" }, + }, +}) + +minetest.register_craft( { + output = "pipeworks:entry_panel_empty 2", + recipe = { + { "", "default:steel_ingot", "" }, + { "", "pipeworks:pipe_1_empty", "" }, + { "", "default:steel_ingot", "" }, + }, +}) + +-- Various ancillary pipe devices + +minetest.register_craft( { + output = "pipeworks:pump_off 2", + recipe = { + { "default:stone", "default:steel_ingot", "default:stone" }, + { "default:copper_ingot", "default:mese_crystal_fragment", "default:copper_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:valve_off_empty 2", + recipe = { + { "", "group:stick", "" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + { "", "default:steel_ingot", "" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:storage_tank_0 2", + recipe = { + { "", "default:steel_ingot", "default:steel_ingot" }, + { "default:steel_ingot", "default:glass", "default:steel_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:grating 2", + recipe = { + { "default:steel_ingot", "", "default:steel_ingot" }, + { "", "pipeworks:pipe_1_empty", "" }, + { "default:steel_ingot", "", "default:steel_ingot" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:flow_sensor_empty 2", + recipe = { + { "pipeworks:pipe_1_empty", "mesecons:mesecon", "pipeworks:pipe_1_empty" }, + }, +}) + +minetest.register_craft( { + output = "pipeworks:fountainhead 2", + recipe = { + { "pipeworks:pipe_1_empty" }, + { "pipeworks:pipe_1_empty" } + }, +}) + + +-- Crafting recipes for pneumatic tubes + +-- If homedecor is not installed, we need to register its crafting chain for +-- plastic sheeting so that pipeworks remains compatible with it. + +if minetest.get_modpath("homedecor") == nil then + + minetest.register_craftitem(":homedecor:oil_extract", { + description = "Oil extract", + inventory_image = "homedecor_oil_extract.png", + }) + + minetest.register_craftitem(":homedecor:paraffin", { + description = "Unprocessed paraffin", + inventory_image = "homedecor_paraffin.png", + }) + + minetest.register_alias("homedecor:plastic_base", "homedecor:paraffin") + + minetest.register_craftitem(":homedecor:plastic_sheeting", { + description = "Plastic sheet", + inventory_image = "homedecor_plastic_sheeting.png", + }) + + minetest.register_craft({ + type = "shapeless", + output = "homedecor:oil_extract 4", + recipe = { + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves", + "group:leaves" + } + }) + + minetest.register_craft({ + type = "cooking", + output = "homedecor:paraffin", + recipe = "homedecor:oil_extract", + }) + + minetest.register_craft({ + type = "cooking", + output = "homedecor:plastic_sheeting", + recipe = "homedecor:paraffin", + }) + + minetest.register_craft({ + type = "fuel", + recipe = "homedecor:oil_extract", + burntime = 30, + }) + + minetest.register_craft({ + type = "fuel", + recipe = "homedecor:paraffin", + burntime = 30, + }) + + minetest.register_craft({ + type = "fuel", + recipe = "homedecor:plastic_sheeting", + burntime = 30, + }) +end + + diff --git a/mods/pipeworks/decorative_tubes.lua b/mods/pipeworks/decorative_tubes.lua new file mode 100644 index 0000000..39ba8f3 --- /dev/null +++ b/mods/pipeworks/decorative_tubes.lua @@ -0,0 +1,83 @@ +local straight = function(pos, node, velocity, stack) return {velocity} end + +minetest.register_node("pipeworks:steel_block_embedded_tube", { + description = "Airtight steelblock embedded tube", + tiles = { + "default_steel_block.png", "default_steel_block.png", + "default_steel_block.png", "default_steel_block.png", + "default_steel_block.png^pipeworks_tube_connection_metallic.png", + "default_steel_block.png^pipeworks_tube_connection_metallic.png", + }, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + tube = { + connect_sides = {front = 1, back = 1,}, + priority = 50, + can_go = straight, + can_insert = function(pos, node, stack, direction) + local dir = minetest.facedir_to_dir(node.param2) + return vector.equals(dir, direction) or vector.equals(vector.multiply(dir, -1), direction) + end, + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, +}) + +minetest.register_craft( { + output = "pipeworks:steel_block_embedded_tube 1", + recipe = { + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + { "default:steel_ingot", "pipeworks:tube_1", "default:steel_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" } + }, +}) + +local pane_box = { + type = "fixed", + fixed = { + { -9/64, -9/64, -8/16, 9/64, 9/64, 8/16 }, -- tube + { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } -- pane + } +} +minetest.register_node("pipeworks:steel_pane_embedded_tube", { + drawtype = "nodebox", + description = "Airtight panel embedded tube ", + tiles = { + "pipeworks_pane_embedded_tube_sides.png^[transformR90", + "pipeworks_pane_embedded_tube_sides.png^[transformR90", + "pipeworks_pane_embedded_tube_sides.png", + "pipeworks_pane_embedded_tube_sides.png", + "pipeworks_pane_embedded_tube_ends.png", "pipeworks_pane_embedded_tube_ends.png", + }, + node_box = pane_box, + selection_box = pane_box, + collision_box = pane_box, + paramtype = "light", + paramtype2 = "facedir", + groups = {cracky=1, oddly_breakable_by_hand = 1, tubedevice = 1}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + tube = { + connect_sides = {front = 1, back = 1,}, + priority = 50, + can_go = straight, + can_insert = function(pos, node, stack, direction) + local dir = minetest.facedir_to_dir(node.param2) + return vector.equals(dir, direction) or vector.equals(vector.multiply(dir, -1), direction) + end, + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, +}) + +minetest.register_craft( { + output = "pipeworks:steel_pane_embedded_tube 1", + recipe = { + { "", "default:steel_ingot", "" }, + { "", "pipeworks:tube_1", "" }, + { "", "default:steel_ingot", "" } + }, +}) diff --git a/mods/pipeworks/default_settings.txt b/mods/pipeworks/default_settings.txt new file mode 100644 index 0000000..a95038d --- /dev/null +++ b/mods/pipeworks/default_settings.txt @@ -0,0 +1,20 @@ +-- Various settings + +pipeworks.enable_pipes = true +pipeworks.enable_autocrafter = true +pipeworks.enable_deployer = true +pipeworks.enable_dispenser = true +pipeworks.enable_node_breaker = true +pipeworks.enable_teleport_tube = true +pipeworks.enable_pipe_devices = true +pipeworks.enable_redefines = true +pipeworks.enable_mese_tube = true +pipeworks.enable_detector_tube = true +pipeworks.enable_conductor_tube = true +pipeworks.enable_accelerator_tube = true +pipeworks.enable_crossing_tube = true +pipeworks.enable_sand_tube = true +pipeworks.enable_mese_sand_tube = true +pipeworks.enable_one_way_tube = true +pipeworks.enable_priority_tube = true +pipeworks.enable_cyclic_mode = true diff --git a/mods/pipeworks/depends.txt b/mods/pipeworks/depends.txt new file mode 100644 index 0000000..02a542c --- /dev/null +++ b/mods/pipeworks/depends.txt @@ -0,0 +1,3 @@ +default +mesecons? +mesecons_mvps? diff --git a/mods/pipeworks/devices.lua b/mods/pipeworks/devices.lua new file mode 100644 index 0000000..52f3002 --- /dev/null +++ b/mods/pipeworks/devices.lua @@ -0,0 +1,572 @@ +-- List of devices that should participate in the autoplace algorithm + +local pipereceptor_on = nil +local pipereceptor_off = nil + +if mesecon then + pipereceptor_on = { + receptor = { + state = mesecon.state.on, + rules = pipeworks.mesecons_rules + } + } + + pipereceptor_off = { + receptor = { + state = mesecon.state.off, + rules = pipeworks.mesecons_rules + } + } +end + +local pipes_devicelist = { + "pump", + "valve", + "storage_tank_0", + "storage_tank_1", + "storage_tank_2", + "storage_tank_3", + "storage_tank_4", + "storage_tank_5", + "storage_tank_6", + "storage_tank_7", + "storage_tank_8", + "storage_tank_9", + "storage_tank_10" +} + +-- Now define the nodes. + +local states = { "on", "off" } +local dgroups = "" + +for s in ipairs(states) do + + if states[s] == "off" then + dgroups = {snappy=3, pipe=1} + else + dgroups = {snappy=3, pipe=1, not_in_creative_inventory=1} + end + + minetest.register_node("pipeworks:pump_"..states[s], { + description = "Pump/Intake Module", + drawtype = "mesh", + mesh = "pipeworks_pump.obj", + tiles = { "pipeworks_pump_"..states[s]..".png" }, + paramtype = "light", + paramtype2 = "facedir", + groups = dgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + drop = "pipeworks:pump_off", + mesecons = {effector = { + action_on = function (pos, node) + minetest.add_node(pos,{name="pipeworks:pump_on", param2 = node.param2}) + end, + action_off = function (pos, node) + minetest.add_node(pos,{name="pipeworks:pump_off", param2 = node.param2}) + end + }}, + on_punch = function(pos, node, puncher) + local fdir = minetest.get_node(pos).param2 + minetest.add_node(pos, { name = "pipeworks:pump_"..states[3-s], param2 = fdir }) + end + }) + + minetest.register_node("pipeworks:valve_"..states[s].."_empty", { + description = "Valve", + drawtype = "mesh", + mesh = "pipeworks_valve_"..states[s]..".obj", + tiles = { "pipeworks_valve.png" }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + }, + collision_box = { + type = "fixed", + fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + }, + groups = dgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + drop = "pipeworks:valve_off_empty", + mesecons = {effector = { + action_on = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2}) + end, + action_off = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2}) + end + }}, + on_punch = function(pos, node, puncher) + local fdir = minetest.get_node(pos).param2 + minetest.add_node(pos, { name = "pipeworks:valve_"..states[3-s].."_empty", param2 = fdir }) + end + }) +end + +minetest.register_node("pipeworks:valve_on_loaded", { + description = "Valve", + drawtype = "mesh", + mesh = "pipeworks_valve_on.obj", + tiles = { "pipeworks_valve.png" }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + }, + collision_box = { + type = "fixed", + fixed = { -8/16, -4/16, -5/16, 8/16, 5/16, 5/16 } + }, + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + drop = "pipeworks:valve_off_empty", + mesecons = {effector = { + action_on = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_on_empty", param2 = node.param2}) + end, + action_off = function (pos, node) + minetest.add_node(pos,{name="pipeworks:valve_off_empty", param2 = node.param2}) + end + }}, + on_punch = function(pos, node, puncher) + local fdir = minetest.get_node(pos).param2 + minetest.add_node(pos, { name = "pipeworks:valve_off_empty", param2 = fdir }) + end +}) + +-- grating + +minetest.register_node("pipeworks:grating", { + description = "Decorative grating", + tiles = { + "pipeworks_grating_top.png", + "pipeworks_grating_sides.png", + "pipeworks_grating_sides.png", + "pipeworks_grating_sides.png", + "pipeworks_grating_sides.png", + "pipeworks_grating_sides.png" + }, + sunlight_propagates = true, + paramtype = "light", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, +}) + +-- outlet spigot + +minetest.register_node("pipeworks:spigot", { + description = "Spigot outlet", + drawtype = "mesh", + mesh = "pipeworks_spigot.obj", + tiles = { "pipeworks_spigot.png" }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + selection_box = { + type = "fixed", + fixed = { -2/16, -6/16, -2/16, 2/16, 2/16, 8/16 } + }, + collision_box = { + type = "fixed", + fixed = { -2/16, -6/16, -2/16, 2/16, 2/16, 8/16 } + } +}) + +minetest.register_node("pipeworks:spigot_pouring", { + description = "Spigot outlet", + drawtype = "mesh", + mesh = "pipeworks_spigot_pouring.obj", + tiles = { + { + name = "default_water_flowing_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 0.8, + }, + }, + { name = "pipeworks_spigot.png" } + }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + selection_box = { + type = "fixed", + fixed = { -2/16, -6/16, -2/16, 2/16, 2/16, 8/16 } + }, + collision_box = { + type = "fixed", + fixed = { -2/16, -6/16, -2/16, 2/16, 2/16, 8/16 } + }, + drop = "pipeworks:spigot", +}) + +-- sealed pipe entry/exit (horizontal pipe passing through a metal +-- wall, for use in places where walls should look like they're airtight) + +local panel_cbox = { + type = "fixed", + fixed = { + { -2/16, -2/16, -8/16, 2/16, 2/16, 8/16 }, + { -8/16, -8/16, -1/16, 8/16, 8/16, 1/16 } + } +} + +minetest.register_node("pipeworks:entry_panel_empty", { + description = "Airtight Pipe entry/exit", + drawtype = "mesh", + mesh = "pipeworks_entry_panel.obj", + tiles = { "pipeworks_entry_panel.png" }, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + selection_box = panel_cbox, + collision_box = panel_cbox, + on_place = function(itemstack, placer, pointed_thing) + local playername = placer:get_player_name() + if not minetest.is_protected(pointed_thing.under, playername) + and not minetest.is_protected(pointed_thing.above, playername) then + local node = minetest.get_node(pointed_thing.under) + + if not minetest.registered_nodes[node.name] + or not minetest.registered_nodes[node.name].on_rightclick then + local pitch = placer:get_look_pitch() + local above = pointed_thing.above + local under = pointed_thing.under + local fdir = minetest.dir_to_facedir(placer:get_look_dir()) + local undernode = minetest.get_node(under) + local abovenode = minetest.get_node(above) + local uname = undernode.name + local aname = abovenode.name + local isabove = (above.x == under.x) and (above.z == under.z) and (pitch > 0) + local pos1 = above + + if above.x == under.x + and above.z == under.z + and ( string.find(uname, "pipeworks:pipe_") + or string.find(uname, "pipeworks:storage_") + or string.find(uname, "pipeworks:expansion_") + or ( string.find(uname, "pipeworks:grating") and not isabove ) + or ( string.find(uname, "pipeworks:pump_") and not isabove ) + or ( string.find(uname, "pipeworks:entry_panel") + and undernode.param2 == 13 ) + ) + then + fdir = 13 + end + + if minetest.registered_nodes[uname]["buildable_to"] then + pos1 = under + end + + if not minetest.registered_nodes[minetest.get_node(pos1).name]["buildable_to"] then return end + + minetest.add_node(pos1, {name = "pipeworks:entry_panel_empty", param2 = fdir }) + pipeworks.scan_for_pipe_objects(pos1) + + if not pipeworks.expect_infinite_stacks then + itemstack:take_item() + end + + else + minetest.registered_nodes[node.name].on_rightclick(pointed_thing.under, node, placer, itemstack) + end + end + return itemstack + end +}) + +minetest.register_node("pipeworks:entry_panel_loaded", { + description = "Airtight Pipe entry/exit", + drawtype = "mesh", + mesh = "pipeworks_entry_panel.obj", + tiles = { "pipeworks_entry_panel.png" }, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + selection_box = panel_cbox, + collision_box = panel_cbox, + drop = "pipeworks:entry_panel_empty" +}) + +minetest.register_node("pipeworks:flow_sensor_empty", { + description = "Flow Sensor", + drawtype = "mesh", + mesh = "pipeworks_flow_sensor.obj", + tiles = { "pipeworks_flow_sensor_off.png" }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon.receptor_off(pos, rules) + end + end, + selection_box = { + type = "fixed", + fixed = { + { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, + { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + } + }, + collision_box = { + type = "fixed", + fixed = { + { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, + { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + } + }, + mesecons = pipereceptor_off +}) + +minetest.register_node("pipeworks:flow_sensor_loaded", { + description = "Flow sensor (on)", + drawtype = "mesh", + mesh = "pipeworks_flow_sensor.obj", + tiles = { "pipeworks_flow_sensor_on.png" }, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon.receptor_on(pos, rules) + end + end, + selection_box = { + type = "fixed", + fixed = { + { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, + { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + } + }, + collision_box = { + type = "fixed", + fixed = { + { -8/16, -2/16, -2/16, 8/16, 2/16, 2/16 }, + { -4/16, -3/16, -3/16, 4/16, 3/16, 3/16 }, + } + }, + drop = "pipeworks:flow_sensor_empty", + mesecons = pipereceptor_on +}) + +-- tanks + +for fill = 0, 10 do + local filldesc="empty" + local sgroups = {snappy=3, pipe=1, tankfill=fill+1} + local image = nil + + if fill ~= 0 then + filldesc=fill.."0% full" + sgroups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1} + image = "pipeworks_storage_tank_fittings.png" + end + + minetest.register_node("pipeworks:expansion_tank_"..fill, { + description = "Expansion Tank ("..filldesc..")... You hacker, you.", + tiles = { + "pipeworks_storage_tank_fittings.png", + "pipeworks_storage_tank_fittings.png", + "pipeworks_storage_tank_back.png", + "pipeworks_storage_tank_back.png", + "pipeworks_storage_tank_back.png", + pipeworks.liquid_texture.."^pipeworks_storage_tank_front_"..fill..".png" + }, + inventory_image = image, + paramtype = "light", + paramtype2 = "facedir", + groups = {snappy=3, pipe=1, tankfill=fill+1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + drop = "pipeworks:storage_tank_0", + after_place_node = function(pos) + pipeworks.look_for_stackable_tanks(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + }) + + minetest.register_node("pipeworks:storage_tank_"..fill, { + description = "Fluid Storage Tank ("..filldesc..")", + tiles = { + "pipeworks_storage_tank_fittings.png", + "pipeworks_storage_tank_fittings.png", + "pipeworks_storage_tank_back.png", + "pipeworks_storage_tank_back.png", + "pipeworks_storage_tank_back.png", + pipeworks.liquid_texture.."^pipeworks_storage_tank_front_"..fill..".png" + }, + inventory_image = image, + paramtype = "light", + paramtype2 = "facedir", + groups = sgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + drop = "pipeworks:storage_tank_0", + after_place_node = function(pos) + pipeworks.look_for_stackable_tanks(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + }) +end + +-- fountainhead + +minetest.register_node("pipeworks:fountainhead", { + description = "Fountainhead", + drawtype = "mesh", + mesh = "pipeworks_fountainhead.obj", + tiles = { "pipeworks_fountainhead.png" }, + sunlight_propagates = true, + paramtype = "light", + groups = {snappy=3, pipe=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon.receptor_on(pos, rules) + end + end, + selection_box = { + type = "fixed", + fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } + }, + collision_box = { + type = "fixed", + fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } + }, +}) + +minetest.register_node("pipeworks:fountainhead_pouring", { + description = "Fountainhead", + drawtype = "mesh", + mesh = "pipeworks_fountainhead.obj", + tiles = { "pipeworks_fountainhead.png" }, + sunlight_propagates = true, + paramtype = "light", + groups = {snappy=3, pipe=1, not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + walkable = true, + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + on_construct = function(pos) + if mesecon then + mesecon.receptor_on(pos, rules) + end + end, + selection_box = { + type = "fixed", + fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } + }, + collision_box = { + type = "fixed", + fixed = { -2/16, -8/16, -2/16, 2/16, 8/16, 2/16 } + }, + drop = "pipeworks:fountainhead" +}) + +minetest.register_alias("pipeworks:valve_off_loaded", "pipeworks:valve_off_empty") +minetest.register_alias("pipeworks:entry_panel", "pipeworks:entry_panel_empty") + diff --git a/mods/pipeworks/filter-injector.lua b/mods/pipeworks/filter-injector.lua new file mode 100644 index 0000000..620b7b3 --- /dev/null +++ b/mods/pipeworks/filter-injector.lua @@ -0,0 +1,238 @@ +local function delay(x) + return (function() return x end) +end + +local function set_filter_infotext(data, meta) + local infotext = data.wise_desc.." Filter-Injector" + if meta:get_int("slotseq_mode") == 2 then + infotext = infotext .. " (slot #"..meta:get_int("slotseq_index").." next)" + end + meta:set_string("infotext", infotext) +end + +local function set_filter_formspec(data, meta) + local itemname = data.wise_desc.." Filter-Injector" + local formspec = "size[8,8.5]".. + "item_image[0,0;1,1;pipeworks:"..data.name.."]".. + "label[1,0;"..minetest.formspec_escape(itemname).."]".. + "label[0,1;Prefer item types:]".. + "list[context;main;0,1.5;8,2;]".. + fs_helpers.cycling_button(meta, "button[0,3.5;4,1", "slotseq_mode", + {"Sequence slots by Priority", + "Sequence slots Randomly", + "Sequence slots by Rotation"}).. + "list[current_player;main;0,4.5;8,4;]" + meta:set_string("formspec", formspec) +end + +-- todo SOON: this function has *way too many* parameters +local function grabAndFire(data,slotseq_mode,filtmeta,frominv,frominvname,frompos,fromnode,filterfor,fromtube,fromdef,dir,fakePlayer,all) + local sposes = {} + for spos,stack in ipairs(frominv:get_list(frominvname)) do + local matches + if filterfor == "" then + matches = stack:get_name() ~= "" + else + matches = stack:get_name() == filterfor.name + end + if matches then table.insert(sposes, spos) end + end + if #sposes == 0 then return false end + if slotseq_mode == 1 then + for i = #sposes, 2, -1 do + local j = math.random(i) + local t = sposes[j] + sposes[j] = sposes[i] + sposes[i] = t + end + elseif slotseq_mode == 2 then + local headpos = filtmeta:get_int("slotseq_index") + table.sort(sposes, function (a, b) + if a >= headpos then + if b < headpos then return true end + else + if b >= headpos then return false end + end + return a < b + end) + end + for _, spos in ipairs(sposes) do + local stack = frominv:get_stack(frominvname, spos) + local doRemove = stack:get_count() + if fromtube.can_remove then + doRemove = fromtube.can_remove(frompos, fromnode, stack, dir) + elseif fromdef.allow_metadata_inventory_take then + doRemove = fromdef.allow_metadata_inventory_take(frompos, frominvname,spos, stack, fakePlayer) + end + -- stupid lack of continue statements grumble + if doRemove > 0 then + if slotseq_mode == 2 then + local nextpos = spos + 1 + if nextpos > frominv:get_size(frominvname) then + nextpos = 1 + end + filtmeta:set_int("slotseq_index", nextpos) + set_filter_infotext(data, filtmeta) + end + local item + local count + if all then + count = math.min(stack:get_count(), doRemove) + if filterfor.count and filterfor.count > 1 then + count = math.min(filterfor.count, count) + end + else + count = 1 + end + if fromtube.remove_items then + -- it could be the entire stack... + item = fromtube.remove_items(frompos, fromnode, stack, dir, count) + else + item = stack:take_item(count) + frominv:set_stack(frominvname, spos, stack) + if fromdef.on_metadata_inventory_take then + fromdef.on_metadata_inventory_take(frompos, frominvname, spos, item, fakePlayer) + end + end + local pos = vector.add(frompos, vector.multiply(dir, 1.4)) + local start_pos = vector.add(frompos, dir) + local item1 = pipeworks.tube_inject_item(pos, start_pos, dir, item) + return true-- only fire one item, please + end + end + return false +end + +local function punch_filter(data, filtpos, filtnode) + local filtmeta = minetest.get_meta(filtpos) + local filtinv = filtmeta:get_inventory() + local owner = filtmeta:get_string("owner") + local fakePlayer = { + get_player_name = delay(owner), + } -- TODO: use a mechanism as the wielder one + local dir = minetest.facedir_to_right_dir(filtnode.param2) + local frompos = vector.subtract(filtpos, dir) + local fromnode = minetest.get_node(frompos) + if not fromnode then return end + local fromdef = minetest.registered_nodes[fromnode.name] + if not fromdef then return end + local fromtube = fromdef.tube + if not (fromtube and fromtube.input_inventory) then return end + local filters = {} + for _, filterstack in ipairs(filtinv:get_list("main")) do + local filtername = filterstack:get_name() + local filtercount = filterstack:get_count() + if filtername ~= "" then table.insert(filters, {name = filtername, count = filtercount}) end + end + if #filters == 0 then table.insert(filters, "") end + local slotseq_mode = filtmeta:get_int("slotseq_mode") + local frommeta = minetest.get_meta(frompos) + local frominv = frommeta:get_inventory() + if fromtube.before_filter then fromtube.before_filter(frompos) end + for _, frominvname in ipairs(type(fromtube.input_inventory) == "table" and fromtube.input_inventory or {fromtube.input_inventory}) do + local done = false + for _, filterfor in ipairs(filters) do + if grabAndFire(data, slotseq_mode, filtmeta, frominv, frominvname, frompos, fromnode, filterfor, fromtube, fromdef, dir, fakePlayer, data.stackwise) then + done = true + break + end + end + if done then break end + end + if fromtube.after_filter then fromtube.after_filter(frompos) end +end + +for _, data in ipairs({ + { + name = "filter", + wise_desc = "Itemwise", + stackwise = false, + }, + { + name = "mese_filter", + wise_desc = "Stackwise", + stackwise = true, + }, +}) do + minetest.register_node("pipeworks:"..data.name, { + description = data.wise_desc.." Filter-Injector", + tiles = { + "pipeworks_"..data.name.."_top.png", + "pipeworks_"..data.name.."_top.png", + "pipeworks_"..data.name.."_output.png", + "pipeworks_"..data.name.."_input.png", + "pipeworks_"..data.name.."_side.png", + "pipeworks_"..data.name.."_top.png", + }, + paramtype2 = "facedir", + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, mesecon = 2}, + legacy_facedir_simple = true, + sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.get_meta(pos) + set_filter_formspec(data, meta) + set_filter_infotext(data, meta) + local inv = meta:get_inventory() + inv:set_size("main", 8*2) + end, + after_place_node = function (pos, placer) + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + pipeworks.after_place(pos) + end, + after_dig_node = pipeworks.after_dig, + on_receive_fields = function(pos, formname, fields, sender) + if not pipeworks.may_configure(pos, sender) then return end + fs_helpers.on_receive_fields(pos, fields) + local meta = minetest.get_meta(pos) + meta:set_int("slotseq_index", 1) + set_filter_formspec(data, meta) + set_filter_infotext(data, meta) + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not pipeworks.may_configure(pos, player) then return 0 end + return count + end, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("main") + end, + mesecons = { + effector = { + action_on = function(pos, node) + punch_filter(data, pos, node) + end, + }, + }, + tube = {connect_sides = {right = 1}}, + on_punch = function (pos, node, puncher) + punch_filter(data, pos, node) + end, + }) +end + +minetest.register_craft( { + output = "pipeworks:filter 2", + recipe = { + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, + { "group:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } + }, +}) + +minetest.register_craft( { + output = "pipeworks:mese_filter 2", + recipe = { + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" }, + { "group:stick", "default:mese", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "default:steel_ingot", "homedecor:plastic_sheeting" } + }, +}) diff --git a/mods/pipeworks/flowing_logic.lua b/mods/pipeworks/flowing_logic.lua new file mode 100644 index 0000000..e0a6236 --- /dev/null +++ b/mods/pipeworks/flowing_logic.lua @@ -0,0 +1,121 @@ +-- This file provides the actual flow and pathfinding logic that makes water +-- move through the pipes. +-- +-- Contributed by mauvebic, 2013-01-03, rewritten a bit by Vanessa Ezekowitz +-- + +local finitewater = minetest.setting_getbool("liquid_finite") + +pipeworks.check_for_liquids = function(pos) + local coords = { + {x=pos.x,y=pos.y-1,z=pos.z}, + {x=pos.x,y=pos.y+1,z=pos.z}, + {x=pos.x-1,y=pos.y,z=pos.z}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z-1}, + {x=pos.x,y=pos.y,z=pos.z+1}, } + for i =1,6 do + local name = minetest.get_node(coords[i]).name + if name and string.find(name,"water") then + if finitewater then minetest.remove_node(coords[i]) end + return true + end + end + return false +end + +pipeworks.check_for_inflows = function(pos,node) + local coords = { + {x=pos.x,y=pos.y-1,z=pos.z}, + {x=pos.x,y=pos.y+1,z=pos.z}, + {x=pos.x-1,y=pos.y,z=pos.z}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z-1}, + {x=pos.x,y=pos.y,z=pos.z+1}, } + local newnode = false + local source = false + for i =1,6 do + if newnode then break end + local name = minetest.get_node(coords[i]).name + if name and (name == "pipeworks:pump_on" and pipeworks.check_for_liquids(coords[i])) or string.find(name,"_loaded") then + if string.find(name,"_loaded") then + source = minetest.get_meta(coords[i]):get_string("source") + if source == minetest.pos_to_string(pos) then break end + end + newnode = string.gsub(node.name,"empty","loaded") + source = {x=coords[i].x,y=coords[i].y,z=coords[i].z} + end + end + if newnode then + minetest.add_node(pos,{name=newnode, param2 = node.param2}) + minetest.get_meta(pos):set_string("source",minetest.pos_to_string(source)) + end +end + +pipeworks.check_sources = function(pos,node) + local sourcepos = minetest.string_to_pos(minetest.get_meta(pos):get_string("source")) + if not sourcepos then return end + local source = minetest.get_node(sourcepos).name + local newnode = false + if source and not ((source == "pipeworks:pump_on" and pipeworks.check_for_liquids(sourcepos)) or string.find(source,"_loaded") or source == "ignore" ) then + newnode = string.gsub(node.name,"loaded","empty") + end + + if newnode then + minetest.add_node(pos,{name=newnode, param2 = node.param2}) + minetest.get_meta(pos):set_string("source","") + end +end + +pipeworks.spigot_check = function(pos, node) + local belowname = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}).name + if belowname and (belowname == "air" or belowname == "default:water_flowing" or belowname == "default:water_source") then + local spigotname = minetest.get_node(pos).name + local fdir=node.param2 + local check = { + {x=pos.x,y=pos.y,z=pos.z+1}, + {x=pos.x+1,y=pos.y,z=pos.z}, + {x=pos.x,y=pos.y,z=pos.z-1}, + {x=pos.x-1,y=pos.y,z=pos.z} + } + local near_node = minetest.get_node(check[fdir+1]) + if near_node and string.find(near_node.name, "_loaded") then + if spigotname and spigotname == "pipeworks:spigot" then + minetest.add_node(pos,{name = "pipeworks:spigot_pouring", param2 = fdir}) + if finitewater or belowname ~= "default:water_source" then + minetest.add_node({x=pos.x,y=pos.y-1,z=pos.z},{name = "default:water_source"}) + end + end + else + if spigotname == "pipeworks:spigot_pouring" then + minetest.add_node({x=pos.x,y=pos.y,z=pos.z},{name = "pipeworks:spigot", param2 = fdir}) + if belowname == "default:water_source" and not finitewater then + minetest.remove_node({x=pos.x,y=pos.y-1,z=pos.z}) + end + end + end + end +end + +pipeworks.fountainhead_check = function(pos, node) + local abovename = minetest.get_node({x=pos.x,y=pos.y+1,z=pos.z}).name + if abovename and (abovename == "air" or abovename == "default:water_flowing" or abovename == "default:water_source") then + local fountainhead_name = minetest.get_node(pos).name + local near_node = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z}) + if near_node and string.find(near_node.name, "_loaded") then + if fountainhead_name and fountainhead_name == "pipeworks:fountainhead" then + minetest.add_node(pos,{name = "pipeworks:fountainhead_pouring"}) + if finitewater or abovename ~= "default:water_source" then + minetest.add_node({x=pos.x,y=pos.y+1,z=pos.z},{name = "default:water_source"}) + end + end + else + if fountainhead_name == "pipeworks:fountainhead_pouring" then + minetest.add_node({x=pos.x,y=pos.y,z=pos.z},{name = "pipeworks:fountainhead"}) + if abovename == "default:water_source" and not finitewater then + minetest.remove_node({x=pos.x,y=pos.y+1,z=pos.z}) + end + end + end + end +end diff --git a/mods/pipeworks/init.lua b/mods/pipeworks/init.lua new file mode 100644 index 0000000..92ce02c --- /dev/null +++ b/mods/pipeworks/init.lua @@ -0,0 +1,115 @@ +-- Pipeworks mod by Vanessa Ezekowitz - 2013-07-13 +-- +-- This mod supplies various steel pipes and plastic pneumatic tubes +-- and devices that they can connect to. +-- +-- License: WTFPL +-- + +pipeworks = {} + +local DEBUG = false + +pipeworks.worldpath = minetest.get_worldpath() +pipeworks.modpath = minetest.get_modpath("pipeworks") + +dofile(pipeworks.modpath.."/default_settings.txt") + +-- Read the external config file if it exists. +if io.open(pipeworks.worldpath.."/pipeworks_settings.txt","r") then + dofile(pipeworks.worldpath.."/pipeworks_settings.txt") + io.close() +end + +-- Random variables + +pipeworks.expect_infinite_stacks = true +if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then + pipeworks.expect_infinite_stacks = false +end + +pipeworks.meseadjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} + +pipeworks.rules_all = {{x=0, y=0, z=1},{x=0, y=0, z=-1},{x=1, y=0, z=0},{x=-1, y=0, z=0}, + {x=0, y=1, z=1},{x=0, y=1, z=-1},{x=1, y=1, z=0},{x=-1, y=1, z=0}, + {x=0, y=-1, z=1},{x=0, y=-1, z=-1},{x=1, y=-1, z=0},{x=-1, y=-1, z=0}, + {x=0, y=1, z=0}, {x=0, y=-1, z=0}} + +pipeworks.mesecons_rules={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=1,y=0,z=0},{x=-1,y=0,z=0},{x=0,y=1,z=0},{x=0,y=-1,z=0}} + +pipeworks.liquid_texture = "default_water.png" + +-- Helper functions + +function pipeworks.fix_image_names(table, replacement) + local outtable={} + for i in ipairs(table) do + outtable[i]=string.gsub(table[i], "_XXXXX", replacement) + end + + return outtable +end + +function pipeworks.add_node_box(t, b) + if not t or not b then return end + for i in ipairs(b) + do table.insert(t, b[i]) + end +end + +function pipeworks.may_configure(pos, player) + local name = player:get_player_name() + local meta = minetest.get_meta(pos) + local owner = meta:get_string("owner") + + if owner ~= "" then -- wielders and filters + return owner == name + end + return not minetest.is_protected(pos, name) +end + +function pipeworks.replace_name(tbl,tr,name) + local ntbl={} + for key,i in pairs(tbl) do + if type(i)=="string" then + ntbl[key]=string.gsub(i,tr,name) + elseif type(i)=="table" then + ntbl[key]=pipeworks.replace_name(i,tr,name) + else + ntbl[key]=i + end + end + return ntbl +end + +------------------------------------------- +-- Load the various other parts of the mod + +dofile(pipeworks.modpath.."/common.lua") +dofile(pipeworks.modpath.."/models.lua") +dofile(pipeworks.modpath.."/autoplace_pipes.lua") +dofile(pipeworks.modpath.."/autoplace_tubes.lua") +dofile(pipeworks.modpath.."/luaentity.lua") +dofile(pipeworks.modpath.."/item_transport.lua") +dofile(pipeworks.modpath.."/flowing_logic.lua") +dofile(pipeworks.modpath.."/crafts.lua") +dofile(pipeworks.modpath.."/tube_registration.lua") +dofile(pipeworks.modpath.."/routing_tubes.lua") +dofile(pipeworks.modpath.."/sorting_tubes.lua") +dofile(pipeworks.modpath.."/vacuum_tubes.lua") +dofile(pipeworks.modpath.."/signal_tubes.lua") +dofile(pipeworks.modpath.."/decorative_tubes.lua") +dofile(pipeworks.modpath.."/filter-injector.lua") +dofile(pipeworks.modpath.."/trashcan.lua") +dofile(pipeworks.modpath.."/wielder.lua") + +if pipeworks.enable_pipes then dofile(pipeworks.modpath.."/pipes.lua") end +if pipeworks.enable_teleport_tube then dofile(pipeworks.modpath.."/teleport_tube.lua") end +if pipeworks.enable_pipe_devices then dofile(pipeworks.modpath.."/devices.lua") end +if pipeworks.enable_redefines then dofile(pipeworks.modpath.."/compat.lua") end +if pipeworks.enable_autocrafter then dofile(pipeworks.modpath.."/autocrafter.lua") end + +minetest.register_alias("pipeworks:pipe", "pipeworks:pipe_110000_empty") + +print("Pipeworks loaded!") + diff --git a/mods/pipeworks/item_transport.lua b/mods/pipeworks/item_transport.lua new file mode 100644 index 0000000..fb9f626 --- /dev/null +++ b/mods/pipeworks/item_transport.lua @@ -0,0 +1,285 @@ +function pipeworks.tube_item(pos, item) + error("obsolete pipeworks.tube_item() called; change caller to use pipeworks.tube_inject_item() instead") +end + +function pipeworks.tube_inject_item(pos, start_pos, velocity, item) + -- Take item in any format + local stack = ItemStack(item) + local obj = luaentity.add_entity(pos, "pipeworks:tubed_item") + obj:set_item(stack:to_string()) + obj.start_pos = vector.new(start_pos) + obj:setvelocity(velocity) + --obj:set_color("red") -- todo: this is test-only code + return obj +end + +-- adding two tube functions +-- can_remove(pos,node,stack,dir) returns the maximum number of items of that stack that can be removed +-- remove_items(pos,node,stack,dir,count) removes count items and returns them +-- both optional w/ sensible defaults and fallback to normal allow_* function +-- XXX: possibly change insert_object to insert_item + +local adjlist={{x=0,y=0,z=1},{x=0,y=0,z=-1},{x=0,y=1,z=0},{x=0,y=-1,z=0},{x=1,y=0,z=0},{x=-1,y=0,z=0}} + +function pipeworks.notvel(tbl, vel) + local tbl2={} + for _,val in ipairs(tbl) do + if val.x ~= -vel.x or val.y ~= -vel.y or val.z ~= -vel.z then table.insert(tbl2, val) end + end + return tbl2 +end + +local function go_next(pos, velocity, stack) + local next_positions = {} + local max_priority = 0 + local cnode = minetest.get_node(pos) + local cmeta = minetest.get_meta(pos) + local can_go + local speed = math.abs(velocity.x + velocity.y + velocity.z) + if speed == 0 then + speed = 1 + end + local vel = {x = velocity.x/speed, y = velocity.y/speed, z = velocity.z/speed,speed=speed} + if speed >= 4.1 then + speed = 4 + elseif speed >= 1.1 then + speed = speed - 0.1 + else + speed = 1 + end + vel.speed = speed + if minetest.registered_nodes[cnode.name] and minetest.registered_nodes[cnode.name].tube and minetest.registered_nodes[cnode.name].tube.can_go then + can_go = minetest.registered_nodes[cnode.name].tube.can_go(pos, cnode, vel, stack) + else + can_go = pipeworks.notvel(adjlist, vel) + end + for _, vect in ipairs(can_go) do + local npos = vector.add(pos, vect) + local node = minetest.get_node(npos) + local reg_node = minetest.registered_nodes[node.name] + if reg_node then + local tube_def = reg_node.tube + local tubedevice = minetest.get_item_group(node.name, "tubedevice") + local tube_priority = (tube_def and tube_def.priority) or 100 + if tubedevice > 0 and tube_priority >= max_priority then + if not tube_def or not tube_def.can_insert or + tube_def.can_insert(npos, node, stack, vect) then + if tube_priority > max_priority then + max_priority = tube_priority + next_positions = {} + end + next_positions[#next_positions + 1] = {pos = npos, vect = vect} + end + end + end + end + + if not next_positions[1] then + return false, nil + end + + local n = (cmeta:get_int("tubedir") % (#next_positions)) + 1 + if pipeworks.enable_cyclic_mode then + cmeta:set_int("tubedir", n) + end + local new_velocity = vector.multiply(next_positions[n].vect, vel.speed) + return true, new_velocity +end + +minetest.register_entity("pipeworks:tubed_item", { + initial_properties = { + hp_max = 1, + physical = false, + collisionbox = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, + visual = "wielditem", + visual_size = {x = 0.15, y = 0.15}, + textures = {""}, + spritediv = {x = 1, y = 1}, + initial_sprite_basepos = {x = 0, y = 0}, + is_visible = false, + }, + + physical_state = false, + + from_data = function(self, itemstring) + local stack = ItemStack(itemstring) + local itemtable = stack:to_table() + local itemname = nil + if itemtable then + itemname = stack:to_table().name + end + local item_texture = nil + local item_type = "" + if minetest.registered_items[itemname] then + item_texture = minetest.registered_items[itemname].inventory_image + item_type = minetest.registered_items[itemname].type + end + self.object:set_properties({ + is_visible = true, + textures = {stack:get_name()} + }) + local def = stack:get_definition() + self.object:setyaw((def and def.type == "node") and 0 or math.pi * 0.25) + end, + + get_staticdata = luaentity.get_staticdata, + on_activate = function(self, staticdata) -- Legacy code, should be replaced later by luaentity.on_activate + if staticdata == "" or staticdata == nil then + return + end + if staticdata == "toremove" then + self.object:remove() + return + end + local item = minetest.deserialize(staticdata) + pipeworks.tube_inject_item(self.object:getpos(), item.start_pos, item.velocity, item.itemstring) + self.object:remove() + end, +}) + +minetest.register_entity("pipeworks:color_entity", { + initial_properties = { + hp_max = 1, + physical = false, + collisionbox = {0.1, 0.1, 0.1, 0.1, 0.1, 0.1}, + visual = "cube", + visual_size = {x = 3.5, y = 3.5, z = 3.5}, -- todo: find correct size + textures = {""}, + is_visible = false, + }, + + physical_state = false, + + from_data = function(self, color) + local t = "pipeworks_color_"..color..".png" + local prop = { + is_visible = true, + visual = "cube", + textures = {t, t, t, t, t, t} -- todo: textures + } + self.object:set_properties(prop) + end, + + get_staticdata = luaentity.get_staticdata, + on_activate = luaentity.on_activate, +}) + +luaentity.register_entity("pipeworks:tubed_item", { + itemstring = '', + item_entity = nil, + color_entity = nil, + color = nil, + start_pos = nil, + + set_item = function(self, item) + local itemstring = ItemStack(item):to_string() -- Accept any input format + if self.itemstring == itemstring then + return + end + if self.item_entity then + self:remove_attached_entity(self.item_entity) + end + self.itemstring = itemstring + self.item_entity = self:add_attached_entity("pipeworks:tubed_item", itemstring) + end, + + set_color = function(self, color) + if self.color == color then + return + end + self.color = color + if self.color_entity then + self:remove_attached_entity(self.color_entity) + end + if color then + self.color_entity = self:add_attached_entity("pipeworks:color_entity", color) + else + self.color_entity = nil + end + end, + + on_step = function(self, dtime) + if self.start_pos == nil then + local pos = self:getpos() + self.start_pos = vector.round(pos) + self:setpos(pos) + end + + local pos = self:getpos() + local stack = ItemStack(self.itemstring) + local drop_pos + + local velocity = self:getvelocity() + + local moved = false + local speed = math.abs(velocity.x + velocity.y + velocity.z) + if speed == 0 then + speed = 1 + moved = true + end + local vel = {x = velocity.x / speed, y = velocity.y / speed, z = velocity.z / speed, speed = speed} + + if vector.distance(pos, self.start_pos) >= 1 then + self.start_pos = vector.add(self.start_pos, vel) + moved = true + end + + minetest.load_position(self.start_pos) + local node = minetest.get_node(self.start_pos) + if moved and minetest.get_item_group(node.name, "tubedevice_receiver") == 1 then + local leftover + if minetest.registered_nodes[node.name].tube and minetest.registered_nodes[node.name].tube.insert_object then + leftover = minetest.registered_nodes[node.name].tube.insert_object(self.start_pos, node, stack, vel) + else + leftover = stack + end + if leftover:is_empty() then + self:remove() + return + end + velocity = vector.multiply(velocity, -1) + self:setvelocity(velocity) + self:set_item(leftover:to_string()) + return + end + + if moved then + local found_next, new_velocity = go_next(self.start_pos, velocity, stack) -- todo: color + if not found_next then + drop_pos = minetest.find_node_near(vector.add(self.start_pos, velocity), 1, "air") + if drop_pos then + minetest.item_drop(stack, "", drop_pos) + self:remove() + return + end + end + + if new_velocity and not vector.equals(velocity, new_velocity) then + self:setpos(self.start_pos) + self:setvelocity(new_velocity) + end + end + end +}) + +if minetest.get_modpath("mesecons_mvps") then + mesecon.register_mvps_unmov("pipeworks:tubed_item") + mesecon.register_mvps_unmov("pipeworks:color_entity") + mesecon.register_on_mvps_move(function(moved_nodes) + local moved = {} + for _, n in ipairs(moved_nodes) do + moved[minetest.hash_node_position(n.oldpos)] = vector.subtract(n.pos, n.oldpos) + end + for id, entity in pairs(luaentity.entities) do + if entity.name == "pipeworks:tubed_item" then + local pos = entity:getpos() + local rpos = vector.round(pos) + local dir = moved[minetest.hash_node_position(rpos)] + if dir then + entity:setpos(vector.add(pos, dir)) + entity.start_pos = vector.add(entity.start_pos, dir) + end + end + end + end) +end diff --git a/mods/pipeworks/legacy.lua b/mods/pipeworks/legacy.lua new file mode 100644 index 0000000..b36cded --- /dev/null +++ b/mods/pipeworks/legacy.lua @@ -0,0 +1,59 @@ + +if not minetest.get_modpath("auto_tree_tap") and + minetest.get_modpath("technic") then + + minetest.register_abm({ + nodenames = { "auto_tree_tap:off", "auto_tree_tap:on" }, + chance = 1, + interval = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("pick", 1) + inv:set_size("ghost_pick", 1) + inv:set_size("main", 100) + minetest.set_node(pos, {name = "pipeworks:nodebreaker_off", param2 = fdir}) + minetest.registered_nodes["pipeworks:nodebreaker_off"].on_punch(pos, node) + inv:set_stack("pick", 1, ItemStack("technic:treetap")) + end + }) + + minetest.register_node(":auto_tree_tap:off", { + description = "Auto-Tap", + tiles = {"pipeworks_nodebreaker_top_off.png","pipeworks_nodebreaker_bottom_off.png","pipeworks_nodebreaker_side2_off.png","pipeworks_nodebreaker_side1_off.png", + "pipeworks_nodebreaker_back.png","pipeworks_nodebreaker_front_off.png"}, + is_ground_content = true, + paramtype2 = "facedir", + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2, mesecon = 2,tubedevice=1, not_in_creative_inventory=1 }, + sounds = default.node_sound_stone_defaults(), + tube = {connect_sides={back=1}}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + inv:set_size("pick", 1) + inv:set_stack("pick", 1, ItemStack("default:pick_mese")) + end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos, placer) + local placer_pos = placer:getpos() + + --correct for the player's height + if placer:is_player() then placer_pos.y = placer_pos.y + 1.5 end + + --correct for 6d facedir + if placer_pos then + local dir = { + x = pos.x - placer_pos.x, + y = pos.y - placer_pos.y, + z = pos.z - placer_pos.z + } + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + end, + after_dig_node = pipeworks.scan_for_tube_objects, + }) +end diff --git a/mods/pipeworks/luaentity.lua b/mods/pipeworks/luaentity.lua new file mode 100644 index 0000000..4ecb163 --- /dev/null +++ b/mods/pipeworks/luaentity.lua @@ -0,0 +1,338 @@ +local max_entity_id = 1000000000000 -- If you need more, there's a problem with your code + +luaentity = {} + +luaentity.registered_entities = {} + +local filename = minetest.get_worldpath().."/luaentities" +local function read_file() + local f = io.open(filename, "r") + if f == nil then return {} end + local t = f:read("*all") + f:close() + if t == "" or t == nil then return {} end + return minetest.deserialize(t) or {} +end + +local function write_file(tbl) + local f = io.open(filename, "w") + f:write(minetest.serialize(tbl)) + f:close() +end + +local function read_entities() + local t = read_file() + for _, entity in pairs(t) do + setmetatable(entity, luaentity.registered_entities[entity.name]) + end + return t +end + +local function write_entities() + for _, entity in pairs(luaentity.entities) do + setmetatable(entity, nil) + for _, attached in pairs(entity._attached_entities) do + if attached.entity then + attached.entity:remove() + attached.entity = nil + end + end + entity._attached_entities_master = nil + end + write_file(luaentity.entities) +end + +minetest.register_on_shutdown(write_entities) +luaentity.entities_index = 0 + +local function get_blockpos(pos) + return {x = math.floor(pos.x / 16), + y = math.floor(pos.y / 16), + z = math.floor(pos.z / 16)} +end + +local active_blocks = {} -- These only contain active blocks near players (i.e., not forceloaded ones) +local handle_active_blocks_step = 2 +local handle_active_blocks_timer = 0 +minetest.register_globalstep(function(dtime) + handle_active_blocks_timer = handle_active_blocks_timer + dtime + if handle_active_blocks_timer >= handle_active_blocks_step then + handle_active_blocks_timer = handle_active_blocks_timer - handle_active_blocks_step + local active_block_range = tonumber(minetest.setting_get("active_block_range")) or 2 + local new_active_blocks = {} + for _, player in ipairs(minetest.get_connected_players()) do + local blockpos = get_blockpos(player:getpos()) + local minp = vector.subtract(blockpos, active_block_range) + local maxp = vector.add(blockpos, active_block_range) + + for x = minp.x, maxp.x do + for y = minp.y, maxp.y do + for z = minp.z, maxp.z do + local pos = {x = x, y = y, z = z} + new_active_blocks[minetest.hash_node_position(pos)] = pos + end + end + end + end + active_blocks = new_active_blocks + -- todo: callbacks on block load/unload + end +end) + +local function is_active(pos) + return active_blocks[minetest.hash_node_position(get_blockpos(pos))] ~= nil +end + +local entitydef_default = { + _attach = function(self, attached, attach_to) + local attached_def = self._attached_entities[attached] + local attach_to_def = self._attached_entities[attach_to] + attached_def.entity:set_attach( + attach_to_def.entity, "", + vector.subtract(attached_def.offset, attach_to_def.offset), -- todo: Does not work because is object space + vector.new(0, 0, 0) + ) + end, + _set_master = function(self, index) + self._attached_entities_master = index + if not index then + return + end + local def = self._attached_entities[index] + if not def.entity then + return + end + def.entity:setpos(vector.add(self._pos, def.offset)) + def.entity:setvelocity(self._velocity) + def.entity:setacceleration(self._acceleration) + end, + _attach_all = function(self) + local master = self._attached_entities_master + if not master then + return + end + for id, entity in pairs(self._attached_entities) do + if id ~= master and entity.entity then + self:_attach(id, master) + end + end + end, + _detach_all = function(self) + local master = self._attached_entities_master + for id, entity in pairs(self._attached_entities) do + if id ~= master and entity.entity then + entity.entity:set_detach() + end + end + end, + _add_attached = function(self, index) + local entity = self._attached_entities[index] + if entity.entity then + return + end + local entity_pos = vector.add(self._pos, entity.offset) + if not is_active(entity_pos) then + return + end + local ent = minetest.add_entity(entity_pos, entity.name):get_luaentity() + ent:from_data(entity.data) + ent.parent_id = self._id + ent.attached_id = index + entity.entity = ent.object + local master = self._attached_entities_master + if master then + self:_attach(index, master) + else + self:_set_master(index) + end + end, + _remove_attached = function(self, index) + local master = self._attached_entities_master + local entity = self._attached_entities[index] + local ent = entity.entity + entity.entity = nil + if index == master then + self:_detach_all() + local newmaster + for id, attached in pairs(self._attached_entities) do + if id ~= master and attached.entity then + newmaster = id + break + end + end + self:_set_master(newmaster) + self:_attach_all() + elseif master and ent then + ent:set_detach() + end + if ent then + ent:remove() + end + end, + _add_loaded = function(self) + for id, _ in pairs(self._attached_entities) do + self:_add_attached(id) + end + end, + getid = function(self) + return self._id + end, + getpos = function(self) + return vector.new(self._pos) + end, + setpos = function(self, pos) + self._pos = vector.new(pos) + --for _, entity in pairs(self._attached_entities) do + -- if entity.entity then + -- entity.entity:setpos(vector.add(self._pos, entity.offset)) + -- end + --end + local master = self._attached_entities_master + if master then + local master_def = self._attached_entities[master] + master_def.entity:setpos(vector.add(self._pos, master_def.offset)) + end + end, + getvelocity = function(self) + return vector.new(self._velocity) + end, + setvelocity = function(self, velocity) + self._velocity = vector.new(velocity) + local master = self._attached_entities_master + if master then + self._attached_entities[master].entity:setvelocity(self._velocity) + end + end, + getacceleration = function(self) + return vector.new(self._acceleration) + end, + setacceleration = function(self, acceleration) + self._acceleration = vector.new(acceleration) + local master = self._attached_entities_master + if master then + self._attached_entities[master].entity:setacceleration(self._acceleration) + end + end, + remove = function(self) + self:_detach_all() + for _, entity in pairs(self._attached_entities) do + if entity.entity then + entity.entity:remove() + end + end + luaentity.entities[self._id] = nil + end, + add_attached_entity = function(self, name, data, offset) + local index = #self._attached_entities + 1 + self._attached_entities[index] = { + name = name, + data = data, + offset = vector.new(offset), + } + self:_add_attached(index) + return index + end, + remove_attached_entity = function(self, index) + self:_remove_attached(index) + self._attached_entities[index] = nil + end, +} + +function luaentity.register_entity(name, prototype) + -- name = check_modname_prefix(name) + prototype.name = name + setmetatable(prototype, {__index = entitydef_default}) + prototype.__index = prototype -- Make it possible to use it as metatable + luaentity.registered_entities[name] = prototype +end + +-- function luaentity.get_entity_definition(entity) +-- return luaentity.registered_entities[entity.name] +-- end + +function luaentity.add_entity(pos, name) + if not luaentity.entities then + minetest.after(0, luaentity.add_entity, vector.new(pos), name) + return + end + local index = luaentity.entities_index + while luaentity.entities[index] do + index = index + 1 + if index >= max_entity_id then + index = 0 + end + end + luaentity.entities_index = index + + local entity = { + name = name, + _id = index, + _pos = vector.new(pos), + _velocity = {x = 0, y = 0, z = 0}, + _acceleration = {x = 0, y = 0, z = 0}, + _attached_entities = {}, + } + + local prototype = luaentity.registered_entities[name] + setmetatable(entity, prototype) -- Default to prototype for other methods + luaentity.entities[index] = entity + + if entity.on_activate then + entity:on_activate() + end + return entity +end + +-- todo: check if remove in get_staticdata works +function luaentity.get_staticdata(self) + local parent = luaentity.entities[self.parent_id] + if parent and parent._remove_attached then + parent:_remove_attached(self.attached_id) + end + return "toremove" +end + +function luaentity.on_activate(self, staticdata) + if staticdata == "toremove" then + self.object:remove() + end +end + +function luaentity.get_objects_inside_radius(pos, radius) + local objects = {} + local index = 1 + for id, entity in pairs(luaentity.entities) do + if vector.distance(pos, entity:getpos()) <= radius then + objects[index] = entity + index = index + 1 + end + end +end + +minetest.register_globalstep(function(dtime) + if not luaentity.entities then + luaentity.entities = read_entities() + end + for id, entity in pairs(luaentity.entities) do + local master = entity._attached_entities_master + if master then + local master_def = entity._attached_entities[master] + local master_entity = master_def.entity + entity._pos = vector.subtract(master_entity:getpos(), master_def.offset) + entity._velocity = master_entity:getvelocity() + entity._acceleration = master_entity:getacceleration() + else + entity._pos = vector.add(vector.add( + entity._pos, + vector.multiply(entity._velocity, dtime)), + vector.multiply(entity._acceleration, 0.5 * dtime * dtime)) + entity._velocity = vector.add( + entity._velocity, + vector.multiply(entity._acceleration, dtime)) + end + entity:_add_loaded() + if entity.on_step then + entity:on_step(dtime) + end + end +end) diff --git a/mods/pipeworks/models.lua b/mods/pipeworks/models.lua new file mode 100644 index 0000000..3be773c --- /dev/null +++ b/mods/pipeworks/models.lua @@ -0,0 +1,49 @@ +----------------------------------- +-- The various pipe select boxes + +pipeworks.pipe_selectboxes = { + { -32/64, -8/64, -8/64, 8/64, 8/64, 8/64 }, + { -8/64 , -8/64, -8/64, 32/64, 8/64, 8/64 }, + { -8/64 , -32/64, -8/64, 8/64, 8/64, 8/64 }, + { -8/64 , -8/64, -8/64, 8/64, 32/64, 8/64 }, + { -8/64 , -8/64, -32/64, 8/64, 8/64, 8/64 }, + { -8/64 , -8/64, -8/64, 8/64, 8/64, 32/64 } +} + +-- Tube models + +pipeworks.tube_leftstub = { + { -32/64, -9/64, -9/64, 9/64, 9/64, 9/64 }, -- tube segment against -X face +} + +pipeworks.tube_rightstub = { + { -9/64, -9/64, -9/64, 32/64, 9/64, 9/64 }, -- tube segment against +X face +} + +pipeworks.tube_bottomstub = { + { -9/64, -32/64, -9/64, 9/64, 9/64, 9/64 }, -- tube segment against -Y face +} + +pipeworks.tube_topstub = { + { -9/64, -9/64, -9/64, 9/64, 32/64, 9/64 }, -- tube segment against +Y face +} + +pipeworks.tube_frontstub = { + { -9/64, -9/64, -32/64, 9/64, 9/64, 9/64 }, -- tube segment against -Z face +} + +pipeworks.tube_backstub = { + { -9/64, -9/64, -9/64, 9/64, 9/64, 32/64 }, -- tube segment against -Z face +} + +pipeworks.tube_boxes = {pipeworks.tube_leftstub, pipeworks.tube_rightstub, pipeworks.tube_bottomstub, pipeworks.tube_topstub, pipeworks.tube_frontstub, pipeworks.tube_backstub} + +pipeworks.tube_selectboxes = { + { -32/64, -10/64, -10/64, 10/64, 10/64, 10/64 }, + { -10/64 , -10/64, -10/64, 32/64, 10/64, 10/64 }, + { -10/64 , -32/64, -10/64, 10/64, 10/64, 10/64 }, + { -10/64 , -10/64, -10/64, 10/64, 32/64, 10/64 }, + { -10/64 , -10/64, -32/64, 10/64, 10/64, 10/64 }, + { -10/64 , -10/64, -10/64, 10/64, 10/64, 32/64 } +} + diff --git a/mods/pipeworks/models/pipeworks_entry_panel.obj b/mods/pipeworks/models/pipeworks_entry_panel.obj new file mode 100644 index 0000000..27577d7 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_entry_panel.obj @@ -0,0 +1,390 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-entry-panel.blend' +# www.blender.org +o Cube.001 +v 0.030483 -0.153248 -0.468750 +v 0.030483 -0.153248 -0.500000 +v -0.030483 -0.153248 -0.468750 +v -0.030483 -0.153248 -0.500000 +v -0.086808 -0.129917 -0.468750 +v -0.086808 -0.129917 -0.500000 +v -0.129917 -0.086808 -0.468750 +v -0.129917 -0.086808 -0.500000 +v -0.153248 -0.030483 -0.468750 +v -0.153248 -0.030483 -0.500000 +v -0.153248 0.030483 -0.468750 +v -0.153248 0.030483 -0.500000 +v -0.129917 0.086808 -0.468750 +v -0.129917 0.086808 -0.500000 +v -0.086808 0.129917 -0.468750 +v -0.086808 0.129917 -0.500000 +v -0.030483 0.153248 -0.468750 +v -0.030483 0.153247 -0.500000 +v 0.030483 0.153248 -0.468750 +v 0.030483 0.153248 -0.500000 +v 0.086808 0.129917 -0.468750 +v 0.086808 0.129917 -0.500000 +v 0.129917 0.086808 -0.468750 +v 0.129917 0.086808 -0.500000 +v 0.153248 0.030483 -0.468750 +v 0.153248 0.030483 -0.500000 +v 0.153248 -0.030483 -0.468750 +v 0.153248 -0.030483 -0.500000 +v 0.129917 -0.086808 -0.468750 +v 0.129917 -0.086808 -0.500000 +v 0.086808 -0.129917 -0.468750 +v 0.086808 -0.129917 -0.500000 +v 0.024386 -0.122598 -0.468750 +v -0.024386 -0.122598 -0.468750 +v -0.069446 -0.103934 -0.468750 +v -0.103934 -0.069446 -0.468750 +v -0.122598 -0.024386 -0.468750 +v -0.122598 0.024386 -0.468750 +v -0.103934 0.069446 -0.468750 +v -0.069446 0.103934 -0.468750 +v -0.024386 0.122598 -0.468750 +v 0.024386 0.122598 -0.468750 +v 0.069446 0.103934 -0.468750 +v 0.103934 0.069446 -0.468750 +v 0.122598 0.024386 -0.468750 +v 0.122598 -0.024387 -0.468750 +v 0.103934 -0.069447 -0.468750 +v 0.069446 -0.103934 -0.468750 +v 0.000000 -0.000000 -0.468750 +v 0.000000 -0.000000 -0.500000 +v -0.103934 -0.069446 0.468750 +v -0.069447 -0.103933 0.468750 +v -0.024387 -0.122598 0.468750 +v 0.024386 -0.122598 0.468750 +v 0.086808 -0.129917 0.500000 +v 0.086808 -0.129917 0.468750 +v 0.129917 -0.086808 0.500000 +v 0.129917 -0.086808 0.468750 +v 0.153247 -0.030483 0.500000 +v 0.153247 -0.030483 0.468750 +v 0.153247 0.030483 0.500000 +v 0.153247 0.030483 0.468750 +v 0.129917 0.086808 0.500000 +v 0.129917 0.086808 0.468750 +v 0.086808 0.129917 0.500000 +v 0.086808 0.129917 0.468750 +v 0.030483 0.153248 0.500000 +v 0.030483 0.153248 0.468750 +v -0.030483 0.153248 0.500000 +v -0.030483 0.153248 0.468750 +v -0.086808 0.129917 0.500000 +v -0.086808 0.129917 0.468750 +v -0.129917 0.086808 0.500000 +v -0.129917 0.086808 0.468750 +v -0.153248 0.030483 0.500000 +v -0.153248 0.030483 0.468750 +v -0.153248 -0.030483 0.500000 +v -0.153248 -0.030483 0.468750 +v -0.129917 -0.086808 0.500000 +v -0.129917 -0.086808 0.468750 +v -0.086808 -0.129917 0.500000 +v -0.086808 -0.129917 0.468750 +v -0.030483 -0.153247 0.500000 +v -0.030483 -0.153247 0.468750 +v 0.030483 -0.153247 0.500000 +v 0.030483 -0.153247 0.468750 +v -0.122598 -0.024386 0.468750 +v -0.122598 0.024387 0.468750 +v -0.103934 0.069447 0.468750 +v -0.069447 0.103934 0.468750 +v -0.024387 0.122598 0.468750 +v 0.024386 0.122598 0.468750 +v 0.069446 0.103934 0.468750 +v 0.103933 0.069447 0.468750 +v 0.122598 0.024387 0.468750 +v 0.122598 -0.024386 0.468750 +v 0.103933 -0.069446 0.468750 +v 0.069446 -0.103933 0.468750 +v -0.000000 0.000000 0.468750 +v -0.000000 0.000000 0.500000 +v 0.500000 -0.500000 0.062500 +v -0.500000 -0.500000 0.062500 +v -0.500000 -0.500000 -0.062500 +v 0.500000 -0.500000 -0.062500 +v 0.500000 0.500000 0.062500 +v -0.500000 0.500000 0.062500 +v -0.500000 0.500000 -0.062500 +v 0.500000 0.500000 -0.062500 +vt 0.871212 0.265152 +vt 0.840909 0.265152 +vt 0.840909 0.295455 +vt 0.871212 0.295455 +vt 0.810606 0.265152 +vt 0.810606 0.295455 +vt 0.780303 0.265152 +vt 0.780303 0.295455 +vt 0.750000 0.265152 +vt 0.750000 0.295455 +vt 0.719697 0.265152 +vt 0.719697 0.295455 +vt 0.689394 0.265152 +vt 0.689394 0.295455 +vt 0.659091 0.265152 +vt 0.659091 0.295455 +vt 0.628788 0.265152 +vt 0.628788 0.295455 +vt 0.598485 0.265152 +vt 0.598485 0.295455 +vt 0.568182 0.265152 +vt 0.568182 0.295455 +vt 0.537879 0.265152 +vt 0.537879 0.295455 +vt 0.507576 0.265152 +vt 0.507576 0.295455 +vt 0.992424 0.265152 +vt 0.962121 0.265152 +vt 0.962121 0.295455 +vt 0.992424 0.295455 +vt 0.931818 0.265152 +vt 0.931818 0.295455 +vt 0.901515 0.265152 +vt 0.901515 0.295455 +vt 0.613449 0.318703 +vt 0.597693 0.397916 +vt 0.581936 0.318703 +vt 0.765436 0.318703 +vt 0.781192 0.397916 +vt 0.796949 0.318703 +vt 0.826063 0.330762 +vt 0.848346 0.353045 +vt 0.860405 0.382159 +vt 0.860405 0.413672 +vt 0.848346 0.442786 +vt 0.826063 0.465069 +vt 0.796949 0.477128 +vt 0.765436 0.477128 +vt 0.736322 0.465069 +vt 0.714039 0.442786 +vt 0.701980 0.413672 +vt 0.701980 0.382159 +vt 0.714039 0.353045 +vt 0.736322 0.330762 +vt 0.552823 0.330762 +vt 0.530540 0.353045 +vt 0.518480 0.382159 +vt 0.518480 0.413672 +vt 0.530540 0.442786 +vt 0.552822 0.465069 +vt 0.581936 0.477128 +vt 0.613449 0.477128 +vt 0.642563 0.465069 +vt 0.664846 0.442786 +vt 0.676906 0.413672 +vt 0.676906 0.382159 +vt 0.664846 0.353045 +vt 0.642563 0.330762 +vt 0.598485 0.250000 +vt 0.598485 0.007576 +vt 0.628788 0.007576 +vt 0.628788 0.250000 +vt 0.552823 0.330759 +vt 0.581937 0.318699 +vt 0.597694 0.397912 +vt 0.530540 0.353042 +vt 0.518481 0.382156 +vt 0.518481 0.413668 +vt 0.530540 0.442782 +vt 0.552823 0.465065 +vt 0.581937 0.477125 +vt 0.613450 0.477125 +vt 0.642564 0.465065 +vt 0.664847 0.442782 +vt 0.676906 0.413668 +vt 0.676906 0.382156 +vt 0.664847 0.353042 +vt 0.642564 0.330759 +vt 0.613450 0.318699 +vt 0.736320 0.330759 +vt 0.765434 0.318699 +vt 0.781190 0.397912 +vt 0.714037 0.353041 +vt 0.701978 0.382156 +vt 0.701978 0.413668 +vt 0.714037 0.442782 +vt 0.736320 0.465065 +vt 0.765434 0.477125 +vt 0.796947 0.477125 +vt 0.826061 0.465065 +vt 0.848344 0.442782 +vt 0.860403 0.413668 +vt 0.860403 0.382156 +vt 0.848344 0.353041 +vt 0.826061 0.330759 +vt 0.796947 0.318699 +vt 0.931818 0.250000 +vt 0.931818 0.007576 +vt 0.962121 0.007576 +vt 0.962121 0.250000 +vt 0.871212 0.250000 +vt 0.871212 0.007576 +vt 0.901515 0.007576 +vt 0.901515 0.250000 +vt 0.780303 0.250000 +vt 0.780303 0.007576 +vt 0.810606 0.007576 +vt 0.810606 0.250000 +vt 0.840909 0.250000 +vt 0.840909 0.007576 +vt 0.750000 0.250000 +vt 0.750000 0.007576 +vt 0.719697 0.250000 +vt 0.719697 0.007576 +vt 0.689394 0.250000 +vt 0.689394 0.007576 +vt 0.659091 0.250000 +vt 0.659091 0.007576 +vt 0.568182 0.250000 +vt 0.568182 0.007576 +vt 0.537879 0.250000 +vt 0.537879 0.007576 +vt 0.507576 0.250000 +vt 0.507576 0.007576 +vt 0.992424 0.007576 +vt 0.992424 0.250000 +vt 0.507576 0.507576 +vt 0.992424 0.507576 +vt 0.992424 0.992424 +vt 0.507576 0.992424 +vt 0.068182 0.492424 +vt 0.007576 0.492424 +vt 0.007576 0.007576 +vt 0.068182 0.007576 +vt 0.492424 0.992424 +vt 0.007576 0.992424 +vt 0.007576 0.507576 +vt 0.492424 0.507576 +vt 0.295455 0.492424 +vt 0.234848 0.492424 +vt 0.234848 0.007576 +vt 0.295455 0.007576 +vt 0.219697 0.007576 +vt 0.219697 0.492424 +vt 0.159091 0.492424 +vt 0.159091 0.007576 +vt 0.083333 0.492424 +vt 0.083333 0.007576 +vt 0.143939 0.007576 +vt 0.143939 0.492424 +s off +f 1/1 3/2 4/3 2/4 +f 3/2 5/5 6/6 4/3 +f 5/5 7/7 8/8 6/6 +f 7/7 9/9 10/10 8/8 +f 9/9 11/11 12/12 10/10 +f 11/11 13/13 14/14 12/12 +f 13/13 15/15 16/16 14/14 +f 15/15 17/17 18/18 16/16 +f 17/17 19/19 20/20 18/18 +f 19/19 21/21 22/22 20/20 +f 21/21 23/23 24/24 22/22 +f 23/23 25/25 26/26 24/24 +f 25/27 27/28 28/29 26/30 +f 27/28 29/31 30/32 28/29 +f 31/33 1/1 2/4 32/34 +f 29/31 31/33 32/34 30/32 +f 4/35 50/36 2/37 +f 1/38 49/39 3/40 +f 3/40 49/39 5/41 +f 5/41 49/39 7/42 +f 7/42 49/39 9/43 +f 9/43 49/39 11/44 +f 11/44 49/39 13/45 +f 13/45 49/39 15/46 +f 15/46 49/39 17/47 +f 17/47 49/39 19/48 +f 19/48 49/39 21/49 +f 21/49 49/39 23/50 +f 23/50 49/39 25/51 +f 25/51 49/39 27/52 +f 27/52 49/39 29/53 +f 29/53 49/39 31/54 +f 31/54 49/39 1/38 +f 2/37 50/36 32/55 +f 32/55 50/36 30/56 +f 30/56 50/36 28/57 +f 28/57 50/36 26/58 +f 26/58 50/36 24/59 +f 24/59 50/36 22/60 +f 22/60 50/36 20/61 +f 20/61 50/36 18/62 +f 18/62 50/36 16/63 +f 16/63 50/36 14/64 +f 14/64 50/36 12/65 +f 12/65 50/36 10/66 +f 10/66 50/36 8/67 +f 8/67 50/36 6/68 +f 6/68 50/36 4/35 +f 41/69 91/70 92/71 42/72 +f 81/73 83/74 100/75 +f 79/76 81/73 100/75 +f 77/77 79/76 100/75 +f 75/78 77/77 100/75 +f 73/79 75/78 100/75 +f 71/80 73/79 100/75 +f 69/81 71/80 100/75 +f 67/82 69/81 100/75 +f 65/83 67/82 100/75 +f 63/84 65/83 100/75 +f 61/85 63/84 100/75 +f 59/86 61/85 100/75 +f 57/87 59/86 100/75 +f 55/88 57/87 100/75 +f 85/89 55/88 100/75 +f 56/90 86/91 99/92 +f 58/93 56/90 99/92 +f 60/94 58/93 99/92 +f 62/95 60/94 99/92 +f 64/96 62/95 99/92 +f 66/97 64/96 99/92 +f 68/98 66/97 99/92 +f 70/99 68/98 99/92 +f 72/100 70/99 99/92 +f 74/101 72/100 99/92 +f 76/102 74/101 99/92 +f 78/103 76/102 99/92 +f 80/104 78/103 99/92 +f 82/105 80/104 99/92 +f 84/106 82/105 99/92 +f 86/91 84/106 99/92 +f 83/74 85/89 100/75 +f 58/22 57/21 55/19 56/20 +f 56/20 55/19 85/17 86/18 +f 60/24 59/23 57/21 58/22 +f 62/26 61/25 59/23 60/24 +f 64/29 63/28 61/27 62/30 +f 66/32 65/31 63/28 64/29 +f 68/34 67/33 65/31 66/32 +f 70/4 69/1 67/33 68/34 +f 72/3 71/2 69/1 70/4 +f 74/6 73/5 71/2 72/3 +f 76/8 75/7 73/5 74/6 +f 78/10 77/9 75/7 76/8 +f 80/12 79/11 77/9 78/10 +f 82/14 81/13 79/11 80/12 +f 84/16 83/15 81/13 82/14 +f 86/18 85/17 83/15 84/16 +f 36/107 51/108 87/109 37/110 +f 34/111 53/112 52/113 35/114 +f 47/115 97/116 98/117 48/118 +f 33/119 54/120 53/112 34/111 +f 35/114 52/113 51/108 36/107 +f 48/118 98/117 54/120 33/119 +f 46/121 96/122 97/116 47/115 +f 45/123 95/124 96/122 46/121 +f 44/125 94/126 95/124 45/123 +f 43/127 93/128 94/126 44/125 +f 42/72 92/71 93/128 43/127 +f 40/129 90/130 91/70 41/69 +f 39/131 89/132 90/130 40/129 +f 38/133 88/134 89/132 39/131 +f 37/110 87/109 88/135 38/136 +f 105/137 106/138 102/139 101/140 +f 106/141 107/142 103/143 102/144 +f 107/145 108/146 104/147 103/148 +f 108/149 105/150 101/151 104/152 +f 101/153 102/154 103/155 104/156 +f 108/157 107/158 106/159 105/160 diff --git a/mods/pipeworks/models/pipeworks_flow_sensor.obj b/mods/pipeworks/models/pipeworks_flow_sensor.obj new file mode 100644 index 0000000..f0ba87e --- /dev/null +++ b/mods/pipeworks/models/pipeworks_flow_sensor.obj @@ -0,0 +1,390 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-flow-sensor.blend' +# www.blender.org +o Cube.001 +v -0.468750 -0.153248 -0.030483 +v -0.500000 -0.153248 -0.030483 +v -0.468750 -0.153248 0.030483 +v -0.500000 -0.153248 0.030483 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.030483 0.153248 +v -0.500000 -0.030483 0.153248 +v -0.468750 0.030483 0.153248 +v -0.500000 0.030483 0.153248 +v -0.468750 0.086808 0.129917 +v -0.500000 0.086808 0.129917 +v -0.468750 0.129917 0.086808 +v -0.500000 0.129917 0.086808 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153247 0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.030483 -0.153248 +v -0.500000 0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.122598 -0.024386 +v -0.468750 -0.122598 0.024386 +v -0.468750 -0.103934 0.069446 +v -0.468750 -0.069446 0.103934 +v -0.468750 -0.024386 0.122598 +v -0.468750 0.024386 0.122598 +v -0.468750 0.069446 0.103934 +v -0.468750 0.103934 0.069446 +v -0.468750 0.122598 0.024386 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.069446 -0.103934 +v -0.468750 0.024386 -0.122598 +v -0.468750 -0.024387 -0.122598 +v -0.468750 -0.069447 -0.103934 +v -0.468750 -0.103934 -0.069446 +v -0.468750 -0.000000 -0.000000 +v -0.500000 -0.000000 -0.000000 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.103933 0.069447 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.122598 -0.024386 +v 0.500000 -0.129917 -0.086807 +v 0.468750 -0.129917 -0.086807 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.468750 -0.030483 -0.153247 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.153248 -0.030483 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.129917 0.086808 +v 0.468750 0.129917 0.086808 +v 0.500000 0.086808 0.129917 +v 0.468750 0.086808 0.129917 +v 0.500000 0.030483 0.153248 +v 0.468750 0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.153247 0.030483 +v 0.468750 -0.153247 0.030483 +v 0.500000 -0.153247 -0.030483 +v 0.468750 -0.153247 -0.030483 +v 0.468750 -0.024386 0.122598 +v 0.468750 0.024387 0.122598 +v 0.468750 0.069447 0.103934 +v 0.468750 0.103934 0.069447 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.069447 -0.103933 +v 0.468750 0.024387 -0.122598 +v 0.468750 -0.024386 -0.122598 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103933 -0.069446 +v 0.468750 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +v 0.250000 -0.187500 0.187500 +v -0.250000 -0.187500 0.187500 +v -0.250000 -0.187500 -0.187500 +v 0.250000 -0.187500 -0.187500 +v 0.250000 0.187500 0.187500 +v -0.250000 0.187500 0.187500 +v -0.250000 0.187500 -0.187500 +v 0.250000 0.187500 -0.187500 +vt 0.813725 0.460784 +vt 0.774510 0.460784 +vt 0.774510 0.500000 +vt 0.813725 0.500000 +vt 0.735294 0.460784 +vt 0.735294 0.500000 +vt 0.696078 0.460784 +vt 0.696078 0.500000 +vt 0.656863 0.460784 +vt 0.656863 0.500000 +vt 0.617647 0.460784 +vt 0.617647 0.500000 +vt 0.578431 0.460784 +vt 0.578431 0.500000 +vt 0.539216 0.460784 +vt 0.539216 0.500000 +vt 0.500000 0.460784 +vt 0.500000 0.500000 +vt 0.460784 0.460784 +vt 0.460784 0.500000 +vt 0.421569 0.460784 +vt 0.421569 0.500000 +vt 0.382353 0.460784 +vt 0.382353 0.500000 +vt 0.343137 0.460784 +vt 0.343137 0.500000 +vt 0.970588 0.460784 +vt 0.931373 0.460784 +vt 0.931373 0.500000 +vt 0.970588 0.500000 +vt 0.892157 0.460784 +vt 0.892157 0.500000 +vt 0.852941 0.460784 +vt 0.852941 0.500000 +vt 0.480968 0.531171 +vt 0.460590 0.633014 +vt 0.440211 0.531171 +vt 0.677539 0.531171 +vt 0.697917 0.633014 +vt 0.718296 0.531171 +vt 0.755950 0.546676 +vt 0.784770 0.575325 +vt 0.800366 0.612756 +vt 0.800366 0.653272 +vt 0.784770 0.690703 +vt 0.755950 0.719352 +vt 0.718296 0.734857 +vt 0.677539 0.734857 +vt 0.639884 0.719352 +vt 0.611065 0.690703 +vt 0.595468 0.653272 +vt 0.595468 0.612756 +vt 0.611065 0.575325 +vt 0.639885 0.546676 +vt 0.402557 0.546676 +vt 0.373737 0.575325 +vt 0.358140 0.612756 +vt 0.358140 0.653272 +vt 0.373737 0.690703 +vt 0.402557 0.719352 +vt 0.440211 0.734857 +vt 0.480968 0.734857 +vt 0.518622 0.719352 +vt 0.547442 0.690703 +vt 0.563039 0.653272 +vt 0.563039 0.612756 +vt 0.547442 0.575325 +vt 0.518622 0.546676 +vt 0.460784 0.441176 +vt 0.460784 0.127451 +vt 0.500000 0.127451 +vt 0.500000 0.441176 +vt 0.402558 0.546671 +vt 0.440212 0.531167 +vt 0.460591 0.633009 +vt 0.373738 0.575320 +vt 0.358141 0.612752 +vt 0.358141 0.653267 +vt 0.373738 0.690699 +vt 0.402558 0.719348 +vt 0.440212 0.734852 +vt 0.480969 0.734852 +vt 0.518623 0.719348 +vt 0.547443 0.690699 +vt 0.563040 0.653267 +vt 0.563040 0.612752 +vt 0.547443 0.575320 +vt 0.518623 0.546671 +vt 0.480969 0.531167 +vt 0.639882 0.546671 +vt 0.677537 0.531167 +vt 0.697915 0.633009 +vt 0.611063 0.575320 +vt 0.595466 0.612752 +vt 0.595466 0.653267 +vt 0.611063 0.690699 +vt 0.639882 0.719347 +vt 0.677537 0.734852 +vt 0.718293 0.734852 +vt 0.755947 0.719347 +vt 0.784767 0.690699 +vt 0.800364 0.653267 +vt 0.800364 0.612752 +vt 0.784767 0.575320 +vt 0.755948 0.546671 +vt 0.718293 0.531167 +vt 0.892157 0.441176 +vt 0.892157 0.127451 +vt 0.931373 0.127451 +vt 0.931373 0.441176 +vt 0.813725 0.441176 +vt 0.813725 0.127451 +vt 0.852941 0.127451 +vt 0.852941 0.441176 +vt 0.696078 0.441176 +vt 0.696078 0.127451 +vt 0.735294 0.127451 +vt 0.735294 0.441176 +vt 0.774510 0.441176 +vt 0.774510 0.127451 +vt 0.656863 0.441176 +vt 0.656863 0.127451 +vt 0.617647 0.441176 +vt 0.617647 0.127451 +vt 0.578431 0.441176 +vt 0.578431 0.127451 +vt 0.539216 0.441176 +vt 0.539216 0.127451 +vt 0.421569 0.441176 +vt 0.421569 0.127451 +vt 0.382353 0.441176 +vt 0.382353 0.127451 +vt 0.343137 0.441176 +vt 0.343137 0.127451 +vt 0.970588 0.127451 +vt 0.970588 0.441176 +vt 0.009804 0.500000 +vt 0.323529 0.500000 +vt 0.323529 0.735294 +vt 0.009804 0.735294 +vt 0.264706 0.990196 +vt 0.264706 0.754902 +vt 0.500000 0.754902 +vt 0.500000 0.990196 +vt 0.519608 0.754902 +vt 0.833333 0.754902 +vt 0.833333 0.990196 +vt 0.519608 0.990196 +vt 0.245098 0.754902 +vt 0.245098 0.990196 +vt 0.009804 0.990196 +vt 0.009804 0.754902 +vt 0.323529 0.245098 +vt 0.009804 0.245098 +vt 0.009804 0.009804 +vt 0.323529 0.009804 +vt 0.009804 0.254902 +vt 0.323529 0.254902 +vt 0.323529 0.490196 +vt 0.009804 0.490196 +s off +f 1/1 3/2 4/3 2/4 +f 3/2 5/5 6/6 4/3 +f 5/5 7/7 8/8 6/6 +f 7/7 9/9 10/10 8/8 +f 9/9 11/11 12/12 10/10 +f 11/11 13/13 14/14 12/12 +f 13/13 15/15 16/16 14/14 +f 15/15 17/17 18/18 16/16 +f 17/17 19/19 20/20 18/18 +f 19/19 21/21 22/22 20/20 +f 21/21 23/23 24/24 22/22 +f 23/23 25/25 26/26 24/24 +f 25/27 27/28 28/29 26/30 +f 27/28 29/31 30/32 28/29 +f 31/33 1/1 2/4 32/34 +f 29/31 31/33 32/34 30/32 +f 4/35 50/36 2/37 +f 1/38 49/39 3/40 +f 3/40 49/39 5/41 +f 5/41 49/39 7/42 +f 7/42 49/39 9/43 +f 9/43 49/39 11/44 +f 11/44 49/39 13/45 +f 13/45 49/39 15/46 +f 15/46 49/39 17/47 +f 17/47 49/39 19/48 +f 19/48 49/39 21/49 +f 21/49 49/39 23/50 +f 23/50 49/39 25/51 +f 25/51 49/39 27/52 +f 27/52 49/39 29/53 +f 29/53 49/39 31/54 +f 31/54 49/39 1/38 +f 2/37 50/36 32/55 +f 32/55 50/36 30/56 +f 30/56 50/36 28/57 +f 28/57 50/36 26/58 +f 26/58 50/36 24/59 +f 24/59 50/36 22/60 +f 22/60 50/36 20/61 +f 20/61 50/36 18/62 +f 18/62 50/36 16/63 +f 16/63 50/36 14/64 +f 14/64 50/36 12/65 +f 12/65 50/36 10/66 +f 10/66 50/36 8/67 +f 8/67 50/36 6/68 +f 6/68 50/36 4/35 +f 41/69 91/70 92/71 42/72 +f 81/73 83/74 100/75 +f 79/76 81/73 100/75 +f 77/77 79/76 100/75 +f 75/78 77/77 100/75 +f 73/79 75/78 100/75 +f 71/80 73/79 100/75 +f 69/81 71/80 100/75 +f 67/82 69/81 100/75 +f 65/83 67/82 100/75 +f 63/84 65/83 100/75 +f 61/85 63/84 100/75 +f 59/86 61/85 100/75 +f 57/87 59/86 100/75 +f 55/88 57/87 100/75 +f 85/89 55/88 100/75 +f 56/90 86/91 99/92 +f 58/93 56/90 99/92 +f 60/94 58/93 99/92 +f 62/95 60/94 99/92 +f 64/96 62/95 99/92 +f 66/97 64/96 99/92 +f 68/98 66/97 99/92 +f 70/99 68/98 99/92 +f 72/100 70/99 99/92 +f 74/101 72/100 99/92 +f 76/102 74/101 99/92 +f 78/103 76/102 99/92 +f 80/104 78/103 99/92 +f 82/105 80/104 99/92 +f 84/106 82/105 99/92 +f 86/91 84/106 99/92 +f 83/74 85/89 100/75 +f 58/22 57/21 55/19 56/20 +f 56/20 55/19 85/17 86/18 +f 60/24 59/23 57/21 58/22 +f 62/26 61/25 59/23 60/24 +f 64/29 63/28 61/27 62/30 +f 66/32 65/31 63/28 64/29 +f 68/34 67/33 65/31 66/32 +f 70/4 69/1 67/33 68/34 +f 72/3 71/2 69/1 70/4 +f 74/6 73/5 71/2 72/3 +f 76/8 75/7 73/5 74/6 +f 78/10 77/9 75/7 76/8 +f 80/12 79/11 77/9 78/10 +f 82/14 81/13 79/11 80/12 +f 84/16 83/15 81/13 82/14 +f 86/18 85/17 83/15 84/16 +f 36/107 51/108 87/109 37/110 +f 34/111 53/112 52/113 35/114 +f 47/115 97/116 98/117 48/118 +f 33/119 54/120 53/112 34/111 +f 35/114 52/113 51/108 36/107 +f 48/118 98/117 54/120 33/119 +f 46/121 96/122 97/116 47/115 +f 45/123 95/124 96/122 46/121 +f 44/125 94/126 95/124 45/123 +f 43/127 93/128 94/126 44/125 +f 42/72 92/71 93/128 43/127 +f 40/129 90/130 91/70 41/69 +f 39/131 89/132 90/130 40/129 +f 38/133 88/134 89/132 39/131 +f 37/110 87/109 88/135 38/136 +f 105/137 106/138 102/139 101/140 +f 106/141 107/142 103/143 102/144 +f 107/145 108/146 104/147 103/148 +f 108/149 105/150 101/151 104/152 +f 101/153 102/154 103/155 104/156 +f 108/157 107/158 106/159 105/160 diff --git a/mods/pipeworks/models/pipeworks_fountainhead.obj b/mods/pipeworks/models/pipeworks_fountainhead.obj new file mode 100644 index 0000000..7685dbf --- /dev/null +++ b/mods/pipeworks/models/pipeworks_fountainhead.obj @@ -0,0 +1,352 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-fountainhead.blend' +# www.blender.org +o Cube.001 +v 0.153248 -0.468750 -0.030483 +v 0.153248 -0.500000 -0.030483 +v 0.153248 -0.468750 0.030483 +v 0.153248 -0.500000 0.030483 +v 0.129917 -0.468750 0.086808 +v 0.129917 -0.500000 0.086808 +v 0.086808 -0.468750 0.129917 +v 0.086808 -0.500000 0.129917 +v 0.030483 -0.468750 0.153248 +v 0.030483 -0.500000 0.153248 +v -0.030483 -0.468750 0.153248 +v -0.030483 -0.500000 0.153248 +v -0.086808 -0.468750 0.129917 +v -0.086808 -0.500000 0.129917 +v -0.129917 -0.468750 0.086808 +v -0.129917 -0.500000 0.086808 +v -0.153247 -0.468750 0.030483 +v -0.153247 -0.500000 0.030483 +v -0.153247 -0.468750 -0.030483 +v -0.153247 -0.500000 -0.030483 +v -0.129917 -0.468750 -0.086808 +v -0.129917 -0.500000 -0.086808 +v -0.086808 -0.468750 -0.129917 +v -0.086807 -0.500000 -0.129917 +v -0.030482 -0.468750 -0.153248 +v -0.030482 -0.500000 -0.153248 +v 0.030483 -0.468750 -0.153248 +v 0.030483 -0.500000 -0.153248 +v 0.086808 -0.468750 -0.129917 +v 0.086808 -0.500000 -0.129917 +v 0.129918 -0.468750 -0.086808 +v 0.129918 -0.500000 -0.086808 +v 0.122598 -0.468750 -0.024386 +v 0.122598 -0.468750 0.024386 +v 0.103934 -0.468750 0.069446 +v 0.069447 -0.468750 0.103934 +v 0.024387 -0.468750 0.122598 +v -0.024386 -0.468750 0.122598 +v -0.069446 -0.468750 0.103934 +v -0.103933 -0.468750 0.069446 +v -0.122598 -0.468750 0.024386 +v -0.122598 -0.468750 -0.024386 +v -0.103933 -0.468750 -0.069446 +v -0.069446 -0.468750 -0.103934 +v -0.024386 -0.468750 -0.122598 +v 0.024387 -0.468750 -0.122598 +v 0.069447 -0.468750 -0.103934 +v 0.103934 -0.468750 -0.069446 +v 0.000000 -0.468750 0.000000 +v 0.000000 -0.500000 -0.000000 +v 0.069446 0.312500 0.103934 +v 0.103933 0.312500 0.069447 +v 0.122598 0.312500 0.024387 +v 0.122598 0.312500 -0.024386 +v 0.129917 0.500000 -0.086808 +v 0.129917 0.312500 -0.086808 +v 0.086808 0.500000 -0.129917 +v 0.086808 0.312500 -0.129917 +v 0.030483 0.500000 -0.153247 +v 0.030483 0.312500 -0.153248 +v -0.030483 0.500000 -0.153247 +v -0.030483 0.312500 -0.153248 +v -0.086808 0.500000 -0.129917 +v -0.086808 0.312500 -0.129917 +v -0.129918 0.500000 -0.086808 +v -0.129918 0.312500 -0.086808 +v -0.153248 0.500000 -0.030483 +v -0.153248 0.312500 -0.030483 +v -0.153248 0.500000 0.030483 +v -0.153248 0.312500 0.030483 +v -0.129918 0.500000 0.086808 +v -0.129918 0.312500 0.086808 +v -0.086808 0.500000 0.129917 +v -0.086808 0.312500 0.129917 +v -0.030483 0.500000 0.153248 +v -0.030483 0.312500 0.153248 +v 0.030482 0.500000 0.153248 +v 0.030482 0.312500 0.153248 +v 0.086807 0.500000 0.129917 +v 0.086807 0.312500 0.129917 +v 0.129917 0.500000 0.086808 +v 0.129917 0.312500 0.086808 +v 0.153247 0.500000 0.030483 +v 0.153247 0.312500 0.030483 +v 0.153247 0.500000 -0.030483 +v 0.153247 0.312500 -0.030483 +v 0.024386 0.312500 0.122598 +v -0.024387 0.312500 0.122598 +v -0.069447 0.312500 0.103934 +v -0.103934 0.312500 0.069446 +v -0.122599 0.312500 0.024386 +v -0.122599 0.312500 -0.024386 +v -0.103934 0.312500 -0.069446 +v -0.069447 0.312500 -0.103934 +v -0.024387 0.312500 -0.122598 +v 0.024386 0.312500 -0.122598 +v 0.069446 0.312500 -0.103933 +v 0.103933 0.312500 -0.069446 +v -0.000000 0.312500 0.000000 +v -0.000000 0.500000 0.000000 +vt 0.680556 0.486111 +vt 0.625000 0.486111 +vt 0.625000 0.652778 +vt 0.680556 0.652778 +vt 0.569444 0.486111 +vt 0.569444 0.652778 +vt 0.513889 0.486111 +vt 0.513889 0.652778 +vt 0.458333 0.486111 +vt 0.458333 0.652778 +vt 0.402778 0.486111 +vt 0.402778 0.652778 +vt 0.347222 0.486111 +vt 0.347222 0.652778 +vt 0.291667 0.486111 +vt 0.291667 0.652778 +vt 0.236111 0.486111 +vt 0.236111 0.652778 +vt 0.180556 0.486111 +vt 0.180556 0.652778 +vt 0.125000 0.486111 +vt 0.125000 0.652778 +vt 0.069444 0.486111 +vt 0.069444 0.652778 +vt 0.013889 0.486111 +vt 0.013889 0.652778 +vt 0.902778 0.486111 +vt 0.847222 0.486111 +vt 0.847222 0.652778 +vt 0.902778 0.652778 +vt 0.791667 0.486111 +vt 0.791667 0.652778 +vt 0.736111 0.486111 +vt 0.736111 0.652778 +vt 0.194034 0.696809 +vt 0.165430 0.839757 +vt 0.136827 0.696809 +vt 0.469943 0.696809 +vt 0.498546 0.839757 +vt 0.527150 0.696809 +vt 0.580002 0.718572 +vt 0.620453 0.758784 +vt 0.642345 0.811323 +vt 0.642345 0.868191 +vt 0.620453 0.920730 +vt 0.580002 0.960942 +vt 0.527149 0.982704 +vt 0.469943 0.982704 +vt 0.417091 0.960942 +vt 0.376639 0.920730 +vt 0.354747 0.868191 +vt 0.354747 0.811323 +vt 0.376639 0.758784 +vt 0.417091 0.718572 +vt 0.083975 0.718572 +vt 0.043524 0.758784 +vt 0.021631 0.811323 +vt 0.021631 0.868191 +vt 0.043523 0.920730 +vt 0.083975 0.960942 +vt 0.136827 0.982704 +vt 0.194034 0.982704 +vt 0.246886 0.960942 +vt 0.287337 0.920730 +vt 0.309229 0.868191 +vt 0.309229 0.811323 +vt 0.287337 0.758784 +vt 0.246886 0.718572 +vt 0.180556 0.458333 +vt 0.180556 0.013889 +vt 0.236111 0.013889 +vt 0.236111 0.458333 +vt 0.750889 0.718565 +vt 0.803741 0.696803 +vt 0.832345 0.839750 +vt 0.710438 0.758777 +vt 0.688546 0.811316 +vt 0.688546 0.868184 +vt 0.710438 0.920723 +vt 0.750889 0.960935 +vt 0.803741 0.982698 +vt 0.860948 0.982698 +vt 0.913800 0.960935 +vt 0.954251 0.920723 +vt 0.976143 0.868184 +vt 0.976143 0.811316 +vt 0.954251 0.758777 +vt 0.913800 0.718565 +vt 0.860948 0.696803 +vt 0.417087 0.718565 +vt 0.469939 0.696803 +vt 0.498543 0.839750 +vt 0.376636 0.758777 +vt 0.354744 0.811316 +vt 0.354744 0.868184 +vt 0.376636 0.920723 +vt 0.417087 0.960935 +vt 0.469939 0.982698 +vt 0.527146 0.982698 +vt 0.579998 0.960935 +vt 0.620449 0.920723 +vt 0.642341 0.868184 +vt 0.642341 0.811316 +vt 0.620449 0.758777 +vt 0.579998 0.718565 +vt 0.527146 0.696803 +vt 0.791667 0.458333 +vt 0.791667 0.013889 +vt 0.847222 0.013889 +vt 0.847222 0.458333 +vt 0.680556 0.458333 +vt 0.680556 0.013889 +vt 0.736111 0.013889 +vt 0.736111 0.458333 +vt 0.513889 0.458333 +vt 0.513889 0.013889 +vt 0.569444 0.013889 +vt 0.569444 0.458333 +vt 0.625000 0.458333 +vt 0.625000 0.013889 +vt 0.458333 0.458333 +vt 0.458333 0.013889 +vt 0.402778 0.458333 +vt 0.402778 0.013889 +vt 0.347222 0.458333 +vt 0.347222 0.013889 +vt 0.291667 0.458333 +vt 0.291667 0.013889 +vt 0.125000 0.458333 +vt 0.125000 0.013889 +vt 0.069444 0.458333 +vt 0.069444 0.013889 +vt 0.013889 0.458333 +vt 0.013889 0.013889 +vt 0.902778 0.013889 +vt 0.902778 0.458333 +s off +f 1/1 3/2 4/3 2/4 +f 3/2 5/5 6/6 4/3 +f 5/5 7/7 8/8 6/6 +f 7/7 9/9 10/10 8/8 +f 9/9 11/11 12/12 10/10 +f 11/11 13/13 14/14 12/12 +f 13/13 15/15 16/16 14/14 +f 15/15 17/17 18/18 16/16 +f 17/17 19/19 20/20 18/18 +f 19/19 21/21 22/22 20/20 +f 21/21 23/23 24/24 22/22 +f 23/23 25/25 26/26 24/24 +f 25/27 27/28 28/29 26/30 +f 27/28 29/31 30/32 28/29 +f 31/33 1/1 2/4 32/34 +f 29/31 31/33 32/34 30/32 +f 4/35 50/36 2/37 +f 1/38 49/39 3/40 +f 3/40 49/39 5/41 +f 5/41 49/39 7/42 +f 7/42 49/39 9/43 +f 9/43 49/39 11/44 +f 11/44 49/39 13/45 +f 13/45 49/39 15/46 +f 15/46 49/39 17/47 +f 17/47 49/39 19/48 +f 19/48 49/39 21/49 +f 21/49 49/39 23/50 +f 23/50 49/39 25/51 +f 25/51 49/39 27/52 +f 27/52 49/39 29/53 +f 29/53 49/39 31/54 +f 31/54 49/39 1/38 +f 2/37 50/36 32/55 +f 32/55 50/36 30/56 +f 30/56 50/36 28/57 +f 28/57 50/36 26/58 +f 26/58 50/36 24/59 +f 24/59 50/36 22/60 +f 22/60 50/36 20/61 +f 20/61 50/36 18/62 +f 18/62 50/36 16/63 +f 16/63 50/36 14/64 +f 14/64 50/36 12/65 +f 12/65 50/36 10/66 +f 10/66 50/36 8/67 +f 8/67 50/36 6/68 +f 6/68 50/36 4/35 +f 41/69 91/70 92/71 42/72 +f 81/73 83/74 100/75 +f 79/76 81/73 100/75 +f 77/77 79/76 100/75 +f 75/78 77/77 100/75 +f 73/79 75/78 100/75 +f 71/80 73/79 100/75 +f 69/81 71/80 100/75 +f 67/82 69/81 100/75 +f 65/83 67/82 100/75 +f 63/84 65/83 100/75 +f 61/85 63/84 100/75 +f 59/86 61/85 100/75 +f 57/87 59/86 100/75 +f 55/88 57/87 100/75 +f 85/89 55/88 100/75 +f 56/90 86/91 99/92 +f 58/93 56/90 99/92 +f 60/94 58/93 99/92 +f 62/95 60/94 99/92 +f 64/96 62/95 99/92 +f 66/97 64/96 99/92 +f 68/98 66/97 99/92 +f 70/99 68/98 99/92 +f 72/100 70/99 99/92 +f 74/101 72/100 99/92 +f 76/102 74/101 99/92 +f 78/103 76/102 99/92 +f 80/104 78/103 99/92 +f 82/105 80/104 99/92 +f 84/106 82/105 99/92 +f 86/91 84/106 99/92 +f 83/74 85/89 100/75 +f 58/22 57/21 55/19 56/20 +f 56/20 55/19 85/17 86/18 +f 60/24 59/23 57/21 58/22 +f 62/26 61/25 59/23 60/24 +f 64/29 63/28 61/27 62/30 +f 66/32 65/31 63/28 64/29 +f 68/34 67/33 65/31 66/32 +f 70/4 69/1 67/33 68/34 +f 72/3 71/2 69/1 70/4 +f 74/6 73/5 71/2 72/3 +f 76/8 75/7 73/5 74/6 +f 78/10 77/9 75/7 76/8 +f 80/12 79/11 77/9 78/10 +f 82/14 81/13 79/11 80/12 +f 84/16 83/15 81/13 82/14 +f 86/18 85/17 83/15 84/16 +f 36/107 51/108 87/109 37/110 +f 34/111 53/112 52/113 35/114 +f 47/115 97/116 98/117 48/118 +f 33/119 54/120 53/112 34/111 +f 35/114 52/113 51/108 36/107 +f 48/118 98/117 54/120 33/119 +f 46/121 96/122 97/116 47/115 +f 45/123 95/124 96/122 46/121 +f 44/125 94/126 95/124 45/123 +f 43/127 93/128 94/126 44/125 +f 42/72 92/71 93/128 43/127 +f 40/129 90/130 91/70 41/69 +f 39/131 89/132 90/130 40/129 +f 38/133 88/134 89/132 39/131 +f 37/110 87/109 88/135 38/136 diff --git a/mods/pipeworks/models/pipeworks_pipe_10.obj b/mods/pipeworks/models/pipeworks_pipe_10.obj new file mode 100644 index 0000000..9edb938 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_10.obj @@ -0,0 +1,891 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-6way.blend' +# www.blender.org +mtllib pipeworks_pipe_10.mtl +o Cube.000 +v 0.069446 -0.468750 -0.103934 +v 0.103933 -0.468750 -0.069446 +v 0.122598 -0.468750 -0.024386 +v 0.122598 -0.468750 0.024386 +v 0.129917 -0.500000 0.086808 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.500000 0.129917 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.500000 0.153247 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.500000 0.153247 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.500000 0.129917 +v -0.086808 -0.468750 0.129917 +v -0.129918 -0.500000 0.086808 +v -0.129917 -0.468750 0.086808 +v -0.153248 -0.500000 0.030483 +v -0.153248 -0.468750 0.030483 +v -0.153248 -0.500000 -0.030483 +v -0.153248 -0.468750 -0.030483 +v -0.129918 -0.500000 -0.086808 +v -0.129917 -0.468750 -0.086808 +v -0.086808 -0.500000 -0.129917 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.500000 -0.153248 +v -0.030483 -0.468750 -0.153248 +v 0.030482 -0.500000 -0.153248 +v 0.030482 -0.468750 -0.153248 +v 0.086807 -0.500000 -0.129917 +v 0.086807 -0.468750 -0.129917 +v 0.129917 -0.500000 -0.086808 +v 0.129917 -0.468750 -0.086808 +v 0.153247 -0.500000 -0.030483 +v 0.153247 -0.468750 -0.030483 +v 0.153247 -0.500000 0.030483 +v 0.153247 -0.468750 0.030483 +v 0.024386 -0.468750 -0.122598 +v -0.024387 -0.468750 -0.122598 +v -0.069447 -0.468750 -0.103934 +v -0.103934 -0.468750 -0.069446 +v -0.122599 -0.468750 -0.024386 +v -0.122599 -0.468750 0.024386 +v -0.103934 -0.468750 0.069446 +v -0.069447 -0.468750 0.103934 +v -0.024387 -0.468750 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.069446 -0.468750 0.103933 +v 0.103933 -0.468750 0.069446 +v -0.000000 -0.468750 -0.000000 +v -0.000000 -0.500000 -0.000000 +v -0.024386 -0.024391 -0.122598 +v -0.069446 -0.024391 -0.103934 +v -0.103934 -0.024391 -0.069446 +v -0.122598 -0.024391 -0.024386 +v -0.122598 -0.024391 0.024386 +v -0.103934 -0.024391 0.069446 +v -0.069446 -0.024391 0.103934 +v -0.024386 -0.024391 0.122598 +v 0.024386 -0.024391 0.122598 +v 0.103934 -0.024391 0.069446 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 -0.069446 +v 0.122598 -0.024391 -0.024386 +v 0.122598 -0.024391 0.024386 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v 0.153248 0.468750 0.030483 +v 0.153248 0.500000 0.030483 +v 0.153248 0.468750 -0.030483 +v 0.153248 0.500000 -0.030483 +v 0.129917 0.468750 -0.086808 +v 0.129917 0.500000 -0.086808 +v 0.086808 0.468750 -0.129917 +v 0.086808 0.500000 -0.129917 +v 0.030483 0.468750 -0.153248 +v 0.030483 0.500000 -0.153248 +v -0.030483 0.468750 -0.153248 +v -0.030483 0.500000 -0.153248 +v -0.086808 0.468750 -0.129917 +v -0.086808 0.500000 -0.129917 +v -0.129917 0.468750 -0.086808 +v -0.129917 0.500000 -0.086808 +v -0.153247 0.468750 -0.030483 +v -0.153247 0.500000 -0.030483 +v -0.153247 0.468750 0.030483 +v -0.153247 0.500000 0.030483 +v -0.129917 0.468750 0.086808 +v -0.129917 0.500000 0.086808 +v -0.086808 0.468750 0.129917 +v -0.086808 0.500000 0.129917 +v -0.030483 0.468750 0.153248 +v -0.030483 0.500000 0.153248 +v 0.030483 0.468750 0.153248 +v 0.030483 0.500000 0.153248 +v 0.086808 0.468750 0.129917 +v 0.086808 0.500000 0.129917 +v 0.129917 0.468750 0.086808 +v 0.129918 0.500000 0.086808 +v 0.122598 0.468750 0.024386 +v 0.122598 0.468750 -0.024386 +v 0.103934 0.468750 -0.069446 +v 0.069447 0.468750 -0.103934 +v 0.024387 0.468750 -0.122598 +v -0.024386 0.468750 -0.122598 +v -0.069446 0.468750 -0.103934 +v -0.103933 0.468750 -0.069446 +v -0.122598 0.468750 -0.024386 +v -0.122598 0.468750 0.024386 +v -0.103933 0.468750 0.069446 +v -0.069446 0.468750 0.103934 +v -0.024386 0.468750 0.122598 +v 0.024387 0.468750 0.122598 +v 0.069447 0.468750 0.103934 +v 0.103934 0.468750 0.069446 +v 0.000000 0.468750 -0.000000 +v 0.000000 0.500000 0.000000 +v -0.024386 0.024390 -0.122598 +v -0.069446 0.024390 -0.103934 +v -0.103934 0.024390 -0.069446 +v -0.122598 0.024390 -0.024386 +v -0.122598 0.024390 0.024386 +v -0.103934 0.024390 0.069446 +v -0.069446 0.024390 0.103934 +v -0.024386 0.024389 0.122598 +v 0.024386 0.024389 0.122598 +v 0.103934 0.024390 0.069446 +v 0.069446 0.024390 0.103934 +v 0.103934 0.024390 -0.069446 +v 0.122598 0.024390 -0.024386 +v 0.122598 0.024390 0.024386 +v 0.069446 0.024390 -0.103934 +v 0.024386 0.024390 -0.122598 +v 0.468750 -0.153248 0.030483 +v 0.500000 -0.153248 0.030483 +v 0.468750 -0.153248 -0.030483 +v 0.500000 -0.153248 -0.030483 +v 0.468750 -0.129917 -0.086808 +v 0.500000 -0.129917 -0.086808 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.030483 -0.153248 +v 0.500000 -0.030483 -0.153248 +v 0.468750 0.030483 -0.153248 +v 0.500000 0.030483 -0.153248 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153247 -0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.129917 0.086808 +v 0.500000 0.129917 0.086808 +v 0.468750 0.086808 0.129917 +v 0.500000 0.086808 0.129917 +v 0.468750 0.030483 0.153248 +v 0.500000 0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.122598 0.024386 +v 0.468750 -0.122598 -0.024386 +v 0.468750 -0.103934 -0.069446 +v 0.468750 -0.069446 -0.103934 +v 0.468750 -0.024386 -0.122598 +v 0.468750 0.024386 -0.122598 +v 0.468750 0.069446 -0.103934 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.122598 0.024386 +v 0.468750 0.103934 0.069446 +v 0.468750 0.069446 0.103934 +v 0.468750 0.024386 0.122598 +v 0.468750 -0.024387 0.122598 +v 0.468750 -0.069447 0.103934 +v 0.468750 -0.103934 0.069446 +v 0.468750 -0.000000 -0.000000 +v 0.500000 -0.000000 0.000000 +v -0.468750 -0.069446 -0.103934 +v -0.468750 -0.103933 -0.069446 +v -0.468750 -0.122598 -0.024387 +v -0.468750 -0.122598 0.024386 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.030483 0.153247 +v -0.468750 -0.030483 0.153248 +v -0.500000 0.030483 0.153247 +v -0.468750 0.030483 0.153248 +v -0.500000 0.086808 0.129917 +v -0.468750 0.086808 0.129917 +v -0.500000 0.129917 0.086808 +v -0.468750 0.129917 0.086808 +v -0.500000 0.153248 0.030483 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.030483 -0.153248 +v -0.468750 0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.153247 -0.030483 +v -0.468750 -0.153247 -0.030483 +v -0.500000 -0.153247 0.030483 +v -0.468750 -0.153247 0.030483 +v -0.468750 -0.024386 -0.122598 +v -0.468750 0.024387 -0.122598 +v -0.468750 0.069447 -0.103934 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.122598 0.024386 +v -0.468750 0.103934 0.069446 +v -0.468750 0.069447 0.103934 +v -0.468750 0.024387 0.122598 +v -0.468750 -0.024386 0.122598 +v -0.468750 -0.069446 0.103933 +v -0.468750 -0.103933 0.069446 +v -0.468750 0.000000 -0.000000 +v -0.500000 0.000000 -0.000000 +v 0.069446 -0.103934 0.468750 +v 0.103933 -0.069447 0.468750 +v 0.122598 -0.024387 0.468750 +v 0.122598 0.024386 0.468750 +v 0.129917 0.086807 0.500000 +v 0.129917 0.086807 0.468750 +v 0.086808 0.129917 0.500000 +v 0.086808 0.129917 0.468750 +v 0.030483 0.153247 0.500000 +v 0.030483 0.153247 0.468750 +v -0.030483 0.153247 0.500000 +v -0.030483 0.153247 0.468750 +v -0.086808 0.129917 0.500000 +v -0.086808 0.129917 0.468750 +v -0.129918 0.086808 0.500000 +v -0.129917 0.086808 0.468750 +v -0.153248 0.030483 0.500000 +v -0.153248 0.030483 0.468750 +v -0.153248 -0.030483 0.500000 +v -0.153248 -0.030483 0.468750 +v -0.129918 -0.086808 0.500000 +v -0.129917 -0.086808 0.468750 +v -0.086808 -0.129917 0.500000 +v -0.086808 -0.129917 0.468750 +v -0.030483 -0.153248 0.500000 +v -0.030483 -0.153248 0.468750 +v 0.030482 -0.153248 0.500000 +v 0.030482 -0.153248 0.468750 +v 0.086807 -0.129917 0.500000 +v 0.086807 -0.129917 0.468750 +v 0.129917 -0.086808 0.500000 +v 0.129917 -0.086808 0.468750 +v 0.153247 -0.030483 0.500000 +v 0.153247 -0.030483 0.468750 +v 0.153247 0.030483 0.500000 +v 0.153247 0.030483 0.468750 +v 0.024386 -0.122598 0.468750 +v -0.024387 -0.122598 0.468750 +v -0.069447 -0.103934 0.468750 +v -0.103934 -0.069447 0.468750 +v -0.122599 -0.024387 0.468750 +v -0.122599 0.024386 0.468750 +v -0.103934 0.069446 0.468750 +v -0.069447 0.103933 0.468750 +v -0.024387 0.122598 0.468750 +v 0.024386 0.122598 0.468750 +v 0.069446 0.103933 0.468750 +v 0.103933 0.069446 0.468750 +v -0.000000 -0.000000 0.468750 +v -0.000000 -0.000000 0.500000 +v -0.024386 -0.122598 0.024391 +v -0.069446 -0.103934 0.024391 +v -0.103934 -0.069446 0.024391 +v -0.122598 -0.024386 0.024391 +v -0.122598 0.024386 0.024391 +v -0.103934 0.069446 0.024391 +v -0.069446 0.103934 0.024391 +v -0.024386 0.122598 0.024391 +v 0.024386 0.122598 0.024391 +v 0.103934 0.069446 0.024391 +v 0.069446 0.103934 0.024391 +v 0.103934 -0.069446 0.024391 +v 0.122598 -0.024386 0.024391 +v 0.122598 0.024386 0.024391 +v 0.069446 -0.103934 0.024391 +v 0.024386 -0.122598 0.024391 +v 0.153248 0.030483 -0.468750 +v 0.153248 0.030483 -0.500000 +v 0.153248 -0.030483 -0.468750 +v 0.153248 -0.030483 -0.500000 +v 0.129917 -0.086808 -0.468750 +v 0.129917 -0.086808 -0.500000 +v 0.086808 -0.129917 -0.468750 +v 0.086808 -0.129917 -0.500000 +v 0.030483 -0.153248 -0.468750 +v 0.030483 -0.153248 -0.500000 +v -0.030483 -0.153248 -0.468750 +v -0.030483 -0.153248 -0.500000 +v -0.086808 -0.129917 -0.468750 +v -0.086808 -0.129917 -0.500000 +v -0.129917 -0.086808 -0.468750 +v -0.129917 -0.086808 -0.500000 +v -0.153247 -0.030483 -0.468750 +v -0.153247 -0.030483 -0.500000 +v -0.153247 0.030483 -0.468750 +v -0.153247 0.030483 -0.500000 +v -0.129917 0.086808 -0.468750 +v -0.129917 0.086808 -0.500000 +v -0.086808 0.129917 -0.468750 +v -0.086808 0.129917 -0.500000 +v -0.030483 0.153248 -0.468750 +v -0.030483 0.153248 -0.500000 +v 0.030483 0.153248 -0.468750 +v 0.030483 0.153248 -0.500000 +v 0.086808 0.129917 -0.468750 +v 0.086808 0.129917 -0.500000 +v 0.129917 0.086808 -0.468750 +v 0.129918 0.086808 -0.500000 +v 0.122598 0.024386 -0.468750 +v 0.122598 -0.024386 -0.468750 +v 0.103934 -0.069446 -0.468750 +v 0.069447 -0.103934 -0.468750 +v 0.024387 -0.122598 -0.468750 +v -0.024386 -0.122598 -0.468750 +v -0.069446 -0.103934 -0.468750 +v -0.103933 -0.069446 -0.468750 +v -0.122598 -0.024386 -0.468750 +v -0.122598 0.024386 -0.468750 +v -0.103933 0.069446 -0.468750 +v -0.069446 0.103934 -0.468750 +v -0.024386 0.122598 -0.468750 +v 0.024387 0.122598 -0.468750 +v 0.069447 0.103934 -0.468750 +v 0.103934 0.069446 -0.468750 +v 0.000000 -0.000000 -0.468750 +v 0.000000 0.000000 -0.500000 +v -0.024386 -0.122598 -0.024390 +v -0.069446 -0.103934 -0.024391 +v -0.103934 -0.069446 -0.024391 +v -0.122598 -0.024386 -0.024391 +v -0.122598 0.024386 -0.024391 +v -0.103934 0.069446 -0.024390 +v -0.069446 0.103934 -0.024390 +v -0.024386 0.122598 -0.024389 +v 0.024386 0.122598 -0.024389 +v 0.103934 0.069446 -0.024390 +v 0.069446 0.103934 -0.024390 +v 0.103934 -0.069446 -0.024390 +v 0.122598 -0.024386 -0.024390 +v 0.122598 0.024386 -0.024390 +v 0.069446 -0.103934 -0.024390 +v 0.024386 -0.122598 -0.024390 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.218363 0.657325 +vt 0.185866 0.820702 +vt 0.153368 0.657325 +vt 0.531836 0.657325 +vt 0.564334 0.820702 +vt 0.596832 0.657325 +vt 0.656879 0.682198 +vt 0.702838 0.728156 +vt 0.727710 0.788204 +vt 0.727710 0.853199 +vt 0.702838 0.913247 +vt 0.656879 0.959205 +vt 0.596831 0.984078 +vt 0.531836 0.984078 +vt 0.471788 0.959205 +vt 0.425830 0.913247 +vt 0.400957 0.853199 +vt 0.400957 0.788204 +vt 0.425830 0.728156 +vt 0.471789 0.682198 +vt 0.093321 0.682198 +vt 0.047362 0.728156 +vt 0.022489 0.788204 +vt 0.022489 0.853199 +vt 0.047362 0.913247 +vt 0.093320 0.959205 +vt 0.153368 0.984078 +vt 0.218363 0.984078 +vt 0.278411 0.959205 +vt 0.324369 0.913247 +vt 0.349242 0.853199 +vt 0.349242 0.788204 +vt 0.324369 0.728156 +vt 0.278411 0.682198 +vt 0.187500 0.515625 +vt 0.250000 0.515625 +vt 0.875000 0.515625 +vt 0.937500 0.515625 +vt 0.750000 0.515625 +vt 0.812500 0.515625 +vt 0.562500 0.515625 +vt 0.625000 0.515625 +vt 0.687500 0.515625 +vt 0.500000 0.515625 +vt 0.437500 0.515625 +vt 0.375000 0.515625 +vt 0.312500 0.515625 +vt 0.125000 0.515625 +vt 0.062500 0.515625 +vt 0.000000 0.515625 +vt 1.000000 0.515625 +usemtl None +s off +f 54/1 41/2 42/3 55/4 +f 31/5 33/6 50/7 +f 29/8 31/5 50/7 +f 27/9 29/8 50/7 +f 25/10 27/9 50/7 +f 23/11 25/10 50/7 +f 21/12 23/11 50/7 +f 19/13 21/12 50/7 +f 17/14 19/13 50/7 +f 15/15 17/14 50/7 +f 13/16 15/15 50/7 +f 11/17 13/16 50/7 +f 9/18 11/17 50/7 +f 7/19 9/18 50/7 +f 5/20 7/19 50/7 +f 35/21 5/20 50/7 +f 6/22 36/23 49/24 +f 8/25 6/22 49/24 +f 10/26 8/25 49/24 +f 12/27 10/26 49/24 +f 14/28 12/27 49/24 +f 16/29 14/28 49/24 +f 18/30 16/29 49/24 +f 20/31 18/30 49/24 +f 22/32 20/31 49/24 +f 24/33 22/32 49/24 +f 26/34 24/33 49/24 +f 28/35 26/34 49/24 +f 30/36 28/35 49/24 +f 32/37 30/36 49/24 +f 34/38 32/37 49/24 +f 36/23 34/38 49/24 +f 33/6 35/21 50/7 +f 8/39 7/40 5/41 6/42 +f 6/42 5/41 35/43 36/44 +f 10/45 9/46 7/40 8/39 +f 12/47 11/48 9/46 10/45 +f 14/49 13/50 11/51 12/52 +f 16/53 15/54 13/50 14/49 +f 18/55 17/56 15/54 16/53 +f 20/57 19/58 17/56 18/55 +f 22/59 21/60 19/58 20/57 +f 24/61 23/62 21/60 22/59 +f 26/63 25/64 23/62 24/61 +f 28/65 27/66 25/64 26/63 +f 30/67 29/68 27/66 28/65 +f 32/69 31/70 29/68 30/67 +f 34/71 33/72 31/70 32/69 +f 36/44 35/43 33/72 34/71 +f 65/73 1/74 37/75 66/76 +f 63/77 3/78 2/79 62/80 +f 61/81 47/82 48/83 60/84 +f 64/85 4/86 3/78 63/77 +f 62/80 2/79 1/74 65/73 +f 60/84 48/83 4/86 64/85 +f 59/87 46/88 47/82 61/81 +f 58/89 45/90 46/88 59/87 +f 57/91 44/92 45/90 58/89 +f 56/93 43/94 44/92 57/91 +f 55/4 42/3 43/94 56/93 +f 53/95 40/96 41/2 54/1 +f 52/97 39/98 40/96 53/95 +f 51/99 38/100 39/98 52/97 +f 66/76 37/75 38/101 51/102 +f 67/58 69/60 70/59 68/57 +f 69/60 71/62 72/61 70/59 +f 71/62 73/64 74/63 72/61 +f 73/64 75/66 76/65 74/63 +f 75/66 77/68 78/67 76/65 +f 77/68 79/70 80/69 78/67 +f 79/70 81/72 82/71 80/69 +f 81/72 83/43 84/44 82/71 +f 83/43 85/41 86/42 84/44 +f 85/41 87/40 88/39 86/42 +f 87/40 89/46 90/45 88/39 +f 89/46 91/48 92/47 90/45 +f 91/51 93/50 94/49 92/52 +f 93/50 95/54 96/53 94/49 +f 97/56 67/58 68/57 98/55 +f 95/54 97/56 98/55 96/53 +f 70/103 116/104 68/105 +f 67/106 115/107 69/108 +f 69/108 115/107 71/109 +f 71/109 115/107 73/110 +f 73/110 115/107 75/111 +f 75/111 115/107 77/112 +f 77/112 115/107 79/113 +f 79/113 115/107 81/114 +f 81/114 115/107 83/115 +f 83/115 115/107 85/116 +f 85/116 115/107 87/117 +f 87/117 115/107 89/118 +f 89/118 115/107 91/119 +f 91/119 115/107 93/120 +f 93/120 115/107 95/121 +f 95/121 115/107 97/122 +f 97/122 115/107 67/106 +f 68/105 116/104 98/123 +f 98/123 116/104 96/124 +f 96/124 116/104 94/125 +f 94/125 116/104 92/126 +f 92/126 116/104 90/127 +f 90/127 116/104 88/128 +f 88/128 116/104 86/129 +f 86/129 116/104 84/130 +f 84/130 116/104 82/131 +f 82/131 116/104 80/132 +f 80/132 116/104 78/133 +f 78/133 116/104 76/134 +f 76/134 116/104 74/135 +f 74/135 116/104 72/136 +f 72/136 116/104 70/103 +f 107/137 120/1 121/4 108/138 +f 102/139 131/73 132/76 103/140 +f 100/141 129/77 128/80 101/142 +f 113/143 127/81 126/84 114/144 +f 99/145 130/85 129/77 100/141 +f 101/142 128/80 131/73 102/139 +f 114/144 126/84 130/85 99/145 +f 112/146 125/87 127/81 113/143 +f 111/147 124/89 125/87 112/146 +f 110/148 123/91 124/89 111/147 +f 109/149 122/93 123/91 110/148 +f 108/138 121/4 122/93 109/149 +f 106/150 119/95 120/1 107/137 +f 105/151 118/97 119/95 106/150 +f 104/152 117/99 118/97 105/151 +f 103/140 132/76 117/102 104/153 +f 133/58 135/60 136/59 134/57 +f 135/60 137/62 138/61 136/59 +f 137/62 139/64 140/63 138/61 +f 139/64 141/66 142/65 140/63 +f 141/66 143/68 144/67 142/65 +f 143/68 145/70 146/69 144/67 +f 145/70 147/72 148/71 146/69 +f 147/72 149/43 150/44 148/71 +f 149/43 151/41 152/42 150/44 +f 151/41 153/40 154/39 152/42 +f 153/40 155/46 156/45 154/39 +f 155/46 157/48 158/47 156/45 +f 157/51 159/50 160/49 158/52 +f 159/50 161/54 162/53 160/49 +f 163/56 133/58 134/57 164/55 +f 161/54 163/56 164/55 162/53 +f 136/103 182/104 134/105 +f 133/106 181/107 135/108 +f 135/108 181/107 137/109 +f 137/109 181/107 139/110 +f 139/110 181/107 141/111 +f 141/111 181/107 143/112 +f 143/112 181/107 145/113 +f 145/113 181/107 147/114 +f 147/114 181/107 149/115 +f 149/115 181/107 151/116 +f 151/116 181/107 153/117 +f 153/117 181/107 155/118 +f 155/118 181/107 157/119 +f 157/119 181/107 159/120 +f 159/120 181/107 161/121 +f 161/121 181/107 163/122 +f 163/122 181/107 133/106 +f 134/105 182/104 164/123 +f 164/123 182/104 162/124 +f 162/124 182/104 160/125 +f 160/125 182/104 158/126 +f 158/126 182/104 156/127 +f 156/127 182/104 154/128 +f 154/128 182/104 152/129 +f 152/129 182/104 150/130 +f 150/130 182/104 148/131 +f 148/131 182/104 146/132 +f 146/132 182/104 144/133 +f 144/133 182/104 142/134 +f 142/134 182/104 140/135 +f 140/135 182/104 138/136 +f 138/136 182/104 136/103 +f 173/137 223/2 224/3 174/138 +f 213/5 215/6 232/7 +f 211/8 213/5 232/7 +f 209/9 211/8 232/7 +f 207/10 209/9 232/7 +f 205/11 207/10 232/7 +f 203/12 205/11 232/7 +f 201/13 203/12 232/7 +f 199/14 201/13 232/7 +f 197/15 199/14 232/7 +f 195/16 197/15 232/7 +f 193/17 195/16 232/7 +f 191/18 193/17 232/7 +f 189/19 191/18 232/7 +f 187/20 189/19 232/7 +f 217/21 187/20 232/7 +f 188/22 218/23 231/24 +f 190/25 188/22 231/24 +f 192/26 190/25 231/24 +f 194/27 192/26 231/24 +f 196/28 194/27 231/24 +f 198/29 196/28 231/24 +f 200/30 198/29 231/24 +f 202/31 200/30 231/24 +f 204/32 202/31 231/24 +f 206/33 204/32 231/24 +f 208/34 206/33 231/24 +f 210/35 208/34 231/24 +f 212/36 210/35 231/24 +f 214/37 212/36 231/24 +f 216/38 214/37 231/24 +f 218/23 216/38 231/24 +f 215/6 217/21 232/7 +f 190/39 189/40 187/41 188/42 +f 188/42 187/41 217/43 218/44 +f 192/45 191/46 189/40 190/39 +f 194/47 193/48 191/46 192/45 +f 196/49 195/50 193/51 194/52 +f 198/53 197/54 195/50 196/49 +f 200/55 199/56 197/54 198/53 +f 202/57 201/58 199/56 200/55 +f 204/59 203/60 201/58 202/57 +f 206/61 205/62 203/60 204/59 +f 208/63 207/64 205/62 206/61 +f 210/65 209/66 207/64 208/63 +f 212/67 211/68 209/66 210/65 +f 214/69 213/70 211/68 212/67 +f 216/71 215/72 213/70 214/69 +f 218/44 217/43 215/72 216/71 +f 168/139 183/74 219/75 169/140 +f 166/141 185/78 184/79 167/142 +f 179/143 229/82 230/83 180/144 +f 165/145 186/86 185/78 166/141 +f 167/142 184/79 183/74 168/139 +f 180/144 230/83 186/86 165/145 +f 178/146 228/88 229/82 179/143 +f 177/147 227/90 228/88 178/146 +f 176/148 226/92 227/90 177/147 +f 175/149 225/94 226/92 176/148 +f 174/138 224/3 225/94 175/149 +f 172/150 222/96 223/2 173/137 +f 171/151 221/98 222/96 172/150 +f 170/152 220/100 221/98 171/151 +f 169/140 219/75 220/101 170/153 +f 286/1 273/2 274/3 287/4 +f 263/5 265/6 282/7 +f 261/8 263/5 282/7 +f 259/9 261/8 282/7 +f 257/10 259/9 282/7 +f 255/11 257/10 282/7 +f 253/12 255/11 282/7 +f 251/13 253/12 282/7 +f 249/14 251/13 282/7 +f 247/15 249/14 282/7 +f 245/16 247/15 282/7 +f 243/17 245/16 282/7 +f 241/18 243/17 282/7 +f 239/19 241/18 282/7 +f 237/20 239/19 282/7 +f 267/21 237/20 282/7 +f 238/22 268/23 281/24 +f 240/25 238/22 281/24 +f 242/26 240/25 281/24 +f 244/27 242/26 281/24 +f 246/28 244/27 281/24 +f 248/29 246/28 281/24 +f 250/30 248/29 281/24 +f 252/31 250/30 281/24 +f 254/32 252/31 281/24 +f 256/33 254/32 281/24 +f 258/34 256/33 281/24 +f 260/35 258/34 281/24 +f 262/36 260/35 281/24 +f 264/37 262/36 281/24 +f 266/38 264/37 281/24 +f 268/23 266/38 281/24 +f 265/6 267/21 282/7 +f 240/39 239/40 237/41 238/42 +f 238/42 237/41 267/43 268/44 +f 242/45 241/46 239/40 240/39 +f 244/47 243/48 241/46 242/45 +f 246/49 245/50 243/51 244/52 +f 248/53 247/54 245/50 246/49 +f 250/55 249/56 247/54 248/53 +f 252/57 251/58 249/56 250/55 +f 254/59 253/60 251/58 252/57 +f 256/61 255/62 253/60 254/59 +f 258/63 257/64 255/62 256/61 +f 260/65 259/66 257/64 258/63 +f 262/67 261/68 259/66 260/65 +f 264/69 263/70 261/68 262/67 +f 266/71 265/72 263/70 264/69 +f 268/44 267/43 265/72 266/71 +f 297/73 233/74 269/75 298/76 +f 295/77 235/78 234/79 294/80 +f 293/81 279/82 280/83 292/84 +f 296/85 236/86 235/78 295/77 +f 294/80 234/79 233/74 297/73 +f 292/84 280/83 236/86 296/85 +f 291/87 278/88 279/82 293/81 +f 290/89 277/90 278/88 291/87 +f 289/91 276/92 277/90 290/89 +f 288/93 275/94 276/92 289/91 +f 287/4 274/3 275/94 288/93 +f 285/95 272/96 273/2 286/1 +f 284/97 271/98 272/96 285/95 +f 283/99 270/100 271/98 284/97 +f 298/76 269/75 270/101 283/102 +f 299/58 301/60 302/59 300/57 +f 301/60 303/62 304/61 302/59 +f 303/62 305/64 306/63 304/61 +f 305/64 307/66 308/65 306/63 +f 307/66 309/68 310/67 308/65 +f 309/68 311/70 312/69 310/67 +f 311/70 313/72 314/71 312/69 +f 313/72 315/43 316/44 314/71 +f 315/43 317/41 318/42 316/44 +f 317/41 319/40 320/39 318/42 +f 319/40 321/46 322/45 320/39 +f 321/46 323/48 324/47 322/45 +f 323/51 325/50 326/49 324/52 +f 325/50 327/54 328/53 326/49 +f 329/56 299/58 300/57 330/55 +f 327/54 329/56 330/55 328/53 +f 302/103 348/104 300/105 +f 299/106 347/107 301/108 +f 301/108 347/107 303/109 +f 303/109 347/107 305/110 +f 305/110 347/107 307/111 +f 307/111 347/107 309/112 +f 309/112 347/107 311/113 +f 311/113 347/107 313/114 +f 313/114 347/107 315/115 +f 315/115 347/107 317/116 +f 317/116 347/107 319/117 +f 319/117 347/107 321/118 +f 321/118 347/107 323/119 +f 323/119 347/107 325/120 +f 325/120 347/107 327/121 +f 327/121 347/107 329/122 +f 329/122 347/107 299/106 +f 300/105 348/104 330/123 +f 330/123 348/104 328/124 +f 328/124 348/104 326/125 +f 326/125 348/104 324/126 +f 324/126 348/104 322/127 +f 322/127 348/104 320/128 +f 320/128 348/104 318/129 +f 318/129 348/104 316/130 +f 316/130 348/104 314/131 +f 314/131 348/104 312/132 +f 312/132 348/104 310/133 +f 310/133 348/104 308/134 +f 308/134 348/104 306/135 +f 306/135 348/104 304/136 +f 304/136 348/104 302/103 +f 339/137 352/1 353/4 340/138 +f 334/139 363/73 364/76 335/140 +f 332/141 361/77 360/80 333/142 +f 345/143 359/81 358/84 346/144 +f 331/145 362/85 361/77 332/141 +f 333/142 360/80 363/73 334/139 +f 346/144 358/84 362/85 331/145 +f 344/146 357/87 359/81 345/143 +f 343/147 356/89 357/87 344/146 +f 342/148 355/91 356/89 343/147 +f 341/149 354/93 355/91 342/148 +f 340/138 353/4 354/93 341/149 +f 338/150 351/95 352/1 339/137 +f 337/151 350/97 351/95 338/150 +f 336/152 349/99 350/97 337/151 +f 335/140 364/76 349/102 336/153 diff --git a/mods/pipeworks/models/pipeworks_pipe_2.obj b/mods/pipeworks/models/pipeworks_pipe_2.obj new file mode 100644 index 0000000..c75bca4 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_2.obj @@ -0,0 +1,392 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-stub-end.blend' +# www.blender.org +o pipe.001_Cylinder.000 +v 0.024386 -0.024391 0.122598 +v 0.024386 -0.024391 -0.122598 +v 0.468750 -0.024387 0.122599 +v 0.468750 0.024386 0.122599 +v 0.024391 0.024386 0.122598 +v 0.500000 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.500000 -0.000000 0.000001 +v 0.500000 -0.129917 -0.086807 +v 0.500000 -0.153248 -0.030482 +v 0.500000 -0.153248 0.030483 +v 0.500000 -0.129917 0.086808 +v 0.500000 -0.086808 0.129918 +v 0.500000 -0.030483 0.153248 +v 0.500000 0.030483 0.153248 +v 0.500000 0.086808 0.129918 +v 0.500000 0.129917 0.086808 +v 0.500000 0.153247 0.030483 +v 0.500000 0.153247 -0.030482 +v 0.500000 0.129917 -0.086807 +v 0.500000 0.086808 -0.129917 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.086808 -0.129917 +v 0.468750 0.030483 -0.153247 +v 0.468750 -0.000000 -0.000000 +v 0.468750 0.129917 -0.086807 +v 0.468750 0.153247 -0.030482 +v 0.468750 0.153247 0.030483 +v 0.468750 0.129917 0.086808 +v 0.468750 0.086808 0.129918 +v 0.468750 0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.468750 -0.086808 0.129918 +v 0.468750 -0.129917 0.086808 +v 0.468750 -0.153248 0.030483 +v 0.468750 -0.153248 -0.030482 +v 0.468750 -0.129917 -0.086807 +v 0.468750 -0.086808 -0.129917 +v 0.468750 -0.030483 -0.153247 +v 0.024391 -0.103934 -0.069446 +v 0.468750 -0.103934 -0.069446 +v 0.468750 -0.122598 -0.024386 +v 0.024391 -0.122598 -0.024386 +v 0.468750 -0.024387 -0.122598 +v 0.468750 -0.069447 -0.103933 +v 0.024391 -0.069446 -0.103934 +v 0.468750 0.103933 -0.069446 +v 0.468750 0.069446 -0.103933 +v 0.024391 0.069446 -0.103934 +v 0.024391 0.024386 -0.122598 +v 0.468750 0.024386 -0.122598 +v 0.024391 0.122598 -0.024386 +v 0.468750 0.122598 -0.024386 +v 0.024391 0.122598 0.024386 +v 0.468750 0.122598 0.024387 +v 0.024391 0.103934 0.069446 +v 0.468750 0.103933 0.069447 +v 0.024391 0.069446 0.103934 +v 0.468750 0.069446 0.103934 +v 0.024391 -0.069446 0.103934 +v 0.468750 -0.069447 0.103934 +v 0.024391 -0.103934 0.069446 +v 0.468750 -0.103934 0.069447 +v 0.024391 -0.122598 0.024386 +v 0.468750 -0.122598 0.024387 +v 0.024390 0.103934 -0.069446 +v -0.042016 -0.000000 0.000000 +v -0.034206 -0.012195 0.061299 +v -0.034203 -0.034723 0.051967 +v -0.034203 -0.061299 0.012193 +v -0.034203 -0.061299 -0.012193 +v -0.034203 -0.051967 -0.034723 +v -0.034203 -0.051967 0.034723 +v -0.034203 -0.034723 -0.051967 +v -0.034206 -0.012196 -0.061299 +v -0.034203 0.012193 -0.061299 +v -0.034203 0.034723 -0.051967 +v -0.034203 0.051967 -0.034723 +v -0.034203 0.061299 -0.012193 +v -0.034203 0.061299 0.012193 +v -0.034203 0.051967 0.034723 +v -0.034203 0.034723 0.051967 +v -0.034203 0.012193 0.061299 +v -0.042017 -0.006098 0.030650 +v -0.042016 -0.017362 0.025984 +v -0.042016 -0.030650 0.006097 +v -0.042016 -0.030650 -0.006096 +v -0.042016 -0.025984 -0.017361 +v -0.014672 -0.077950 0.052085 +v -0.042016 -0.017362 -0.025983 +v -0.042017 -0.006098 -0.030649 +v -0.042016 0.006096 -0.030649 +v -0.042016 0.017361 -0.025983 +v -0.042016 0.025983 -0.017362 +v -0.042016 0.030649 -0.006096 +v -0.042016 0.030649 0.006097 +v -0.042016 0.025983 0.017362 +v -0.042016 0.017361 0.025984 +v -0.042016 0.006096 0.030650 +v -0.014675 -0.018293 0.091949 +v -0.014672 -0.052084 0.077951 +v -0.014672 -0.091948 0.018290 +v -0.014672 -0.091949 -0.018289 +v -0.014672 -0.077951 -0.052084 +v -0.042016 -0.025984 0.017362 +v -0.014672 -0.052085 -0.077950 +v -0.014675 -0.018293 -0.091948 +v -0.014672 0.018289 -0.091948 +v -0.014672 0.052084 -0.077950 +v -0.014672 0.077950 -0.052085 +v -0.014672 0.091948 -0.018289 +v -0.014672 0.091949 0.018290 +v -0.014672 0.077951 0.052085 +v -0.014672 0.052085 0.077951 +v -0.014672 0.018290 0.091949 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.812500 0.265625 +vt 0.812500 0.015625 +vt 0.625000 0.265625 +vt 0.625000 0.015625 +vt 0.687500 0.015625 +vt 0.687500 0.265625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.500000 0.015625 +vt 0.500000 0.265625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.250000 0.265625 +vt 0.250000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.125000 0.015625 +vt 0.125000 0.265625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.648437 0.265625 +vt 0.414062 0.265625 +vt 0.531250 0.265625 +vt 0.632812 0.265625 +vt 0.617187 0.265625 +vt 0.601562 0.265625 +vt 0.585937 0.265625 +vt 0.570312 0.265625 +vt 0.554687 0.265625 +vt 0.539062 0.265625 +vt 0.523437 0.265625 +vt 0.507812 0.265625 +vt 0.492187 0.265625 +vt 0.476562 0.265625 +vt 0.460937 0.265625 +vt 0.445312 0.265625 +vt 0.429687 0.265625 +vt 0.882812 0.265625 +vt 0.179687 0.265625 +vt 0.296875 0.265625 +vt 0.765625 0.265625 +vt 0.835937 0.265625 +vt 0.734375 0.265625 +vt 0.789062 0.265625 +vt 0.703125 0.265625 +vt 0.742187 0.265625 +vt 0.671875 0.265625 +vt 0.695312 0.265625 +vt 0.640625 0.265625 +vt 0.609375 0.265625 +vt 0.578125 0.265625 +vt 0.546875 0.265625 +vt 0.515625 0.265625 +vt 0.484375 0.265625 +vt 0.453125 0.265625 +vt 0.367187 0.265625 +vt 0.421875 0.265625 +vt 0.320312 0.265625 +vt 0.390625 0.265625 +vt 0.273437 0.265625 +vt 0.359375 0.265625 +vt 0.226562 0.265625 +vt 0.328125 0.265625 +s off +f 6/1 7/2 8/3 +f 9/4 6/1 8/3 +f 10/5 9/4 8/3 +f 11/6 10/5 8/3 +f 12/7 11/6 8/3 +f 13/8 12/7 8/3 +f 14/9 13/8 8/3 +f 15/10 14/9 8/3 +f 16/11 15/10 8/3 +f 17/12 16/11 8/3 +f 18/13 17/12 8/3 +f 19/14 18/13 8/3 +f 20/15 19/14 8/3 +f 21/16 20/15 8/3 +f 22/17 21/16 8/3 +f 23/18 24/19 25/20 +f 26/21 23/18 25/20 +f 27/22 26/21 25/20 +f 28/23 27/22 25/20 +f 29/24 28/23 25/20 +f 30/25 29/24 25/20 +f 31/26 30/25 25/20 +f 32/27 31/26 25/20 +f 33/28 32/27 25/20 +f 34/29 33/28 25/20 +f 35/30 34/29 25/20 +f 36/31 35/30 25/20 +f 37/32 36/31 25/20 +f 38/33 37/32 25/20 +f 39/34 38/33 25/20 +f 24/19 39/34 25/20 +f 7/2 22/17 8/3 +f 26/35 20/36 21/37 23/38 +f 23/38 21/37 22/39 24/40 +f 27/41 19/42 20/36 26/35 +f 28/43 18/44 19/42 27/41 +f 29/45 17/46 18/47 28/48 +f 30/49 16/50 17/46 29/45 +f 31/51 15/52 16/50 30/49 +f 32/53 14/54 15/52 31/51 +f 33/55 13/56 14/54 32/53 +f 34/57 12/58 13/56 33/55 +f 35/59 11/60 12/58 34/57 +f 36/61 10/62 11/60 35/59 +f 37/63 9/64 10/62 36/61 +f 38/65 6/66 9/64 37/63 +f 39/67 7/68 6/66 38/65 +f 24/40 22/39 7/68 39/67 +f 40/69 41/70 42/71 43/72 +f 46/73 45/74 41/70 40/69 +f 49/75 48/76 51/77 50/78 +f 54/79 55/80 53/81 52/82 +f 56/83 57/84 55/80 54/79 +f 58/85 59/86 57/84 56/83 +f 5/87 4/88 59/86 58/85 +f 62/89 63/90 61/91 60/92 +f 64/93 65/94 63/90 62/89 +f 43/72 42/71 65/95 64/96 +f 1/97 3/98 4/88 5/87 +f 2/99 44/100 45/74 46/73 +f 66/101 47/102 48/76 49/75 +f 50/78 51/77 44/100 2/99 +f 52/82 53/81 47/102 66/101 +f 60/92 61/91 3/98 1/97 +f 86/103 105/104 67/105 +f 87/106 86/103 67/105 +f 88/107 87/106 67/105 +f 90/108 88/107 67/105 +f 91/109 90/108 67/105 +f 92/110 91/109 67/105 +f 93/111 92/110 67/105 +f 94/112 93/111 67/105 +f 95/113 94/112 67/105 +f 96/114 95/113 67/105 +f 97/115 96/114 67/105 +f 98/116 97/115 67/105 +f 99/117 98/116 67/105 +f 84/118 99/117 67/105 +f 85/119 84/118 67/105 +f 105/104 85/119 67/105 +f 102/120 89/121 73/122 70/123 +f 103/124 102/120 70/123 71/125 +f 104/126 103/124 71/125 72/127 +f 106/128 104/126 72/127 74/129 +f 107/130 106/128 74/129 75/131 +f 108/103 107/130 75/131 76/132 +f 109/108 108/103 76/132 77/133 +f 110/111 109/108 77/133 78/134 +f 111/114 110/111 78/134 79/135 +f 112/117 111/114 79/135 80/136 +f 113/104 112/117 80/136 81/137 +f 114/138 113/104 81/137 82/139 +f 115/140 114/138 82/139 83/141 +f 100/142 115/140 83/141 68/143 +f 101/144 100/142 68/143 69/145 +f 89/121 101/144 69/145 73/122 +f 70/123 73/122 105/104 86/103 +f 71/125 70/123 86/103 87/106 +f 72/127 71/125 87/106 88/107 +f 74/129 72/127 88/107 90/108 +f 75/131 74/129 90/108 91/109 +f 76/132 75/131 91/109 92/110 +f 77/133 76/132 92/110 93/111 +f 78/134 77/133 93/111 94/112 +f 79/135 78/134 94/112 95/113 +f 80/136 79/135 95/113 96/114 +f 81/137 80/136 96/114 97/115 +f 82/139 81/137 97/115 98/116 +f 83/141 82/139 98/116 99/117 +f 68/143 83/141 99/117 84/118 +f 69/145 68/143 84/118 85/119 +f 73/122 69/145 85/119 105/104 +f 64/96 62/89 89/121 102/120 +f 43/72 64/96 102/120 103/124 +f 40/69 43/72 103/124 104/126 +f 46/73 40/69 104/126 106/128 +f 2/99 46/73 106/128 107/130 +f 50/78 2/99 107/130 108/103 +f 49/75 50/78 108/103 109/108 +f 66/101 49/75 109/108 110/111 +f 52/82 66/101 110/111 111/114 +f 54/79 52/82 111/114 112/117 +f 56/83 54/79 112/117 113/104 +f 58/85 56/83 113/104 114/138 +f 5/87 58/85 114/138 115/140 +f 1/97 5/87 115/140 100/142 +f 60/92 1/97 100/142 101/144 +f 62/89 60/92 101/144 89/121 diff --git a/mods/pipeworks/models/pipeworks_pipe_3.obj b/mods/pipeworks/models/pipeworks_pipe_3.obj new file mode 100644 index 0000000..f126551 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_3.obj @@ -0,0 +1,354 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-2way-straight.blend' +# www.blender.org +mtllib pipeworks_pipe_3.mtl +o Cube.001 +v 0.468750 -0.153248 0.030483 +v 0.500000 -0.153248 0.030483 +v 0.468750 -0.153248 -0.030483 +v 0.500000 -0.153248 -0.030483 +v 0.468750 -0.129917 -0.086808 +v 0.500000 -0.129917 -0.086808 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.030483 -0.153248 +v 0.500000 -0.030483 -0.153248 +v 0.468750 0.030483 -0.153248 +v 0.500000 0.030483 -0.153248 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153247 -0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.129917 0.086808 +v 0.500000 0.129917 0.086808 +v 0.468750 0.086808 0.129917 +v 0.500000 0.086808 0.129917 +v 0.468750 0.030483 0.153248 +v 0.500000 0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.122598 0.024386 +v 0.468750 -0.122598 -0.024386 +v 0.468750 -0.103934 -0.069446 +v 0.468750 -0.069446 -0.103934 +v 0.468750 -0.024386 -0.122598 +v 0.468750 0.024386 -0.122598 +v 0.468750 0.069446 -0.103934 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.122598 0.024386 +v 0.468750 0.103934 0.069446 +v 0.468750 0.069446 0.103934 +v 0.468750 0.024386 0.122598 +v 0.468750 -0.024387 0.122598 +v 0.468750 -0.069447 0.103934 +v 0.468750 -0.103934 0.069446 +v 0.468750 -0.000000 -0.000000 +v 0.500000 -0.000000 0.000000 +v -0.468750 -0.069446 -0.103934 +v -0.468750 -0.103933 -0.069446 +v -0.468750 -0.122598 -0.024387 +v -0.468750 -0.122598 0.024386 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.030483 0.153247 +v -0.468750 -0.030483 0.153248 +v -0.500000 0.030483 0.153247 +v -0.468750 0.030483 0.153248 +v -0.500000 0.086808 0.129917 +v -0.468750 0.086808 0.129917 +v -0.500000 0.129917 0.086808 +v -0.468750 0.129917 0.086808 +v -0.500000 0.153248 0.030483 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.030483 -0.153248 +v -0.468750 0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.153247 -0.030483 +v -0.468750 -0.153247 -0.030483 +v -0.500000 -0.153247 0.030483 +v -0.468750 -0.153247 0.030483 +v -0.468750 -0.024386 -0.122598 +v -0.468750 0.024387 -0.122598 +v -0.468750 0.069447 -0.103934 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.122598 0.024386 +v -0.468750 0.103934 0.069446 +v -0.468750 0.069447 0.103934 +v -0.468750 0.024387 0.122598 +v -0.468750 -0.024386 0.122598 +v -0.468750 -0.069446 0.103933 +v -0.468750 -0.103933 0.069446 +v -0.468750 0.000000 -0.000000 +v -0.500000 0.000000 -0.000000 +vt 0.750000 0.546875 +vt 0.687500 0.546875 +vt 0.687500 0.609375 +vt 0.750000 0.609375 +vt 0.625000 0.546875 +vt 0.625000 0.609375 +vt 0.562500 0.546875 +vt 0.562500 0.609375 +vt 0.500000 0.546875 +vt 0.500000 0.609375 +vt 0.437500 0.546875 +vt 0.437500 0.609375 +vt 0.375000 0.546875 +vt 0.375000 0.609375 +vt 0.312500 0.546875 +vt 0.312500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.125000 0.546875 +vt 0.125000 0.609375 +vt 0.062500 0.546875 +vt 0.062500 0.609375 +vt 0.000000 0.546875 +vt 0.000000 0.609375 +vt 1.000000 0.546875 +vt 0.937500 0.546875 +vt 0.937500 0.609375 +vt 1.000000 0.609375 +vt 0.875000 0.546875 +vt 0.875000 0.609375 +vt 0.812500 0.546875 +vt 0.812500 0.609375 +vt 0.218363 0.657325 +vt 0.185866 0.820702 +vt 0.153368 0.657325 +vt 0.531836 0.657325 +vt 0.564334 0.820702 +vt 0.596832 0.657325 +vt 0.656879 0.682198 +vt 0.702838 0.728156 +vt 0.727710 0.788204 +vt 0.727710 0.853199 +vt 0.702838 0.913247 +vt 0.656879 0.959205 +vt 0.596831 0.984078 +vt 0.531836 0.984078 +vt 0.471788 0.959205 +vt 0.425830 0.913247 +vt 0.400957 0.853199 +vt 0.400957 0.788204 +vt 0.425830 0.728156 +vt 0.471789 0.682198 +vt 0.093321 0.682198 +vt 0.047362 0.728156 +vt 0.022489 0.788204 +vt 0.022489 0.853199 +vt 0.047362 0.913247 +vt 0.093320 0.959205 +vt 0.153368 0.984078 +vt 0.218363 0.984078 +vt 0.278411 0.959205 +vt 0.324369 0.913247 +vt 0.349242 0.853199 +vt 0.349242 0.788204 +vt 0.324369 0.728156 +vt 0.278411 0.682198 +vt 0.187500 0.515625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.515625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.875000 0.515625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.515625 +vt 0.750000 0.515625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.515625 +vt 0.562500 0.515625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.515625 +vt 0.687500 0.515625 +vt 0.687500 0.015625 +vt 0.500000 0.515625 +vt 0.500000 0.015625 +vt 0.437500 0.515625 +vt 0.437500 0.015625 +vt 0.375000 0.515625 +vt 0.375000 0.015625 +vt 0.312500 0.515625 +vt 0.312500 0.015625 +vt 0.125000 0.515625 +vt 0.125000 0.015625 +vt 0.062500 0.515625 +vt 0.062500 0.015625 +vt 0.000000 0.515625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.515625 +usemtl None +s off +f 1/1 3/2 4/3 2/4 +f 3/2 5/5 6/6 4/3 +f 5/5 7/7 8/8 6/6 +f 7/7 9/9 10/10 8/8 +f 9/9 11/11 12/12 10/10 +f 11/11 13/13 14/14 12/12 +f 13/13 15/15 16/16 14/14 +f 15/15 17/17 18/18 16/16 +f 17/17 19/19 20/20 18/18 +f 19/19 21/21 22/22 20/20 +f 21/21 23/23 24/24 22/22 +f 23/23 25/25 26/26 24/24 +f 25/27 27/28 28/29 26/30 +f 27/28 29/31 30/32 28/29 +f 31/33 1/1 2/4 32/34 +f 29/31 31/33 32/34 30/32 +f 4/35 50/36 2/37 +f 1/38 49/39 3/40 +f 3/40 49/39 5/41 +f 5/41 49/39 7/42 +f 7/42 49/39 9/43 +f 9/43 49/39 11/44 +f 11/44 49/39 13/45 +f 13/45 49/39 15/46 +f 15/46 49/39 17/47 +f 17/47 49/39 19/48 +f 19/48 49/39 21/49 +f 21/49 49/39 23/50 +f 23/50 49/39 25/51 +f 25/51 49/39 27/52 +f 27/52 49/39 29/53 +f 29/53 49/39 31/54 +f 31/54 49/39 1/38 +f 2/37 50/36 32/55 +f 32/55 50/36 30/56 +f 30/56 50/36 28/57 +f 28/57 50/36 26/58 +f 26/58 50/36 24/59 +f 24/59 50/36 22/60 +f 22/60 50/36 20/61 +f 20/61 50/36 18/62 +f 18/62 50/36 16/63 +f 16/63 50/36 14/64 +f 14/64 50/36 12/65 +f 12/65 50/36 10/66 +f 10/66 50/36 8/67 +f 8/67 50/36 6/68 +f 6/68 50/36 4/35 +f 41/69 91/70 92/71 42/72 +f 81/73 83/74 100/75 +f 79/76 81/73 100/75 +f 77/77 79/76 100/75 +f 75/78 77/77 100/75 +f 73/79 75/78 100/75 +f 71/80 73/79 100/75 +f 69/81 71/80 100/75 +f 67/82 69/81 100/75 +f 65/83 67/82 100/75 +f 63/84 65/83 100/75 +f 61/85 63/84 100/75 +f 59/86 61/85 100/75 +f 57/87 59/86 100/75 +f 55/88 57/87 100/75 +f 85/89 55/88 100/75 +f 56/90 86/91 99/92 +f 58/93 56/90 99/92 +f 60/94 58/93 99/92 +f 62/95 60/94 99/92 +f 64/96 62/95 99/92 +f 66/97 64/96 99/92 +f 68/98 66/97 99/92 +f 70/99 68/98 99/92 +f 72/100 70/99 99/92 +f 74/101 72/100 99/92 +f 76/102 74/101 99/92 +f 78/103 76/102 99/92 +f 80/104 78/103 99/92 +f 82/105 80/104 99/92 +f 84/106 82/105 99/92 +f 86/91 84/106 99/92 +f 83/74 85/89 100/75 +f 58/22 57/21 55/19 56/20 +f 56/20 55/19 85/17 86/18 +f 60/24 59/23 57/21 58/22 +f 62/26 61/25 59/23 60/24 +f 64/29 63/28 61/27 62/30 +f 66/32 65/31 63/28 64/29 +f 68/34 67/33 65/31 66/32 +f 70/4 69/1 67/33 68/34 +f 72/3 71/2 69/1 70/4 +f 74/6 73/5 71/2 72/3 +f 76/8 75/7 73/5 74/6 +f 78/10 77/9 75/7 76/8 +f 80/12 79/11 77/9 78/10 +f 82/14 81/13 79/11 80/12 +f 84/16 83/15 81/13 82/14 +f 86/18 85/17 83/15 84/16 +f 36/107 51/108 87/109 37/110 +f 34/111 53/112 52/113 35/114 +f 47/115 97/116 98/117 48/118 +f 33/119 54/120 53/112 34/111 +f 35/114 52/113 51/108 36/107 +f 48/118 98/117 54/120 33/119 +f 46/121 96/122 97/116 47/115 +f 45/123 95/124 96/122 46/121 +f 44/125 94/126 95/124 45/123 +f 43/127 93/128 94/126 44/125 +f 42/72 92/71 93/128 43/127 +f 40/129 90/130 91/70 41/69 +f 39/131 89/132 90/130 40/129 +f 38/133 88/134 89/132 39/131 +f 37/110 87/109 88/135 38/136 diff --git a/mods/pipeworks/models/pipeworks_pipe_4.obj b/mods/pipeworks/models/pipeworks_pipe_4.obj new file mode 100644 index 0000000..0ef583f --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_4.obj @@ -0,0 +1,478 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-2way-corner.blend' +# www.blender.org +mtllib pipeworks_pipe_4.mtl +o pipe.001_Cylinder.000 +v -0.024386 -0.024391 0.122598 +v -0.024387 -0.468750 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.024386 -0.024391 0.122598 +v -0.086808 -0.500000 -0.129917 +v -0.030483 -0.500000 -0.153247 +v -0.000000 -0.500000 0.000000 +v -0.129917 -0.500000 -0.086808 +v -0.153248 -0.500000 -0.030483 +v -0.153248 -0.500000 0.030483 +v -0.129917 -0.500000 0.086808 +v -0.086808 -0.500000 0.129917 +v -0.030483 -0.500000 0.153248 +v 0.030483 -0.500000 0.153248 +v 0.086808 -0.500000 0.129917 +v 0.129917 -0.500000 0.086808 +v 0.153247 -0.500000 0.030483 +v 0.153248 -0.500000 -0.030483 +v 0.129917 -0.500000 -0.086808 +v 0.086808 -0.500000 -0.129917 +v 0.030483 -0.500000 -0.153247 +v 0.086808 -0.468750 -0.129917 +v 0.030483 -0.468750 -0.153248 +v -0.000000 -0.468750 0.000000 +v 0.129917 -0.468750 -0.086808 +v 0.153248 -0.468750 -0.030483 +v 0.153247 -0.468750 0.030483 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.468750 0.129917 +v -0.129917 -0.468750 0.086808 +v -0.153248 -0.468750 0.030483 +v -0.153248 -0.468750 -0.030483 +v -0.129917 -0.468750 -0.086808 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.468750 -0.153248 +v -0.103934 -0.024391 -0.069446 +v -0.103934 -0.468750 -0.069446 +v -0.122598 -0.468750 -0.024386 +v -0.122598 -0.024391 -0.024386 +v -0.024386 -0.024391 -0.122598 +v -0.024386 -0.468750 -0.122598 +v -0.069446 -0.468750 -0.103933 +v -0.069446 -0.024391 -0.103934 +v 0.103934 -0.024391 -0.069446 +v 0.103933 -0.468750 -0.069446 +v 0.069446 -0.468750 -0.103934 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v 0.024386 -0.468750 -0.122598 +v 0.122598 -0.024391 -0.024386 +v 0.122598 -0.468750 -0.024386 +v 0.122598 -0.024391 0.024386 +v 0.122598 -0.468750 0.024386 +v 0.103934 -0.024391 0.069446 +v 0.103933 -0.468750 0.069447 +v 0.069446 -0.024391 0.103934 +v 0.069446 -0.468750 0.103934 +v -0.069446 -0.024391 0.103934 +v -0.069447 -0.468750 0.103934 +v -0.103934 -0.024391 0.069446 +v -0.103934 -0.468750 0.069446 +v -0.122598 -0.024391 0.024386 +v -0.122598 -0.468750 0.024386 +v -0.041924 0.041589 0.103934 +v -0.041925 0.041589 -0.103934 +v -0.010062 0.009727 -0.122598 +v -0.079509 0.079173 -0.024386 +v -0.066311 0.065976 -0.069446 +v -0.024663 0.094826 -0.069446 +v -0.011464 0.062964 0.103934 +v -0.024662 0.094827 0.069446 +v -0.031805 0.112070 0.024386 +v -0.031805 0.112070 -0.024386 +v 0.005779 0.021334 -0.122598 +v -0.011464 0.062964 -0.103934 +v 0.005780 0.021334 0.122598 +v -0.079509 0.079173 0.024386 +v -0.066311 0.065976 0.069446 +v 0.468750 -0.024387 0.122599 +v 0.468750 0.024386 0.122599 +v 0.024391 0.024386 0.122598 +v 0.500000 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.500000 -0.000000 0.000001 +v 0.500000 -0.129917 -0.086807 +v 0.500000 -0.153248 -0.030482 +v 0.500000 -0.153248 0.030483 +v 0.500000 -0.129917 0.086808 +v 0.500000 -0.086808 0.129918 +v 0.500000 -0.030483 0.153248 +v 0.500000 0.030483 0.153248 +v 0.500000 0.086808 0.129918 +v 0.500000 0.129917 0.086808 +v 0.500000 0.153247 0.030483 +v 0.500000 0.153247 -0.030482 +v 0.500000 0.129917 -0.086807 +v 0.500000 0.086808 -0.129917 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.086808 -0.129917 +v 0.468750 0.030483 -0.153247 +v 0.468750 -0.000000 -0.000000 +v 0.468750 0.129917 -0.086807 +v 0.468750 0.153247 -0.030482 +v 0.468750 0.153247 0.030483 +v 0.468750 0.129917 0.086808 +v 0.468750 0.086808 0.129918 +v 0.468750 0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.468750 -0.086808 0.129918 +v 0.468750 -0.129917 0.086808 +v 0.468750 -0.153248 0.030483 +v 0.468750 -0.153248 -0.030482 +v 0.468750 -0.129917 -0.086807 +v 0.468750 -0.086808 -0.129917 +v 0.468750 -0.030483 -0.153247 +v 0.024391 -0.103934 -0.069446 +v 0.468750 -0.103934 -0.069446 +v 0.468750 -0.122598 -0.024386 +v 0.024391 -0.122598 -0.024386 +v 0.468750 -0.024387 -0.122598 +v 0.468750 -0.069447 -0.103933 +v 0.024391 -0.069446 -0.103934 +v 0.468750 0.103933 -0.069446 +v 0.468750 0.069446 -0.103933 +v 0.024391 0.069446 -0.103934 +v 0.024391 0.024386 -0.122598 +v 0.468750 0.024386 -0.122598 +v 0.024391 0.122598 -0.024386 +v 0.468750 0.122598 -0.024386 +v 0.024391 0.122598 0.024386 +v 0.468750 0.122598 0.024387 +v 0.024391 0.103934 0.069446 +v 0.468750 0.103933 0.069447 +v 0.024391 0.069446 0.103934 +v 0.468750 0.069446 0.103934 +v 0.024391 -0.069446 0.103934 +v 0.468750 -0.069447 0.103934 +v 0.024391 -0.103934 0.069446 +v 0.468750 -0.103934 0.069447 +v 0.024391 -0.122598 0.024386 +v 0.468750 -0.122598 0.024387 +v 0.024390 0.103934 -0.069446 +v -0.020763 -0.005780 0.122598 +v -0.111499 0.031804 0.024386 +v -0.094256 0.024662 0.069446 +v -0.062393 0.011464 0.103934 +v -0.062393 0.011464 -0.103934 +v -0.020763 -0.005780 -0.122598 +v -0.111499 0.031804 -0.024386 +v -0.094256 0.024662 -0.069446 +v -0.010062 0.009727 0.122598 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.201671 0.341280 +vt 0.315528 0.341280 +vt 0.307071 0.384726 +vt 0.531250 0.296875 +vt 0.531250 0.343750 +vt 0.484375 0.343750 +vt 0.484375 0.296875 +vt 0.437500 0.343750 +vt 0.437500 0.296875 +vt 0.390625 0.296875 +vt 0.390625 0.343750 +vt 0.343750 0.343750 +vt 0.343750 0.296875 +vt 0.578125 0.296875 +vt 0.578125 0.343750 +vt 0.625000 0.296875 +vt 0.625000 0.343750 +vt 0.671875 0.296875 +vt 0.671875 0.343750 +vt 0.801371 0.340121 +vt 0.695971 0.383568 +vt 0.687514 0.340121 +vt 0.720953 0.419768 +vt 0.757935 0.446864 +vt 0.801382 0.453989 +vt 0.625000 0.484375 +vt 0.625000 0.437500 +vt 0.671875 0.437500 +vt 0.671875 0.484375 +vt 0.625000 0.390625 +vt 0.671875 0.390625 +vt 0.578125 0.390625 +vt 0.531250 0.390625 +vt 0.484375 0.390625 +vt 0.437500 0.390625 +vt 0.282090 0.420927 +vt 0.245108 0.448023 +vt 0.201660 0.455148 +vt 0.390625 0.390625 +vt 0.343750 0.390625 +vt 0.390625 0.437500 +vt 0.343750 0.437500 +vt 0.343750 0.484375 +vt 0.390625 0.484375 +vt 0.437500 0.437500 +vt 0.437500 0.484375 +vt 0.484375 0.437500 +vt 0.484375 0.484375 +vt 0.531250 0.437500 +vt 0.531250 0.484375 +vt 0.578125 0.484375 +vt 0.578125 0.437500 +usemtl None +s off +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 +f 8/8 5/5 7/7 +f 9/9 8/8 7/7 +f 10/10 9/9 7/7 +f 11/11 10/10 7/7 +f 12/12 11/11 7/7 +f 13/13 12/12 7/7 +f 14/14 13/13 7/7 +f 15/15 14/14 7/7 +f 16/16 15/15 7/7 +f 17/17 16/16 7/7 +f 18/18 17/17 7/7 +f 19/19 18/18 7/7 +f 20/20 19/19 7/7 +f 21/21 20/20 7/7 +f 22/22 23/23 24/24 +f 25/25 22/22 24/24 +f 26/26 25/25 24/24 +f 27/27 26/26 24/24 +f 28/28 27/27 24/24 +f 29/29 28/28 24/24 +f 30/30 29/29 24/24 +f 31/31 30/30 24/24 +f 32/32 31/31 24/24 +f 33/33 32/32 24/24 +f 34/34 33/33 24/24 +f 35/35 34/34 24/24 +f 36/36 35/35 24/24 +f 37/37 36/36 24/24 +f 38/38 37/37 24/24 +f 23/23 38/38 24/24 +f 6/6 21/21 7/7 +f 25/39 19/40 20/41 22/42 +f 22/42 20/41 21/43 23/44 +f 26/45 18/46 19/40 25/39 +f 27/47 17/48 18/46 26/45 +f 28/49 16/50 17/51 27/52 +f 29/53 15/54 16/50 28/49 +f 30/55 14/56 15/54 29/53 +f 31/57 13/58 14/56 30/55 +f 32/59 12/60 13/58 31/57 +f 33/61 11/62 12/60 32/59 +f 34/63 10/64 11/62 33/61 +f 35/65 9/66 10/64 34/63 +f 36/67 8/68 9/66 35/65 +f 37/69 5/70 8/68 36/67 +f 38/71 6/72 5/70 37/69 +f 23/44 21/43 6/72 38/71 +f 39/73 40/74 41/75 42/76 +f 43/77 44/78 45/79 46/80 +f 47/81 48/82 49/83 50/84 +f 51/85 52/86 44/78 43/77 +f 46/80 45/79 40/74 39/73 +f 50/84 49/83 52/86 51/85 +f 53/87 54/88 48/82 47/81 +f 55/89 56/90 54/88 53/87 +f 57/91 58/92 56/90 55/89 +f 59/93 60/94 58/92 57/91 +f 4/4 3/3 60/94 59/93 +f 2/2 1/1 61/95 62/96 +f 63/97 64/98 62/96 61/95 +f 65/99 66/100 64/98 63/97 +f 42/76 41/75 66/101 65/102 +f 85/5 86/6 87/7 +f 88/8 85/5 87/7 +f 89/9 88/8 87/7 +f 90/10 89/9 87/7 +f 91/11 90/10 87/7 +f 92/12 91/11 87/7 +f 93/13 92/12 87/7 +f 94/14 93/13 87/7 +f 95/15 94/14 87/7 +f 96/16 95/15 87/7 +f 97/17 96/16 87/7 +f 98/18 97/17 87/7 +f 99/19 98/18 87/7 +f 100/20 99/19 87/7 +f 101/21 100/20 87/7 +f 102/22 103/23 104/24 +f 105/25 102/22 104/24 +f 106/26 105/25 104/24 +f 107/27 106/26 104/24 +f 108/28 107/27 104/24 +f 109/29 108/28 104/24 +f 110/30 109/29 104/24 +f 111/31 110/30 104/24 +f 112/32 111/31 104/24 +f 113/33 112/32 104/24 +f 114/34 113/33 104/24 +f 115/35 114/34 104/24 +f 116/36 115/35 104/24 +f 117/37 116/36 104/24 +f 118/38 117/37 104/24 +f 103/23 118/38 104/24 +f 86/6 101/21 87/7 +f 105/39 99/40 100/41 102/42 +f 102/42 100/41 101/43 103/44 +f 106/45 98/46 99/40 105/39 +f 107/47 97/48 98/46 106/45 +f 108/49 96/50 97/51 107/52 +f 109/53 95/54 96/50 108/49 +f 110/55 94/56 95/54 109/53 +f 111/57 93/58 94/56 110/55 +f 112/59 92/60 93/58 111/57 +f 113/61 91/62 92/60 112/59 +f 114/63 90/64 91/62 113/61 +f 115/65 89/66 90/64 114/63 +f 116/67 88/68 89/66 115/65 +f 117/69 85/70 88/68 116/67 +f 118/71 86/72 85/70 117/69 +f 103/44 101/43 86/72 118/71 +f 119/73 120/74 121/75 122/76 +f 125/80 124/79 120/74 119/73 +f 128/84 127/83 130/86 129/85 +f 133/89 134/90 132/88 131/87 +f 135/91 136/92 134/90 133/89 +f 137/93 138/94 136/92 135/91 +f 84/4 83/3 138/94 137/93 +f 141/97 142/98 140/96 139/95 +f 143/99 144/100 142/98 141/97 +f 122/76 121/75 144/101 143/102 +f 4/1 82/2 83/3 84/4 +f 51/77 123/78 124/79 125/80 +f 145/81 126/82 127/83 128/84 +f 129/85 130/86 123/78 51/77 +f 131/87 132/88 126/82 145/81 +f 139/95 140/96 82/2 4/1 +f 51/103 43/104 151/105 +f 65/106 147/107 152/108 42/109 +f 42/109 152/108 153/110 39/111 +f 46/112 39/111 153/110 150/113 +f 46/112 150/113 151/114 43/115 +f 65/106 63/116 148/117 147/107 +f 63/116 61/118 149/119 148/117 +f 61/118 1/120 146/121 149/119 +f 4/122 146/123 1/124 +f 4/122 154/125 146/123 +f 4/122 79/126 154/125 +f 79/126 4/122 84/127 +f 137/128 73/129 79/130 84/131 +f 73/129 67/132 154/133 79/130 +f 149/119 146/121 154/133 67/132 +f 81/134 148/117 149/119 67/132 +f 80/135 147/107 148/117 81/134 +f 80/135 70/136 152/108 147/107 +f 70/136 71/137 153/110 152/108 +f 51/103 151/105 69/138 +f 51/103 69/138 77/139 +f 77/139 129/140 51/103 +f 150/113 68/141 69/142 151/114 +f 78/143 77/144 69/142 68/141 +f 68/141 150/113 153/110 71/137 +f 129/145 77/144 78/143 128/146 +f 78/143 68/141 71/137 72/147 +f 78/143 72/147 145/148 128/146 +f 76/149 72/147 71/137 70/136 +f 76/149 131/150 145/148 72/147 +f 80/135 75/151 76/149 70/136 +f 133/152 131/150 76/149 75/151 +f 135/153 133/152 75/151 74/154 +f 75/151 80/135 81/134 74/154 +f 74/154 81/134 67/132 73/129 +f 137/128 135/153 74/154 73/129 diff --git a/mods/pipeworks/models/pipeworks_pipe_5.obj b/mods/pipeworks/models/pipeworks_pipe_5.obj new file mode 100644 index 0000000..abf8b97 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_5.obj @@ -0,0 +1,542 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-3way-corner.blend' +# www.blender.org +o pipe.001_Cylinder.000 +v 0.122598 -0.024391 0.024386 +v 0.122598 -0.468750 0.024387 +v 0.122598 -0.468750 -0.024386 +v 0.122598 -0.024391 -0.024386 +v -0.129917 -0.500000 0.086808 +v -0.153247 -0.500000 0.030483 +v 0.000000 -0.500000 -0.000000 +v -0.086808 -0.500000 0.129917 +v -0.030483 -0.500000 0.153248 +v 0.030483 -0.500000 0.153248 +v 0.086808 -0.500000 0.129917 +v 0.129917 -0.500000 0.086808 +v 0.153248 -0.500000 0.030483 +v 0.153248 -0.500000 -0.030483 +v 0.129917 -0.500000 -0.086808 +v 0.086808 -0.500000 -0.129917 +v 0.030483 -0.500000 -0.153247 +v -0.030483 -0.500000 -0.153248 +v -0.086808 -0.500000 -0.129917 +v -0.129917 -0.500000 -0.086808 +v -0.153247 -0.500000 -0.030483 +v -0.129917 -0.468750 -0.086808 +v -0.153248 -0.468750 -0.030483 +v 0.000000 -0.468750 -0.000000 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.468750 -0.153248 +v 0.030483 -0.468750 -0.153247 +v 0.086808 -0.468750 -0.129917 +v 0.129917 -0.468750 -0.086808 +v 0.153248 -0.468750 -0.030483 +v 0.153248 -0.468750 0.030483 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.468750 0.129917 +v -0.129917 -0.468750 0.086808 +v -0.153248 -0.468750 0.030483 +v -0.069446 -0.024391 0.103934 +v -0.069446 -0.468750 0.103934 +v -0.024386 -0.468750 0.122598 +v -0.024386 -0.024391 0.122598 +v -0.122598 -0.024391 0.024386 +v -0.122598 -0.468750 0.024386 +v -0.103933 -0.468750 0.069446 +v -0.103934 -0.024391 0.069446 +v -0.069446 -0.024391 -0.103934 +v -0.069446 -0.468750 -0.103933 +v -0.103934 -0.468750 -0.069446 +v -0.103934 -0.024391 -0.069446 +v -0.122598 -0.024391 -0.024386 +v -0.122598 -0.468750 -0.024386 +v -0.024386 -0.024391 -0.122598 +v -0.024386 -0.468750 -0.122598 +v 0.024386 -0.024391 -0.122598 +v 0.024386 -0.468750 -0.122598 +v 0.069446 -0.024391 -0.103934 +v 0.069447 -0.468750 -0.103933 +v 0.103934 -0.024391 -0.069446 +v 0.103934 -0.468750 -0.069446 +v 0.103934 -0.024391 0.069446 +v 0.103934 -0.468750 0.069447 +v 0.069446 -0.024391 0.103934 +v 0.069446 -0.468750 0.103934 +v 0.024386 -0.024391 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.500000 -0.129917 0.086808 +v 0.500000 -0.153248 0.030483 +v 0.500000 0.000000 0.000000 +v 0.500000 -0.086808 0.129917 +v 0.500000 -0.030483 0.153248 +v 0.500000 0.030483 0.153248 +v 0.500000 0.086808 0.129917 +v 0.500000 0.129917 0.086808 +v 0.500000 0.153248 0.030483 +v 0.500000 0.153248 -0.030483 +v 0.500000 0.129917 -0.086808 +v 0.500000 0.086808 -0.129917 +v 0.500000 0.030483 -0.153247 +v 0.500000 -0.030483 -0.153247 +v 0.500000 -0.086808 -0.129917 +v 0.500000 -0.129917 -0.086807 +v 0.500000 -0.153248 -0.030482 +v 0.468750 -0.129917 -0.086807 +v 0.468750 -0.153248 -0.030483 +v 0.468750 -0.000000 0.000000 +v 0.468750 -0.086808 -0.129917 +v 0.468750 -0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.468750 0.086808 -0.129917 +v 0.468750 0.129917 -0.086808 +v 0.468750 0.153248 -0.030483 +v 0.468750 0.153248 0.030483 +v 0.468750 0.129917 0.086808 +v 0.468750 0.086808 0.129917 +v 0.468750 0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.468750 -0.086808 0.129917 +v 0.468750 -0.129917 0.086808 +v 0.468750 -0.153248 0.030483 +v 0.024386 -0.069446 0.103934 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.024386 0.122598 +v 0.024386 -0.122598 0.024386 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.103934 0.069447 +v 0.024386 -0.103934 0.069446 +v 0.024386 -0.069446 -0.103934 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103934 -0.069446 +v 0.024386 -0.103934 -0.069446 +v 0.468750 -0.122598 -0.024386 +v 0.468750 -0.024386 -0.122598 +v 0.024386 0.024386 -0.122598 +v 0.468750 0.024386 -0.122598 +v 0.024386 0.069446 -0.103934 +v 0.468750 0.069446 -0.103933 +v 0.024386 0.103934 -0.069446 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.103934 0.069447 +v 0.468750 0.069446 0.103934 +v 0.468750 0.024386 0.122598 +v 0.122599 -0.024387 -0.468750 +v 0.122599 0.024386 -0.468750 +v 0.122598 0.024386 -0.024391 +v -0.129917 -0.086808 -0.500000 +v -0.153247 -0.030483 -0.500000 +v 0.000001 0.000000 -0.500000 +v -0.086807 -0.129917 -0.500000 +v -0.030482 -0.153248 -0.500000 +v 0.030483 -0.153248 -0.500000 +v 0.086808 -0.129917 -0.500000 +v 0.129918 -0.086808 -0.500000 +v 0.153248 -0.030483 -0.500000 +v 0.153248 0.030483 -0.500000 +v 0.129918 0.086808 -0.500000 +v 0.086808 0.129917 -0.500000 +v 0.030483 0.153247 -0.500000 +v -0.030482 0.153247 -0.500000 +v -0.086807 0.129917 -0.500000 +v -0.129917 0.086808 -0.500000 +v -0.153247 0.030483 -0.500000 +v -0.129917 0.086808 -0.468750 +v -0.153247 0.030483 -0.468750 +v 0.000000 0.000000 -0.468750 +v -0.086807 0.129917 -0.468750 +v -0.030482 0.153247 -0.468750 +v 0.030483 0.153247 -0.468750 +v 0.086808 0.129917 -0.468750 +v 0.129918 0.086808 -0.468750 +v 0.153248 0.030483 -0.468750 +v 0.153248 -0.030483 -0.468750 +v 0.129918 -0.086808 -0.468750 +v 0.086808 -0.129917 -0.468750 +v 0.030483 -0.153248 -0.468750 +v -0.030482 -0.153248 -0.468750 +v -0.086807 -0.129917 -0.468750 +v -0.129917 -0.086808 -0.468750 +v -0.153247 -0.030483 -0.468750 +v -0.069446 -0.103934 -0.024391 +v -0.069446 -0.103934 -0.468750 +v -0.024386 -0.122598 -0.468750 +v -0.024386 -0.122598 -0.024391 +v -0.122598 -0.024387 -0.468750 +v -0.103933 -0.069447 -0.468750 +v -0.103934 -0.069446 -0.024391 +v -0.069446 0.103933 -0.468750 +v -0.103933 0.069446 -0.468750 +v -0.103934 0.069446 -0.024391 +v -0.122598 0.024386 -0.024391 +v -0.122598 0.024386 -0.468750 +v -0.024386 0.122598 -0.024391 +v -0.024386 0.122598 -0.468750 +v 0.024386 0.122598 -0.024391 +v 0.024387 0.122598 -0.468750 +v 0.069446 0.103934 -0.024391 +v 0.069447 0.103933 -0.468750 +v 0.103934 0.069446 -0.024391 +v 0.103934 0.069446 -0.468750 +v 0.103934 -0.069446 -0.024391 +v 0.103934 -0.069447 -0.468750 +v 0.069446 -0.103934 -0.024391 +v 0.069447 -0.103934 -0.468750 +v 0.024386 -0.122598 -0.024391 +v 0.024387 -0.122598 -0.468750 +v -0.069446 0.103934 -0.024390 +v 0.024386 0.024386 0.122594 +v 0.024386 0.069446 0.103930 +v 0.024386 0.103933 0.069442 +v 0.024386 0.122598 0.024382 +v -0.028389 0.109793 0.028385 +v -0.109793 0.028389 0.028387 +v -0.028389 0.028389 0.109791 +v -0.073974 0.029365 0.073972 +v -0.073974 0.070067 0.028386 +v -0.028389 0.070067 0.073971 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.934657 0.863213 +vt 0.901601 0.899049 +vt 0.865820 0.861492 +vt 0.925541 0.762929 +vt 0.899262 0.810455 +vt 0.865821 0.758725 +vt 0.832379 0.810455 +vt 0.806102 0.762929 +vt 0.959958 0.821457 +vt 0.796982 0.863213 +vt 0.973651 0.780138 +vt 0.830039 0.899049 +vt 0.865820 0.923510 +vt 0.757989 0.745545 +vt 0.793772 0.721082 +vt 0.757989 0.780138 +vt 0.937873 0.721082 +vt 0.973654 0.745543 +vt 0.771681 0.821457 +vt 0.840522 0.707845 +vt 0.891124 0.707845 +s off +f 1/1 2/2 3/3 4/4 +f 5/5 6/6 7/7 +f 8/8 5/5 7/7 +f 9/9 8/8 7/7 +f 10/10 9/9 7/7 +f 11/11 10/10 7/7 +f 12/12 11/11 7/7 +f 13/13 12/12 7/7 +f 14/14 13/13 7/7 +f 15/15 14/14 7/7 +f 16/16 15/15 7/7 +f 17/17 16/16 7/7 +f 18/18 17/17 7/7 +f 19/19 18/18 7/7 +f 20/20 19/19 7/7 +f 21/21 20/20 7/7 +f 22/22 23/23 24/24 +f 25/25 22/22 24/24 +f 26/26 25/25 24/24 +f 27/27 26/26 24/24 +f 28/28 27/27 24/24 +f 29/29 28/28 24/24 +f 30/30 29/29 24/24 +f 31/31 30/30 24/24 +f 32/32 31/31 24/24 +f 33/33 32/32 24/24 +f 34/34 33/33 24/24 +f 35/35 34/34 24/24 +f 36/36 35/35 24/24 +f 37/37 36/36 24/24 +f 38/38 37/37 24/24 +f 23/23 38/38 24/24 +f 6/6 21/21 7/7 +f 25/39 19/40 20/41 22/42 +f 22/42 20/41 21/43 23/44 +f 26/45 18/46 19/40 25/39 +f 27/47 17/48 18/46 26/45 +f 28/49 16/50 17/51 27/52 +f 29/53 15/54 16/50 28/49 +f 30/55 14/56 15/54 29/53 +f 31/57 13/58 14/56 30/55 +f 32/59 12/60 13/58 31/57 +f 33/61 11/62 12/60 32/59 +f 34/63 10/64 11/62 33/61 +f 35/65 9/66 10/64 34/63 +f 36/67 8/68 9/66 35/65 +f 37/69 5/70 8/68 36/67 +f 38/71 6/72 5/70 37/69 +f 23/44 21/43 6/72 38/71 +f 39/73 40/74 41/75 42/76 +f 43/77 44/78 45/79 46/80 +f 47/81 48/82 49/83 50/84 +f 51/85 52/86 44/78 43/77 +f 46/80 45/79 40/74 39/73 +f 50/84 49/83 52/86 51/85 +f 53/87 54/88 48/82 47/81 +f 55/89 56/90 54/88 53/87 +f 57/91 58/92 56/90 55/89 +f 59/93 60/94 58/92 57/91 +f 4/4 3/3 60/94 59/93 +f 2/2 1/1 61/95 62/96 +f 63/97 64/98 62/96 61/95 +f 65/99 66/100 64/98 63/97 +f 42/76 41/75 66/101 65/102 +f 69/5 70/6 71/7 +f 72/8 69/5 71/7 +f 73/9 72/8 71/7 +f 74/10 73/9 71/7 +f 75/11 74/10 71/7 +f 76/12 75/11 71/7 +f 77/13 76/12 71/7 +f 78/14 77/13 71/7 +f 79/15 78/14 71/7 +f 80/16 79/15 71/7 +f 81/17 80/16 71/7 +f 82/18 81/17 71/7 +f 83/19 82/18 71/7 +f 84/20 83/19 71/7 +f 85/21 84/20 71/7 +f 86/22 87/23 88/24 +f 89/25 86/22 88/24 +f 90/26 89/25 88/24 +f 91/27 90/26 88/24 +f 92/28 91/27 88/24 +f 93/29 92/28 88/24 +f 94/30 93/29 88/24 +f 95/31 94/30 88/24 +f 96/32 95/31 88/24 +f 97/33 96/32 88/24 +f 98/34 97/33 88/24 +f 99/35 98/34 88/24 +f 100/36 99/35 88/24 +f 101/37 100/36 88/24 +f 102/38 101/37 88/24 +f 87/23 102/38 88/24 +f 70/6 85/21 71/7 +f 89/39 83/40 84/41 86/42 +f 86/42 84/41 85/43 87/44 +f 90/45 82/46 83/40 89/39 +f 91/47 81/48 82/46 90/45 +f 92/49 80/50 81/51 91/52 +f 93/53 79/54 80/50 92/49 +f 94/55 78/56 79/54 93/53 +f 95/57 77/58 78/56 94/55 +f 96/59 76/60 77/58 95/57 +f 97/61 75/62 76/60 96/59 +f 98/63 74/64 75/62 97/61 +f 99/65 73/66 74/64 98/63 +f 100/67 72/68 73/66 99/65 +f 101/69 69/70 72/68 100/67 +f 102/71 70/72 69/70 101/69 +f 87/44 85/43 70/72 102/71 +f 106/77 107/78 108/79 109/80 +f 110/81 111/82 112/83 113/84 +f 109/80 108/79 104/74 103/73 +f 118/91 119/92 117/90 116/89 +f 120/93 121/94 119/92 118/91 +f 128/5 129/6 130/7 +f 131/8 128/5 130/7 +f 132/9 131/8 130/7 +f 133/10 132/9 130/7 +f 134/11 133/10 130/7 +f 135/12 134/11 130/7 +f 136/13 135/12 130/7 +f 137/14 136/13 130/7 +f 138/15 137/14 130/7 +f 139/16 138/15 130/7 +f 140/17 139/16 130/7 +f 141/18 140/17 130/7 +f 142/19 141/18 130/7 +f 143/20 142/19 130/7 +f 144/21 143/20 130/7 +f 145/22 146/23 147/24 +f 148/25 145/22 147/24 +f 149/26 148/25 147/24 +f 150/27 149/26 147/24 +f 151/28 150/27 147/24 +f 152/29 151/28 147/24 +f 153/30 152/29 147/24 +f 154/31 153/30 147/24 +f 155/32 154/31 147/24 +f 156/33 155/32 147/24 +f 157/34 156/33 147/24 +f 158/35 157/34 147/24 +f 159/36 158/35 147/24 +f 160/37 159/36 147/24 +f 161/38 160/37 147/24 +f 146/23 161/38 147/24 +f 129/6 144/21 130/7 +f 148/39 142/40 143/41 145/42 +f 145/42 143/41 144/43 146/44 +f 149/45 141/46 142/40 148/39 +f 150/47 140/48 141/46 149/45 +f 151/49 139/50 140/51 150/52 +f 152/53 138/54 139/50 151/49 +f 153/55 137/56 138/54 152/53 +f 154/57 136/58 137/56 153/55 +f 155/59 135/60 136/58 154/57 +f 156/61 134/62 135/60 155/59 +f 157/63 133/64 134/62 156/61 +f 158/65 132/66 133/64 157/63 +f 159/67 131/68 132/66 158/65 +f 160/69 128/70 131/68 159/67 +f 161/71 129/72 128/70 160/69 +f 146/44 144/43 129/72 161/71 +f 162/73 163/74 164/75 165/76 +f 168/80 167/79 163/74 162/73 +f 171/84 170/83 173/86 172/85 +f 176/89 177/90 175/88 174/87 +f 178/91 179/92 177/90 176/89 +f 180/93 181/94 179/92 178/91 +f 127/4 126/3 181/94 180/93 +f 184/97 185/98 183/96 182/95 +f 186/99 187/100 185/98 184/97 +f 165/76 164/75 187/101 186/102 +f 191/103 192/104 193/105 +f 195/106 198/107 196/108 +f 198/107 193/105 197/109 +f 198/107 197/109 196/108 +f 196/108 197/109 194/110 +f 190/111 191/103 198/107 +f 193/105 188/112 197/109 +f 193/105 198/107 191/103 +f 195/106 190/111 198/107 +f 190/111 195/106 189/113 +f 192/1 67/2 68/3 176/4 +f 103/73 104/74 105/75 65/76 +f 186/85 114/86 107/78 106/77 +f 113/84 112/83 114/86 186/85 +f 55/87 115/88 111/82 110/81 +f 116/89 117/90 115/88 55/87 +f 176/4 68/3 121/94 120/93 +f 191/95 122/96 67/2 192/1 +f 190/97 123/98 122/96 191/95 +f 189/99 124/100 123/98 190/97 +f 65/76 105/75 124/101 189/102 +f 4/1 125/2 126/3 127/4 +f 51/77 166/78 167/79 168/80 +f 188/81 169/82 170/83 171/84 +f 172/85 173/86 166/78 51/77 +f 174/87 175/88 169/82 188/81 +f 182/95 183/96 125/2 4/1 +f 174/114 192/104 176/115 +f 51/116 43/117 172/118 +f 42/119 65/120 189/113 +f 192/104 174/114 193/105 +f 188/112 193/105 174/114 +f 188/112 171/121 197/109 +f 46/122 39/123 196/108 +f 195/106 196/108 39/123 +f 194/110 46/122 196/108 +f 194/110 197/109 171/121 +f 171/121 172/118 194/110 +f 43/117 194/110 172/118 +f 46/122 194/110 43/117 +f 39/123 42/119 195/106 +f 189/113 195/106 42/119 diff --git a/mods/pipeworks/models/pipeworks_pipe_6.obj b/mods/pipeworks/models/pipeworks_pipe_6.obj new file mode 100644 index 0000000..0744c45 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_6.obj @@ -0,0 +1,499 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-3way.blend' +# www.blender.org +o Cube.000 +v -0.069446 -0.468750 0.103934 +v -0.103933 -0.468750 0.069446 +v -0.122598 -0.468750 0.024386 +v -0.122598 -0.468750 -0.024386 +v -0.129917 -0.500000 -0.086808 +v -0.129917 -0.468750 -0.086808 +v -0.086808 -0.500000 -0.129917 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.500000 -0.153248 +v -0.030483 -0.468750 -0.153248 +v 0.030483 -0.500000 -0.153247 +v 0.030483 -0.468750 -0.153247 +v 0.086808 -0.500000 -0.129917 +v 0.086808 -0.468750 -0.129917 +v 0.129917 -0.500000 -0.086808 +v 0.129917 -0.468750 -0.086808 +v 0.153248 -0.500000 -0.030483 +v 0.153248 -0.468750 -0.030483 +v 0.153248 -0.500000 0.030483 +v 0.153248 -0.468750 0.030483 +v 0.129917 -0.500000 0.086808 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.500000 0.129917 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.500000 0.153248 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.500000 0.153248 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.500000 0.129917 +v -0.086808 -0.468750 0.129917 +v -0.129917 -0.500000 0.086808 +v -0.129917 -0.468750 0.086808 +v -0.153247 -0.500000 0.030483 +v -0.153248 -0.468750 0.030483 +v -0.153247 -0.500000 -0.030483 +v -0.153248 -0.468750 -0.030483 +v -0.024386 -0.468750 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.069446 -0.468750 0.103934 +v 0.103934 -0.468750 0.069447 +v 0.122598 -0.468750 0.024387 +v 0.122598 -0.468750 -0.024386 +v 0.103934 -0.468750 -0.069446 +v 0.069447 -0.468750 -0.103933 +v 0.024386 -0.468750 -0.122598 +v -0.024386 -0.468750 -0.122598 +v -0.069446 -0.468750 -0.103933 +v -0.103934 -0.468750 -0.069446 +v 0.000000 -0.468750 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.024386 -0.024391 0.122598 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 0.069446 +v 0.122598 -0.024391 0.024386 +v 0.122598 -0.024391 -0.024386 +v 0.103934 -0.024391 -0.069446 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v -0.024386 -0.024391 -0.122598 +v -0.103934 -0.024391 -0.069446 +v -0.069446 -0.024391 -0.103934 +v -0.103934 -0.024391 0.069446 +v -0.122598 -0.024391 0.024386 +v -0.122598 -0.024391 -0.024386 +v -0.069446 -0.024391 0.103934 +v -0.024386 -0.024391 0.122598 +v -0.468750 -0.153248 -0.030483 +v -0.500000 -0.153248 -0.030483 +v -0.468750 -0.153248 0.030483 +v -0.500000 -0.153248 0.030483 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.030483 0.153248 +v -0.500000 -0.030483 0.153248 +v -0.468750 0.030483 0.153248 +v -0.500000 0.030483 0.153248 +v -0.468750 0.086808 0.129917 +v -0.500000 0.086808 0.129917 +v -0.468750 0.129917 0.086808 +v -0.500000 0.129917 0.086808 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153248 0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.030483 -0.153248 +v -0.500000 0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.122598 -0.024386 +v -0.468750 -0.122598 0.024386 +v -0.468750 -0.103934 0.069446 +v -0.468750 -0.069446 0.103934 +v -0.468750 -0.024386 0.122598 +v -0.468750 0.024386 0.122598 +v -0.468750 0.069446 0.103934 +v -0.468750 0.103934 0.069446 +v -0.468750 0.122598 0.024386 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.069446 -0.103934 +v -0.468750 0.024386 -0.122598 +v -0.468750 -0.024386 -0.122598 +v -0.468750 -0.069446 -0.103934 +v -0.468750 -0.103934 -0.069446 +v -0.468750 0.000000 -0.000000 +v -0.500000 -0.000000 -0.000000 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.103934 0.069447 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.122598 -0.024386 +v 0.500000 -0.129917 -0.086807 +v 0.468750 -0.129917 -0.086807 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.468750 -0.030483 -0.153247 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.153248 -0.030483 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.129917 0.086808 +v 0.468750 0.129917 0.086808 +v 0.500000 0.086808 0.129917 +v 0.468750 0.086808 0.129917 +v 0.500000 0.030483 0.153248 +v 0.468750 0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.153248 0.030483 +v 0.468750 -0.153248 0.030483 +v 0.500000 -0.153248 -0.030482 +v 0.468750 -0.153248 -0.030483 +v 0.468750 -0.024386 0.122598 +v 0.468750 0.024386 0.122598 +v 0.468750 0.069446 0.103934 +v 0.468750 0.103934 0.069447 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.069446 -0.103933 +v 0.468750 0.024386 -0.122598 +v 0.468750 -0.024386 -0.122598 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103934 -0.069446 +v 0.468750 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.218363 0.657325 +vt 0.185866 0.820702 +vt 0.153368 0.657325 +vt 0.531836 0.657325 +vt 0.564334 0.820702 +vt 0.596832 0.657325 +vt 0.656879 0.682198 +vt 0.702838 0.728156 +vt 0.727710 0.788204 +vt 0.727710 0.853199 +vt 0.702838 0.913247 +vt 0.656879 0.959205 +vt 0.596831 0.984078 +vt 0.531836 0.984078 +vt 0.471788 0.959205 +vt 0.425830 0.913247 +vt 0.400957 0.853199 +vt 0.400957 0.788204 +vt 0.425830 0.728156 +vt 0.471789 0.682198 +vt 0.093321 0.682198 +vt 0.047362 0.728156 +vt 0.022489 0.788204 +vt 0.022489 0.853199 +vt 0.047362 0.913247 +vt 0.093320 0.959205 +vt 0.153368 0.984078 +vt 0.218363 0.984078 +vt 0.278411 0.959205 +vt 0.324369 0.913247 +vt 0.349242 0.853199 +vt 0.349242 0.788204 +vt 0.324369 0.728156 +vt 0.278411 0.682198 +vt 0.187500 0.515625 +vt 0.250000 0.515625 +vt 0.875000 0.515625 +vt 0.937500 0.515625 +vt 0.750000 0.515625 +vt 0.812500 0.515625 +vt 0.562500 0.515625 +vt 0.625000 0.515625 +vt 0.687500 0.515625 +vt 0.500000 0.515625 +vt 0.437500 0.515625 +vt 0.375000 0.515625 +vt 0.312500 0.515625 +vt 0.125000 0.515625 +vt 0.062500 0.515625 +vt 0.000000 0.515625 +vt 1.000000 0.515625 +s off +f 54/1 41/2 42/3 55/4 +f 31/5 33/6 50/7 +f 29/8 31/5 50/7 +f 27/9 29/8 50/7 +f 25/10 27/9 50/7 +f 23/11 25/10 50/7 +f 21/12 23/11 50/7 +f 19/13 21/12 50/7 +f 17/14 19/13 50/7 +f 15/15 17/14 50/7 +f 13/16 15/15 50/7 +f 11/17 13/16 50/7 +f 9/18 11/17 50/7 +f 7/19 9/18 50/7 +f 5/20 7/19 50/7 +f 35/21 5/20 50/7 +f 6/22 36/23 49/24 +f 8/25 6/22 49/24 +f 10/26 8/25 49/24 +f 12/27 10/26 49/24 +f 14/28 12/27 49/24 +f 16/29 14/28 49/24 +f 18/30 16/29 49/24 +f 20/31 18/30 49/24 +f 22/32 20/31 49/24 +f 24/33 22/32 49/24 +f 26/34 24/33 49/24 +f 28/35 26/34 49/24 +f 30/36 28/35 49/24 +f 32/37 30/36 49/24 +f 34/38 32/37 49/24 +f 36/23 34/38 49/24 +f 33/6 35/21 50/7 +f 8/39 7/40 5/41 6/42 +f 6/42 5/41 35/43 36/44 +f 10/45 9/46 7/40 8/39 +f 12/47 11/48 9/46 10/45 +f 14/49 13/50 11/51 12/52 +f 16/53 15/54 13/50 14/49 +f 18/55 17/56 15/54 16/53 +f 20/57 19/58 17/56 18/55 +f 22/59 21/60 19/58 20/57 +f 24/61 23/62 21/60 22/59 +f 26/63 25/64 23/62 24/61 +f 28/65 27/66 25/64 26/63 +f 30/67 29/68 27/66 28/65 +f 32/69 31/70 29/68 30/67 +f 34/71 33/72 31/70 32/69 +f 36/44 35/43 33/72 34/71 +f 65/73 1/74 37/75 66/76 +f 63/77 3/78 2/79 62/80 +f 61/81 47/82 48/83 60/84 +f 64/85 4/86 3/78 63/77 +f 62/80 2/79 1/74 65/73 +f 60/84 48/83 4/86 64/85 +f 59/87 46/88 47/82 61/81 +f 58/89 45/90 46/88 59/87 +f 57/91 44/92 45/90 58/89 +f 56/93 43/94 44/92 57/91 +f 55/4 42/3 43/94 56/93 +f 53/95 40/96 41/2 54/1 +f 52/97 39/98 40/96 53/95 +f 51/99 38/100 39/98 52/97 +f 66/76 37/75 38/101 51/102 +f 67/58 69/60 70/59 68/57 +f 69/60 71/62 72/61 70/59 +f 71/62 73/64 74/63 72/61 +f 73/64 75/66 76/65 74/63 +f 75/66 77/68 78/67 76/65 +f 77/68 79/70 80/69 78/67 +f 79/70 81/72 82/71 80/69 +f 81/72 83/43 84/44 82/71 +f 83/43 85/41 86/42 84/44 +f 85/41 87/40 88/39 86/42 +f 87/40 89/46 90/45 88/39 +f 89/46 91/48 92/47 90/45 +f 91/51 93/50 94/49 92/52 +f 93/50 95/54 96/53 94/49 +f 97/56 67/58 68/57 98/55 +f 95/54 97/56 98/55 96/53 +f 70/103 116/104 68/105 +f 67/106 115/107 69/108 +f 69/108 115/107 71/109 +f 71/109 115/107 73/110 +f 73/110 115/107 75/111 +f 75/111 115/107 77/112 +f 77/112 115/107 79/113 +f 79/113 115/107 81/114 +f 81/114 115/107 83/115 +f 83/115 115/107 85/116 +f 85/116 115/107 87/117 +f 87/117 115/107 89/118 +f 89/118 115/107 91/119 +f 91/119 115/107 93/120 +f 93/120 115/107 95/121 +f 95/121 115/107 97/122 +f 97/122 115/107 67/106 +f 68/105 116/104 98/123 +f 98/123 116/104 96/124 +f 96/124 116/104 94/125 +f 94/125 116/104 92/126 +f 92/126 116/104 90/127 +f 90/127 116/104 88/128 +f 88/128 116/104 86/129 +f 86/129 116/104 84/130 +f 84/130 116/104 82/131 +f 82/131 116/104 80/132 +f 80/132 116/104 78/133 +f 78/133 116/104 76/134 +f 76/134 116/104 74/135 +f 74/135 116/104 72/136 +f 72/136 116/104 70/103 +f 107/137 157/2 158/3 108/138 +f 147/5 149/6 166/7 +f 145/8 147/5 166/7 +f 143/9 145/8 166/7 +f 141/10 143/9 166/7 +f 139/11 141/10 166/7 +f 137/12 139/11 166/7 +f 135/13 137/12 166/7 +f 133/14 135/13 166/7 +f 131/15 133/14 166/7 +f 129/16 131/15 166/7 +f 127/17 129/16 166/7 +f 125/18 127/17 166/7 +f 123/19 125/18 166/7 +f 121/20 123/19 166/7 +f 151/21 121/20 166/7 +f 122/22 152/23 165/24 +f 124/25 122/22 165/24 +f 126/26 124/25 165/24 +f 128/27 126/26 165/24 +f 130/28 128/27 165/24 +f 132/29 130/28 165/24 +f 134/30 132/29 165/24 +f 136/31 134/30 165/24 +f 138/32 136/31 165/24 +f 140/33 138/32 165/24 +f 142/34 140/33 165/24 +f 144/35 142/34 165/24 +f 146/36 144/35 165/24 +f 148/37 146/36 165/24 +f 150/38 148/37 165/24 +f 152/23 150/38 165/24 +f 149/6 151/21 166/7 +f 124/39 123/40 121/41 122/42 +f 122/42 121/41 151/43 152/44 +f 126/45 125/46 123/40 124/39 +f 128/47 127/48 125/46 126/45 +f 130/49 129/50 127/51 128/52 +f 132/53 131/54 129/50 130/49 +f 134/55 133/56 131/54 132/53 +f 136/57 135/58 133/56 134/55 +f 138/59 137/60 135/58 136/57 +f 140/61 139/62 137/60 138/59 +f 142/63 141/64 139/62 140/61 +f 144/65 143/66 141/64 142/63 +f 146/67 145/68 143/66 144/65 +f 148/69 147/70 145/68 146/67 +f 150/71 149/72 147/70 148/69 +f 152/44 151/43 149/72 150/71 +f 102/139 117/74 153/75 103/140 +f 100/141 119/78 118/79 101/142 +f 113/143 163/82 164/83 114/144 +f 99/145 120/86 119/78 100/141 +f 101/142 118/79 117/74 102/139 +f 114/144 164/83 120/86 99/145 +f 112/146 162/88 163/82 113/143 +f 111/147 161/90 162/88 112/146 +f 110/148 160/92 161/90 111/147 +f 109/149 159/94 160/92 110/148 +f 108/138 158/3 159/94 109/149 +f 106/150 156/96 157/2 107/137 +f 105/151 155/98 156/96 106/150 +f 104/152 154/100 155/98 105/151 +f 103/140 153/75 154/101 104/153 diff --git a/mods/pipeworks/models/pipeworks_pipe_7.obj b/mods/pipeworks/models/pipeworks_pipe_7.obj new file mode 100644 index 0000000..d299361 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_7.obj @@ -0,0 +1,629 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-4way-corner.blend' +# www.blender.org +o Cube.000 +v -0.069446 -0.468750 0.103934 +v -0.103933 -0.468750 0.069446 +v -0.122598 -0.468750 0.024386 +v -0.122598 -0.468750 -0.024386 +v -0.129917 -0.500000 -0.086808 +v -0.129917 -0.468750 -0.086808 +v -0.086808 -0.500000 -0.129917 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.500000 -0.153248 +v -0.030483 -0.468750 -0.153248 +v 0.030483 -0.500000 -0.153247 +v 0.030483 -0.468750 -0.153247 +v 0.086808 -0.500000 -0.129917 +v 0.086808 -0.468750 -0.129917 +v 0.129917 -0.500000 -0.086808 +v 0.129917 -0.468750 -0.086808 +v 0.153248 -0.500000 -0.030483 +v 0.153248 -0.468750 -0.030483 +v 0.153248 -0.500000 0.030483 +v 0.153248 -0.468750 0.030483 +v 0.129917 -0.500000 0.086808 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.500000 0.129917 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.500000 0.153248 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.500000 0.153248 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.500000 0.129917 +v -0.086808 -0.468750 0.129917 +v -0.129917 -0.500000 0.086808 +v -0.129917 -0.468750 0.086808 +v -0.153247 -0.500000 0.030483 +v -0.153248 -0.468750 0.030483 +v -0.153247 -0.500000 -0.030483 +v -0.153248 -0.468750 -0.030483 +v -0.024386 -0.468750 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.069446 -0.468750 0.103934 +v 0.103934 -0.468750 0.069447 +v 0.122598 -0.468750 0.024387 +v 0.122598 -0.468750 -0.024386 +v 0.103934 -0.468750 -0.069446 +v 0.069447 -0.468750 -0.103933 +v 0.024386 -0.468750 -0.122598 +v -0.024386 -0.468750 -0.122598 +v -0.069446 -0.468750 -0.103933 +v -0.103934 -0.468750 -0.069446 +v 0.000000 -0.468750 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.024386 -0.024391 0.122598 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 0.069446 +v 0.122598 -0.024391 0.024386 +v 0.122598 -0.024391 -0.024386 +v 0.103934 -0.024391 -0.069446 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v -0.024386 -0.024391 -0.122598 +v -0.103934 -0.024391 -0.069446 +v -0.069446 -0.024391 -0.103934 +v -0.103934 -0.024391 0.069446 +v -0.122598 -0.024391 0.024386 +v -0.122598 -0.024391 -0.024386 +v -0.069446 -0.024391 0.103934 +v -0.024386 -0.024391 0.122598 +v -0.468750 -0.153248 -0.030483 +v -0.500000 -0.153248 -0.030483 +v -0.468750 -0.153248 0.030483 +v -0.500000 -0.153248 0.030483 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.030483 0.153248 +v -0.500000 -0.030483 0.153248 +v -0.468750 0.030483 0.153248 +v -0.500000 0.030483 0.153248 +v -0.468750 0.086808 0.129917 +v -0.500000 0.086808 0.129917 +v -0.468750 0.129917 0.086808 +v -0.500000 0.129917 0.086808 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153248 0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.030483 -0.153248 +v -0.500000 0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.122598 -0.024386 +v -0.468750 -0.122598 0.024386 +v -0.468750 -0.103934 0.069446 +v -0.468750 -0.069446 0.103934 +v -0.468750 -0.024386 0.122598 +v -0.468750 0.024386 0.122598 +v -0.468750 0.069446 0.103934 +v -0.468750 0.103934 0.069446 +v -0.468750 0.122598 0.024386 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.069446 -0.103934 +v -0.468750 0.024386 -0.122598 +v -0.468750 -0.024386 -0.122598 +v -0.468750 -0.069446 -0.103934 +v -0.468750 -0.103934 -0.069446 +v -0.468750 0.000000 -0.000000 +v -0.500000 -0.000000 -0.000000 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.103934 0.069447 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.122598 -0.024386 +v 0.500000 -0.129917 -0.086807 +v 0.468750 -0.129917 -0.086807 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.468750 -0.030483 -0.153247 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.153248 -0.030483 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.129917 0.086808 +v 0.468750 0.129917 0.086808 +v 0.500000 0.086808 0.129917 +v 0.468750 0.086808 0.129917 +v 0.500000 0.030483 0.153248 +v 0.468750 0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.153248 0.030483 +v 0.468750 -0.153248 0.030483 +v 0.500000 -0.153248 -0.030482 +v 0.468750 -0.153248 -0.030483 +v 0.468750 -0.024386 0.122598 +v 0.468750 0.024386 0.122598 +v 0.468750 0.069446 0.103934 +v 0.468750 0.103934 0.069447 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.069446 -0.103933 +v 0.468750 0.024386 -0.122598 +v 0.468750 -0.024386 -0.122598 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103934 -0.069446 +v 0.468750 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.069446 -0.103934 -0.468750 +v -0.103933 -0.069447 -0.468750 +v -0.122598 -0.024387 -0.468750 +v -0.122598 0.024386 -0.468750 +v -0.129917 0.086808 -0.500000 +v -0.129917 0.086808 -0.468750 +v -0.086807 0.129917 -0.500000 +v -0.086807 0.129917 -0.468750 +v -0.030482 0.153247 -0.500000 +v -0.030482 0.153247 -0.468750 +v 0.030483 0.153247 -0.500000 +v 0.030483 0.153247 -0.468750 +v 0.086808 0.129917 -0.500000 +v 0.086808 0.129917 -0.468750 +v 0.129918 0.086808 -0.500000 +v 0.129918 0.086808 -0.468750 +v 0.153248 0.030483 -0.500000 +v 0.153248 0.030483 -0.468750 +v 0.153248 -0.030483 -0.500000 +v 0.153248 -0.030483 -0.468750 +v 0.129918 -0.086808 -0.500000 +v 0.129918 -0.086808 -0.468750 +v 0.086808 -0.129917 -0.500000 +v 0.086808 -0.129917 -0.468750 +v 0.030483 -0.153248 -0.500000 +v 0.030483 -0.153248 -0.468750 +v -0.030482 -0.153248 -0.500000 +v -0.030482 -0.153248 -0.468750 +v -0.086807 -0.129917 -0.500000 +v -0.086807 -0.129917 -0.468750 +v -0.129917 -0.086808 -0.500000 +v -0.129917 -0.086808 -0.468750 +v -0.153247 -0.030483 -0.500000 +v -0.153247 -0.030483 -0.468750 +v -0.153247 0.030483 -0.500000 +v -0.153247 0.030483 -0.468750 +v -0.024386 -0.122598 -0.468750 +v 0.024387 -0.122598 -0.468750 +v 0.069447 -0.103934 -0.468750 +v 0.103934 -0.069447 -0.468750 +v 0.122599 -0.024387 -0.468750 +v 0.122599 0.024386 -0.468750 +v 0.103934 0.069446 -0.468750 +v 0.069447 0.103933 -0.468750 +v 0.024387 0.122598 -0.468750 +v -0.024386 0.122598 -0.468750 +v -0.069446 0.103933 -0.468750 +v -0.103933 0.069446 -0.468750 +v 0.000000 -0.000000 -0.468750 +v 0.000001 -0.000000 -0.500000 +v 0.024386 -0.122598 -0.024391 +v 0.069446 -0.103934 -0.024391 +v 0.103934 -0.069446 -0.024391 +v 0.122598 -0.024386 -0.024391 +v 0.122598 0.024386 -0.024391 +v 0.103934 0.069446 -0.024391 +v 0.069446 0.103934 -0.024391 +v 0.024386 0.122598 -0.024391 +v -0.024386 0.122598 -0.024391 +v -0.103934 0.069446 -0.024391 +v -0.069446 0.103934 -0.024391 +v -0.103934 -0.069446 -0.024391 +v -0.122598 -0.024386 -0.024391 +v -0.122598 0.024386 -0.024391 +v -0.069446 -0.103934 -0.024391 +v -0.024386 -0.122598 -0.024391 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.218363 0.657325 +vt 0.185866 0.820702 +vt 0.153368 0.657325 +vt 0.531836 0.657325 +vt 0.564334 0.820702 +vt 0.596832 0.657325 +vt 0.656879 0.682198 +vt 0.702838 0.728156 +vt 0.727710 0.788204 +vt 0.727710 0.853199 +vt 0.702838 0.913247 +vt 0.656879 0.959205 +vt 0.596831 0.984078 +vt 0.531836 0.984078 +vt 0.471788 0.959205 +vt 0.425830 0.913247 +vt 0.400957 0.853199 +vt 0.400957 0.788204 +vt 0.425830 0.728156 +vt 0.471789 0.682198 +vt 0.093321 0.682198 +vt 0.047362 0.728156 +vt 0.022489 0.788204 +vt 0.022489 0.853199 +vt 0.047362 0.913247 +vt 0.093320 0.959205 +vt 0.153368 0.984078 +vt 0.218363 0.984078 +vt 0.278411 0.959205 +vt 0.324369 0.913247 +vt 0.349242 0.853199 +vt 0.349242 0.788204 +vt 0.324369 0.728156 +vt 0.278411 0.682198 +vt 0.187500 0.515625 +vt 0.250000 0.515625 +vt 0.875000 0.515625 +vt 0.937500 0.515625 +vt 0.750000 0.515625 +vt 0.812500 0.515625 +vt 0.562500 0.515625 +vt 0.625000 0.515625 +vt 0.687500 0.515625 +vt 0.500000 0.515625 +vt 0.437500 0.515625 +vt 0.375000 0.515625 +vt 0.312500 0.515625 +vt 0.125000 0.515625 +vt 0.062500 0.515625 +vt 0.000000 0.515625 +vt 1.000000 0.515625 +s off +f 54/1 41/2 42/3 55/4 +f 31/5 33/6 50/7 +f 29/8 31/5 50/7 +f 27/9 29/8 50/7 +f 25/10 27/9 50/7 +f 23/11 25/10 50/7 +f 21/12 23/11 50/7 +f 19/13 21/12 50/7 +f 17/14 19/13 50/7 +f 15/15 17/14 50/7 +f 13/16 15/15 50/7 +f 11/17 13/16 50/7 +f 9/18 11/17 50/7 +f 7/19 9/18 50/7 +f 5/20 7/19 50/7 +f 35/21 5/20 50/7 +f 6/22 36/23 49/24 +f 8/25 6/22 49/24 +f 10/26 8/25 49/24 +f 12/27 10/26 49/24 +f 14/28 12/27 49/24 +f 16/29 14/28 49/24 +f 18/30 16/29 49/24 +f 20/31 18/30 49/24 +f 22/32 20/31 49/24 +f 24/33 22/32 49/24 +f 26/34 24/33 49/24 +f 28/35 26/34 49/24 +f 30/36 28/35 49/24 +f 32/37 30/36 49/24 +f 34/38 32/37 49/24 +f 36/23 34/38 49/24 +f 33/6 35/21 50/7 +f 8/39 7/40 5/41 6/42 +f 6/42 5/41 35/43 36/44 +f 10/45 9/46 7/40 8/39 +f 12/47 11/48 9/46 10/45 +f 14/49 13/50 11/51 12/52 +f 16/53 15/54 13/50 14/49 +f 18/55 17/56 15/54 16/53 +f 20/57 19/58 17/56 18/55 +f 22/59 21/60 19/58 20/57 +f 24/61 23/62 21/60 22/59 +f 26/63 25/64 23/62 24/61 +f 28/65 27/66 25/64 26/63 +f 30/67 29/68 27/66 28/65 +f 32/69 31/70 29/68 30/67 +f 34/71 33/72 31/70 32/69 +f 36/44 35/43 33/72 34/71 +f 65/73 1/74 37/75 66/76 +f 63/77 3/78 2/79 62/80 +f 61/81 47/82 48/83 60/84 +f 64/85 4/86 3/78 63/77 +f 62/80 2/79 1/74 65/73 +f 60/84 48/83 4/86 64/85 +f 59/87 46/88 47/82 61/81 +f 58/89 45/90 46/88 59/87 +f 57/91 44/92 45/90 58/89 +f 56/93 43/94 44/92 57/91 +f 55/4 42/3 43/94 56/93 +f 53/95 40/96 41/2 54/1 +f 52/97 39/98 40/96 53/95 +f 51/99 38/100 39/98 52/97 +f 66/76 37/75 38/101 51/102 +f 67/58 69/60 70/59 68/57 +f 69/60 71/62 72/61 70/59 +f 71/62 73/64 74/63 72/61 +f 73/64 75/66 76/65 74/63 +f 75/66 77/68 78/67 76/65 +f 77/68 79/70 80/69 78/67 +f 79/70 81/72 82/71 80/69 +f 81/72 83/43 84/44 82/71 +f 83/43 85/41 86/42 84/44 +f 85/41 87/40 88/39 86/42 +f 87/40 89/46 90/45 88/39 +f 89/46 91/48 92/47 90/45 +f 91/51 93/50 94/49 92/52 +f 93/50 95/54 96/53 94/49 +f 97/56 67/58 68/57 98/55 +f 95/54 97/56 98/55 96/53 +f 70/103 116/104 68/105 +f 67/106 115/107 69/108 +f 69/108 115/107 71/109 +f 71/109 115/107 73/110 +f 73/110 115/107 75/111 +f 75/111 115/107 77/112 +f 77/112 115/107 79/113 +f 79/113 115/107 81/114 +f 81/114 115/107 83/115 +f 83/115 115/107 85/116 +f 85/116 115/107 87/117 +f 87/117 115/107 89/118 +f 89/118 115/107 91/119 +f 91/119 115/107 93/120 +f 93/120 115/107 95/121 +f 95/121 115/107 97/122 +f 97/122 115/107 67/106 +f 68/105 116/104 98/123 +f 98/123 116/104 96/124 +f 96/124 116/104 94/125 +f 94/125 116/104 92/126 +f 92/126 116/104 90/127 +f 90/127 116/104 88/128 +f 88/128 116/104 86/129 +f 86/129 116/104 84/130 +f 84/130 116/104 82/131 +f 82/131 116/104 80/132 +f 80/132 116/104 78/133 +f 78/133 116/104 76/134 +f 76/134 116/104 74/135 +f 74/135 116/104 72/136 +f 72/136 116/104 70/103 +f 107/137 157/2 158/3 108/138 +f 147/5 149/6 166/7 +f 145/8 147/5 166/7 +f 143/9 145/8 166/7 +f 141/10 143/9 166/7 +f 139/11 141/10 166/7 +f 137/12 139/11 166/7 +f 135/13 137/12 166/7 +f 133/14 135/13 166/7 +f 131/15 133/14 166/7 +f 129/16 131/15 166/7 +f 127/17 129/16 166/7 +f 125/18 127/17 166/7 +f 123/19 125/18 166/7 +f 121/20 123/19 166/7 +f 151/21 121/20 166/7 +f 122/22 152/23 165/24 +f 124/25 122/22 165/24 +f 126/26 124/25 165/24 +f 128/27 126/26 165/24 +f 130/28 128/27 165/24 +f 132/29 130/28 165/24 +f 134/30 132/29 165/24 +f 136/31 134/30 165/24 +f 138/32 136/31 165/24 +f 140/33 138/32 165/24 +f 142/34 140/33 165/24 +f 144/35 142/34 165/24 +f 146/36 144/35 165/24 +f 148/37 146/36 165/24 +f 150/38 148/37 165/24 +f 152/23 150/38 165/24 +f 149/6 151/21 166/7 +f 124/39 123/40 121/41 122/42 +f 122/42 121/41 151/43 152/44 +f 126/45 125/46 123/40 124/39 +f 128/47 127/48 125/46 126/45 +f 130/49 129/50 127/51 128/52 +f 132/53 131/54 129/50 130/49 +f 134/55 133/56 131/54 132/53 +f 136/57 135/58 133/56 134/55 +f 138/59 137/60 135/58 136/57 +f 140/61 139/62 137/60 138/59 +f 142/63 141/64 139/62 140/61 +f 144/65 143/66 141/64 142/63 +f 146/67 145/68 143/66 144/65 +f 148/69 147/70 145/68 146/67 +f 150/71 149/72 147/70 148/69 +f 152/44 151/43 149/72 150/71 +f 102/139 117/74 153/75 103/140 +f 100/141 119/78 118/79 101/142 +f 113/143 163/82 164/83 114/144 +f 99/145 120/86 119/78 100/141 +f 101/142 118/79 117/74 102/139 +f 114/144 164/83 120/86 99/145 +f 112/146 162/88 163/82 113/143 +f 111/147 161/90 162/88 112/146 +f 110/148 160/92 161/90 111/147 +f 109/149 159/94 160/92 110/148 +f 108/138 158/3 159/94 109/149 +f 106/150 156/96 157/2 107/137 +f 105/151 155/98 156/96 106/150 +f 104/152 154/100 155/98 105/151 +f 103/140 153/75 154/101 104/153 +f 220/1 207/2 208/3 221/4 +f 197/5 199/6 216/7 +f 195/8 197/5 216/7 +f 193/9 195/8 216/7 +f 191/10 193/9 216/7 +f 189/11 191/10 216/7 +f 187/12 189/11 216/7 +f 185/13 187/12 216/7 +f 183/14 185/13 216/7 +f 181/15 183/14 216/7 +f 179/16 181/15 216/7 +f 177/17 179/16 216/7 +f 175/18 177/17 216/7 +f 173/19 175/18 216/7 +f 171/20 173/19 216/7 +f 201/21 171/20 216/7 +f 172/22 202/23 215/24 +f 174/25 172/22 215/24 +f 176/26 174/25 215/24 +f 178/27 176/26 215/24 +f 180/28 178/27 215/24 +f 182/29 180/28 215/24 +f 184/30 182/29 215/24 +f 186/31 184/30 215/24 +f 188/32 186/31 215/24 +f 190/33 188/32 215/24 +f 192/34 190/33 215/24 +f 194/35 192/34 215/24 +f 196/36 194/35 215/24 +f 198/37 196/36 215/24 +f 200/38 198/37 215/24 +f 202/23 200/38 215/24 +f 199/6 201/21 216/7 +f 174/39 173/40 171/41 172/42 +f 172/42 171/41 201/43 202/44 +f 176/45 175/46 173/40 174/39 +f 178/47 177/48 175/46 176/45 +f 180/49 179/50 177/51 178/52 +f 182/53 181/54 179/50 180/49 +f 184/55 183/56 181/54 182/53 +f 186/57 185/58 183/56 184/55 +f 188/59 187/60 185/58 186/57 +f 190/61 189/62 187/60 188/59 +f 192/63 191/64 189/62 190/61 +f 194/65 193/66 191/64 192/63 +f 196/67 195/68 193/66 194/65 +f 198/69 197/70 195/68 196/67 +f 200/71 199/72 197/70 198/69 +f 202/44 201/43 199/72 200/71 +f 231/73 167/74 203/75 232/76 +f 229/77 169/78 168/79 228/80 +f 227/81 213/82 214/83 226/84 +f 230/85 170/86 169/78 229/77 +f 228/80 168/79 167/74 231/73 +f 226/84 214/83 170/86 230/85 +f 225/87 212/88 213/82 227/81 +f 224/89 211/90 212/88 225/87 +f 223/91 210/92 211/90 224/89 +f 222/93 209/94 210/92 223/91 +f 221/4 208/3 209/94 222/93 +f 219/95 206/96 207/2 220/1 +f 218/97 205/98 206/96 219/95 +f 217/99 204/100 205/98 218/97 +f 232/76 203/75 204/101 217/102 diff --git a/mods/pipeworks/models/pipeworks_pipe_8.obj b/mods/pipeworks/models/pipeworks_pipe_8.obj new file mode 100644 index 0000000..5dc58f9 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_8.obj @@ -0,0 +1,631 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-4way.blend' +# www.blender.org +mtllib pipeworks_pipe_8.mtl +o Cube.000 +v 0.069446 -0.468750 -0.103934 +v 0.103933 -0.468750 -0.069446 +v 0.122598 -0.468750 -0.024386 +v 0.122598 -0.468750 0.024386 +v 0.129917 -0.500000 0.086808 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.500000 0.129917 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.500000 0.153247 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.500000 0.153247 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.500000 0.129917 +v -0.086808 -0.468750 0.129917 +v -0.129918 -0.500000 0.086808 +v -0.129917 -0.468750 0.086808 +v -0.153248 -0.500000 0.030483 +v -0.153248 -0.468750 0.030483 +v -0.153248 -0.500000 -0.030483 +v -0.153248 -0.468750 -0.030483 +v -0.129918 -0.500000 -0.086808 +v -0.129917 -0.468750 -0.086808 +v -0.086808 -0.500000 -0.129917 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.500000 -0.153248 +v -0.030483 -0.468750 -0.153248 +v 0.030482 -0.500000 -0.153248 +v 0.030482 -0.468750 -0.153248 +v 0.086807 -0.500000 -0.129917 +v 0.086807 -0.468750 -0.129917 +v 0.129917 -0.500000 -0.086808 +v 0.129917 -0.468750 -0.086808 +v 0.153247 -0.500000 -0.030483 +v 0.153247 -0.468750 -0.030483 +v 0.153247 -0.500000 0.030483 +v 0.153247 -0.468750 0.030483 +v 0.024386 -0.468750 -0.122598 +v -0.024387 -0.468750 -0.122598 +v -0.069447 -0.468750 -0.103934 +v -0.103934 -0.468750 -0.069446 +v -0.122599 -0.468750 -0.024386 +v -0.122599 -0.468750 0.024386 +v -0.103934 -0.468750 0.069446 +v -0.069447 -0.468750 0.103934 +v -0.024387 -0.468750 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.069446 -0.468750 0.103933 +v 0.103933 -0.468750 0.069446 +v -0.000000 -0.468750 -0.000000 +v -0.000000 -0.500000 -0.000000 +v -0.024386 -0.024391 -0.122598 +v -0.069446 -0.024391 -0.103934 +v -0.103934 -0.024391 -0.069446 +v -0.122598 -0.024391 -0.024386 +v -0.122598 -0.024391 0.024386 +v -0.103934 -0.024391 0.069446 +v -0.069446 -0.024391 0.103934 +v -0.024386 -0.024391 0.122598 +v 0.024386 -0.024391 0.122598 +v 0.103934 -0.024391 0.069446 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 -0.069446 +v 0.122598 -0.024391 -0.024386 +v 0.122598 -0.024391 0.024386 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v 0.153248 0.468750 0.030483 +v 0.153248 0.500000 0.030483 +v 0.153248 0.468750 -0.030483 +v 0.153248 0.500000 -0.030483 +v 0.129917 0.468750 -0.086808 +v 0.129917 0.500000 -0.086808 +v 0.086808 0.468750 -0.129917 +v 0.086808 0.500000 -0.129917 +v 0.030483 0.468750 -0.153248 +v 0.030483 0.500000 -0.153248 +v -0.030483 0.468750 -0.153248 +v -0.030483 0.500000 -0.153248 +v -0.086808 0.468750 -0.129917 +v -0.086808 0.500000 -0.129917 +v -0.129917 0.468750 -0.086808 +v -0.129917 0.500000 -0.086808 +v -0.153247 0.468750 -0.030483 +v -0.153247 0.500000 -0.030483 +v -0.153247 0.468750 0.030483 +v -0.153247 0.500000 0.030483 +v -0.129917 0.468750 0.086808 +v -0.129917 0.500000 0.086808 +v -0.086808 0.468750 0.129917 +v -0.086808 0.500000 0.129917 +v -0.030483 0.468750 0.153248 +v -0.030483 0.500000 0.153248 +v 0.030483 0.468750 0.153248 +v 0.030483 0.500000 0.153248 +v 0.086808 0.468750 0.129917 +v 0.086808 0.500000 0.129917 +v 0.129917 0.468750 0.086808 +v 0.129918 0.500000 0.086808 +v 0.122598 0.468750 0.024386 +v 0.122598 0.468750 -0.024386 +v 0.103934 0.468750 -0.069446 +v 0.069447 0.468750 -0.103934 +v 0.024387 0.468750 -0.122598 +v -0.024386 0.468750 -0.122598 +v -0.069446 0.468750 -0.103934 +v -0.103933 0.468750 -0.069446 +v -0.122598 0.468750 -0.024386 +v -0.122598 0.468750 0.024386 +v -0.103933 0.468750 0.069446 +v -0.069446 0.468750 0.103934 +v -0.024386 0.468750 0.122598 +v 0.024387 0.468750 0.122598 +v 0.069447 0.468750 0.103934 +v 0.103934 0.468750 0.069446 +v 0.000000 0.468750 -0.000000 +v 0.000000 0.500000 0.000000 +v -0.024386 0.024390 -0.122598 +v -0.069446 0.024390 -0.103934 +v -0.103934 0.024390 -0.069446 +v -0.122598 0.024390 -0.024386 +v -0.122598 0.024390 0.024386 +v -0.103934 0.024390 0.069446 +v -0.069446 0.024390 0.103934 +v -0.024386 0.024389 0.122598 +v 0.024386 0.024389 0.122598 +v 0.103934 0.024390 0.069446 +v 0.069446 0.024390 0.103934 +v 0.103934 0.024390 -0.069446 +v 0.122598 0.024390 -0.024386 +v 0.122598 0.024390 0.024386 +v 0.069446 0.024390 -0.103934 +v 0.024386 0.024390 -0.122598 +v 0.468750 -0.153248 0.030483 +v 0.500000 -0.153248 0.030483 +v 0.468750 -0.153248 -0.030483 +v 0.500000 -0.153248 -0.030483 +v 0.468750 -0.129917 -0.086808 +v 0.500000 -0.129917 -0.086808 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.030483 -0.153248 +v 0.500000 -0.030483 -0.153248 +v 0.468750 0.030483 -0.153248 +v 0.500000 0.030483 -0.153248 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153247 -0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.129917 0.086808 +v 0.500000 0.129917 0.086808 +v 0.468750 0.086808 0.129917 +v 0.500000 0.086808 0.129917 +v 0.468750 0.030483 0.153248 +v 0.500000 0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.122598 0.024386 +v 0.468750 -0.122598 -0.024386 +v 0.468750 -0.103934 -0.069446 +v 0.468750 -0.069446 -0.103934 +v 0.468750 -0.024386 -0.122598 +v 0.468750 0.024386 -0.122598 +v 0.468750 0.069446 -0.103934 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.122598 0.024386 +v 0.468750 0.103934 0.069446 +v 0.468750 0.069446 0.103934 +v 0.468750 0.024386 0.122598 +v 0.468750 -0.024387 0.122598 +v 0.468750 -0.069447 0.103934 +v 0.468750 -0.103934 0.069446 +v 0.468750 -0.000000 -0.000000 +v 0.500000 -0.000000 0.000000 +v -0.468750 -0.069446 -0.103934 +v -0.468750 -0.103933 -0.069446 +v -0.468750 -0.122598 -0.024387 +v -0.468750 -0.122598 0.024386 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.030483 0.153247 +v -0.468750 -0.030483 0.153248 +v -0.500000 0.030483 0.153247 +v -0.468750 0.030483 0.153248 +v -0.500000 0.086808 0.129917 +v -0.468750 0.086808 0.129917 +v -0.500000 0.129917 0.086808 +v -0.468750 0.129917 0.086808 +v -0.500000 0.153248 0.030483 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.030483 -0.153248 +v -0.468750 0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.153247 -0.030483 +v -0.468750 -0.153247 -0.030483 +v -0.500000 -0.153247 0.030483 +v -0.468750 -0.153247 0.030483 +v -0.468750 -0.024386 -0.122598 +v -0.468750 0.024387 -0.122598 +v -0.468750 0.069447 -0.103934 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.122598 0.024386 +v -0.468750 0.103934 0.069446 +v -0.468750 0.069447 0.103934 +v -0.468750 0.024387 0.122598 +v -0.468750 -0.024386 0.122598 +v -0.468750 -0.069446 0.103933 +v -0.468750 -0.103933 0.069446 +v -0.468750 0.000000 -0.000000 +v -0.500000 0.000000 -0.000000 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.218363 0.657325 +vt 0.185866 0.820702 +vt 0.153368 0.657325 +vt 0.531836 0.657325 +vt 0.564334 0.820702 +vt 0.596832 0.657325 +vt 0.656879 0.682198 +vt 0.702838 0.728156 +vt 0.727710 0.788204 +vt 0.727710 0.853199 +vt 0.702838 0.913247 +vt 0.656879 0.959205 +vt 0.596831 0.984078 +vt 0.531836 0.984078 +vt 0.471788 0.959205 +vt 0.425830 0.913247 +vt 0.400957 0.853199 +vt 0.400957 0.788204 +vt 0.425830 0.728156 +vt 0.471789 0.682198 +vt 0.093321 0.682198 +vt 0.047362 0.728156 +vt 0.022489 0.788204 +vt 0.022489 0.853199 +vt 0.047362 0.913247 +vt 0.093320 0.959205 +vt 0.153368 0.984078 +vt 0.218363 0.984078 +vt 0.278411 0.959205 +vt 0.324369 0.913247 +vt 0.349242 0.853199 +vt 0.349242 0.788204 +vt 0.324369 0.728156 +vt 0.278411 0.682198 +vt 0.187500 0.515625 +vt 0.250000 0.515625 +vt 0.875000 0.515625 +vt 0.937500 0.515625 +vt 0.750000 0.515625 +vt 0.812500 0.515625 +vt 0.562500 0.515625 +vt 0.625000 0.515625 +vt 0.687500 0.515625 +vt 0.500000 0.515625 +vt 0.437500 0.515625 +vt 0.375000 0.515625 +vt 0.312500 0.515625 +vt 0.125000 0.515625 +vt 0.062500 0.515625 +vt 0.000000 0.515625 +vt 1.000000 0.515625 +usemtl None +s off +f 54/1 41/2 42/3 55/4 +f 31/5 33/6 50/7 +f 29/8 31/5 50/7 +f 27/9 29/8 50/7 +f 25/10 27/9 50/7 +f 23/11 25/10 50/7 +f 21/12 23/11 50/7 +f 19/13 21/12 50/7 +f 17/14 19/13 50/7 +f 15/15 17/14 50/7 +f 13/16 15/15 50/7 +f 11/17 13/16 50/7 +f 9/18 11/17 50/7 +f 7/19 9/18 50/7 +f 5/20 7/19 50/7 +f 35/21 5/20 50/7 +f 6/22 36/23 49/24 +f 8/25 6/22 49/24 +f 10/26 8/25 49/24 +f 12/27 10/26 49/24 +f 14/28 12/27 49/24 +f 16/29 14/28 49/24 +f 18/30 16/29 49/24 +f 20/31 18/30 49/24 +f 22/32 20/31 49/24 +f 24/33 22/32 49/24 +f 26/34 24/33 49/24 +f 28/35 26/34 49/24 +f 30/36 28/35 49/24 +f 32/37 30/36 49/24 +f 34/38 32/37 49/24 +f 36/23 34/38 49/24 +f 33/6 35/21 50/7 +f 8/39 7/40 5/41 6/42 +f 6/42 5/41 35/43 36/44 +f 10/45 9/46 7/40 8/39 +f 12/47 11/48 9/46 10/45 +f 14/49 13/50 11/51 12/52 +f 16/53 15/54 13/50 14/49 +f 18/55 17/56 15/54 16/53 +f 20/57 19/58 17/56 18/55 +f 22/59 21/60 19/58 20/57 +f 24/61 23/62 21/60 22/59 +f 26/63 25/64 23/62 24/61 +f 28/65 27/66 25/64 26/63 +f 30/67 29/68 27/66 28/65 +f 32/69 31/70 29/68 30/67 +f 34/71 33/72 31/70 32/69 +f 36/44 35/43 33/72 34/71 +f 65/73 1/74 37/75 66/76 +f 63/77 3/78 2/79 62/80 +f 61/81 47/82 48/83 60/84 +f 64/85 4/86 3/78 63/77 +f 62/80 2/79 1/74 65/73 +f 60/84 48/83 4/86 64/85 +f 59/87 46/88 47/82 61/81 +f 58/89 45/90 46/88 59/87 +f 57/91 44/92 45/90 58/89 +f 56/93 43/94 44/92 57/91 +f 55/4 42/3 43/94 56/93 +f 53/95 40/96 41/2 54/1 +f 52/97 39/98 40/96 53/95 +f 51/99 38/100 39/98 52/97 +f 66/76 37/75 38/101 51/102 +f 67/58 69/60 70/59 68/57 +f 69/60 71/62 72/61 70/59 +f 71/62 73/64 74/63 72/61 +f 73/64 75/66 76/65 74/63 +f 75/66 77/68 78/67 76/65 +f 77/68 79/70 80/69 78/67 +f 79/70 81/72 82/71 80/69 +f 81/72 83/43 84/44 82/71 +f 83/43 85/41 86/42 84/44 +f 85/41 87/40 88/39 86/42 +f 87/40 89/46 90/45 88/39 +f 89/46 91/48 92/47 90/45 +f 91/51 93/50 94/49 92/52 +f 93/50 95/54 96/53 94/49 +f 97/56 67/58 68/57 98/55 +f 95/54 97/56 98/55 96/53 +f 70/103 116/104 68/105 +f 67/106 115/107 69/108 +f 69/108 115/107 71/109 +f 71/109 115/107 73/110 +f 73/110 115/107 75/111 +f 75/111 115/107 77/112 +f 77/112 115/107 79/113 +f 79/113 115/107 81/114 +f 81/114 115/107 83/115 +f 83/115 115/107 85/116 +f 85/116 115/107 87/117 +f 87/117 115/107 89/118 +f 89/118 115/107 91/119 +f 91/119 115/107 93/120 +f 93/120 115/107 95/121 +f 95/121 115/107 97/122 +f 97/122 115/107 67/106 +f 68/105 116/104 98/123 +f 98/123 116/104 96/124 +f 96/124 116/104 94/125 +f 94/125 116/104 92/126 +f 92/126 116/104 90/127 +f 90/127 116/104 88/128 +f 88/128 116/104 86/129 +f 86/129 116/104 84/130 +f 84/130 116/104 82/131 +f 82/131 116/104 80/132 +f 80/132 116/104 78/133 +f 78/133 116/104 76/134 +f 76/134 116/104 74/135 +f 74/135 116/104 72/136 +f 72/136 116/104 70/103 +f 107/137 120/1 121/4 108/138 +f 102/139 131/73 132/76 103/140 +f 100/141 129/77 128/80 101/142 +f 113/143 127/81 126/84 114/144 +f 99/145 130/85 129/77 100/141 +f 101/142 128/80 131/73 102/139 +f 114/144 126/84 130/85 99/145 +f 112/146 125/87 127/81 113/143 +f 111/147 124/89 125/87 112/146 +f 110/148 123/91 124/89 111/147 +f 109/149 122/93 123/91 110/148 +f 108/138 121/4 122/93 109/149 +f 106/150 119/95 120/1 107/137 +f 105/151 118/97 119/95 106/150 +f 104/152 117/99 118/97 105/151 +f 103/140 132/76 117/102 104/153 +f 133/58 135/60 136/59 134/57 +f 135/60 137/62 138/61 136/59 +f 137/62 139/64 140/63 138/61 +f 139/64 141/66 142/65 140/63 +f 141/66 143/68 144/67 142/65 +f 143/68 145/70 146/69 144/67 +f 145/70 147/72 148/71 146/69 +f 147/72 149/43 150/44 148/71 +f 149/43 151/41 152/42 150/44 +f 151/41 153/40 154/39 152/42 +f 153/40 155/46 156/45 154/39 +f 155/46 157/48 158/47 156/45 +f 157/51 159/50 160/49 158/52 +f 159/50 161/54 162/53 160/49 +f 163/56 133/58 134/57 164/55 +f 161/54 163/56 164/55 162/53 +f 136/103 182/104 134/105 +f 133/106 181/107 135/108 +f 135/108 181/107 137/109 +f 137/109 181/107 139/110 +f 139/110 181/107 141/111 +f 141/111 181/107 143/112 +f 143/112 181/107 145/113 +f 145/113 181/107 147/114 +f 147/114 181/107 149/115 +f 149/115 181/107 151/116 +f 151/116 181/107 153/117 +f 153/117 181/107 155/118 +f 155/118 181/107 157/119 +f 157/119 181/107 159/120 +f 159/120 181/107 161/121 +f 161/121 181/107 163/122 +f 163/122 181/107 133/106 +f 134/105 182/104 164/123 +f 164/123 182/104 162/124 +f 162/124 182/104 160/125 +f 160/125 182/104 158/126 +f 158/126 182/104 156/127 +f 156/127 182/104 154/128 +f 154/128 182/104 152/129 +f 152/129 182/104 150/130 +f 150/130 182/104 148/131 +f 148/131 182/104 146/132 +f 146/132 182/104 144/133 +f 144/133 182/104 142/134 +f 142/134 182/104 140/135 +f 140/135 182/104 138/136 +f 138/136 182/104 136/103 +f 173/137 223/2 224/3 174/138 +f 213/5 215/6 232/7 +f 211/8 213/5 232/7 +f 209/9 211/8 232/7 +f 207/10 209/9 232/7 +f 205/11 207/10 232/7 +f 203/12 205/11 232/7 +f 201/13 203/12 232/7 +f 199/14 201/13 232/7 +f 197/15 199/14 232/7 +f 195/16 197/15 232/7 +f 193/17 195/16 232/7 +f 191/18 193/17 232/7 +f 189/19 191/18 232/7 +f 187/20 189/19 232/7 +f 217/21 187/20 232/7 +f 188/22 218/23 231/24 +f 190/25 188/22 231/24 +f 192/26 190/25 231/24 +f 194/27 192/26 231/24 +f 196/28 194/27 231/24 +f 198/29 196/28 231/24 +f 200/30 198/29 231/24 +f 202/31 200/30 231/24 +f 204/32 202/31 231/24 +f 206/33 204/32 231/24 +f 208/34 206/33 231/24 +f 210/35 208/34 231/24 +f 212/36 210/35 231/24 +f 214/37 212/36 231/24 +f 216/38 214/37 231/24 +f 218/23 216/38 231/24 +f 215/6 217/21 232/7 +f 190/39 189/40 187/41 188/42 +f 188/42 187/41 217/43 218/44 +f 192/45 191/46 189/40 190/39 +f 194/47 193/48 191/46 192/45 +f 196/49 195/50 193/51 194/52 +f 198/53 197/54 195/50 196/49 +f 200/55 199/56 197/54 198/53 +f 202/57 201/58 199/56 200/55 +f 204/59 203/60 201/58 202/57 +f 206/61 205/62 203/60 204/59 +f 208/63 207/64 205/62 206/61 +f 210/65 209/66 207/64 208/63 +f 212/67 211/68 209/66 210/65 +f 214/69 213/70 211/68 212/67 +f 216/71 215/72 213/70 214/69 +f 218/44 217/43 215/72 216/71 +f 168/139 183/74 219/75 169/140 +f 166/141 185/78 184/79 167/142 +f 179/143 229/82 230/83 180/144 +f 165/145 186/86 185/78 166/141 +f 167/142 184/79 183/74 168/139 +f 180/144 230/83 186/86 165/145 +f 178/146 228/88 229/82 179/143 +f 177/147 227/90 228/88 178/146 +f 176/148 226/92 227/90 177/147 +f 175/149 225/94 226/92 176/148 +f 174/138 224/3 225/94 175/149 +f 172/150 222/96 223/2 173/137 +f 171/151 221/98 222/96 172/150 +f 170/152 220/100 221/98 171/151 +f 169/140 219/75 220/101 170/153 diff --git a/mods/pipeworks/models/pipeworks_pipe_9.obj b/mods/pipeworks/models/pipeworks_pipe_9.obj new file mode 100644 index 0000000..8c6e03b --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pipe_9.obj @@ -0,0 +1,759 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-5way.blend' +# www.blender.org +o Cube.000 +v -0.069446 -0.468750 0.103934 +v -0.103933 -0.468750 0.069446 +v -0.122598 -0.468750 0.024386 +v -0.122598 -0.468750 -0.024386 +v -0.129917 -0.500000 -0.086808 +v -0.129917 -0.468750 -0.086808 +v -0.086808 -0.500000 -0.129917 +v -0.086808 -0.468750 -0.129917 +v -0.030483 -0.500000 -0.153248 +v -0.030483 -0.468750 -0.153248 +v 0.030483 -0.500000 -0.153247 +v 0.030483 -0.468750 -0.153247 +v 0.086808 -0.500000 -0.129917 +v 0.086808 -0.468750 -0.129917 +v 0.129917 -0.500000 -0.086808 +v 0.129917 -0.468750 -0.086808 +v 0.153248 -0.500000 -0.030483 +v 0.153248 -0.468750 -0.030483 +v 0.153248 -0.500000 0.030483 +v 0.153248 -0.468750 0.030483 +v 0.129917 -0.500000 0.086808 +v 0.129917 -0.468750 0.086808 +v 0.086808 -0.500000 0.129917 +v 0.086808 -0.468750 0.129917 +v 0.030483 -0.500000 0.153248 +v 0.030483 -0.468750 0.153248 +v -0.030483 -0.500000 0.153248 +v -0.030483 -0.468750 0.153248 +v -0.086808 -0.500000 0.129917 +v -0.086808 -0.468750 0.129917 +v -0.129917 -0.500000 0.086808 +v -0.129917 -0.468750 0.086808 +v -0.153247 -0.500000 0.030483 +v -0.153248 -0.468750 0.030483 +v -0.153247 -0.500000 -0.030483 +v -0.153248 -0.468750 -0.030483 +v -0.024386 -0.468750 0.122598 +v 0.024386 -0.468750 0.122598 +v 0.069446 -0.468750 0.103934 +v 0.103934 -0.468750 0.069447 +v 0.122598 -0.468750 0.024387 +v 0.122598 -0.468750 -0.024386 +v 0.103934 -0.468750 -0.069446 +v 0.069447 -0.468750 -0.103933 +v 0.024386 -0.468750 -0.122598 +v -0.024386 -0.468750 -0.122598 +v -0.069446 -0.468750 -0.103933 +v -0.103934 -0.468750 -0.069446 +v 0.000000 -0.468750 0.000000 +v 0.000000 -0.500000 0.000000 +v 0.024386 -0.024391 0.122598 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 0.069446 +v 0.122598 -0.024391 0.024386 +v 0.122598 -0.024391 -0.024386 +v 0.103934 -0.024391 -0.069446 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v -0.024386 -0.024391 -0.122598 +v -0.103934 -0.024391 -0.069446 +v -0.069446 -0.024391 -0.103934 +v -0.103934 -0.024391 0.069446 +v -0.122598 -0.024391 0.024386 +v -0.122598 -0.024391 -0.024386 +v -0.069446 -0.024391 0.103934 +v -0.024386 -0.024391 0.122598 +v -0.153248 0.468750 -0.030483 +v -0.153248 0.500000 -0.030483 +v -0.153248 0.468750 0.030483 +v -0.153248 0.500000 0.030483 +v -0.129917 0.468750 0.086808 +v -0.129917 0.500000 0.086808 +v -0.086808 0.468750 0.129917 +v -0.086808 0.500000 0.129917 +v -0.030483 0.468750 0.153248 +v -0.030483 0.500000 0.153248 +v 0.030483 0.468750 0.153248 +v 0.030483 0.500000 0.153248 +v 0.086808 0.468750 0.129917 +v 0.086808 0.500000 0.129917 +v 0.129917 0.468750 0.086808 +v 0.129917 0.500000 0.086808 +v 0.153248 0.468750 0.030483 +v 0.153248 0.500000 0.030483 +v 0.153248 0.468750 -0.030483 +v 0.153248 0.500000 -0.030483 +v 0.129917 0.468750 -0.086808 +v 0.129917 0.500000 -0.086808 +v 0.086808 0.468750 -0.129917 +v 0.086808 0.500000 -0.129917 +v 0.030483 0.468750 -0.153248 +v 0.030483 0.500000 -0.153248 +v -0.030483 0.468750 -0.153248 +v -0.030483 0.500000 -0.153248 +v -0.086808 0.468750 -0.129917 +v -0.086808 0.500000 -0.129917 +v -0.129917 0.468750 -0.086808 +v -0.129917 0.500000 -0.086808 +v -0.122598 0.468750 -0.024386 +v -0.122598 0.468750 0.024386 +v -0.103934 0.468750 0.069446 +v -0.069446 0.468750 0.103934 +v -0.024386 0.468750 0.122598 +v 0.024386 0.468750 0.122598 +v 0.069446 0.468750 0.103934 +v 0.103934 0.468750 0.069446 +v 0.122598 0.468750 0.024386 +v 0.122598 0.468750 -0.024386 +v 0.103934 0.468750 -0.069446 +v 0.069446 0.468750 -0.103934 +v 0.024386 0.468750 -0.122598 +v -0.024386 0.468750 -0.122598 +v -0.069446 0.468750 -0.103934 +v -0.103934 0.468750 -0.069446 +v -0.000000 0.468750 0.000000 +v -0.000000 0.500000 -0.000000 +v 0.024386 0.024390 0.122598 +v 0.069446 0.024390 0.103934 +v 0.103934 0.024390 0.069446 +v 0.122598 0.024390 0.024386 +v 0.122598 0.024390 -0.024386 +v 0.103934 0.024390 -0.069446 +v 0.069446 0.024390 -0.103934 +v 0.024386 0.024389 -0.122598 +v -0.024386 0.024389 -0.122598 +v -0.103934 0.024390 -0.069446 +v -0.069446 0.024390 -0.103934 +v -0.103934 0.024390 0.069446 +v -0.122598 0.024390 0.024386 +v -0.122598 0.024390 -0.024386 +v -0.069446 0.024390 0.103934 +v -0.024386 0.024390 0.122598 +v -0.468750 -0.153248 -0.030483 +v -0.500000 -0.153248 -0.030483 +v -0.468750 -0.153248 0.030483 +v -0.500000 -0.153248 0.030483 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.030483 0.153248 +v -0.500000 -0.030483 0.153248 +v -0.468750 0.030483 0.153248 +v -0.500000 0.030483 0.153248 +v -0.468750 0.086808 0.129917 +v -0.500000 0.086808 0.129917 +v -0.468750 0.129917 0.086808 +v -0.500000 0.129917 0.086808 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153248 0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.030483 -0.153248 +v -0.500000 0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.122598 -0.024386 +v -0.468750 -0.122598 0.024386 +v -0.468750 -0.103934 0.069446 +v -0.468750 -0.069446 0.103934 +v -0.468750 -0.024386 0.122598 +v -0.468750 0.024386 0.122598 +v -0.468750 0.069446 0.103934 +v -0.468750 0.103934 0.069446 +v -0.468750 0.122598 0.024386 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.069446 -0.103934 +v -0.468750 0.024386 -0.122598 +v -0.468750 -0.024386 -0.122598 +v -0.468750 -0.069446 -0.103934 +v -0.468750 -0.103934 -0.069446 +v -0.468750 0.000000 -0.000000 +v -0.500000 -0.000000 -0.000000 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.103934 0.069447 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.122598 -0.024386 +v 0.500000 -0.129917 -0.086807 +v 0.468750 -0.129917 -0.086807 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.468750 -0.030483 -0.153247 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.153248 -0.030483 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.129917 0.086808 +v 0.468750 0.129917 0.086808 +v 0.500000 0.086808 0.129917 +v 0.468750 0.086808 0.129917 +v 0.500000 0.030483 0.153248 +v 0.468750 0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.086808 0.129917 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.153248 0.030483 +v 0.468750 -0.153248 0.030483 +v 0.500000 -0.153248 -0.030482 +v 0.468750 -0.153248 -0.030483 +v 0.468750 -0.024386 0.122598 +v 0.468750 0.024386 0.122598 +v 0.468750 0.069446 0.103934 +v 0.468750 0.103934 0.069447 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.069446 -0.103933 +v 0.468750 0.024386 -0.122598 +v 0.468750 -0.024386 -0.122598 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103934 -0.069446 +v 0.468750 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +v -0.069446 -0.103934 -0.468750 +v -0.103933 -0.069447 -0.468750 +v -0.122598 -0.024387 -0.468750 +v -0.122598 0.024386 -0.468750 +v -0.129917 0.086808 -0.500000 +v -0.129917 0.086808 -0.468750 +v -0.086807 0.129917 -0.500000 +v -0.086807 0.129917 -0.468750 +v -0.030482 0.153247 -0.500000 +v -0.030482 0.153247 -0.468750 +v 0.030483 0.153247 -0.500000 +v 0.030483 0.153247 -0.468750 +v 0.086808 0.129917 -0.500000 +v 0.086808 0.129917 -0.468750 +v 0.129918 0.086808 -0.500000 +v 0.129918 0.086808 -0.468750 +v 0.153248 0.030483 -0.500000 +v 0.153248 0.030483 -0.468750 +v 0.153248 -0.030483 -0.500000 +v 0.153248 -0.030483 -0.468750 +v 0.129918 -0.086808 -0.500000 +v 0.129918 -0.086808 -0.468750 +v 0.086808 -0.129917 -0.500000 +v 0.086808 -0.129917 -0.468750 +v 0.030483 -0.153248 -0.500000 +v 0.030483 -0.153248 -0.468750 +v -0.030482 -0.153248 -0.500000 +v -0.030482 -0.153248 -0.468750 +v -0.086807 -0.129917 -0.500000 +v -0.086807 -0.129917 -0.468750 +v -0.129917 -0.086808 -0.500000 +v -0.129917 -0.086808 -0.468750 +v -0.153247 -0.030483 -0.500000 +v -0.153247 -0.030483 -0.468750 +v -0.153247 0.030483 -0.500000 +v -0.153247 0.030483 -0.468750 +v -0.024386 -0.122598 -0.468750 +v 0.024387 -0.122598 -0.468750 +v 0.069447 -0.103934 -0.468750 +v 0.103934 -0.069447 -0.468750 +v 0.122599 -0.024387 -0.468750 +v 0.122599 0.024386 -0.468750 +v 0.103934 0.069446 -0.468750 +v 0.069447 0.103933 -0.468750 +v 0.024387 0.122598 -0.468750 +v -0.024386 0.122598 -0.468750 +v -0.069446 0.103933 -0.468750 +v -0.103933 0.069446 -0.468750 +v 0.000000 -0.000000 -0.468750 +v 0.000001 -0.000000 -0.500000 +v 0.024386 -0.122598 -0.024391 +v 0.069446 -0.103934 -0.024391 +v 0.103934 -0.069446 -0.024391 +v 0.122598 -0.024386 -0.024391 +v 0.122598 0.024386 -0.024391 +v 0.103934 0.069446 -0.024391 +v 0.069446 0.103934 -0.024391 +v 0.024386 0.122598 -0.024391 +v -0.024386 0.122598 -0.024391 +v -0.103934 0.069446 -0.024391 +v -0.069446 0.103934 -0.024391 +v -0.103934 -0.069446 -0.024391 +v -0.122598 -0.024386 -0.024391 +v -0.122598 0.024386 -0.024391 +v -0.069446 -0.103934 -0.024391 +v -0.024386 -0.122598 -0.024391 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.250000 0.015625 +vt 0.250000 0.265625 +vt 0.093322 0.682190 +vt 0.153370 0.657318 +vt 0.185867 0.820694 +vt 0.047364 0.728149 +vt 0.022491 0.788196 +vt 0.022491 0.853192 +vt 0.047364 0.913239 +vt 0.093322 0.959198 +vt 0.153370 0.984070 +vt 0.218365 0.984070 +vt 0.278413 0.959198 +vt 0.324371 0.913239 +vt 0.349244 0.853192 +vt 0.349244 0.788196 +vt 0.324371 0.728149 +vt 0.278413 0.682190 +vt 0.218365 0.657318 +vt 0.471785 0.682190 +vt 0.531832 0.657318 +vt 0.564330 0.820694 +vt 0.425826 0.728149 +vt 0.400953 0.788196 +vt 0.400953 0.853192 +vt 0.425826 0.913239 +vt 0.471785 0.959198 +vt 0.531832 0.984070 +vt 0.596827 0.984070 +vt 0.656875 0.959198 +vt 0.702834 0.913239 +vt 0.727706 0.853192 +vt 0.727706 0.788196 +vt 0.702834 0.728149 +vt 0.656875 0.682190 +vt 0.596827 0.657318 +vt 0.125000 0.609375 +vt 0.125000 0.546875 +vt 0.187500 0.546875 +vt 0.187500 0.609375 +vt 0.250000 0.546875 +vt 0.250000 0.609375 +vt 0.062500 0.609375 +vt 0.062500 0.546875 +vt 0.000000 0.609375 +vt 0.000000 0.546875 +vt 0.937500 0.609375 +vt 0.937500 0.546875 +vt 1.000000 0.546875 +vt 1.000000 0.609375 +vt 0.875000 0.609375 +vt 0.875000 0.546875 +vt 0.812500 0.609375 +vt 0.812500 0.546875 +vt 0.750000 0.609375 +vt 0.750000 0.546875 +vt 0.687500 0.609375 +vt 0.687500 0.546875 +vt 0.625000 0.609375 +vt 0.625000 0.546875 +vt 0.562500 0.609375 +vt 0.562500 0.546875 +vt 0.500000 0.609375 +vt 0.500000 0.546875 +vt 0.437500 0.609375 +vt 0.437500 0.546875 +vt 0.375000 0.609375 +vt 0.375000 0.546875 +vt 0.312500 0.609375 +vt 0.312500 0.546875 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.812500 0.015625 +vt 0.812500 0.265625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.625000 0.015625 +vt 0.625000 0.265625 +vt 0.687500 0.265625 +vt 0.687500 0.015625 +vt 0.500000 0.265625 +vt 0.500000 0.015625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.125000 0.265625 +vt 0.125000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.218363 0.657325 +vt 0.185866 0.820702 +vt 0.153368 0.657325 +vt 0.531836 0.657325 +vt 0.564334 0.820702 +vt 0.596832 0.657325 +vt 0.656879 0.682198 +vt 0.702838 0.728156 +vt 0.727710 0.788204 +vt 0.727710 0.853199 +vt 0.702838 0.913247 +vt 0.656879 0.959205 +vt 0.596831 0.984078 +vt 0.531836 0.984078 +vt 0.471788 0.959205 +vt 0.425830 0.913247 +vt 0.400957 0.853199 +vt 0.400957 0.788204 +vt 0.425830 0.728156 +vt 0.471789 0.682198 +vt 0.093321 0.682198 +vt 0.047362 0.728156 +vt 0.022489 0.788204 +vt 0.022489 0.853199 +vt 0.047362 0.913247 +vt 0.093320 0.959205 +vt 0.153368 0.984078 +vt 0.218363 0.984078 +vt 0.278411 0.959205 +vt 0.324369 0.913247 +vt 0.349242 0.853199 +vt 0.349242 0.788204 +vt 0.324369 0.728156 +vt 0.278411 0.682198 +vt 0.187500 0.515625 +vt 0.250000 0.515625 +vt 0.875000 0.515625 +vt 0.937500 0.515625 +vt 0.750000 0.515625 +vt 0.812500 0.515625 +vt 0.562500 0.515625 +vt 0.625000 0.515625 +vt 0.687500 0.515625 +vt 0.500000 0.515625 +vt 0.437500 0.515625 +vt 0.375000 0.515625 +vt 0.312500 0.515625 +vt 0.125000 0.515625 +vt 0.062500 0.515625 +vt 0.000000 0.515625 +vt 1.000000 0.515625 +s off +f 54/1 41/2 42/3 55/4 +f 31/5 33/6 50/7 +f 29/8 31/5 50/7 +f 27/9 29/8 50/7 +f 25/10 27/9 50/7 +f 23/11 25/10 50/7 +f 21/12 23/11 50/7 +f 19/13 21/12 50/7 +f 17/14 19/13 50/7 +f 15/15 17/14 50/7 +f 13/16 15/15 50/7 +f 11/17 13/16 50/7 +f 9/18 11/17 50/7 +f 7/19 9/18 50/7 +f 5/20 7/19 50/7 +f 35/21 5/20 50/7 +f 6/22 36/23 49/24 +f 8/25 6/22 49/24 +f 10/26 8/25 49/24 +f 12/27 10/26 49/24 +f 14/28 12/27 49/24 +f 16/29 14/28 49/24 +f 18/30 16/29 49/24 +f 20/31 18/30 49/24 +f 22/32 20/31 49/24 +f 24/33 22/32 49/24 +f 26/34 24/33 49/24 +f 28/35 26/34 49/24 +f 30/36 28/35 49/24 +f 32/37 30/36 49/24 +f 34/38 32/37 49/24 +f 36/23 34/38 49/24 +f 33/6 35/21 50/7 +f 8/39 7/40 5/41 6/42 +f 6/42 5/41 35/43 36/44 +f 10/45 9/46 7/40 8/39 +f 12/47 11/48 9/46 10/45 +f 14/49 13/50 11/51 12/52 +f 16/53 15/54 13/50 14/49 +f 18/55 17/56 15/54 16/53 +f 20/57 19/58 17/56 18/55 +f 22/59 21/60 19/58 20/57 +f 24/61 23/62 21/60 22/59 +f 26/63 25/64 23/62 24/61 +f 28/65 27/66 25/64 26/63 +f 30/67 29/68 27/66 28/65 +f 32/69 31/70 29/68 30/67 +f 34/71 33/72 31/70 32/69 +f 36/44 35/43 33/72 34/71 +f 65/73 1/74 37/75 66/76 +f 63/77 3/78 2/79 62/80 +f 61/81 47/82 48/83 60/84 +f 64/85 4/86 3/78 63/77 +f 62/80 2/79 1/74 65/73 +f 60/84 48/83 4/86 64/85 +f 59/87 46/88 47/82 61/81 +f 58/89 45/90 46/88 59/87 +f 57/91 44/92 45/90 58/89 +f 56/93 43/94 44/92 57/91 +f 55/4 42/3 43/94 56/93 +f 53/95 40/96 41/2 54/1 +f 52/97 39/98 40/96 53/95 +f 51/99 38/100 39/98 52/97 +f 66/76 37/75 38/101 51/102 +f 67/58 69/60 70/59 68/57 +f 69/60 71/62 72/61 70/59 +f 71/62 73/64 74/63 72/61 +f 73/64 75/66 76/65 74/63 +f 75/66 77/68 78/67 76/65 +f 77/68 79/70 80/69 78/67 +f 79/70 81/72 82/71 80/69 +f 81/72 83/43 84/44 82/71 +f 83/43 85/41 86/42 84/44 +f 85/41 87/40 88/39 86/42 +f 87/40 89/46 90/45 88/39 +f 89/46 91/48 92/47 90/45 +f 91/51 93/50 94/49 92/52 +f 93/50 95/54 96/53 94/49 +f 97/56 67/58 68/57 98/55 +f 95/54 97/56 98/55 96/53 +f 70/103 116/104 68/105 +f 67/106 115/107 69/108 +f 69/108 115/107 71/109 +f 71/109 115/107 73/110 +f 73/110 115/107 75/111 +f 75/111 115/107 77/112 +f 77/112 115/107 79/113 +f 79/113 115/107 81/114 +f 81/114 115/107 83/115 +f 83/115 115/107 85/116 +f 85/116 115/107 87/117 +f 87/117 115/107 89/118 +f 89/118 115/107 91/119 +f 91/119 115/107 93/120 +f 93/120 115/107 95/121 +f 95/121 115/107 97/122 +f 97/122 115/107 67/106 +f 68/105 116/104 98/123 +f 98/123 116/104 96/124 +f 96/124 116/104 94/125 +f 94/125 116/104 92/126 +f 92/126 116/104 90/127 +f 90/127 116/104 88/128 +f 88/128 116/104 86/129 +f 86/129 116/104 84/130 +f 84/130 116/104 82/131 +f 82/131 116/104 80/132 +f 80/132 116/104 78/133 +f 78/133 116/104 76/134 +f 76/134 116/104 74/135 +f 74/135 116/104 72/136 +f 72/136 116/104 70/103 +f 107/137 120/1 121/4 108/138 +f 102/139 131/73 132/76 103/140 +f 100/141 129/77 128/80 101/142 +f 113/143 127/81 126/84 114/144 +f 99/145 130/85 129/77 100/141 +f 101/142 128/80 131/73 102/139 +f 114/144 126/84 130/85 99/145 +f 112/146 125/87 127/81 113/143 +f 111/147 124/89 125/87 112/146 +f 110/148 123/91 124/89 111/147 +f 109/149 122/93 123/91 110/148 +f 108/138 121/4 122/93 109/149 +f 106/150 119/95 120/1 107/137 +f 105/151 118/97 119/95 106/150 +f 104/152 117/99 118/97 105/151 +f 103/140 132/76 117/102 104/153 +f 133/58 135/60 136/59 134/57 +f 135/60 137/62 138/61 136/59 +f 137/62 139/64 140/63 138/61 +f 139/64 141/66 142/65 140/63 +f 141/66 143/68 144/67 142/65 +f 143/68 145/70 146/69 144/67 +f 145/70 147/72 148/71 146/69 +f 147/72 149/43 150/44 148/71 +f 149/43 151/41 152/42 150/44 +f 151/41 153/40 154/39 152/42 +f 153/40 155/46 156/45 154/39 +f 155/46 157/48 158/47 156/45 +f 157/51 159/50 160/49 158/52 +f 159/50 161/54 162/53 160/49 +f 163/56 133/58 134/57 164/55 +f 161/54 163/56 164/55 162/53 +f 136/103 182/104 134/105 +f 133/106 181/107 135/108 +f 135/108 181/107 137/109 +f 137/109 181/107 139/110 +f 139/110 181/107 141/111 +f 141/111 181/107 143/112 +f 143/112 181/107 145/113 +f 145/113 181/107 147/114 +f 147/114 181/107 149/115 +f 149/115 181/107 151/116 +f 151/116 181/107 153/117 +f 153/117 181/107 155/118 +f 155/118 181/107 157/119 +f 157/119 181/107 159/120 +f 159/120 181/107 161/121 +f 161/121 181/107 163/122 +f 163/122 181/107 133/106 +f 134/105 182/104 164/123 +f 164/123 182/104 162/124 +f 162/124 182/104 160/125 +f 160/125 182/104 158/126 +f 158/126 182/104 156/127 +f 156/127 182/104 154/128 +f 154/128 182/104 152/129 +f 152/129 182/104 150/130 +f 150/130 182/104 148/131 +f 148/131 182/104 146/132 +f 146/132 182/104 144/133 +f 144/133 182/104 142/134 +f 142/134 182/104 140/135 +f 140/135 182/104 138/136 +f 138/136 182/104 136/103 +f 173/137 223/2 224/3 174/138 +f 213/5 215/6 232/7 +f 211/8 213/5 232/7 +f 209/9 211/8 232/7 +f 207/10 209/9 232/7 +f 205/11 207/10 232/7 +f 203/12 205/11 232/7 +f 201/13 203/12 232/7 +f 199/14 201/13 232/7 +f 197/15 199/14 232/7 +f 195/16 197/15 232/7 +f 193/17 195/16 232/7 +f 191/18 193/17 232/7 +f 189/19 191/18 232/7 +f 187/20 189/19 232/7 +f 217/21 187/20 232/7 +f 188/22 218/23 231/24 +f 190/25 188/22 231/24 +f 192/26 190/25 231/24 +f 194/27 192/26 231/24 +f 196/28 194/27 231/24 +f 198/29 196/28 231/24 +f 200/30 198/29 231/24 +f 202/31 200/30 231/24 +f 204/32 202/31 231/24 +f 206/33 204/32 231/24 +f 208/34 206/33 231/24 +f 210/35 208/34 231/24 +f 212/36 210/35 231/24 +f 214/37 212/36 231/24 +f 216/38 214/37 231/24 +f 218/23 216/38 231/24 +f 215/6 217/21 232/7 +f 190/39 189/40 187/41 188/42 +f 188/42 187/41 217/43 218/44 +f 192/45 191/46 189/40 190/39 +f 194/47 193/48 191/46 192/45 +f 196/49 195/50 193/51 194/52 +f 198/53 197/54 195/50 196/49 +f 200/55 199/56 197/54 198/53 +f 202/57 201/58 199/56 200/55 +f 204/59 203/60 201/58 202/57 +f 206/61 205/62 203/60 204/59 +f 208/63 207/64 205/62 206/61 +f 210/65 209/66 207/64 208/63 +f 212/67 211/68 209/66 210/65 +f 214/69 213/70 211/68 212/67 +f 216/71 215/72 213/70 214/69 +f 218/44 217/43 215/72 216/71 +f 168/139 183/74 219/75 169/140 +f 166/141 185/78 184/79 167/142 +f 179/143 229/82 230/83 180/144 +f 165/145 186/86 185/78 166/141 +f 167/142 184/79 183/74 168/139 +f 180/144 230/83 186/86 165/145 +f 178/146 228/88 229/82 179/143 +f 177/147 227/90 228/88 178/146 +f 176/148 226/92 227/90 177/147 +f 175/149 225/94 226/92 176/148 +f 174/138 224/3 225/94 175/149 +f 172/150 222/96 223/2 173/137 +f 171/151 221/98 222/96 172/150 +f 170/152 220/100 221/98 171/151 +f 169/140 219/75 220/101 170/153 +f 286/1 273/2 274/3 287/4 +f 263/5 265/6 282/7 +f 261/8 263/5 282/7 +f 259/9 261/8 282/7 +f 257/10 259/9 282/7 +f 255/11 257/10 282/7 +f 253/12 255/11 282/7 +f 251/13 253/12 282/7 +f 249/14 251/13 282/7 +f 247/15 249/14 282/7 +f 245/16 247/15 282/7 +f 243/17 245/16 282/7 +f 241/18 243/17 282/7 +f 239/19 241/18 282/7 +f 237/20 239/19 282/7 +f 267/21 237/20 282/7 +f 238/22 268/23 281/24 +f 240/25 238/22 281/24 +f 242/26 240/25 281/24 +f 244/27 242/26 281/24 +f 246/28 244/27 281/24 +f 248/29 246/28 281/24 +f 250/30 248/29 281/24 +f 252/31 250/30 281/24 +f 254/32 252/31 281/24 +f 256/33 254/32 281/24 +f 258/34 256/33 281/24 +f 260/35 258/34 281/24 +f 262/36 260/35 281/24 +f 264/37 262/36 281/24 +f 266/38 264/37 281/24 +f 268/23 266/38 281/24 +f 265/6 267/21 282/7 +f 240/39 239/40 237/41 238/42 +f 238/42 237/41 267/43 268/44 +f 242/45 241/46 239/40 240/39 +f 244/47 243/48 241/46 242/45 +f 246/49 245/50 243/51 244/52 +f 248/53 247/54 245/50 246/49 +f 250/55 249/56 247/54 248/53 +f 252/57 251/58 249/56 250/55 +f 254/59 253/60 251/58 252/57 +f 256/61 255/62 253/60 254/59 +f 258/63 257/64 255/62 256/61 +f 260/65 259/66 257/64 258/63 +f 262/67 261/68 259/66 260/65 +f 264/69 263/70 261/68 262/67 +f 266/71 265/72 263/70 264/69 +f 268/44 267/43 265/72 266/71 +f 297/73 233/74 269/75 298/76 +f 295/77 235/78 234/79 294/80 +f 293/81 279/82 280/83 292/84 +f 296/85 236/86 235/78 295/77 +f 294/80 234/79 233/74 297/73 +f 292/84 280/83 236/86 296/85 +f 291/87 278/88 279/82 293/81 +f 290/89 277/90 278/88 291/87 +f 289/91 276/92 277/90 290/89 +f 288/93 275/94 276/92 289/91 +f 287/4 274/3 275/94 288/93 +f 285/95 272/96 273/2 286/1 +f 284/97 271/98 272/96 285/95 +f 283/99 270/100 271/98 284/97 +f 298/76 269/75 270/101 283/102 diff --git a/mods/pipeworks/models/pipeworks_pump.obj b/mods/pipeworks/models/pipeworks_pump.obj new file mode 100644 index 0000000..f05dd02 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_pump.obj @@ -0,0 +1,282 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-pump.blend' +# www.blender.org +mtllib pipeworks_pump.mtl +o Cube +v -0.500000 -0.500000 0.500000 +v -0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 -0.500000 +v 0.500000 -0.500000 0.500000 +v -0.500000 -0.375000 0.500000 +v -0.500000 -0.375000 -0.500000 +v 0.500000 -0.375000 -0.500000 +v 0.500000 -0.375000 0.500000 +v -0.437500 -0.375000 0.437500 +v -0.437500 -0.375000 -0.437500 +v 0.437500 -0.375000 -0.437500 +v 0.437500 -0.375000 0.437500 +v -0.437500 0.375000 0.437500 +v -0.437500 0.375000 -0.437500 +v 0.437500 0.375000 -0.437500 +v 0.437500 0.375000 0.437500 +v 0.153248 0.468750 0.030483 +v 0.153248 0.500000 0.030483 +v 0.153248 0.468750 -0.030483 +v 0.153248 0.500000 -0.030483 +v 0.129917 0.468750 -0.086808 +v 0.129917 0.500000 -0.086808 +v 0.086808 0.468750 -0.129917 +v 0.086808 0.500000 -0.129917 +v 0.030483 0.468750 -0.153248 +v 0.030483 0.500000 -0.153248 +v -0.030483 0.468750 -0.153248 +v -0.030483 0.500000 -0.153248 +v -0.086808 0.468750 -0.129917 +v -0.086808 0.500000 -0.129917 +v -0.129917 0.468750 -0.086808 +v -0.129917 0.500000 -0.086808 +v -0.153247 0.468750 -0.030483 +v -0.153247 0.500000 -0.030483 +v -0.153247 0.468750 0.030483 +v -0.153247 0.500000 0.030483 +v -0.129917 0.468750 0.086808 +v -0.129917 0.500000 0.086808 +v -0.086808 0.468750 0.129917 +v -0.086808 0.500000 0.129917 +v -0.030483 0.468750 0.153248 +v -0.030483 0.500000 0.153248 +v 0.030483 0.468750 0.153248 +v 0.030483 0.500000 0.153248 +v 0.086808 0.468750 0.129917 +v 0.086808 0.500000 0.129917 +v 0.129917 0.468750 0.086808 +v 0.129918 0.500000 0.086808 +v 0.122598 0.468750 0.024386 +v 0.122598 0.468750 -0.024386 +v 0.103934 0.468750 -0.069446 +v 0.069447 0.468750 -0.103934 +v 0.024387 0.468750 -0.122598 +v -0.024386 0.468750 -0.122598 +v -0.069446 0.468750 -0.103934 +v -0.103933 0.468750 -0.069446 +v -0.122598 0.468750 -0.024386 +v -0.122598 0.468750 0.024386 +v -0.103933 0.468750 0.069446 +v -0.069446 0.468750 0.103934 +v -0.024386 0.468750 0.122598 +v 0.024387 0.468750 0.122598 +v 0.069447 0.468750 0.103934 +v 0.103934 0.468750 0.069446 +v 0.000000 0.468750 -0.000000 +v 0.000000 0.500000 0.000000 +v 0.122598 0.375003 0.024386 +v 0.122598 0.375003 -0.024386 +v 0.103934 0.375003 -0.069446 +v 0.069446 0.375003 0.103934 +v 0.103934 0.375003 0.069446 +v 0.024386 0.375003 0.122598 +v -0.024386 0.375003 0.122598 +v -0.069446 0.375003 0.103934 +v -0.103934 0.375003 0.069446 +v -0.122598 0.375003 0.024386 +v -0.122598 0.375003 -0.024386 +v -0.103934 0.375003 -0.069446 +v -0.069446 0.375003 -0.103934 +v -0.024386 0.375003 -0.122598 +v 0.069446 0.375003 -0.103934 +v 0.024386 0.375003 -0.122598 +vt 0.714844 0.761719 +vt 0.714844 0.511719 +vt 0.746094 0.511719 +vt 0.746094 0.761719 +vt 0.621094 0.761719 +vt 0.621094 0.511719 +vt 0.652344 0.511719 +vt 0.652344 0.761719 +vt 0.683594 0.761719 +vt 0.683594 0.511719 +vt 0.996094 0.511719 +vt 0.996094 0.761719 +vt 0.996094 0.261719 +vt 0.746094 0.261719 +vt 0.230469 0.261719 +vt 0.449219 0.261719 +vt 0.449219 0.433594 +vt 0.230469 0.433594 +vt 0.222656 0.613281 +vt 0.003906 0.613281 +vt 0.003906 0.441406 +vt 0.222656 0.441406 +vt 0.222656 0.433594 +vt 0.003906 0.433594 +vt 0.003906 0.261719 +vt 0.222656 0.261719 +vt 0.675781 0.433594 +vt 0.457031 0.433594 +vt 0.457031 0.261719 +vt 0.675781 0.261719 +vt 0.230469 0.660156 +vt 0.230469 0.441406 +vt 0.449219 0.441406 +vt 0.449219 0.660156 +vt 0.750000 0.996094 +vt 0.812500 0.996094 +vt 0.812500 0.945313 +vt 0.750000 0.945313 +vt 0.875000 0.996094 +vt 0.875000 0.945313 +vt 0.937500 0.996094 +vt 0.937500 0.945313 +vt 1.000000 0.996094 +vt 1.000000 0.945313 +vt 0.000000 0.996094 +vt 0.062500 0.996094 +vt 0.062500 0.945313 +vt 0.000000 0.945313 +vt 0.125000 0.996094 +vt 0.125000 0.945313 +vt 0.187500 0.996094 +vt 0.187500 0.945313 +vt 0.250000 0.996094 +vt 0.250000 0.945313 +vt 0.312500 0.996094 +vt 0.312500 0.945313 +vt 0.375000 0.996094 +vt 0.375000 0.945313 +vt 0.437500 0.996094 +vt 0.437500 0.945313 +vt 0.500000 0.996094 +vt 0.500000 0.945313 +vt 0.562500 0.996094 +vt 0.562500 0.945313 +vt 0.625000 0.996094 +vt 0.625000 0.945313 +vt 0.687500 0.996094 +vt 0.687500 0.945313 +vt 0.007550 0.738767 +vt 0.046892 0.730976 +vt 0.007550 0.723186 +vt 0.101275 0.738767 +vt 0.140617 0.730976 +vt 0.101275 0.723186 +vt 0.107265 0.708790 +vt 0.118332 0.697773 +vt 0.132792 0.691810 +vt 0.148443 0.691810 +vt 0.162903 0.697773 +vt 0.173970 0.708790 +vt 0.179959 0.723186 +vt 0.179959 0.738767 +vt 0.173970 0.753163 +vt 0.162903 0.764180 +vt 0.148443 0.770143 +vt 0.132792 0.770143 +vt 0.118332 0.764180 +vt 0.107265 0.753163 +vt 0.013540 0.708790 +vt 0.024607 0.697773 +vt 0.039067 0.691810 +vt 0.054718 0.691810 +vt 0.069178 0.697773 +vt 0.080245 0.708790 +vt 0.086234 0.723186 +vt 0.086234 0.738767 +vt 0.080245 0.753162 +vt 0.069178 0.764180 +vt 0.054718 0.770143 +vt 0.039067 0.770143 +vt 0.024607 0.764180 +vt 0.013540 0.753162 +vt 0.250000 0.777344 +vt 0.312500 0.777344 +vt 0.937500 0.777344 +vt 1.000000 0.777344 +vt 0.812500 0.777344 +vt 0.875000 0.777344 +vt 0.625000 0.777344 +vt 0.687500 0.777344 +vt 0.750000 0.777344 +vt 0.562500 0.777344 +vt 0.500000 0.777344 +vt 0.437500 0.777344 +vt 0.375000 0.777344 +vt 0.187500 0.777344 +vt 0.125000 0.777344 +vt 0.062500 0.777344 +vt 0.000000 0.777344 +usemtl None +s off +f 5/1 6/2 2/3 1/4 +f 6/5 7/6 3/7 2/8 +f 7/9 8/10 4/2 3/1 +f 8/10 5/9 1/8 4/7 +f 1/4 2/3 3/11 4/12 +f 8/13 7/11 6/3 5/14 +f 13/15 14/16 10/17 9/18 +f 14/19 15/20 11/21 10/22 +f 15/23 16/24 12/25 11/26 +f 16/27 13/28 9/29 12/30 +f 16/31 15/32 14/33 13/34 +f 17/35 19/36 20/37 18/38 +f 19/36 21/39 22/40 20/37 +f 21/39 23/41 24/42 22/40 +f 23/41 25/43 26/44 24/42 +f 25/45 27/46 28/47 26/48 +f 27/46 29/49 30/50 28/47 +f 29/49 31/51 32/52 30/50 +f 31/51 33/53 34/54 32/52 +f 33/53 35/55 36/56 34/54 +f 35/55 37/57 38/58 36/56 +f 37/57 39/59 40/60 38/58 +f 39/59 41/61 42/62 40/60 +f 41/61 43/63 44/64 42/62 +f 43/63 45/65 46/66 44/64 +f 47/67 17/35 18/38 48/68 +f 45/65 47/67 48/68 46/66 +f 20/69 66/70 18/71 +f 17/72 65/73 19/74 +f 19/74 65/73 21/75 +f 21/75 65/73 23/76 +f 23/76 65/73 25/77 +f 25/77 65/73 27/78 +f 27/78 65/73 29/79 +f 29/79 65/73 31/80 +f 31/80 65/73 33/81 +f 33/81 65/73 35/82 +f 35/82 65/73 37/83 +f 37/83 65/73 39/84 +f 39/84 65/73 41/85 +f 41/85 65/73 43/86 +f 43/86 65/73 45/87 +f 45/87 65/73 47/88 +f 47/88 65/73 17/72 +f 18/71 66/70 48/89 +f 48/89 66/70 46/90 +f 46/90 66/70 44/91 +f 44/91 66/70 42/92 +f 42/92 66/70 40/93 +f 40/93 66/70 38/94 +f 38/94 66/70 36/95 +f 36/95 66/70 34/96 +f 34/96 66/70 32/97 +f 32/97 66/70 30/98 +f 30/98 66/70 28/99 +f 28/99 66/70 26/100 +f 26/100 66/70 24/101 +f 24/101 66/70 22/102 +f 22/102 66/70 20/69 +f 57/54 77/103 76/104 58/56 +f 52/42 81/105 82/106 53/44 +f 50/37 68/107 69/108 51/40 +f 63/66 70/109 71/110 64/68 +f 49/38 67/111 68/107 50/37 +f 51/40 69/108 81/105 52/42 +f 64/68 71/110 67/111 49/38 +f 62/64 72/112 70/109 63/66 +f 61/62 73/113 72/112 62/64 +f 60/60 74/114 73/113 61/62 +f 59/58 75/115 74/114 60/60 +f 58/56 76/104 75/115 59/58 +f 56/52 78/116 77/103 57/54 +f 55/50 79/117 78/116 56/52 +f 54/47 80/118 79/117 55/50 +f 53/48 82/119 80/118 54/47 diff --git a/mods/pipeworks/models/pipeworks_spigot.obj b/mods/pipeworks/models/pipeworks_spigot.obj new file mode 100644 index 0000000..f6e80c9 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_spigot.obj @@ -0,0 +1,512 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-spigot.blend' +# www.blender.org +mtllib pipeworks_spigot.mtl +o pipe.000_Cylinder.001 +v -0.122598 -0.024391 -0.024386 +v -0.122598 -0.024391 0.024386 +v 0.129917 -0.250000 -0.086808 +v 0.153247 -0.250000 -0.030483 +v -0.000000 -0.250000 -0.000000 +v 0.086808 -0.250000 -0.129917 +v 0.030483 -0.250000 -0.153248 +v -0.030483 -0.250000 -0.153248 +v -0.086808 -0.250000 -0.129917 +v -0.129917 -0.250000 -0.086808 +v -0.153248 -0.250000 -0.030483 +v -0.153248 -0.250000 0.030483 +v -0.129917 -0.250000 0.086808 +v -0.086808 -0.250000 0.129917 +v -0.030483 -0.250000 0.153247 +v 0.030483 -0.250000 0.153248 +v 0.086808 -0.250000 0.129917 +v 0.129917 -0.250000 0.086808 +v 0.153247 -0.250000 0.030483 +v 0.129917 -0.187500 0.086808 +v 0.153248 -0.187500 0.030483 +v -0.000000 -0.187500 -0.000000 +v 0.086808 -0.187500 0.129917 +v 0.030483 -0.187500 0.153248 +v -0.030483 -0.187500 0.153247 +v -0.086808 -0.187500 0.129917 +v -0.129917 -0.187500 0.086808 +v -0.153248 -0.187500 0.030483 +v -0.153248 -0.187500 -0.030483 +v -0.129917 -0.187500 -0.086808 +v -0.086808 -0.187500 -0.129917 +v -0.030483 -0.187500 -0.153248 +v 0.030483 -0.187500 -0.153248 +v 0.086808 -0.187500 -0.129917 +v 0.129917 -0.187500 -0.086808 +v 0.153248 -0.187500 -0.030483 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v 0.122598 -0.024391 -0.024386 +v 0.103934 -0.024391 -0.069446 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 0.069446 +v 0.122598 -0.024391 0.024386 +v 0.024386 -0.024391 0.122598 +v -0.024386 -0.024391 0.122598 +v -0.069446 -0.024391 0.103934 +v -0.103934 -0.024391 0.069446 +v -0.103934 -0.024391 -0.069446 +v -0.069446 -0.024391 -0.103934 +v -0.024386 -0.024391 -0.122598 +v -0.103934 0.041589 -0.041924 +v 0.103934 0.041589 -0.041925 +v 0.122598 0.009727 -0.010062 +v 0.024386 0.079173 -0.079509 +v 0.069446 0.065976 -0.066311 +v 0.069446 0.094826 -0.024663 +v -0.103934 0.062964 -0.011464 +v -0.069446 0.094827 -0.024662 +v -0.024386 0.112070 -0.031805 +v 0.024386 0.112070 -0.031805 +v 0.122598 0.021334 0.005779 +v 0.103934 0.062964 -0.011464 +v -0.122598 0.021334 0.005780 +v -0.024386 0.079173 -0.079509 +v -0.069446 0.065976 -0.066311 +v -0.122599 -0.024387 0.468750 +v -0.122599 0.024386 0.468750 +v -0.122598 0.024386 0.024391 +v 0.129917 -0.086808 0.500000 +v 0.153247 -0.030483 0.500000 +v -0.000001 0.000000 0.500000 +v 0.086807 -0.129917 0.500000 +v 0.030482 -0.153248 0.500000 +v -0.030483 -0.153248 0.500000 +v -0.086808 -0.129917 0.500000 +v -0.129918 -0.086808 0.500000 +v -0.153248 -0.030483 0.500000 +v -0.153248 0.030483 0.500000 +v -0.129918 0.086808 0.500000 +v -0.086808 0.129917 0.500000 +v -0.030483 0.153247 0.500000 +v 0.030482 0.153247 0.500000 +v 0.086807 0.129917 0.500000 +v 0.129917 0.086808 0.500000 +v 0.153247 0.030483 0.500000 +v 0.129917 0.086808 0.468750 +v 0.153247 0.030483 0.468750 +v 0.000000 0.000000 0.468750 +v 0.086807 0.129917 0.468750 +v 0.030482 0.153247 0.468750 +v -0.030483 0.153247 0.468750 +v -0.086808 0.129917 0.468750 +v -0.129918 0.086808 0.468750 +v -0.153248 0.030483 0.468750 +v -0.153248 -0.030483 0.468750 +v -0.129918 -0.086808 0.468750 +v -0.086808 -0.129917 0.468750 +v -0.030483 -0.153248 0.468750 +v 0.030482 -0.153248 0.468750 +v 0.086807 -0.129917 0.468750 +v 0.129917 -0.086808 0.468750 +v 0.153247 -0.030483 0.468750 +v 0.069446 -0.103934 0.024391 +v 0.069446 -0.103934 0.468750 +v 0.024386 -0.122598 0.468750 +v 0.024386 -0.122598 0.024391 +v 0.122598 -0.024387 0.468750 +v 0.103933 -0.069447 0.468750 +v 0.103934 -0.069446 0.024391 +v 0.069446 0.103933 0.468750 +v 0.103933 0.069446 0.468750 +v 0.103934 0.069446 0.024391 +v 0.122598 0.024386 0.024391 +v 0.122598 0.024386 0.468750 +v 0.024386 0.122598 0.024391 +v 0.024386 0.122598 0.468750 +v -0.024386 0.122598 0.024391 +v -0.024387 0.122598 0.468750 +v -0.069446 0.103934 0.024391 +v -0.069447 0.103933 0.468750 +v -0.103934 0.069446 0.024391 +v -0.103934 0.069446 0.468750 +v -0.103934 -0.069446 0.024391 +v -0.103934 -0.069447 0.468750 +v -0.069446 -0.103934 0.024391 +v -0.069447 -0.103934 0.468750 +v -0.024386 -0.122598 0.024391 +v -0.024387 -0.122598 0.468750 +v 0.069446 0.103934 0.024390 +v -0.122598 -0.005780 -0.020763 +v -0.024386 0.031804 -0.111499 +v -0.069446 0.024662 -0.094256 +v -0.103934 0.011464 -0.062393 +v 0.103934 0.011464 -0.062393 +v 0.122598 -0.005780 -0.020763 +v 0.024386 0.031804 -0.111499 +v 0.069446 0.024662 -0.094256 +v -0.122598 0.009727 -0.010062 +v -0.122598 -0.246570 0.024386 +v -0.103934 -0.246570 0.069446 +v -0.069447 -0.246570 0.103934 +v -0.122598 -0.246570 -0.024386 +v 0.069446 -0.246571 0.103933 +v 0.122598 -0.246571 0.024386 +v 0.103934 -0.246571 0.069446 +v 0.103933 -0.246571 -0.069446 +v -0.024386 -0.246570 0.122598 +v 0.122598 -0.246571 -0.024386 +v -0.024386 -0.246571 -0.122598 +v 0.024386 -0.246571 -0.122598 +v 0.069446 -0.246571 -0.103934 +v -0.103934 -0.246570 -0.069446 +v -0.069446 -0.246570 -0.103934 +v 0.024386 -0.246570 0.122598 +vt 0.139725 0.682190 +vt 0.199773 0.657318 +vt 0.232270 0.820694 +vt 0.093767 0.728149 +vt 0.068894 0.788196 +vt 0.068894 0.853192 +vt 0.093767 0.913239 +vt 0.139725 0.959198 +vt 0.199773 0.984070 +vt 0.264768 0.984070 +vt 0.324816 0.959198 +vt 0.370774 0.913239 +vt 0.395647 0.853192 +vt 0.395647 0.788196 +vt 0.370774 0.728149 +vt 0.324816 0.682190 +vt 0.264768 0.657318 +vt 0.487410 0.682190 +vt 0.547457 0.657318 +vt 0.579955 0.820694 +vt 0.441451 0.728149 +vt 0.416578 0.788196 +vt 0.416578 0.853192 +vt 0.441451 0.913239 +vt 0.487410 0.959198 +vt 0.547457 0.984070 +vt 0.612452 0.984070 +vt 0.672500 0.959198 +vt 0.718459 0.913239 +vt 0.743331 0.853192 +vt 0.743331 0.788196 +vt 0.718459 0.728149 +vt 0.672500 0.682190 +vt 0.612452 0.657318 +vt 0.125000 0.640625 +vt 0.125000 0.578125 +vt 0.187500 0.578125 +vt 0.187500 0.640625 +vt 0.250000 0.578125 +vt 0.250000 0.640625 +vt 0.062500 0.640625 +vt 0.062500 0.578125 +vt 0.000000 0.640625 +vt 0.000000 0.578125 +vt 0.937500 0.640625 +vt 0.937500 0.578125 +vt 1.000000 0.578125 +vt 1.000000 0.640625 +vt 0.875000 0.640625 +vt 0.875000 0.578125 +vt 0.812500 0.640625 +vt 0.812500 0.578125 +vt 0.750000 0.640625 +vt 0.750000 0.578125 +vt 0.687500 0.640625 +vt 0.687500 0.578125 +vt 0.625000 0.640625 +vt 0.625000 0.578125 +vt 0.562500 0.640625 +vt 0.562500 0.578125 +vt 0.500000 0.640625 +vt 0.500000 0.578125 +vt 0.437500 0.640625 +vt 0.437500 0.578125 +vt 0.375000 0.640625 +vt 0.375000 0.578125 +vt 0.312500 0.640625 +vt 0.312500 0.578125 +vt 0.187500 0.453125 +vt 0.125000 0.453125 +vt 0.139892 0.682190 +vt 0.199940 0.657318 +vt 0.232437 0.820694 +vt 0.093934 0.728149 +vt 0.069061 0.788196 +vt 0.069061 0.853192 +vt 0.093934 0.913239 +vt 0.139892 0.959198 +vt 0.199940 0.984070 +vt 0.264935 0.984070 +vt 0.324983 0.959198 +vt 0.370941 0.913239 +vt 0.395814 0.853192 +vt 0.395814 0.788196 +vt 0.370941 0.728149 +vt 0.324983 0.682190 +vt 0.264935 0.657318 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.812500 0.265625 +vt 0.812500 0.015625 +vt 0.625000 0.265625 +vt 0.625000 0.015625 +vt 0.687500 0.015625 +vt 0.687500 0.265625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.500000 0.015625 +vt 0.500000 0.265625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.250000 0.265625 +vt 0.250000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.125000 0.015625 +vt 0.125000 0.265625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.000000 0.999989 +vt 0.000000 0.890943 +vt 0.041611 0.899043 +vt 0.941956 0.794823 +vt 0.941956 0.841698 +vt 0.895081 0.841698 +vt 0.895081 0.794823 +vt 0.848206 0.841698 +vt 0.848206 0.794823 +vt 0.801331 0.794823 +vt 0.801331 0.841698 +vt 0.754456 0.841698 +vt 0.754456 0.794823 +vt 0.988831 0.794823 +vt 0.988831 0.841698 +vt 0.941956 0.701073 +vt 0.941956 0.747948 +vt 0.895081 0.747948 +vt 0.895081 0.701073 +vt 0.041611 0.741571 +vt 0.000000 0.749671 +vt 0.076282 0.717645 +vt 0.102233 0.682226 +vt 0.109057 0.640614 +vt 0.754456 0.747948 +vt 0.801331 0.747948 +vt 0.848206 0.747948 +vt 0.848206 0.701073 +vt 0.941956 0.888573 +vt 0.988831 0.888573 +vt 0.895081 0.888573 +vt 0.848206 0.888573 +vt 0.076282 0.922969 +vt 0.102233 0.958388 +vt 0.109057 1.000000 +vt 0.801331 0.888573 +vt 0.754456 0.888573 +vt 0.801331 0.935448 +vt 0.754456 0.935448 +vt 0.754456 0.982323 +vt 0.801331 0.982323 +vt 0.848206 0.935448 +vt 0.848206 0.982323 +vt 0.895081 0.935448 +vt 0.895081 0.982323 +vt 0.941956 0.935448 +vt 0.941956 0.982323 +vt 0.988831 0.982323 +vt 0.988831 0.935448 +vt 0.801331 0.701073 +vt 0.754456 0.701073 +vt 0.250000 0.453125 +vt 0.875000 0.453125 +vt 0.937500 0.453125 +vt 0.750000 0.453125 +vt 0.812500 0.453125 +vt 0.562500 0.453125 +vt 0.625000 0.453125 +vt 0.687500 0.453125 +vt 0.500000 0.453125 +vt 0.437500 0.453125 +vt 0.375000 0.453125 +vt 0.312500 0.453125 +vt 0.062500 0.453125 +vt 0.000000 0.453125 +vt 1.000000 0.453125 +g pipe.000_Cylinder.001_metal +usemtl metal +s off +f 3/1 4/2 5/3 +f 6/4 3/1 5/3 +f 7/5 6/4 5/3 +f 8/6 7/5 5/3 +f 9/7 8/6 5/3 +f 10/8 9/7 5/3 +f 11/9 10/8 5/3 +f 12/10 11/9 5/3 +f 13/11 12/10 5/3 +f 14/12 13/11 5/3 +f 15/13 14/12 5/3 +f 16/14 15/13 5/3 +f 17/15 16/14 5/3 +f 18/16 17/15 5/3 +f 19/17 18/16 5/3 +f 20/18 21/19 22/20 +f 23/21 20/18 22/20 +f 24/22 23/21 22/20 +f 25/23 24/22 22/20 +f 26/24 25/23 22/20 +f 27/25 26/24 22/20 +f 28/26 27/25 22/20 +f 29/27 28/26 22/20 +f 30/28 29/27 22/20 +f 31/29 30/28 22/20 +f 32/30 31/29 22/20 +f 33/31 32/30 22/20 +f 34/32 33/31 22/20 +f 35/33 34/32 22/20 +f 36/34 35/33 22/20 +f 21/19 36/34 22/20 +f 4/2 19/17 5/3 +f 23/35 17/36 18/37 20/38 +f 20/38 18/37 19/39 21/40 +f 24/41 16/42 17/36 23/35 +f 25/43 15/44 16/42 24/41 +f 26/45 14/46 15/47 25/48 +f 27/49 13/50 14/46 26/45 +f 28/51 12/52 13/50 27/49 +f 29/53 11/54 12/52 28/51 +f 30/55 10/56 11/54 29/53 +f 31/57 9/58 10/56 30/55 +f 32/59 8/60 9/58 31/57 +f 33/61 7/62 8/60 32/59 +f 34/63 6/64 7/62 33/61 +f 35/65 3/66 6/64 34/63 +f 36/67 4/68 3/66 35/65 +f 21/40 19/39 4/68 36/67 +f 142/69 1/37 48/36 152/70 +f 69/71 70/72 71/73 +f 72/74 69/71 71/73 +f 73/75 72/74 71/73 +f 74/76 73/75 71/73 +f 75/77 74/76 71/73 +f 76/78 75/77 71/73 +f 77/79 76/78 71/73 +f 78/80 77/79 71/73 +f 79/81 78/80 71/73 +f 80/82 79/81 71/73 +f 81/83 80/82 71/73 +f 82/84 81/83 71/73 +f 83/85 82/84 71/73 +f 84/86 83/85 71/73 +f 85/87 84/86 71/73 +f 86/18 87/19 88/20 +f 89/21 86/18 88/20 +f 90/22 89/21 88/20 +f 91/23 90/22 88/20 +f 92/24 91/23 88/20 +f 93/25 92/24 88/20 +f 94/26 93/25 88/20 +f 95/27 94/26 88/20 +f 96/28 95/27 88/20 +f 97/29 96/28 88/20 +f 98/30 97/29 88/20 +f 99/31 98/30 88/20 +f 100/32 99/31 88/20 +f 101/33 100/32 88/20 +f 102/34 101/33 88/20 +f 87/19 102/34 88/20 +f 70/72 85/87 71/73 +f 89/35 83/36 84/37 86/38 +f 86/38 84/37 85/39 87/40 +f 90/41 82/42 83/36 89/35 +f 91/43 81/44 82/42 90/41 +f 92/45 80/46 81/47 91/48 +f 93/49 79/50 80/46 92/45 +f 94/51 78/52 79/50 93/49 +f 95/53 77/54 78/52 94/51 +f 96/55 76/56 77/54 95/53 +f 97/57 75/58 76/56 96/55 +f 98/59 74/60 75/58 97/57 +f 99/61 73/62 74/60 98/59 +f 100/63 72/64 73/62 99/61 +f 101/65 69/66 72/64 100/63 +f 102/67 70/68 69/66 101/65 +f 87/40 85/39 70/68 102/67 +f 103/88 104/89 105/90 106/91 +f 109/92 108/93 104/89 103/88 +f 112/94 111/95 114/96 113/97 +f 117/98 118/99 116/100 115/101 +f 119/102 120/103 118/99 117/98 +f 121/104 122/105 120/103 119/102 +f 68/106 67/107 122/105 121/104 +f 125/108 126/109 124/110 123/111 +f 127/112 128/113 126/109 125/108 +f 106/91 105/90 128/114 127/115 +f 2/116 66/117 67/107 68/106 +f 43/118 107/119 108/93 109/92 +f 129/120 110/121 111/95 112/94 +f 113/97 114/96 107/119 43/118 +f 115/101 116/100 110/121 129/120 +f 123/111 124/110 66/117 2/116 +f 43/122 39/123 135/124 +f 50/125 131/126 136/127 38/128 +f 38/128 136/127 137/129 37/130 +f 40/131 37/130 137/129 134/132 +f 40/131 134/132 135/133 39/134 +f 50/125 49/135 132/136 131/126 +f 49/137 48/138 133/139 132/140 +f 48/138 1/125 130/128 133/139 +f 2/43 130/141 1/142 +f 2/43 138/143 130/141 +f 2/43 63/144 138/143 +f 63/144 2/43 68/145 +f 121/146 57/147 63/131 68/134 +f 57/147 51/148 138/130 63/131 +f 133/139 130/128 138/130 51/148 +f 65/149 132/140 133/139 51/148 +f 64/150 131/126 132/136 65/151 +f 64/150 54/152 136/127 131/126 +f 54/152 55/153 137/129 136/127 +f 43/122 135/124 53/154 +f 43/122 53/154 61/155 +f 61/155 113/156 43/122 +f 134/132 52/157 53/158 135/133 +f 62/159 61/160 53/158 52/157 +f 52/157 134/132 137/129 55/153 +f 113/161 61/160 62/159 112/162 +f 62/159 52/157 55/153 56/163 +f 62/159 56/163 129/164 112/162 +f 60/165 56/163 55/153 54/152 +f 60/165 115/166 129/164 56/163 +f 64/150 59/167 60/165 54/152 +f 117/168 115/166 60/165 59/167 +f 119/169 117/168 59/167 58/170 +f 59/167 64/150 65/151 58/170 +f 58/171 65/149 51/148 57/147 +f 121/146 119/172 58/171 57/147 +f 1/37 142/69 139/173 2/39 +f 37/50 151/174 150/175 38/46 +f 39/54 148/176 146/177 40/52 +f 41/60 143/178 145/179 42/58 +f 43/56 144/180 148/176 39/54 +f 40/52 146/177 151/174 37/50 +f 42/58 145/179 144/180 43/56 +f 44/62 154/181 143/178 41/60 +f 45/64 147/182 154/181 44/62 +f 46/66 141/183 147/182 45/64 +f 47/68 140/184 141/183 46/66 +f 2/39 139/173 140/184 47/68 +f 49/42 153/185 152/70 48/36 +f 50/44 149/186 153/185 49/42 +f 38/46 150/175 149/187 50/47 diff --git a/mods/pipeworks/models/pipeworks_spigot_pouring.obj b/mods/pipeworks/models/pipeworks_spigot_pouring.obj new file mode 100644 index 0000000..50f653c --- /dev/null +++ b/mods/pipeworks/models/pipeworks_spigot_pouring.obj @@ -0,0 +1,634 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-spigot-pouring.blend' +# www.blender.org +mtllib pipeworks_spigot_pouring.mtl +o pipe.001_Cylinder.000 +v -0.094401 -0.559070 0.018777 +v -0.080029 -0.559070 0.053473 +v -0.053474 -0.559070 0.080029 +v -0.094401 -0.559070 -0.018778 +v 0.053473 -0.559070 0.080029 +v 0.094400 -0.559070 0.018777 +v 0.080029 -0.559070 0.053473 +v 0.080029 -0.559071 -0.053474 +v -0.018777 -0.559070 0.094400 +v 0.094400 -0.559071 -0.018777 +v -0.018777 -0.559071 -0.094401 +v 0.018777 -0.559071 -0.094401 +v 0.053473 -0.559071 -0.080029 +v -0.080029 -0.559070 -0.053474 +v -0.053474 -0.559070 -0.080029 +v 0.018777 -0.559070 0.094400 +v -0.000000 -0.559070 -0.000000 +v -0.094401 -0.243141 0.018777 +v -0.080029 -0.243141 0.053473 +v -0.053474 -0.243141 0.080029 +v -0.094401 -0.243141 -0.018778 +v 0.053473 -0.243141 0.080029 +v 0.094400 -0.243141 0.018777 +v 0.080029 -0.243141 0.053473 +v 0.080029 -0.243141 -0.053474 +v -0.018777 -0.243141 0.094400 +v 0.094400 -0.243141 -0.018777 +v -0.018777 -0.243141 -0.094401 +v 0.018777 -0.243141 -0.094401 +v 0.053473 -0.243141 -0.080029 +v -0.080029 -0.243141 -0.053474 +v -0.053474 -0.243141 -0.080029 +v 0.018777 -0.243141 0.094400 +vt 0.499995 0.000000 +vt 0.374998 0.000000 +vt 0.375003 1.000000 +vt 0.500001 1.000000 +vt 0.249999 0.000000 +vt 0.250003 1.000000 +vt 0.124999 0.000000 +vt 0.125002 1.000000 +vt 0.874999 0.000000 +vt 0.750001 0.000000 +vt 0.750000 1.000000 +vt 0.874999 1.000000 +vt 0.625002 0.000000 +vt 0.624999 1.000000 +vt 0.500003 0.000000 +vt 0.499998 1.000000 +vt 0.375006 0.000000 +vt 0.375000 1.000000 +vt 0.250008 0.000000 +vt 0.250001 1.000000 +vt 0.125008 0.000000 +vt 0.000010 0.000000 +vt 0.000000 1.000000 +vt 0.125000 1.000000 +vt 0.749993 0.000000 +vt 0.624993 0.000000 +vt 0.625001 1.000000 +vt 0.750002 1.000000 +vt 0.999987 0.000000 +vt 0.874991 0.000000 +vt 0.875002 1.000000 +vt 1.000000 1.000000 +vt 0.999997 0.000000 +vt 0.999998 1.000000 +vt 0.000003 1.000000 +vt 0.000002 0.000000 +vt 0.000000 0.400543 +vt 0.076119 0.216772 +vt 0.500000 0.500000 +vt 0.216773 0.076119 +vt 0.400545 0.000000 +vt 0.599455 0.000000 +vt 0.783226 0.076119 +vt 0.923879 0.216773 +vt 1.000000 0.400544 +vt 1.000000 0.599455 +vt 0.923881 0.783226 +vt 0.783227 0.923879 +vt 0.599455 1.000000 +vt 0.400545 1.000000 +vt 0.216772 0.923879 +vt 0.076119 0.783227 +vt 0.000000 0.599455 +g pipe.001_Cylinder.000_water +usemtl water +s off +f 12/1 11/2 28/3 29/4 +f 11/2 15/5 32/6 28/3 +f 15/5 14/7 31/8 32/6 +f 1/9 2/10 19/11 18/12 +f 2/10 3/13 20/14 19/11 +f 3/13 9/15 26/16 20/14 +f 9/15 16/17 33/18 26/16 +f 16/17 5/19 22/20 33/18 +f 7/21 6/22 23/23 24/24 +f 8/25 13/26 30/27 25/28 +f 6/29 10/30 27/31 23/32 +f 5/19 7/21 24/24 22/20 +f 10/30 8/25 25/28 27/31 +f 13/26 12/1 29/4 30/27 +f 4/33 1/9 18/12 21/34 +f 21/35 31/8 14/7 4/36 +f 4/37 14/38 17/39 +f 14/38 15/40 17/39 +f 15/40 11/41 17/39 +f 11/41 12/42 17/39 +f 12/42 13/43 17/39 +f 13/43 8/44 17/39 +f 8/44 10/45 17/39 +f 10/45 6/46 17/39 +f 6/46 7/47 17/39 +f 7/47 5/48 17/39 +f 5/48 16/49 17/39 +f 16/49 9/50 17/39 +f 9/50 3/51 17/39 +f 3/51 2/52 17/39 +f 2/52 1/53 17/39 +f 1/53 4/37 17/39 +o pipe.000_Cylinder.001 +v -0.122598 -0.024391 -0.024386 +v -0.122598 -0.024391 0.024386 +v 0.129917 -0.250000 -0.086808 +v 0.153247 -0.250000 -0.030483 +v -0.000000 -0.250000 -0.000000 +v 0.086808 -0.250000 -0.129917 +v 0.030483 -0.250000 -0.153248 +v -0.030483 -0.250000 -0.153248 +v -0.086808 -0.250000 -0.129917 +v -0.129917 -0.250000 -0.086808 +v -0.153248 -0.250000 -0.030483 +v -0.153248 -0.250000 0.030483 +v -0.129917 -0.250000 0.086808 +v -0.086808 -0.250000 0.129917 +v -0.030483 -0.250000 0.153247 +v 0.030483 -0.250000 0.153248 +v 0.086808 -0.250000 0.129917 +v 0.129917 -0.250000 0.086808 +v 0.153247 -0.250000 0.030483 +v 0.129917 -0.187500 0.086808 +v 0.153248 -0.187500 0.030483 +v -0.000000 -0.187500 -0.000000 +v 0.086808 -0.187500 0.129917 +v 0.030483 -0.187500 0.153248 +v -0.030483 -0.187500 0.153247 +v -0.086808 -0.187500 0.129917 +v -0.129917 -0.187500 0.086808 +v -0.153248 -0.187500 0.030483 +v -0.153248 -0.187500 -0.030483 +v -0.129917 -0.187500 -0.086808 +v -0.086808 -0.187500 -0.129917 +v -0.030483 -0.187500 -0.153248 +v 0.030483 -0.187500 -0.153248 +v 0.086808 -0.187500 -0.129917 +v 0.129917 -0.187500 -0.086808 +v 0.153248 -0.187500 -0.030483 +v 0.069446 -0.024391 -0.103934 +v 0.024386 -0.024391 -0.122598 +v 0.122598 -0.024391 -0.024386 +v 0.103934 -0.024391 -0.069446 +v 0.069446 -0.024391 0.103934 +v 0.103934 -0.024391 0.069446 +v 0.122598 -0.024391 0.024386 +v 0.024386 -0.024391 0.122598 +v -0.024386 -0.024391 0.122598 +v -0.069446 -0.024391 0.103934 +v -0.103934 -0.024391 0.069446 +v -0.103934 -0.024391 -0.069446 +v -0.069446 -0.024391 -0.103934 +v -0.024386 -0.024391 -0.122598 +v -0.103934 0.041589 -0.041924 +v 0.103934 0.041589 -0.041925 +v 0.122598 0.009727 -0.010062 +v 0.024386 0.079173 -0.079509 +v 0.069446 0.065976 -0.066311 +v 0.069446 0.094826 -0.024663 +v -0.103934 0.062964 -0.011464 +v -0.069446 0.094827 -0.024662 +v -0.024386 0.112070 -0.031805 +v 0.024386 0.112070 -0.031805 +v 0.122598 0.021334 0.005779 +v 0.103934 0.062964 -0.011464 +v -0.122598 0.021334 0.005780 +v -0.024386 0.079173 -0.079509 +v -0.069446 0.065976 -0.066311 +v -0.122599 -0.024387 0.468750 +v -0.122599 0.024386 0.468750 +v -0.122598 0.024386 0.024391 +v 0.129917 -0.086808 0.500000 +v 0.153247 -0.030483 0.500000 +v -0.000001 0.000000 0.500000 +v 0.086807 -0.129917 0.500000 +v 0.030482 -0.153248 0.500000 +v -0.030483 -0.153248 0.500000 +v -0.086808 -0.129917 0.500000 +v -0.129918 -0.086808 0.500000 +v -0.153248 -0.030483 0.500000 +v -0.153248 0.030483 0.500000 +v -0.129918 0.086808 0.500000 +v -0.086808 0.129917 0.500000 +v -0.030483 0.153247 0.500000 +v 0.030482 0.153247 0.500000 +v 0.086807 0.129917 0.500000 +v 0.129917 0.086808 0.500000 +v 0.153247 0.030483 0.500000 +v 0.129917 0.086808 0.468750 +v 0.153247 0.030483 0.468750 +v 0.000000 0.000000 0.468750 +v 0.086807 0.129917 0.468750 +v 0.030482 0.153247 0.468750 +v -0.030483 0.153247 0.468750 +v -0.086808 0.129917 0.468750 +v -0.129918 0.086808 0.468750 +v -0.153248 0.030483 0.468750 +v -0.153248 -0.030483 0.468750 +v -0.129918 -0.086808 0.468750 +v -0.086808 -0.129917 0.468750 +v -0.030483 -0.153248 0.468750 +v 0.030482 -0.153248 0.468750 +v 0.086807 -0.129917 0.468750 +v 0.129917 -0.086808 0.468750 +v 0.153247 -0.030483 0.468750 +v 0.069446 -0.103934 0.024391 +v 0.069446 -0.103934 0.468750 +v 0.024386 -0.122598 0.468750 +v 0.024386 -0.122598 0.024391 +v 0.122598 -0.024387 0.468750 +v 0.103933 -0.069447 0.468750 +v 0.103934 -0.069446 0.024391 +v 0.069446 0.103933 0.468750 +v 0.103933 0.069446 0.468750 +v 0.103934 0.069446 0.024391 +v 0.122598 0.024386 0.024391 +v 0.122598 0.024386 0.468750 +v 0.024386 0.122598 0.024391 +v 0.024386 0.122598 0.468750 +v -0.024386 0.122598 0.024391 +v -0.024387 0.122598 0.468750 +v -0.069446 0.103934 0.024391 +v -0.069447 0.103933 0.468750 +v -0.103934 0.069446 0.024391 +v -0.103934 0.069446 0.468750 +v -0.103934 -0.069446 0.024391 +v -0.103934 -0.069447 0.468750 +v -0.069446 -0.103934 0.024391 +v -0.069447 -0.103934 0.468750 +v -0.024386 -0.122598 0.024391 +v -0.024387 -0.122598 0.468750 +v 0.069446 0.103934 0.024390 +v -0.122598 -0.005780 -0.020763 +v -0.024386 0.031804 -0.111499 +v -0.069446 0.024662 -0.094256 +v -0.103934 0.011464 -0.062393 +v 0.103934 0.011464 -0.062393 +v 0.122598 -0.005780 -0.020763 +v 0.024386 0.031804 -0.111499 +v 0.069446 0.024662 -0.094256 +v -0.122598 0.009727 -0.010062 +v -0.122598 -0.246570 0.024386 +v -0.103934 -0.246570 0.069446 +v -0.069447 -0.246570 0.103934 +v -0.122598 -0.246570 -0.024386 +v 0.069446 -0.246571 0.103933 +v 0.122598 -0.246571 0.024386 +v 0.103934 -0.246571 0.069446 +v 0.103933 -0.246571 -0.069446 +v -0.024386 -0.246570 0.122598 +v 0.122598 -0.246571 -0.024386 +v -0.024386 -0.246571 -0.122598 +v 0.024386 -0.246571 -0.122598 +v 0.069446 -0.246571 -0.103934 +v -0.103934 -0.246570 -0.069446 +v -0.069446 -0.246570 -0.103934 +v 0.024386 -0.246570 0.122598 +vt 0.139725 0.682190 +vt 0.199773 0.657318 +vt 0.232270 0.820694 +vt 0.093767 0.728149 +vt 0.068894 0.788196 +vt 0.068894 0.853192 +vt 0.093767 0.913239 +vt 0.139725 0.959198 +vt 0.199773 0.984070 +vt 0.264768 0.984070 +vt 0.324816 0.959198 +vt 0.370774 0.913239 +vt 0.395647 0.853192 +vt 0.395647 0.788196 +vt 0.370774 0.728149 +vt 0.324816 0.682190 +vt 0.264768 0.657318 +vt 0.487410 0.682190 +vt 0.547457 0.657318 +vt 0.579955 0.820694 +vt 0.441451 0.728149 +vt 0.416578 0.788196 +vt 0.416578 0.853192 +vt 0.441451 0.913239 +vt 0.487410 0.959198 +vt 0.547457 0.984070 +vt 0.612452 0.984070 +vt 0.672500 0.959198 +vt 0.718459 0.913239 +vt 0.743331 0.853192 +vt 0.743331 0.788196 +vt 0.718459 0.728149 +vt 0.672500 0.682190 +vt 0.612452 0.657318 +vt 0.125000 0.640625 +vt 0.125000 0.578125 +vt 0.187500 0.578125 +vt 0.187500 0.640625 +vt 0.250000 0.578125 +vt 0.250000 0.640625 +vt 0.062500 0.640625 +vt 0.062500 0.578125 +vt 0.000000 0.640625 +vt 0.000000 0.578125 +vt 0.937500 0.640625 +vt 0.937500 0.578125 +vt 1.000000 0.578125 +vt 1.000000 0.640625 +vt 0.875000 0.640625 +vt 0.875000 0.578125 +vt 0.812500 0.640625 +vt 0.812500 0.578125 +vt 0.750000 0.640625 +vt 0.750000 0.578125 +vt 0.687500 0.640625 +vt 0.687500 0.578125 +vt 0.625000 0.640625 +vt 0.625000 0.578125 +vt 0.562500 0.640625 +vt 0.562500 0.578125 +vt 0.500000 0.640625 +vt 0.500000 0.578125 +vt 0.437500 0.640625 +vt 0.437500 0.578125 +vt 0.375000 0.640625 +vt 0.375000 0.578125 +vt 0.312500 0.640625 +vt 0.312500 0.578125 +vt 0.187500 0.453125 +vt 0.125000 0.453125 +vt 0.139892 0.682190 +vt 0.199940 0.657318 +vt 0.232437 0.820694 +vt 0.093934 0.728149 +vt 0.069061 0.788196 +vt 0.069061 0.853192 +vt 0.093934 0.913239 +vt 0.139892 0.959198 +vt 0.199940 0.984070 +vt 0.264935 0.984070 +vt 0.324983 0.959198 +vt 0.370941 0.913239 +vt 0.395814 0.853192 +vt 0.395814 0.788196 +vt 0.370941 0.728149 +vt 0.324983 0.682190 +vt 0.264935 0.657318 +vt 0.875000 0.265625 +vt 0.875000 0.015625 +vt 0.937500 0.015625 +vt 0.937500 0.265625 +vt 0.812500 0.265625 +vt 0.812500 0.015625 +vt 0.625000 0.265625 +vt 0.625000 0.015625 +vt 0.687500 0.015625 +vt 0.687500 0.265625 +vt 0.437500 0.265625 +vt 0.437500 0.015625 +vt 0.500000 0.015625 +vt 0.500000 0.265625 +vt 0.375000 0.265625 +vt 0.375000 0.015625 +vt 0.312500 0.265625 +vt 0.312500 0.015625 +vt 0.250000 0.265625 +vt 0.250000 0.015625 +vt 0.062500 0.265625 +vt 0.062500 0.015625 +vt 0.125000 0.015625 +vt 0.125000 0.265625 +vt 0.000000 0.265625 +vt 0.000000 0.015625 +vt 1.000000 0.015625 +vt 1.000000 0.265625 +vt 0.187500 0.265625 +vt 0.187500 0.015625 +vt 0.750000 0.265625 +vt 0.750000 0.015625 +vt 0.562500 0.265625 +vt 0.562500 0.015625 +vt 0.000000 0.999989 +vt 0.000000 0.890943 +vt 0.041611 0.899043 +vt 0.941956 0.794823 +vt 0.941956 0.841698 +vt 0.895081 0.841698 +vt 0.895081 0.794823 +vt 0.848206 0.841698 +vt 0.848206 0.794823 +vt 0.801331 0.794823 +vt 0.801331 0.841698 +vt 0.754456 0.841698 +vt 0.754456 0.794823 +vt 0.988831 0.794823 +vt 0.988831 0.841698 +vt 0.941956 0.701073 +vt 0.941956 0.747948 +vt 0.895081 0.747948 +vt 0.895081 0.701073 +vt 0.041611 0.741571 +vt 0.000000 0.749671 +vt 0.076282 0.717645 +vt 0.102233 0.682226 +vt 0.109057 0.640614 +vt 0.754456 0.747948 +vt 0.801331 0.747948 +vt 0.848206 0.747948 +vt 0.848206 0.701073 +vt 0.941956 0.888573 +vt 0.988831 0.888573 +vt 0.895081 0.888573 +vt 0.848206 0.888573 +vt 0.076282 0.922969 +vt 0.102233 0.958388 +vt 0.109057 1.000000 +vt 0.801331 0.888573 +vt 0.754456 0.888573 +vt 0.801331 0.935448 +vt 0.754456 0.935448 +vt 0.754456 0.982323 +vt 0.801331 0.982323 +vt 0.848206 0.935448 +vt 0.848206 0.982323 +vt 0.895081 0.935448 +vt 0.895081 0.982323 +vt 0.941956 0.935448 +vt 0.941956 0.982323 +vt 0.988831 0.982323 +vt 0.988831 0.935448 +vt 0.801331 0.701073 +vt 0.754456 0.701073 +vt 0.250000 0.453125 +vt 0.875000 0.453125 +vt 0.937500 0.453125 +vt 0.750000 0.453125 +vt 0.812500 0.453125 +vt 0.562500 0.453125 +vt 0.625000 0.453125 +vt 0.687500 0.453125 +vt 0.500000 0.453125 +vt 0.437500 0.453125 +vt 0.375000 0.453125 +vt 0.312500 0.453125 +vt 0.062500 0.453125 +vt 0.000000 0.453125 +vt 1.000000 0.453125 +g pipe.000_Cylinder.001_metal +usemtl metal +s off +f 36/54 37/55 38/56 +f 39/57 36/54 38/56 +f 40/58 39/57 38/56 +f 41/59 40/58 38/56 +f 42/60 41/59 38/56 +f 43/61 42/60 38/56 +f 44/62 43/61 38/56 +f 45/63 44/62 38/56 +f 46/64 45/63 38/56 +f 47/65 46/64 38/56 +f 48/66 47/65 38/56 +f 49/67 48/66 38/56 +f 50/68 49/67 38/56 +f 51/69 50/68 38/56 +f 52/70 51/69 38/56 +f 53/71 54/72 55/73 +f 56/74 53/71 55/73 +f 57/75 56/74 55/73 +f 58/76 57/75 55/73 +f 59/77 58/76 55/73 +f 60/78 59/77 55/73 +f 61/79 60/78 55/73 +f 62/80 61/79 55/73 +f 63/81 62/80 55/73 +f 64/82 63/81 55/73 +f 65/83 64/82 55/73 +f 66/84 65/83 55/73 +f 67/85 66/84 55/73 +f 68/86 67/85 55/73 +f 69/87 68/86 55/73 +f 54/72 69/87 55/73 +f 37/55 52/70 38/56 +f 56/88 50/89 51/90 53/91 +f 53/91 51/90 52/92 54/93 +f 57/94 49/95 50/89 56/88 +f 58/96 48/97 49/95 57/94 +f 59/98 47/99 48/100 58/101 +f 60/102 46/103 47/99 59/98 +f 61/104 45/105 46/103 60/102 +f 62/106 44/107 45/105 61/104 +f 63/108 43/109 44/107 62/106 +f 64/110 42/111 43/109 63/108 +f 65/112 41/113 42/111 64/110 +f 66/114 40/115 41/113 65/112 +f 67/116 39/117 40/115 66/114 +f 68/118 36/119 39/117 67/116 +f 69/120 37/121 36/119 68/118 +f 54/93 52/92 37/121 69/120 +f 175/122 34/90 81/89 185/123 +f 102/124 103/125 104/126 +f 105/127 102/124 104/126 +f 106/128 105/127 104/126 +f 107/129 106/128 104/126 +f 108/130 107/129 104/126 +f 109/131 108/130 104/126 +f 110/132 109/131 104/126 +f 111/133 110/132 104/126 +f 112/134 111/133 104/126 +f 113/135 112/134 104/126 +f 114/136 113/135 104/126 +f 115/137 114/136 104/126 +f 116/138 115/137 104/126 +f 117/139 116/138 104/126 +f 118/140 117/139 104/126 +f 119/71 120/72 121/73 +f 122/74 119/71 121/73 +f 123/75 122/74 121/73 +f 124/76 123/75 121/73 +f 125/77 124/76 121/73 +f 126/78 125/77 121/73 +f 127/79 126/78 121/73 +f 128/80 127/79 121/73 +f 129/81 128/80 121/73 +f 130/82 129/81 121/73 +f 131/83 130/82 121/73 +f 132/84 131/83 121/73 +f 133/85 132/84 121/73 +f 134/86 133/85 121/73 +f 135/87 134/86 121/73 +f 120/72 135/87 121/73 +f 103/125 118/140 104/126 +f 122/88 116/89 117/90 119/91 +f 119/91 117/90 118/92 120/93 +f 123/94 115/95 116/89 122/88 +f 124/96 114/97 115/95 123/94 +f 125/98 113/99 114/100 124/101 +f 126/102 112/103 113/99 125/98 +f 127/104 111/105 112/103 126/102 +f 128/106 110/107 111/105 127/104 +f 129/108 109/109 110/107 128/106 +f 130/110 108/111 109/109 129/108 +f 131/112 107/113 108/111 130/110 +f 132/114 106/115 107/113 131/112 +f 133/116 105/117 106/115 132/114 +f 134/118 102/119 105/117 133/116 +f 135/120 103/121 102/119 134/118 +f 120/93 118/92 103/121 135/120 +f 136/141 137/142 138/143 139/144 +f 142/145 141/146 137/142 136/141 +f 145/147 144/148 147/149 146/150 +f 150/151 151/152 149/153 148/154 +f 152/155 153/156 151/152 150/151 +f 154/157 155/158 153/156 152/155 +f 101/159 100/160 155/158 154/157 +f 158/161 159/162 157/163 156/164 +f 160/165 161/166 159/162 158/161 +f 139/144 138/143 161/167 160/168 +f 35/169 99/170 100/160 101/159 +f 76/171 140/172 141/146 142/145 +f 162/173 143/174 144/148 145/147 +f 146/150 147/149 140/172 76/171 +f 148/154 149/153 143/174 162/173 +f 156/164 157/163 99/170 35/169 +f 76/175 72/176 168/177 +f 83/178 164/179 169/180 71/181 +f 71/181 169/180 170/182 70/183 +f 73/184 70/183 170/182 167/185 +f 73/184 167/185 168/186 72/187 +f 83/178 82/188 165/189 164/179 +f 82/190 81/191 166/192 165/193 +f 81/191 34/178 163/181 166/192 +f 35/96 163/194 34/195 +f 35/96 171/196 163/194 +f 35/96 96/197 171/196 +f 96/197 35/96 101/198 +f 154/199 90/200 96/184 101/187 +f 90/200 84/201 171/183 96/184 +f 166/192 163/181 171/183 84/201 +f 98/202 165/193 166/192 84/201 +f 97/203 164/179 165/189 98/204 +f 97/203 87/205 169/180 164/179 +f 87/205 88/206 170/182 169/180 +f 76/175 168/177 86/207 +f 76/175 86/207 94/208 +f 94/208 146/209 76/175 +f 167/185 85/210 86/211 168/186 +f 95/212 94/213 86/211 85/210 +f 85/210 167/185 170/182 88/206 +f 146/214 94/213 95/212 145/215 +f 95/212 85/210 88/206 89/216 +f 95/212 89/216 162/217 145/215 +f 93/218 89/216 88/206 87/205 +f 93/218 148/219 162/217 89/216 +f 97/203 92/220 93/218 87/205 +f 150/221 148/219 93/218 92/220 +f 152/222 150/221 92/220 91/223 +f 92/220 97/203 98/204 91/223 +f 91/224 98/202 84/201 90/200 +f 154/199 152/225 91/224 90/200 +f 34/90 175/122 172/226 35/92 +f 70/103 184/227 183/228 71/99 +f 72/107 181/229 179/230 73/105 +f 74/113 176/231 178/232 75/111 +f 76/109 177/233 181/229 72/107 +f 73/105 179/230 184/227 70/103 +f 75/111 178/232 177/233 76/109 +f 77/115 187/234 176/231 74/113 +f 78/117 180/235 187/234 77/115 +f 79/119 174/236 180/235 78/117 +f 80/121 173/237 174/236 79/119 +f 35/92 172/226 173/237 80/121 +f 82/95 186/238 185/123 81/89 +f 83/97 182/239 186/238 82/95 +f 71/99 183/228 182/240 83/100 diff --git a/mods/pipeworks/models/pipeworks_valve_off.obj b/mods/pipeworks/models/pipeworks_valve_off.obj new file mode 100644 index 0000000..c5f71be --- /dev/null +++ b/mods/pipeworks/models/pipeworks_valve_off.obj @@ -0,0 +1,458 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-valve-off.blend' +# www.blender.org +mtllib pipeworks_valve_off.mtl +o Cube.003 +v 0.062500 0.281250 -0.312500 +v 0.062500 0.281250 0.093750 +v -0.062500 0.281250 0.093750 +v -0.062500 0.281250 -0.312500 +v 0.062500 0.343750 -0.312500 +v 0.062500 0.343750 0.093750 +v -0.062500 0.343750 0.093750 +v -0.062500 0.343750 -0.312500 +v 0.031250 0.250000 -0.031250 +v 0.031250 0.250000 0.031250 +v -0.031250 0.250000 0.031250 +v -0.031250 0.250000 -0.031250 +v 0.031250 0.281250 -0.031250 +v 0.031250 0.281250 0.031250 +v -0.031250 0.281250 0.031250 +v -0.031250 0.281250 -0.031250 +v 0.250000 -0.250000 -0.250000 +v 0.250000 -0.250000 0.250000 +v -0.250000 -0.250000 0.250000 +v -0.250000 -0.250000 -0.250000 +v 0.250000 0.250000 -0.250000 +v 0.250000 0.250000 0.250000 +v -0.250000 0.250000 0.250000 +v -0.250000 0.250000 -0.250000 +v -0.468750 -0.153248 -0.030483 +v -0.500000 -0.153248 -0.030483 +v -0.468750 -0.153248 0.030483 +v -0.500000 -0.153248 0.030483 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.030483 0.153248 +v -0.500000 -0.030483 0.153248 +v -0.468750 0.030483 0.153248 +v -0.500000 0.030483 0.153248 +v -0.468750 0.086808 0.129917 +v -0.500000 0.086808 0.129917 +v -0.468750 0.129917 0.086808 +v -0.500000 0.129917 0.086808 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153247 0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.030483 -0.153248 +v -0.500000 0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.122598 -0.024386 +v -0.468750 -0.122598 0.024386 +v -0.468750 -0.103934 0.069446 +v -0.468750 -0.069446 0.103934 +v -0.468750 -0.024386 0.122598 +v -0.468750 0.024386 0.122598 +v -0.468750 0.069446 0.103934 +v -0.468750 0.103934 0.069446 +v -0.468750 0.122598 0.024386 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.069446 -0.103934 +v -0.468750 0.024386 -0.122598 +v -0.468750 -0.024387 -0.122598 +v -0.468750 -0.069447 -0.103934 +v -0.468750 -0.103934 -0.069446 +v -0.468750 -0.000000 -0.000000 +v -0.500000 -0.000000 -0.000000 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.103933 0.069447 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.122598 -0.024386 +v 0.500000 -0.129917 -0.086807 +v 0.468750 -0.129917 -0.086807 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.468750 -0.030483 -0.153247 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.153248 -0.030483 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.129917 0.086808 +v 0.468750 0.129917 0.086808 +v 0.500000 0.086808 0.129917 +v 0.468750 0.086808 0.129917 +v 0.500000 0.030483 0.153248 +v 0.468750 0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.086807 0.129917 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.153247 0.030483 +v 0.468750 -0.153247 0.030483 +v 0.500000 -0.153247 -0.030483 +v 0.468750 -0.153247 -0.030483 +v 0.468750 -0.024386 0.122598 +v 0.468750 0.024387 0.122598 +v 0.468750 0.069447 0.103934 +v 0.468750 0.103934 0.069447 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.069447 -0.103933 +v 0.468750 0.024387 -0.122598 +v 0.468750 -0.024386 -0.122598 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103933 -0.069446 +v 0.468750 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +vt 0.265625 0.234375 +vt 0.468750 0.234375 +vt 0.468750 0.265625 +vt 0.265625 0.265625 +vt 0.265625 0.187500 +vt 0.328125 0.187500 +vt 0.328125 0.218750 +vt 0.265625 0.218750 +vt 0.468750 0.312500 +vt 0.265625 0.312500 +vt 0.265625 0.281250 +vt 0.468750 0.281250 +vt 0.406250 0.218750 +vt 0.343750 0.218750 +vt 0.343750 0.187500 +vt 0.406250 0.187500 +vt 0.468750 0.468750 +vt 0.265625 0.468750 +vt 0.265625 0.406250 +vt 0.468750 0.406250 +vt 0.468750 0.390625 +vt 0.265625 0.390625 +vt 0.265625 0.328125 +vt 0.468750 0.328125 +vt 0.039062 0.203125 +vt 0.007812 0.203125 +vt 0.007812 0.187500 +vt 0.039062 0.187500 +vt 0.085938 0.203125 +vt 0.054688 0.203125 +vt 0.054688 0.187500 +vt 0.085938 0.187500 +vt 0.148438 0.187500 +vt 0.179688 0.187500 +vt 0.179688 0.203125 +vt 0.148438 0.203125 +vt 0.132812 0.203125 +vt 0.101562 0.203125 +vt 0.101562 0.187500 +vt 0.132812 0.187500 +vt 0.515625 0.484375 +vt 0.515625 0.734375 +vt 0.265625 0.734375 +vt 0.265625 0.484375 +vt 0.000000 0.468750 +vt 0.000000 0.218750 +vt 0.250000 0.218750 +vt 0.250000 0.468750 +vt 0.515625 1.000000 +vt 0.265625 1.000000 +vt 0.265625 0.750000 +vt 0.515625 0.750000 +vt 0.250000 0.734375 +vt 0.000000 0.734375 +vt 0.000000 0.484375 +vt 0.250000 0.484375 +vt 0.781250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 0.750000 +vt 0.781250 0.750000 +vt 0.000847 0.750015 +vt 0.250216 0.750015 +vt 0.250216 0.999385 +vt 0.000847 0.999385 +vt 0.867188 0.273438 +vt 0.835938 0.273438 +vt 0.835938 0.304688 +vt 0.867188 0.304688 +vt 0.804688 0.273438 +vt 0.804688 0.304688 +vt 0.773438 0.273438 +vt 0.773438 0.304688 +vt 0.742188 0.273438 +vt 0.742188 0.304688 +vt 0.710938 0.273438 +vt 0.710938 0.304688 +vt 0.679688 0.273438 +vt 0.679688 0.304688 +vt 0.648438 0.273438 +vt 0.648438 0.304688 +vt 0.617188 0.273438 +vt 0.617188 0.304688 +vt 0.585938 0.273438 +vt 0.585938 0.304688 +vt 0.554688 0.273438 +vt 0.554688 0.304688 +vt 0.523438 0.273438 +vt 0.523438 0.304688 +vt 0.492188 0.273438 +vt 0.492188 0.304688 +vt 0.992188 0.273438 +vt 0.960938 0.273438 +vt 0.960938 0.304688 +vt 0.992188 0.304688 +vt 0.929688 0.273438 +vt 0.929688 0.304688 +vt 0.898438 0.273438 +vt 0.898438 0.304688 +vt 0.600936 0.328499 +vt 0.584692 0.410164 +vt 0.568448 0.328499 +vt 0.757628 0.328499 +vt 0.773872 0.410164 +vt 0.790117 0.328499 +vt 0.820132 0.340932 +vt 0.843105 0.363905 +vt 0.855537 0.393920 +vt 0.855537 0.426408 +vt 0.843105 0.456424 +vt 0.820132 0.479396 +vt 0.790117 0.491829 +vt 0.757628 0.491829 +vt 0.727613 0.479396 +vt 0.704640 0.456424 +vt 0.692207 0.426408 +vt 0.692207 0.393920 +vt 0.704640 0.363905 +vt 0.727613 0.340932 +vt 0.538432 0.340932 +vt 0.515460 0.363905 +vt 0.503027 0.393920 +vt 0.503027 0.426408 +vt 0.515460 0.456424 +vt 0.538432 0.479396 +vt 0.568448 0.491829 +vt 0.600936 0.491829 +vt 0.630951 0.479396 +vt 0.653924 0.456424 +vt 0.666357 0.426408 +vt 0.666357 0.393920 +vt 0.653924 0.363905 +vt 0.630951 0.340932 +vt 0.585938 0.257812 +vt 0.585938 0.007812 +vt 0.617188 0.007812 +vt 0.617188 0.257812 +vt 0.538433 0.340928 +vt 0.568449 0.328495 +vt 0.584693 0.410160 +vt 0.515460 0.363901 +vt 0.503028 0.393916 +vt 0.503028 0.426405 +vt 0.515460 0.456420 +vt 0.538433 0.479393 +vt 0.568449 0.491826 +vt 0.600937 0.491826 +vt 0.630952 0.479393 +vt 0.653925 0.456420 +vt 0.666358 0.426405 +vt 0.666358 0.393916 +vt 0.653925 0.363901 +vt 0.630952 0.340928 +vt 0.600937 0.328495 +vt 0.727611 0.340928 +vt 0.757626 0.328495 +vt 0.773870 0.410160 +vt 0.704638 0.363901 +vt 0.692205 0.393916 +vt 0.692205 0.426405 +vt 0.704638 0.456420 +vt 0.727611 0.479393 +vt 0.757626 0.491826 +vt 0.790115 0.491826 +vt 0.820130 0.479393 +vt 0.843103 0.456420 +vt 0.855535 0.426405 +vt 0.855535 0.393916 +vt 0.843103 0.363901 +vt 0.820130 0.340928 +vt 0.790115 0.328495 +vt 0.929688 0.257812 +vt 0.929688 0.007812 +vt 0.960938 0.007812 +vt 0.960938 0.257812 +vt 0.867188 0.257812 +vt 0.867188 0.007812 +vt 0.898438 0.007812 +vt 0.898438 0.257812 +vt 0.773438 0.257812 +vt 0.773438 0.007812 +vt 0.804688 0.007812 +vt 0.804688 0.257812 +vt 0.835938 0.257812 +vt 0.835938 0.007812 +vt 0.742188 0.257812 +vt 0.742188 0.007812 +vt 0.710938 0.257812 +vt 0.710938 0.007812 +vt 0.679688 0.257812 +vt 0.679688 0.007812 +vt 0.648438 0.257812 +vt 0.648438 0.007812 +vt 0.554688 0.257812 +vt 0.554688 0.007812 +vt 0.523438 0.257812 +vt 0.523438 0.007812 +vt 0.492188 0.257812 +vt 0.492188 0.007812 +vt 0.992188 0.007812 +vt 0.992188 0.257812 +usemtl None +s off +f 5/1 6/2 2/3 1/4 +f 6/5 7/6 3/7 2/8 +f 7/9 8/10 4/11 3/12 +f 8/13 5/14 1/15 4/16 +f 1/17 2/18 3/19 4/20 +f 8/21 7/22 6/23 5/24 +f 13/25 14/26 10/27 9/28 +f 14/29 15/30 11/31 10/32 +f 15/33 16/34 12/35 11/36 +f 16/37 13/38 9/39 12/40 +f 21/41 22/42 18/43 17/44 +f 22/45 23/46 19/47 18/48 +f 23/49 24/50 20/51 19/52 +f 24/53 21/54 17/55 20/56 +f 17/57 18/58 19/59 20/60 +f 24/61 23/62 22/63 21/64 +f 25/65 27/66 28/67 26/68 +f 27/66 29/69 30/70 28/67 +f 29/69 31/71 32/72 30/70 +f 31/71 33/73 34/74 32/72 +f 33/73 35/75 36/76 34/74 +f 35/75 37/77 38/78 36/76 +f 37/77 39/79 40/80 38/78 +f 39/79 41/81 42/82 40/80 +f 41/81 43/83 44/84 42/82 +f 43/83 45/85 46/86 44/84 +f 45/85 47/87 48/88 46/86 +f 47/87 49/89 50/90 48/88 +f 49/91 51/92 52/93 50/94 +f 51/92 53/95 54/96 52/93 +f 55/97 25/65 26/68 56/98 +f 53/95 55/97 56/98 54/96 +f 28/99 74/100 26/101 +f 25/102 73/103 27/104 +f 27/104 73/103 29/105 +f 29/105 73/103 31/106 +f 31/106 73/103 33/107 +f 33/107 73/103 35/108 +f 35/108 73/103 37/109 +f 37/109 73/103 39/110 +f 39/110 73/103 41/111 +f 41/111 73/103 43/112 +f 43/112 73/103 45/113 +f 45/113 73/103 47/114 +f 47/114 73/103 49/115 +f 49/115 73/103 51/116 +f 51/116 73/103 53/117 +f 53/117 73/103 55/118 +f 55/118 73/103 25/102 +f 26/101 74/100 56/119 +f 56/119 74/100 54/120 +f 54/120 74/100 52/121 +f 52/121 74/100 50/122 +f 50/122 74/100 48/123 +f 48/123 74/100 46/124 +f 46/124 74/100 44/125 +f 44/125 74/100 42/126 +f 42/126 74/100 40/127 +f 40/127 74/100 38/128 +f 38/128 74/100 36/129 +f 36/129 74/100 34/130 +f 34/130 74/100 32/131 +f 32/131 74/100 30/132 +f 30/132 74/100 28/99 +f 65/133 115/134 116/135 66/136 +f 105/137 107/138 124/139 +f 103/140 105/137 124/139 +f 101/141 103/140 124/139 +f 99/142 101/141 124/139 +f 97/143 99/142 124/139 +f 95/144 97/143 124/139 +f 93/145 95/144 124/139 +f 91/146 93/145 124/139 +f 89/147 91/146 124/139 +f 87/148 89/147 124/139 +f 85/149 87/148 124/139 +f 83/150 85/149 124/139 +f 81/151 83/150 124/139 +f 79/152 81/151 124/139 +f 109/153 79/152 124/139 +f 80/154 110/155 123/156 +f 82/157 80/154 123/156 +f 84/158 82/157 123/156 +f 86/159 84/158 123/156 +f 88/160 86/159 123/156 +f 90/161 88/160 123/156 +f 92/162 90/161 123/156 +f 94/163 92/162 123/156 +f 96/164 94/163 123/156 +f 98/165 96/164 123/156 +f 100/166 98/165 123/156 +f 102/167 100/166 123/156 +f 104/168 102/167 123/156 +f 106/169 104/168 123/156 +f 108/170 106/169 123/156 +f 110/155 108/170 123/156 +f 107/138 109/153 124/139 +f 82/86 81/85 79/83 80/84 +f 80/84 79/83 109/81 110/82 +f 84/88 83/87 81/85 82/86 +f 86/90 85/89 83/87 84/88 +f 88/93 87/92 85/91 86/94 +f 90/96 89/95 87/92 88/93 +f 92/98 91/97 89/95 90/96 +f 94/68 93/65 91/97 92/98 +f 96/67 95/66 93/65 94/68 +f 98/70 97/69 95/66 96/67 +f 100/72 99/71 97/69 98/70 +f 102/74 101/73 99/71 100/72 +f 104/76 103/75 101/73 102/74 +f 106/78 105/77 103/75 104/76 +f 108/80 107/79 105/77 106/78 +f 110/82 109/81 107/79 108/80 +f 60/171 75/172 111/173 61/174 +f 58/175 77/176 76/177 59/178 +f 71/179 121/180 122/181 72/182 +f 57/183 78/184 77/176 58/175 +f 59/178 76/177 75/172 60/171 +f 72/182 122/181 78/184 57/183 +f 70/185 120/186 121/180 71/179 +f 69/187 119/188 120/186 70/185 +f 68/189 118/190 119/188 69/187 +f 67/191 117/192 118/190 68/189 +f 66/136 116/135 117/192 67/191 +f 64/193 114/194 115/134 65/133 +f 63/195 113/196 114/194 64/193 +f 62/197 112/198 113/196 63/195 +f 61/174 111/173 112/199 62/200 diff --git a/mods/pipeworks/models/pipeworks_valve_on.obj b/mods/pipeworks/models/pipeworks_valve_on.obj new file mode 100644 index 0000000..ba08b30 --- /dev/null +++ b/mods/pipeworks/models/pipeworks_valve_on.obj @@ -0,0 +1,458 @@ +# Blender v2.69 (sub 0) OBJ File: 'pipe-valve-on.blend' +# www.blender.org +mtllib pipeworks_valve_on.mtl +o Cube.003 +v 0.312500 0.281250 0.062500 +v -0.093750 0.281250 0.062500 +v -0.093750 0.281250 -0.062500 +v 0.312500 0.281250 -0.062500 +v 0.312500 0.343750 0.062500 +v -0.093750 0.343750 0.062500 +v -0.093750 0.343750 -0.062500 +v 0.312500 0.343750 -0.062500 +v 0.031250 0.250000 -0.031250 +v 0.031250 0.250000 0.031250 +v -0.031250 0.250000 0.031250 +v -0.031250 0.250000 -0.031250 +v 0.031250 0.281250 -0.031250 +v 0.031250 0.281250 0.031250 +v -0.031250 0.281250 0.031250 +v -0.031250 0.281250 -0.031250 +v 0.250000 -0.250000 -0.250000 +v 0.250000 -0.250000 0.250000 +v -0.250000 -0.250000 0.250000 +v -0.250000 -0.250000 -0.250000 +v 0.250000 0.250000 -0.250000 +v 0.250000 0.250000 0.250000 +v -0.250000 0.250000 0.250000 +v -0.250000 0.250000 -0.250000 +v -0.468750 -0.153248 -0.030483 +v -0.500000 -0.153248 -0.030483 +v -0.468750 -0.153248 0.030483 +v -0.500000 -0.153248 0.030483 +v -0.468750 -0.129917 0.086808 +v -0.500000 -0.129917 0.086808 +v -0.468750 -0.086808 0.129917 +v -0.500000 -0.086808 0.129917 +v -0.468750 -0.030483 0.153248 +v -0.500000 -0.030483 0.153248 +v -0.468750 0.030483 0.153248 +v -0.500000 0.030483 0.153248 +v -0.468750 0.086808 0.129917 +v -0.500000 0.086808 0.129917 +v -0.468750 0.129917 0.086808 +v -0.500000 0.129917 0.086808 +v -0.468750 0.153248 0.030483 +v -0.500000 0.153247 0.030483 +v -0.468750 0.153248 -0.030483 +v -0.500000 0.153248 -0.030483 +v -0.468750 0.129917 -0.086808 +v -0.500000 0.129917 -0.086808 +v -0.468750 0.086808 -0.129917 +v -0.500000 0.086808 -0.129917 +v -0.468750 0.030483 -0.153248 +v -0.500000 0.030483 -0.153248 +v -0.468750 -0.030483 -0.153248 +v -0.500000 -0.030483 -0.153248 +v -0.468750 -0.086808 -0.129917 +v -0.500000 -0.086808 -0.129917 +v -0.468750 -0.129917 -0.086808 +v -0.500000 -0.129917 -0.086808 +v -0.468750 -0.122598 -0.024386 +v -0.468750 -0.122598 0.024386 +v -0.468750 -0.103934 0.069446 +v -0.468750 -0.069446 0.103934 +v -0.468750 -0.024386 0.122598 +v -0.468750 0.024386 0.122598 +v -0.468750 0.069446 0.103934 +v -0.468750 0.103934 0.069446 +v -0.468750 0.122598 0.024386 +v -0.468750 0.122598 -0.024386 +v -0.468750 0.103934 -0.069446 +v -0.468750 0.069446 -0.103934 +v -0.468750 0.024386 -0.122598 +v -0.468750 -0.024387 -0.122598 +v -0.468750 -0.069447 -0.103934 +v -0.468750 -0.103934 -0.069446 +v -0.468750 -0.000000 -0.000000 +v -0.500000 -0.000000 -0.000000 +v 0.468750 -0.069446 0.103934 +v 0.468750 -0.103933 0.069447 +v 0.468750 -0.122598 0.024387 +v 0.468750 -0.122598 -0.024386 +v 0.500000 -0.129917 -0.086807 +v 0.468750 -0.129917 -0.086807 +v 0.500000 -0.086808 -0.129917 +v 0.468750 -0.086808 -0.129917 +v 0.500000 -0.030483 -0.153247 +v 0.468750 -0.030483 -0.153247 +v 0.500000 0.030483 -0.153247 +v 0.468750 0.030483 -0.153247 +v 0.500000 0.086808 -0.129917 +v 0.468750 0.086808 -0.129917 +v 0.500000 0.129917 -0.086808 +v 0.468750 0.129917 -0.086808 +v 0.500000 0.153248 -0.030483 +v 0.468750 0.153248 -0.030483 +v 0.500000 0.153248 0.030483 +v 0.468750 0.153248 0.030483 +v 0.500000 0.129917 0.086808 +v 0.468750 0.129917 0.086808 +v 0.500000 0.086808 0.129917 +v 0.468750 0.086808 0.129917 +v 0.500000 0.030483 0.153248 +v 0.468750 0.030483 0.153248 +v 0.500000 -0.030483 0.153248 +v 0.468750 -0.030483 0.153248 +v 0.500000 -0.086807 0.129917 +v 0.468750 -0.086808 0.129917 +v 0.500000 -0.129917 0.086808 +v 0.468750 -0.129917 0.086808 +v 0.500000 -0.153247 0.030483 +v 0.468750 -0.153247 0.030483 +v 0.500000 -0.153247 -0.030483 +v 0.468750 -0.153247 -0.030483 +v 0.468750 -0.024386 0.122598 +v 0.468750 0.024387 0.122598 +v 0.468750 0.069447 0.103934 +v 0.468750 0.103934 0.069447 +v 0.468750 0.122598 0.024387 +v 0.468750 0.122598 -0.024386 +v 0.468750 0.103934 -0.069446 +v 0.468750 0.069447 -0.103933 +v 0.468750 0.024387 -0.122598 +v 0.468750 -0.024386 -0.122598 +v 0.468750 -0.069446 -0.103933 +v 0.468750 -0.103933 -0.069446 +v 0.468750 0.000000 0.000000 +v 0.500000 0.000000 0.000000 +vt 0.265625 0.234375 +vt 0.468750 0.234375 +vt 0.468750 0.265625 +vt 0.265625 0.265625 +vt 0.265625 0.187500 +vt 0.328125 0.187500 +vt 0.328125 0.218750 +vt 0.265625 0.218750 +vt 0.468750 0.312500 +vt 0.265625 0.312500 +vt 0.265625 0.281250 +vt 0.468750 0.281250 +vt 0.406250 0.218750 +vt 0.343750 0.218750 +vt 0.343750 0.187500 +vt 0.406250 0.187500 +vt 0.468750 0.468750 +vt 0.265625 0.468750 +vt 0.265625 0.406250 +vt 0.468750 0.406250 +vt 0.468750 0.390625 +vt 0.265625 0.390625 +vt 0.265625 0.328125 +vt 0.468750 0.328125 +vt 0.039062 0.203125 +vt 0.007812 0.203125 +vt 0.007812 0.187500 +vt 0.039062 0.187500 +vt 0.085938 0.203125 +vt 0.054688 0.203125 +vt 0.054688 0.187500 +vt 0.085938 0.187500 +vt 0.148438 0.187500 +vt 0.179688 0.187500 +vt 0.179688 0.203125 +vt 0.148438 0.203125 +vt 0.132812 0.203125 +vt 0.101562 0.203125 +vt 0.101562 0.187500 +vt 0.132812 0.187500 +vt 0.515625 0.484375 +vt 0.515625 0.734375 +vt 0.265625 0.734375 +vt 0.265625 0.484375 +vt 0.000000 0.468750 +vt 0.000000 0.218750 +vt 0.250000 0.218750 +vt 0.250000 0.468750 +vt 0.515625 1.000000 +vt 0.265625 1.000000 +vt 0.265625 0.750000 +vt 0.515625 0.750000 +vt 0.250000 0.734375 +vt 0.000000 0.734375 +vt 0.000000 0.484375 +vt 0.250000 0.484375 +vt 0.781250 1.000000 +vt 0.531250 1.000000 +vt 0.531250 0.750000 +vt 0.781250 0.750000 +vt 0.000847 0.750015 +vt 0.250216 0.750015 +vt 0.250216 0.999385 +vt 0.000847 0.999385 +vt 0.867188 0.273438 +vt 0.835938 0.273438 +vt 0.835938 0.304688 +vt 0.867188 0.304688 +vt 0.804688 0.273438 +vt 0.804688 0.304688 +vt 0.773438 0.273438 +vt 0.773438 0.304688 +vt 0.742188 0.273438 +vt 0.742188 0.304688 +vt 0.710938 0.273438 +vt 0.710938 0.304688 +vt 0.679688 0.273438 +vt 0.679688 0.304688 +vt 0.648438 0.273438 +vt 0.648438 0.304688 +vt 0.617188 0.273438 +vt 0.617188 0.304688 +vt 0.585938 0.273438 +vt 0.585938 0.304688 +vt 0.554688 0.273438 +vt 0.554688 0.304688 +vt 0.523438 0.273438 +vt 0.523438 0.304688 +vt 0.492188 0.273438 +vt 0.492188 0.304688 +vt 0.992188 0.273438 +vt 0.960938 0.273438 +vt 0.960938 0.304688 +vt 0.992188 0.304688 +vt 0.929688 0.273438 +vt 0.929688 0.304688 +vt 0.898438 0.273438 +vt 0.898438 0.304688 +vt 0.600936 0.328499 +vt 0.584692 0.410164 +vt 0.568448 0.328499 +vt 0.757628 0.328499 +vt 0.773872 0.410164 +vt 0.790117 0.328499 +vt 0.820132 0.340932 +vt 0.843105 0.363905 +vt 0.855537 0.393920 +vt 0.855537 0.426408 +vt 0.843105 0.456424 +vt 0.820132 0.479396 +vt 0.790117 0.491829 +vt 0.757628 0.491829 +vt 0.727613 0.479396 +vt 0.704640 0.456424 +vt 0.692207 0.426408 +vt 0.692207 0.393920 +vt 0.704640 0.363905 +vt 0.727613 0.340932 +vt 0.538432 0.340932 +vt 0.515460 0.363905 +vt 0.503027 0.393920 +vt 0.503027 0.426408 +vt 0.515460 0.456424 +vt 0.538432 0.479396 +vt 0.568448 0.491829 +vt 0.600936 0.491829 +vt 0.630951 0.479396 +vt 0.653924 0.456424 +vt 0.666357 0.426408 +vt 0.666357 0.393920 +vt 0.653924 0.363905 +vt 0.630951 0.340932 +vt 0.585938 0.257812 +vt 0.585938 0.007812 +vt 0.617188 0.007812 +vt 0.617188 0.257812 +vt 0.538433 0.340928 +vt 0.568449 0.328495 +vt 0.584693 0.410160 +vt 0.515460 0.363901 +vt 0.503028 0.393916 +vt 0.503028 0.426405 +vt 0.515460 0.456420 +vt 0.538433 0.479393 +vt 0.568449 0.491826 +vt 0.600937 0.491826 +vt 0.630952 0.479393 +vt 0.653925 0.456420 +vt 0.666358 0.426405 +vt 0.666358 0.393916 +vt 0.653925 0.363901 +vt 0.630952 0.340928 +vt 0.600937 0.328495 +vt 0.727611 0.340928 +vt 0.757626 0.328495 +vt 0.773870 0.410160 +vt 0.704638 0.363901 +vt 0.692205 0.393916 +vt 0.692205 0.426405 +vt 0.704638 0.456420 +vt 0.727611 0.479393 +vt 0.757626 0.491826 +vt 0.790115 0.491826 +vt 0.820130 0.479393 +vt 0.843103 0.456420 +vt 0.855535 0.426405 +vt 0.855535 0.393916 +vt 0.843103 0.363901 +vt 0.820130 0.340928 +vt 0.790115 0.328495 +vt 0.929688 0.257812 +vt 0.929688 0.007812 +vt 0.960938 0.007812 +vt 0.960938 0.257812 +vt 0.867188 0.257812 +vt 0.867188 0.007812 +vt 0.898438 0.007812 +vt 0.898438 0.257812 +vt 0.773438 0.257812 +vt 0.773438 0.007812 +vt 0.804688 0.007812 +vt 0.804688 0.257812 +vt 0.835938 0.257812 +vt 0.835938 0.007812 +vt 0.742188 0.257812 +vt 0.742188 0.007812 +vt 0.710938 0.257812 +vt 0.710938 0.007812 +vt 0.679688 0.257812 +vt 0.679688 0.007812 +vt 0.648438 0.257812 +vt 0.648438 0.007812 +vt 0.554688 0.257812 +vt 0.554688 0.007812 +vt 0.523438 0.257812 +vt 0.523438 0.007812 +vt 0.492188 0.257812 +vt 0.492188 0.007812 +vt 0.992188 0.007812 +vt 0.992188 0.257812 +usemtl None +s off +f 5/1 6/2 2/3 1/4 +f 6/5 7/6 3/7 2/8 +f 7/9 8/10 4/11 3/12 +f 8/13 5/14 1/15 4/16 +f 1/17 2/18 3/19 4/20 +f 8/21 7/22 6/23 5/24 +f 13/25 14/26 10/27 9/28 +f 14/29 15/30 11/31 10/32 +f 15/33 16/34 12/35 11/36 +f 16/37 13/38 9/39 12/40 +f 21/41 22/42 18/43 17/44 +f 22/45 23/46 19/47 18/48 +f 23/49 24/50 20/51 19/52 +f 24/53 21/54 17/55 20/56 +f 17/57 18/58 19/59 20/60 +f 24/61 23/62 22/63 21/64 +f 25/65 27/66 28/67 26/68 +f 27/66 29/69 30/70 28/67 +f 29/69 31/71 32/72 30/70 +f 31/71 33/73 34/74 32/72 +f 33/73 35/75 36/76 34/74 +f 35/75 37/77 38/78 36/76 +f 37/77 39/79 40/80 38/78 +f 39/79 41/81 42/82 40/80 +f 41/81 43/83 44/84 42/82 +f 43/83 45/85 46/86 44/84 +f 45/85 47/87 48/88 46/86 +f 47/87 49/89 50/90 48/88 +f 49/91 51/92 52/93 50/94 +f 51/92 53/95 54/96 52/93 +f 55/97 25/65 26/68 56/98 +f 53/95 55/97 56/98 54/96 +f 28/99 74/100 26/101 +f 25/102 73/103 27/104 +f 27/104 73/103 29/105 +f 29/105 73/103 31/106 +f 31/106 73/103 33/107 +f 33/107 73/103 35/108 +f 35/108 73/103 37/109 +f 37/109 73/103 39/110 +f 39/110 73/103 41/111 +f 41/111 73/103 43/112 +f 43/112 73/103 45/113 +f 45/113 73/103 47/114 +f 47/114 73/103 49/115 +f 49/115 73/103 51/116 +f 51/116 73/103 53/117 +f 53/117 73/103 55/118 +f 55/118 73/103 25/102 +f 26/101 74/100 56/119 +f 56/119 74/100 54/120 +f 54/120 74/100 52/121 +f 52/121 74/100 50/122 +f 50/122 74/100 48/123 +f 48/123 74/100 46/124 +f 46/124 74/100 44/125 +f 44/125 74/100 42/126 +f 42/126 74/100 40/127 +f 40/127 74/100 38/128 +f 38/128 74/100 36/129 +f 36/129 74/100 34/130 +f 34/130 74/100 32/131 +f 32/131 74/100 30/132 +f 30/132 74/100 28/99 +f 65/133 115/134 116/135 66/136 +f 105/137 107/138 124/139 +f 103/140 105/137 124/139 +f 101/141 103/140 124/139 +f 99/142 101/141 124/139 +f 97/143 99/142 124/139 +f 95/144 97/143 124/139 +f 93/145 95/144 124/139 +f 91/146 93/145 124/139 +f 89/147 91/146 124/139 +f 87/148 89/147 124/139 +f 85/149 87/148 124/139 +f 83/150 85/149 124/139 +f 81/151 83/150 124/139 +f 79/152 81/151 124/139 +f 109/153 79/152 124/139 +f 80/154 110/155 123/156 +f 82/157 80/154 123/156 +f 84/158 82/157 123/156 +f 86/159 84/158 123/156 +f 88/160 86/159 123/156 +f 90/161 88/160 123/156 +f 92/162 90/161 123/156 +f 94/163 92/162 123/156 +f 96/164 94/163 123/156 +f 98/165 96/164 123/156 +f 100/166 98/165 123/156 +f 102/167 100/166 123/156 +f 104/168 102/167 123/156 +f 106/169 104/168 123/156 +f 108/170 106/169 123/156 +f 110/155 108/170 123/156 +f 107/138 109/153 124/139 +f 82/86 81/85 79/83 80/84 +f 80/84 79/83 109/81 110/82 +f 84/88 83/87 81/85 82/86 +f 86/90 85/89 83/87 84/88 +f 88/93 87/92 85/91 86/94 +f 90/96 89/95 87/92 88/93 +f 92/98 91/97 89/95 90/96 +f 94/68 93/65 91/97 92/98 +f 96/67 95/66 93/65 94/68 +f 98/70 97/69 95/66 96/67 +f 100/72 99/71 97/69 98/70 +f 102/74 101/73 99/71 100/72 +f 104/76 103/75 101/73 102/74 +f 106/78 105/77 103/75 104/76 +f 108/80 107/79 105/77 106/78 +f 110/82 109/81 107/79 108/80 +f 60/171 75/172 111/173 61/174 +f 58/175 77/176 76/177 59/178 +f 71/179 121/180 122/181 72/182 +f 57/183 78/184 77/176 58/175 +f 59/178 76/177 75/172 60/171 +f 72/182 122/181 78/184 57/183 +f 70/185 120/186 121/180 71/179 +f 69/187 119/188 120/186 70/185 +f 68/189 118/190 119/188 69/187 +f 67/191 117/192 118/190 68/189 +f 66/136 116/135 117/192 67/191 +f 64/193 114/194 115/134 65/133 +f 63/195 113/196 114/194 64/193 +f 62/197 112/198 113/196 63/195 +f 61/174 111/173 112/199 62/200 diff --git a/mods/pipeworks/pipes.lua b/mods/pipeworks/pipes.lua new file mode 100644 index 0000000..2056fdf --- /dev/null +++ b/mods/pipeworks/pipes.lua @@ -0,0 +1,222 @@ +-- This file supplies the steel pipes + +local REGISTER_COMPATIBILITY = true + +local pipes_empty_nodenames = {} +local pipes_full_nodenames = {} + +local vti = {4, 3, 2, 1, 6, 5} +local cconnects = {{}, {1}, {1, 2}, {1, 3}, {1, 3, 5}, {1, 2, 3}, {1, 2, 3, 5}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 6}} +for index, connects in ipairs(cconnects) do + local outsel = {} + + local jx = 0 + local jy = 0 + local jz = 0 + for _, v in ipairs(connects) do + if v == 1 or v == 2 then + jx = jx + 1 + elseif v == 3 or v == 4 then + jy = jy + 1 + else + jz = jz + 1 + end + table.insert(outsel, pipeworks.pipe_selectboxes[v]) + end + + if #connects == 1 then + local v = connects[1] + v = v-1 + 2*(v%2) -- Opposite side + end + + local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1} + local pipedesc = "Pipe segement".." "..dump(connects).."... You hacker, you." + local image = nil + + if #connects == 0 then + pgroups = {snappy = 3, tube = 1} + pipedesc = "Pipe segment" + image = "pipeworks_pipe_inv.png" + end + + local outimg_e = { "pipeworks_pipe_plain.png" } + local outimg_l = { "pipeworks_pipe_plain.png" } + + if index == 3 then + outimg_e = { "pipeworks_pipe_3_empty.png" } + outimg_l = { "pipeworks_pipe_3_loaded.png" } + end + + local mesh = "pipeworks_pipe_"..index..".obj" + + if index == 1 then + mesh = "pipeworks_pipe_3.obj" + end + + minetest.register_node("pipeworks:pipe_"..index.."_empty", { + description = pipedesc, + drawtype = "mesh", + mesh = mesh, + tiles = outimg_e, + sunlight_propagates = true, + inventory_image = image, + wield_image = image, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = outsel + }, + collision_box = { + type = "fixed", + fixed = outsel + }, + groups = pgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end + }) + + local pgroups = {snappy = 3, pipe = 1, not_in_creative_inventory = 1} + + minetest.register_node("pipeworks:pipe_"..index.."_loaded", { + description = pipedesc, + drawtype = "mesh", + mesh = mesh, + tiles = outimg_l, + sunlight_propagates = true, + paramtype = "light", + paramtype2 = "facedir", + selection_box = { + type = "fixed", + fixed = outsel + }, + collision_box = { + type = "fixed", + fixed = outsel + }, + groups = pgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + after_dig_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end + }) + + table.insert(pipes_empty_nodenames, "pipeworks:pipe_"..index.."_empty") + table.insert(pipes_full_nodenames, "pipeworks:pipe_"..index.."_loaded") +end + + + +if REGISTER_COMPATIBILITY then + local cempty = "pipeworks:pipe_compatibility_empty" + local cloaded = "pipeworks:pipe_compatibility_loaded" + minetest.register_node(cempty, { + drawtype = "airlike", + sunlight_propagates = true, + paramtype = "light", + inventory_image = "pipeworks_pipe_inv.png", + wield_image = "pipeworks_pipe_inv.png", + description = "Pipe Segment (legacy)", + groups = {not_in_creative_inventory = 1, pipe_to_update = 1}, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + }) + minetest.register_node(cloaded, { + drawtype = "airlike", + sunlight_propagates = true, + paramtype = "light", + inventory_image = "pipeworks_pipe_inv.png", + groups = {not_in_creative_inventory = 1, pipe_to_update = 1}, + drop = "pipeworks:pipe_1_empty", + after_place_node = function(pos) + pipeworks.scan_for_pipe_objects(pos) + end, + }) + for xm = 0, 1 do + for xp = 0, 1 do + for ym = 0, 1 do + for yp = 0, 1 do + for zm = 0, 1 do + for zp = 0, 1 do + local pname = xm..xp..ym..yp..zm..zp + minetest.register_alias("pipeworks:pipe_"..pname.."_empty", cempty) + minetest.register_alias("pipeworks:pipe_"..pname.."_loaded", cloaded) + end + end + end + end + end + end + minetest.register_abm({ + nodenames = {"group:pipe_to_update"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local minp = {x = pos.x-1, y = pos.y-1, z = pos.z-1} + local maxp = {x = pos.x+1, y = pos.y+1, z = pos.z+1} + if table.getn(minetest.find_nodes_in_area(minp, maxp, "ignore")) == 0 then + pipeworks.scan_for_pipe_objects(pos) + end + end + }) +end + +table.insert(pipes_empty_nodenames,"pipeworks:valve_on_empty") +table.insert(pipes_empty_nodenames,"pipeworks:valve_off_empty") +table.insert(pipes_empty_nodenames,"pipeworks:entry_panel_empty") +table.insert(pipes_empty_nodenames,"pipeworks:flow_sensor_empty") + +table.insert(pipes_full_nodenames,"pipeworks:valve_on_loaded") +table.insert(pipes_full_nodenames,"pipeworks:entry_panel_loaded") +table.insert(pipes_full_nodenames,"pipeworks:flow_sensor_loaded") + +minetest.register_abm({ + nodenames = pipes_empty_nodenames, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.check_for_inflows(pos,node) + end +}) + +minetest.register_abm({ + nodenames = pipes_full_nodenames, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.check_sources(pos,node) + end +}) + +minetest.register_abm({ + nodenames = {"pipeworks:spigot","pipeworks:spigot_pouring"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.spigot_check(pos,node) + end +}) + +minetest.register_abm({ + nodenames = {"pipeworks:fountainhead","pipeworks:fountainhead_pouring"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + pipeworks.fountainhead_check(pos,node) + end +}) + diff --git a/mods/pipeworks/routing_tubes.lua b/mods/pipeworks/routing_tubes.lua new file mode 100644 index 0000000..8620d20 --- /dev/null +++ b/mods/pipeworks/routing_tubes.lua @@ -0,0 +1,119 @@ +-- the default tube and default textures +pipeworks.register_tube("pipeworks:tube", "Pneumatic tube segment") +minetest.register_craft( { + output = "pipeworks:tube_1 6", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "", "", "" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +-- the high priority tube is a low-cpu replacement for sorting tubes in situations +-- where players would use them for simple routing (turning off paths) +-- without doing actual sorting, like at outputs of tubedevices that might both accept and eject items +if pipeworks.enable_priority_tube then + local color = "#ff3030:128" + pipeworks.register_tube("pipeworks:priority_tube", { + description = "High Priority Tube Segment", + inventory_image = "pipeworks_tube_inv.png^[colorize:" .. color, + plain = { "pipeworks_tube_plain.png^[colorize:" .. color }, + noctr = { "pipeworks_tube_noctr.png^[colorize:" .. color }, + ends = { "pipeworks_tube_end.png^[colorize:" .. color }, + short = "pipeworks_tube_short.png^[colorize:" .. color, + node_def = { + tube = { priority = 150 } -- higher than tubedevices (100) + }, + }) + minetest.register_craft( { + output = "pipeworks:priority_tube_1 6", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:gold_ingot", "", "default:gold_ingot" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) +end + +if pipeworks.enable_accelerator_tube then + pipeworks.register_tube("pipeworks:accelerator_tube", { + description = "Accelerating Pneumatic Tube Segment", + inventory_image = "pipeworks_accelerator_tube_inv.png", + plain = { "pipeworks_accelerator_tube_plain.png" }, + noctr = { "pipeworks_accelerator_tube_noctr.png" }, + ends = { "pipeworks_accelerator_tube_end.png" }, + short = "pipeworks_accelerator_tube_short.png", + node_def = { + tube = {can_go = function(pos, node, velocity, stack) + velocity.speed = velocity.speed+1 + return pipeworks.notvel(pipeworks.meseadjlist, velocity) + end} + }, + }) + minetest.register_craft( { + output = "pipeworks:accelerator_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:mese_crystal_fragment", "default:steel_ingot", "default:mese_crystal_fragment" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) +end + +if pipeworks.enable_crossing_tube then + pipeworks.register_tube("pipeworks:crossing_tube", { + description = "Crossing Pneumatic Tube Segment", + inventory_image = "pipeworks_crossing_tube_inv.png", + plain = { "pipeworks_crossing_tube_plain.png" }, + noctr = { "pipeworks_crossing_tube_noctr.png" }, + ends = { "pipeworks_crossing_tube_end.png" }, + short = "pipeworks_crossing_tube_short.png", + node_def = { + tube = {can_go = function(pos, node, velocity, stack) return {velocity} end } + }, + }) + minetest.register_craft( { + output = "pipeworks:crossing_tube_1 5", + recipe = { + { "", "pipeworks:tube_1", "" }, + { "pipeworks:tube_1", "pipeworks:tube_1", "pipeworks:tube_1" }, + { "", "pipeworks:tube_1", "" } + }, + }) +end + +if pipeworks.enable_one_way_tube then + minetest.register_node("pipeworks:one_way_tube", { + description = "One way tube", + tiles = {"pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_top.png", "pipeworks_one_way_tube_output.png", + "pipeworks_one_way_tube_input.png", "pipeworks_one_way_tube_side.png", "pipeworks_one_way_tube_top.png"}, + paramtype2 = "facedir", + drawtype = "nodebox", + paramtype = "light", + node_box = {type = "fixed", + fixed = {{-1/2, -9/64, -9/64, 1/2, 9/64, 9/64}}}, + groups = {snappy = 2, choppy = 2, oddly_breakable_by_hand = 2, tubedevice = 1}, + sounds = default.node_sound_wood_defaults(), + tube = { + connect_sides = {left = 1, right = 1}, + can_go = function(pos, node, velocity, stack) + return {velocity} + end, + can_insert = function(pos, node, stack, direction) + local dir = minetest.facedir_to_right_dir(node.param2) + return vector.equals(dir, direction) + end, + priority = 75 -- Higher than normal tubes, but lower than receivers + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, + }) + minetest.register_craft({ + output = "pipeworks:one_way_tube 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "group:stick", "default:mese_crystal", "homedecor:plastic_sheeting" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) +end diff --git a/mods/pipeworks/signal_tubes.lua b/mods/pipeworks/signal_tubes.lua new file mode 100644 index 0000000..bfce14a --- /dev/null +++ b/mods/pipeworks/signal_tubes.lua @@ -0,0 +1,111 @@ +if pipeworks.enable_detector_tube then + local detector_tube_step = 2 * tonumber(minetest.setting_get("dedicated_server_step")) + pipeworks.register_tube("pipeworks:detector_tube_on", { + description = "Detecting Pneumatic Tube Segment on (you hacker you)", + inventory_image = "pipeworks_detector_tube_inv.png", + plain = { "pipeworks_detector_tube_plain.png" }, + node_def = { + tube = {can_go = function(pos, node, velocity, stack) + local meta = minetest.get_meta(pos) + local name = minetest.get_node(pos).name + local nitems = meta:get_int("nitems")+1 + meta:set_int("nitems", nitems) + local saved_pos = vector.new(pos) + minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, saved_pos) + return pipeworks.notvel(pipeworks.meseadjlist,velocity) + end}, + groups = {mesecon = 2, not_in_creative_inventory = 1}, + drop = "pipeworks:detector_tube_off_1", + mesecons = {receptor = {state = "on", rules = pipeworks.mesecons_rules}}, + item_exit = function(pos) + local meta = minetest.get_meta(pos) + local nitems = meta:get_int("nitems")-1 + local node = minetest.get_node(pos) + local name = node.name + local fdir = node.param2 + if nitems == 0 then + minetest.set_node(pos, {name = string.gsub(name, "on", "off"), param2 = fdir}) + mesecon.receptor_off(pos, pipeworks.mesecons_rules) + else + meta:set_int("nitems", nitems) + end + end, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("nitems", 1) + local name = minetest.get_node(pos).name + local saved_pos = vector.new(pos) + minetest.after(detector_tube_step, minetest.registered_nodes[name].item_exit, saved_pos) + end, + }, + }) + pipeworks.register_tube("pipeworks:detector_tube_off", { + description = "Detecting Pneumatic Tube Segment", + inventory_image = "pipeworks_detector_tube_inv.png", + plain = { "pipeworks_detector_tube_plain.png" }, + node_def = { + tube = {can_go = function(pos, node, velocity, stack) + local node = minetest.get_node(pos) + local name = node.name + local fdir = node.param2 + minetest.set_node(pos,{name = string.gsub(name, "off", "on"), param2 = fdir}) + mesecon.receptor_on(pos, pipeworks.mesecons_rules) + return pipeworks.notvel(pipeworks.meseadjlist, velocity) + end}, + groups = {mesecon = 2}, + mesecons = {receptor = {state = "off", rules = pipeworks.mesecons_rules }}, + }, + }) + + minetest.register_craft( { + output = "pipeworks:conductor_tube_off_1 6", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "mesecons:mesecon", "mesecons:mesecon", "mesecons:mesecon" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) +end + +if pipeworks.enable_conductor_tube then + pipeworks.register_tube("pipeworks:conductor_tube_off", { + description = "Conducting Pneumatic Tube Segment", + inventory_image = "pipeworks_conductor_tube_inv.png", + short = "pipeworks_conductor_tube_short.png", + plain = { "pipeworks_conductor_tube_plain.png" }, + noctr = { "pipeworks_conductor_tube_noctr.png" }, + ends = { "pipeworks_conductor_tube_end.png" }, + node_def = { + groups = {mesecon = 2}, + mesecons = {conductor = {state = "off", + rules = pipeworks.mesecons_rules, + onstate = "pipeworks:conductor_tube_on_#id"}} + }, + }) + pipeworks.register_tube("pipeworks:conductor_tube_on", { + description = "Conducting Pneumatic Tube Segment on (you hacker you)", + inventory_image = "pipeworks_conductor_tube_inv.png", + short = "pipeworks_conductor_tube_short.png", + plain = { "pipeworks_conductor_tube_on_plain.png" }, + noctr = { "pipeworks_conductor_tube_on_noctr.png" }, + ends = { "pipeworks_conductor_tube_on_end.png" }, + node_def = { + groups = {mesecon = 2, not_in_creative_inventory = 1}, + drop = "pipeworks:conductor_tube_off_1", + mesecons = {conductor = {state = "on", + rules = pipeworks.mesecons_rules, + offstate = "pipeworks:conductor_tube_off_#id"}} + }, + }) + + minetest.register_craft( { + output = "pipeworks:detector_tube_off_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "mesecons:mesecon", "mesecons_materials:silicon", "mesecons:mesecon" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) +end + + diff --git a/mods/pipeworks/sorting_tubes.lua b/mods/pipeworks/sorting_tubes.lua new file mode 100644 index 0000000..6f47f72 --- /dev/null +++ b/mods/pipeworks/sorting_tubes.lua @@ -0,0 +1,148 @@ +if pipeworks.enable_mese_tube then + local function update_formspec(pos) + local meta = minetest.get_meta(pos) + local old_formspec = meta:get_string("formspec") + if string.find(old_formspec, "button1") then -- Old version + local inv = meta:get_inventory() + for i = 1, 6 do + for _, stack in ipairs(inv:get_list("line"..i)) do + minetest.item_drop(stack, "", pos) + end + end + end + local buttons_formspec = "" + for i = 0, 5 do + buttons_formspec = buttons_formspec .. fs_helpers.cycling_button(meta, + "image_button[7,"..(i)..";1,1", "l"..(i+1).."s", + {{text="",texture="pipeworks_button_off.png", addopts="false;false;pipeworks_button_interm.png"}, {text="",texture="pipeworks_button_on.png", addopts="false;false;pipeworks_button_interm.png"}}) + end + meta:set_string("formspec", + "size[8,11]".. + "list[context;line1;1,0;6,1;]".. + "list[context;line2;1,1;6,1;]".. + "list[context;line3;1,2;6,1;]".. + "list[context;line4;1,3;6,1;]".. + "list[context;line5;1,4;6,1;]".. + "list[context;line6;1,5;6,1;]".. + "image[0,0;1,1;pipeworks_white.png]".. + "image[0,1;1,1;pipeworks_black.png]".. + "image[0,2;1,1;pipeworks_green.png]".. + "image[0,3;1,1;pipeworks_yellow.png]".. + "image[0,4;1,1;pipeworks_blue.png]".. + "image[0,5;1,1;pipeworks_red.png]".. + buttons_formspec.. + "list[current_player;main;0,7;8,4;]") + end + + pipeworks.register_tube("pipeworks:mese_tube", { + description = "Sorting Pneumatic Tube Segment", + inventory_image = "pipeworks_mese_tube_inv.png", + noctr = {"pipeworks_mese_tube_noctr_1.png", "pipeworks_mese_tube_noctr_2.png", "pipeworks_mese_tube_noctr_3.png", + "pipeworks_mese_tube_noctr_4.png", "pipeworks_mese_tube_noctr_5.png", "pipeworks_mese_tube_noctr_6.png"}, + plain = {"pipeworks_mese_tube_plain_1.png", "pipeworks_mese_tube_plain_2.png", "pipeworks_mese_tube_plain_3.png", + "pipeworks_mese_tube_plain_4.png", "pipeworks_mese_tube_plain_5.png", "pipeworks_mese_tube_plain_6.png"}, + ends = { "pipeworks_mese_tube_end.png" }, + short = "pipeworks_mese_tube_short.png", + no_facedir = true, -- Must use old tubes, since the textures are rotated with 6d ones + node_def = { + tube = {can_go = function(pos, node, velocity, stack) + local tbl, tbln = {}, 0 + local found, foundn = {}, 0 + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local name = stack:get_name() + for i, vect in ipairs(pipeworks.meseadjlist) do + local npos = vector.add(pos, vect) + local node = minetest.get_node(npos) + local reg_node = minetest.registered_nodes[node.name] + if meta:get_int("l"..i.."s") == 1 and reg_node then + local tube_def = reg_node.tube + if not tube_def or not tube_def.can_insert or + tube_def.can_insert(npos, node, stack, vect) then + local invname = "line"..i + local is_empty = true + for _, st in ipairs(inv:get_list(invname)) do + if not st:is_empty() then + is_empty = false + if st:get_name() == name then + foundn = foundn + 1 + found[foundn] = vect + end + end + end + if is_empty then + tbln = tbln + 1 + tbl[tbln] = vect + end + end + end + end + return (foundn > 0) and found or tbl + end}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + for i = 1, 6 do + meta:set_int("l"..tostring(i).."s", 1) + inv:set_size("line"..tostring(i), 6*1) + end + update_formspec(pos) + meta:set_string("infotext", "Sorting pneumatic tube") + end, + on_punch = update_formspec, + on_receive_fields = function(pos, formname, fields, sender) + if not pipeworks.may_configure(pos, sender) then return end + fs_helpers.on_receive_fields(pos, fields) + update_formspec(pos) + end, + can_dig = function(pos, player) + update_formspec(pos) -- so non-virtual items would be dropped for old tubes + return true + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + update_formspec(pos) -- For old tubes + local inv = minetest.get_meta(pos):get_inventory() + local stack_copy = ItemStack(stack) + stack_copy:set_count(1) + inv:set_stack(listname, index, stack_copy) + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + update_formspec(pos) -- For old tubes + local inv = minetest.get_meta(pos):get_inventory() + inv:set_stack(listname, index, ItemStack("")) + return 0 + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not pipeworks.may_configure(pos, player) then return 0 end + update_formspec(pos) -- For old tubes + local inv = minetest.get_meta(pos):get_inventory() + inv:set_stack(from_list, from_index, ItemStack("")) + return 0 + end, + }, + }) + + minetest.register_craft( { + output = "pipeworks:mese_tube_000000 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "", "default:mese_crystal", "" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) + + minetest.register_craft( { + type = "shapeless", + output = "pipeworks:mese_tube_000000", + recipe = { + "pipeworks:tube_1", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment" + }, + }) +end diff --git a/mods/pipeworks/teleport_tube.lua b/mods/pipeworks/teleport_tube.lua new file mode 100644 index 0000000..3a870f5 --- /dev/null +++ b/mods/pipeworks/teleport_tube.lua @@ -0,0 +1,242 @@ +local filename=minetest.get_worldpath() .. "/teleport_tubes" + +local tp_tube_db = nil -- nil forces a read +local tp_tube_db_version = 2.0 + +local function hash(pos) + return string.format("%d", minetest.hash_node_position(pos)) +end + +local function save_tube_db() + local file, err = io.open(filename, "w") + if file then + tp_tube_db.version = tp_tube_db_version + file:write(minetest.serialize(tp_tube_db)) + tp_tube_db.version = nil + io.close(file) + else + error(err) + end +end + +local function migrate_tube_db() + local tmp_db = {} + tp_tube_db.version = nil + for key, val in pairs(tp_tube_db) do + if(val.channel ~= "") then -- skip unconfigured tubes + tmp_db[hash(val)] = val + end + end + tp_tube_db = tmp_db + save_tube_db() +end + +local function read_tube_db() + local file = io.open(filename, "r") + if file ~= nil then + local file_content = file:read("*all") + io.close(file) + + if file_content and file_content ~= "" then + tp_tube_db = minetest.deserialize(file_content) + if(not tp_tube_db.version or tonumber(tp_tube_db.version) < tp_tube_db_version) then + migrate_tube_db() + end + tp_tube_db.version = nil -- we add it back when saving + return tp_tube_db -- we read sucessfully + end + end + tp_tube_db = {} + return tp_tube_db +end + +-- updates or adds a tube +local function set_tube(pos, channel, can_receive) + local tubes = tp_tube_db or read_tube_db() + local hash = hash(pos) + local tube = tubes[hash] + if tube then + tube.channel = channel + tube.cr = can_receive + save_tube_db() + return + end + + -- we haven't found any tp tube to update, so lets add it + tp_tube_db[hash] = {x=pos.x,y=pos.y,z=pos.z,channel=channel,cr=can_receive} + save_tube_db() +end + +local function remove_tube(pos) + local tubes = tp_tube_db or read_tube_db() + tubes[hash(pos)] = nil + save_tube_db() +end + +local function read_node_with_vm(pos) + local vm = VoxelManip() + local MinEdge, MaxEdge = vm:read_from_map(pos, pos) + local data = vm:get_data() + local area = VoxelArea:new({MinEdge = MinEdge, MaxEdge = MaxEdge}) + return minetest.get_name_from_content_id(data[area:index(pos.x, pos.y, pos.z)]) +end + +local function get_receivers(pos, channel) + local tubes = tp_tube_db or read_tube_db() + local receivers = {} + local dirty = false + for key, val in pairs(tubes) do + -- skip all non-receivers and the tube that it came from as early as possible, as this is called often + if (val.cr == 1 and val.channel == channel and (val.x ~= pos.x or val.y ~= pos.y or val.z ~= pos.z)) then + local is_loaded = (minetest.get_node_or_nil(val) ~= nil) + local node_name = is_loaded and minetest.get_node(pos).name or read_node_with_vm(val) + + if minetest.registered_nodes[node_name] and minetest.registered_nodes[node_name].is_teleport_tube then + table.insert(receivers, val) + else + tp_tube_db[key] = nil + dirty = true + end + end + end + if dirty then + save_tube_db() + end + return receivers +end + +local function update_meta(meta, can_receive) + meta:set_int("can_receive", can_receive and 1 or 0) + local cr_state = can_receive and "on" or "off" + meta:set_string("formspec","size[8.6,2.2]".. + "field[0.6,0.6;7,1;channel;Channel:;${channel}]".. + "label[7.3,0;Receive]".. + "image_button[7.3,0.3;1,1;pipeworks_button_" .. cr_state .. ".png;cr" .. (can_receive and 0 or 1) .. ";;;false;pipeworks_button_interm.png]".. + "image[0.3,1.3;1,1;pipeworks_teleport_tube_inv.png]".. + "label[1.6,1.2;channels are public by default]" .. + "label[1.6,1.5;use : for fully private channels]" .. + "label[1.6,1.8;use \\; for private receivers]" .. + default.gui_bg.. + default.gui_bg_img) +end + +pipeworks.register_tube("pipeworks:teleport_tube", { + description = "Teleporting Pneumatic Tube Segment", + inventory_image = "pipeworks_teleport_tube_inv.png", + noctr = { "pipeworks_teleport_tube_noctr.png" }, + plain = { "pipeworks_teleport_tube_plain.png" }, + ends = { "pipeworks_teleport_tube_end.png" }, + short = "pipeworks_teleport_tube_short.png", + node_def = { + is_teleport_tube = true, + tube = { + can_go = function(pos,node,velocity,stack) + velocity.x = 0 + velocity.y = 0 + velocity.z = 0 + + local channel = minetest.get_meta(pos):get_string("channel") + if channel == "" then return {} end + + local target = get_receivers(pos, channel) + if target[1] == nil then return {} end + + local d = math.random(1,#target) + pos.x = target[d].x + pos.y = target[d].y + pos.z = target[d].z + return pipeworks.meseadjlist + end + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + update_meta(meta, true) + meta:set_string("infotext", "unconfigured Teleportation Tube") + end, + on_receive_fields = function(pos,formname,fields,sender) + if not fields.channel -- ignore escaping or clientside manipulation of the form + or not pipeworks.may_configure(pos, sender) then + return + end + local new_channel = tostring(fields.channel):trim() + + local meta = minetest.get_meta(pos) + local can_receive = meta:get_int("can_receive") + + -- check for private channels each time before actually changing anything + -- to not even allow switching between can_receive states of private channels + if new_channel ~= "" then + local sender_name = sender:get_player_name() + local name, mode = new_channel:match("^([^:;]+)([:;])") + if name and mode and name ~= sender_name then + --channels starting with '[name]:' can only be used by the named player + if mode == ":" then + minetest.chat_send_player(sender_name, "Sorry, channel '"..new_channel.."' is reserved for exclusive use by "..name) + return + + --channels starting with '[name];' can be used by other players, but cannot be received from + elseif mode == ";" and (fields.cr1 or (can_receive ~= 0 and not fields.cr0)) then + minetest.chat_send_player(sender_name, "Sorry, receiving from channel '"..new_channel.."' is reserved for "..name) + return + end + end + end + + local dirty = false + + -- was the channel changed? + local channel = meta:get_string("channel") + if new_channel ~= channel then + channel = new_channel + meta:set_string("channel", channel) + dirty = true + end + + -- test if a can_receive button was pressed + if fields.cr0 and can_receive ~= 0 then + can_receive = 0 + update_meta(meta, false) + dirty = true + elseif fields.cr1 and can_receive ~= 1 then + can_receive = 1 + update_meta(meta, true) + dirty = true + end + + -- save if we changed something, handle the empty channel while we're at it + if dirty then + if channel ~= "" then + set_tube(pos, channel, can_receive) + local cr_description = (can_receive == 1) and "sending and receiving" or "sending" + meta:set_string("infotext", string.format("Teleportation Tube %s on '%s'", cr_description, channel)) + else + -- remove empty channel tubes, to not have to search through them + remove_tube(pos) + meta:set_string("infotext", "unconfigured Teleportation Tube") + end + end + end, + on_destruct = function(pos) + remove_tube(pos) + end + }, +}) +minetest.register_craft( { + output = "pipeworks:teleport_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:desert_stone", "default:mese", "default:desert_stone" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, +}) + +if minetest.get_modpath("mesecons_mvps") ~= nil then + mesecon.register_on_mvps_move(function(moved_nodes) + for _, n in ipairs(moved_nodes) do + if string.find(n.node.name, "pipeworks:teleport_tube") ~= nil then + local meta = minetest.get_meta(n.pos) + set_tube(n.pos, meta:get_string("channel"), meta:get_int("can_receive")) + end + end + end) +end diff --git a/mods/pipeworks/textures/homedecor_oil_extract.png b/mods/pipeworks/textures/homedecor_oil_extract.png new file mode 100644 index 0000000..48e6dff Binary files /dev/null and b/mods/pipeworks/textures/homedecor_oil_extract.png differ diff --git a/mods/pipeworks/textures/homedecor_paraffin.png b/mods/pipeworks/textures/homedecor_paraffin.png new file mode 100644 index 0000000..77d2bbd Binary files /dev/null and b/mods/pipeworks/textures/homedecor_paraffin.png differ diff --git a/mods/pipeworks/textures/homedecor_plastic_sheeting.png b/mods/pipeworks/textures/homedecor_plastic_sheeting.png new file mode 100644 index 0000000..034dcc2 Binary files /dev/null and b/mods/pipeworks/textures/homedecor_plastic_sheeting.png differ diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_end.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_end.png new file mode 100644 index 0000000..f841d20 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_accelerator_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_inv.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_inv.png new file mode 100644 index 0000000..3f68082 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_accelerator_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_noctr.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_noctr.png new file mode 100644 index 0000000..61a46a3 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_accelerator_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_plain.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_plain.png new file mode 100644 index 0000000..0baa541 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_accelerator_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_accelerator_tube_short.png b/mods/pipeworks/textures/pipeworks_accelerator_tube_short.png new file mode 100644 index 0000000..4f389d9 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_accelerator_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_autocrafter.png b/mods/pipeworks/textures/pipeworks_autocrafter.png new file mode 100644 index 0000000..6c7c84d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_autocrafter.png differ diff --git a/mods/pipeworks/textures/pipeworks_black.png b/mods/pipeworks/textures/pipeworks_black.png new file mode 100644 index 0000000..34afad8 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_black.png differ diff --git a/mods/pipeworks/textures/pipeworks_blue.png b/mods/pipeworks/textures/pipeworks_blue.png new file mode 100644 index 0000000..64c8a6f Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_blue.png differ diff --git a/mods/pipeworks/textures/pipeworks_button_interm.png b/mods/pipeworks/textures/pipeworks_button_interm.png new file mode 100644 index 0000000..7541a2e Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_button_interm.png differ diff --git a/mods/pipeworks/textures/pipeworks_button_off.png b/mods/pipeworks/textures/pipeworks_button_off.png new file mode 100644 index 0000000..1933742 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_button_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_button_on.png b/mods/pipeworks/textures/pipeworks_button_on.png new file mode 100644 index 0000000..bb34ceb Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_button_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_end.png b/mods/pipeworks/textures/pipeworks_conductor_tube_end.png new file mode 100644 index 0000000..49bf788 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_inv.png b/mods/pipeworks/textures/pipeworks_conductor_tube_inv.png new file mode 100644 index 0000000..bffb5ae Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_noctr.png b/mods/pipeworks/textures/pipeworks_conductor_tube_noctr.png new file mode 100644 index 0000000..2cbd109 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_on_end.png b/mods/pipeworks/textures/pipeworks_conductor_tube_on_end.png new file mode 100644 index 0000000..1fd0c53 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_on_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_on_noctr.png b/mods/pipeworks/textures/pipeworks_conductor_tube_on_noctr.png new file mode 100644 index 0000000..934ca1d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_on_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_on_plain.png b/mods/pipeworks/textures/pipeworks_conductor_tube_on_plain.png new file mode 100644 index 0000000..ecf3eaa Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_on_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_plain.png b/mods/pipeworks/textures/pipeworks_conductor_tube_plain.png new file mode 100644 index 0000000..2c4ad99 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_conductor_tube_short.png b/mods/pipeworks/textures/pipeworks_conductor_tube_short.png new file mode 100644 index 0000000..7ec809a Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_conductor_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_crossing_tube_end.png b/mods/pipeworks/textures/pipeworks_crossing_tube_end.png new file mode 100644 index 0000000..7b51ce3 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_crossing_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_crossing_tube_inv.png b/mods/pipeworks/textures/pipeworks_crossing_tube_inv.png new file mode 100644 index 0000000..a547f05 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_crossing_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_crossing_tube_noctr.png b/mods/pipeworks/textures/pipeworks_crossing_tube_noctr.png new file mode 100644 index 0000000..fdef1be Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_crossing_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_crossing_tube_plain.png b/mods/pipeworks/textures/pipeworks_crossing_tube_plain.png new file mode 100644 index 0000000..385c7e7 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_crossing_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_crossing_tube_short.png b/mods/pipeworks/textures/pipeworks_crossing_tube_short.png new file mode 100644 index 0000000..ef191de Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_crossing_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_back.png b/mods/pipeworks/textures/pipeworks_deployer_back.png new file mode 100644 index 0000000..4e08be3 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_back.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_bottom.png b/mods/pipeworks/textures/pipeworks_deployer_bottom.png new file mode 100644 index 0000000..b5ebd43 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_bottom.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_front_off.png b/mods/pipeworks/textures/pipeworks_deployer_front_off.png new file mode 100644 index 0000000..323cdaa Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_front_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_front_on.png b/mods/pipeworks/textures/pipeworks_deployer_front_on.png new file mode 100644 index 0000000..38caed6 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_front_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_side.png b/mods/pipeworks/textures/pipeworks_deployer_side.png new file mode 100644 index 0000000..2527f6e Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_side.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_side1.png b/mods/pipeworks/textures/pipeworks_deployer_side1.png new file mode 100644 index 0000000..2527f6e Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_side1.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_side2.png b/mods/pipeworks/textures/pipeworks_deployer_side2.png new file mode 100644 index 0000000..032d471 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_side2.png differ diff --git a/mods/pipeworks/textures/pipeworks_deployer_top.png b/mods/pipeworks/textures/pipeworks_deployer_top.png new file mode 100644 index 0000000..6e3f9d0 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_deployer_top.png differ diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_end.png b/mods/pipeworks/textures/pipeworks_detector_tube_end.png new file mode 100644 index 0000000..e9d01ba Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_detector_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_inv.png b/mods/pipeworks/textures/pipeworks_detector_tube_inv.png new file mode 100644 index 0000000..84cae45 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_detector_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_noctr.png b/mods/pipeworks/textures/pipeworks_detector_tube_noctr.png new file mode 100644 index 0000000..6f07886 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_detector_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_plain.png b/mods/pipeworks/textures/pipeworks_detector_tube_plain.png new file mode 100644 index 0000000..d99cddc Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_detector_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_detector_tube_short.png b/mods/pipeworks/textures/pipeworks_detector_tube_short.png new file mode 100644 index 0000000..6729c53 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_detector_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_back.png b/mods/pipeworks/textures/pipeworks_dispenser_back.png new file mode 100644 index 0000000..ce447bd Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_back.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_bottom.png b/mods/pipeworks/textures/pipeworks_dispenser_bottom.png new file mode 100644 index 0000000..16dc584 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_bottom.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_front_off.png b/mods/pipeworks/textures/pipeworks_dispenser_front_off.png new file mode 100644 index 0000000..b0c9e4a Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_front_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_front_on.png b/mods/pipeworks/textures/pipeworks_dispenser_front_on.png new file mode 100644 index 0000000..c9fff11 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_front_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_side1.png b/mods/pipeworks/textures/pipeworks_dispenser_side1.png new file mode 100644 index 0000000..bd17852 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_side1.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_side2.png b/mods/pipeworks/textures/pipeworks_dispenser_side2.png new file mode 100644 index 0000000..005d9a5 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_side2.png differ diff --git a/mods/pipeworks/textures/pipeworks_dispenser_top.png b/mods/pipeworks/textures/pipeworks_dispenser_top.png new file mode 100644 index 0000000..7dd49ad Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_dispenser_top.png differ diff --git a/mods/pipeworks/textures/pipeworks_entry_panel.png b/mods/pipeworks/textures/pipeworks_entry_panel.png new file mode 100644 index 0000000..040f408 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_entry_panel.png differ diff --git a/mods/pipeworks/textures/pipeworks_filter_input.png b/mods/pipeworks/textures/pipeworks_filter_input.png new file mode 100644 index 0000000..e57a5ec Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_filter_input.png differ diff --git a/mods/pipeworks/textures/pipeworks_filter_output.png b/mods/pipeworks/textures/pipeworks_filter_output.png new file mode 100644 index 0000000..e0ae622 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_filter_output.png differ diff --git a/mods/pipeworks/textures/pipeworks_filter_side.png b/mods/pipeworks/textures/pipeworks_filter_side.png new file mode 100644 index 0000000..6645948 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_filter_side.png differ diff --git a/mods/pipeworks/textures/pipeworks_filter_top.png b/mods/pipeworks/textures/pipeworks_filter_top.png new file mode 100644 index 0000000..c1c130c Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_filter_top.png differ diff --git a/mods/pipeworks/textures/pipeworks_flow_sensor_off.png b/mods/pipeworks/textures/pipeworks_flow_sensor_off.png new file mode 100644 index 0000000..10c6846 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_flow_sensor_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_flow_sensor_on.png b/mods/pipeworks/textures/pipeworks_flow_sensor_on.png new file mode 100644 index 0000000..03e054a Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_flow_sensor_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_fountainhead.png b/mods/pipeworks/textures/pipeworks_fountainhead.png new file mode 100644 index 0000000..4affa69 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_fountainhead.png differ diff --git a/mods/pipeworks/textures/pipeworks_grating_sides.png b/mods/pipeworks/textures/pipeworks_grating_sides.png new file mode 100644 index 0000000..a8b0b09 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_grating_sides.png differ diff --git a/mods/pipeworks/textures/pipeworks_grating_top.png b/mods/pipeworks/textures/pipeworks_grating_top.png new file mode 100644 index 0000000..e56cf3a Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_grating_top.png differ diff --git a/mods/pipeworks/textures/pipeworks_green.png b/mods/pipeworks/textures/pipeworks_green.png new file mode 100644 index 0000000..3f42f9f Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_green.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_input.png b/mods/pipeworks/textures/pipeworks_mese_filter_input.png new file mode 100644 index 0000000..d0353a7 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_filter_input.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_output.png b/mods/pipeworks/textures/pipeworks_mese_filter_output.png new file mode 100644 index 0000000..35db0fe Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_filter_output.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_side.png b/mods/pipeworks/textures/pipeworks_mese_filter_side.png new file mode 100644 index 0000000..f2793b1 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_filter_side.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_filter_top.png b/mods/pipeworks/textures/pipeworks_mese_filter_top.png new file mode 100644 index 0000000..7b8e2b1 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_filter_top.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_end.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_end.png new file mode 100644 index 0000000..d8e7c37 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_sand_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_inv.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_inv.png new file mode 100644 index 0000000..c2471db Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_sand_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_noctr.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_noctr.png new file mode 100644 index 0000000..9e41bc8 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_sand_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_plain.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_plain.png new file mode 100644 index 0000000..aa0b399 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_sand_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_sand_tube_short.png b/mods/pipeworks/textures/pipeworks_mese_sand_tube_short.png new file mode 100644 index 0000000..a0eeedf Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_sand_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_end.png b/mods/pipeworks/textures/pipeworks_mese_tube_end.png new file mode 100644 index 0000000..3b15d7a Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_inv.png b/mods/pipeworks/textures/pipeworks_mese_tube_inv.png new file mode 100644 index 0000000..9b3c5a6 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_1.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_1.png new file mode 100644 index 0000000..da29b06 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_1.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_2.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_2.png new file mode 100644 index 0000000..1f37163 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_2.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_3.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_3.png new file mode 100644 index 0000000..1371ce7 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_3.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_4.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_4.png new file mode 100644 index 0000000..bca7439 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_4.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_5.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_5.png new file mode 100644 index 0000000..2cc44d4 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_5.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_noctr_6.png b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_6.png new file mode 100644 index 0000000..d93213d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_noctr_6.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_1.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_1.png new file mode 100644 index 0000000..517f5a4 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_plain_1.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_2.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_2.png new file mode 100644 index 0000000..6323492 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_plain_2.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_3.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_3.png new file mode 100644 index 0000000..820597b Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_plain_3.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_4.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_4.png new file mode 100644 index 0000000..bc19da2 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_plain_4.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_5.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_5.png new file mode 100644 index 0000000..f781787 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_plain_5.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_plain_6.png b/mods/pipeworks/textures/pipeworks_mese_tube_plain_6.png new file mode 100644 index 0000000..863059f Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_plain_6.png differ diff --git a/mods/pipeworks/textures/pipeworks_mese_tube_short.png b/mods/pipeworks/textures/pipeworks_mese_tube_short.png new file mode 100644 index 0000000..fae64c4 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_mese_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_back.png b/mods/pipeworks/textures/pipeworks_nodebreaker_back.png new file mode 100644 index 0000000..e964bdf Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_back.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_off.png new file mode 100644 index 0000000..c7a48d4 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_on.png new file mode 100644 index 0000000..e14ca32 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_bottom_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_front_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_front_off.png new file mode 100644 index 0000000..36a5a50 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_front_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_front_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_front_on.png new file mode 100644 index 0000000..bf7fe70 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_front_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_side1_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_side1_off.png new file mode 100644 index 0000000..30769fa Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_side1_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_side1_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_side1_on.png new file mode 100644 index 0000000..ff0a893 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_side1_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_side2_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_side2_off.png new file mode 100644 index 0000000..babb681 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_side2_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_side2_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_side2_on.png new file mode 100644 index 0000000..ed0e12e Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_side2_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_top_off.png b/mods/pipeworks/textures/pipeworks_nodebreaker_top_off.png new file mode 100644 index 0000000..fb86b95 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_top_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_nodebreaker_top_on.png b/mods/pipeworks/textures/pipeworks_nodebreaker_top_on.png new file mode 100644 index 0000000..97da74d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_nodebreaker_top_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_input.png b/mods/pipeworks/textures/pipeworks_one_way_tube_input.png new file mode 100644 index 0000000..0226cef Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_one_way_tube_input.png differ diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_output.png b/mods/pipeworks/textures/pipeworks_one_way_tube_output.png new file mode 100644 index 0000000..0226cef Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_one_way_tube_output.png differ diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_side.png b/mods/pipeworks/textures/pipeworks_one_way_tube_side.png new file mode 100644 index 0000000..174b133 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_one_way_tube_side.png differ diff --git a/mods/pipeworks/textures/pipeworks_one_way_tube_top.png b/mods/pipeworks/textures/pipeworks_one_way_tube_top.png new file mode 100644 index 0000000..9b9be73 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_one_way_tube_top.png differ diff --git a/mods/pipeworks/textures/pipeworks_pane_embedded_tube_ends.png b/mods/pipeworks/textures/pipeworks_pane_embedded_tube_ends.png new file mode 100644 index 0000000..93cc2d0 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pane_embedded_tube_ends.png differ diff --git a/mods/pipeworks/textures/pipeworks_pane_embedded_tube_sides.png b/mods/pipeworks/textures/pipeworks_pane_embedded_tube_sides.png new file mode 100644 index 0000000..53874e9 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pane_embedded_tube_sides.png differ diff --git a/mods/pipeworks/textures/pipeworks_pipe_3_empty.png b/mods/pipeworks/textures/pipeworks_pipe_3_empty.png new file mode 100644 index 0000000..d13ec77 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pipe_3_empty.png differ diff --git a/mods/pipeworks/textures/pipeworks_pipe_3_loaded.png b/mods/pipeworks/textures/pipeworks_pipe_3_loaded.png new file mode 100644 index 0000000..c086e19 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pipe_3_loaded.png differ diff --git a/mods/pipeworks/textures/pipeworks_pipe_inv.png b/mods/pipeworks/textures/pipeworks_pipe_inv.png new file mode 100644 index 0000000..aeec393 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pipe_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_pipe_plain.png b/mods/pipeworks/textures/pipeworks_pipe_plain.png new file mode 100644 index 0000000..7cbc11b Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pipe_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_plastic_sheeting.png b/mods/pipeworks/textures/pipeworks_plastic_sheeting.png new file mode 100644 index 0000000..1386b19 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_plastic_sheeting.png differ diff --git a/mods/pipeworks/textures/pipeworks_pump_off.png b/mods/pipeworks/textures/pipeworks_pump_off.png new file mode 100644 index 0000000..3dbd2b0 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pump_off.png differ diff --git a/mods/pipeworks/textures/pipeworks_pump_on.png b/mods/pipeworks/textures/pipeworks_pump_on.png new file mode 100644 index 0000000..7c16d5d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_pump_on.png differ diff --git a/mods/pipeworks/textures/pipeworks_red.png b/mods/pipeworks/textures/pipeworks_red.png new file mode 100644 index 0000000..33812bd Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_red.png differ diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_end.png b/mods/pipeworks/textures/pipeworks_sand_tube_end.png new file mode 100644 index 0000000..16945da Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_sand_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_inv.png b/mods/pipeworks/textures/pipeworks_sand_tube_inv.png new file mode 100644 index 0000000..aa2a72a Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_sand_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_noctr.png b/mods/pipeworks/textures/pipeworks_sand_tube_noctr.png new file mode 100644 index 0000000..cbb3a09 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_sand_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_plain.png b/mods/pipeworks/textures/pipeworks_sand_tube_plain.png new file mode 100644 index 0000000..71deecc Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_sand_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_sand_tube_short.png b/mods/pipeworks/textures/pipeworks_sand_tube_short.png new file mode 100644 index 0000000..89c4713 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_sand_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_spigot.png b/mods/pipeworks/textures/pipeworks_spigot.png new file mode 100644 index 0000000..a79dbf8 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_spigot.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_back.png b/mods/pipeworks/textures/pipeworks_storage_tank_back.png new file mode 100644 index 0000000..3b6a16b Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_back.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_fittings.png b/mods/pipeworks/textures/pipeworks_storage_tank_fittings.png new file mode 100644 index 0000000..f3b8b24 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_fittings.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_0.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_0.png new file mode 100644 index 0000000..c91466f Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_0.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_1.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_1.png new file mode 100644 index 0000000..6656834 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_1.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_10.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_10.png new file mode 100644 index 0000000..f48a738 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_10.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_2.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_2.png new file mode 100644 index 0000000..a36bc24 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_2.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_3.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_3.png new file mode 100644 index 0000000..d237dd5 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_3.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_4.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_4.png new file mode 100644 index 0000000..47d9669 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_4.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_5.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_5.png new file mode 100644 index 0000000..17eaf69 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_5.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_6.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_6.png new file mode 100644 index 0000000..77619e3 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_6.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_7.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_7.png new file mode 100644 index 0000000..ffebf9b Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_7.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_8.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_8.png new file mode 100644 index 0000000..4974a82 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_8.png differ diff --git a/mods/pipeworks/textures/pipeworks_storage_tank_front_9.png b/mods/pipeworks/textures/pipeworks_storage_tank_front_9.png new file mode 100644 index 0000000..87b6d79 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_storage_tank_front_9.png differ diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_end.png b/mods/pipeworks/textures/pipeworks_teleport_tube_end.png new file mode 100644 index 0000000..09ee3fb Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_teleport_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_inv.png b/mods/pipeworks/textures/pipeworks_teleport_tube_inv.png new file mode 100644 index 0000000..305d867 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_teleport_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_noctr.png b/mods/pipeworks/textures/pipeworks_teleport_tube_noctr.png new file mode 100644 index 0000000..3d10b41 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_teleport_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_plain.png b/mods/pipeworks/textures/pipeworks_teleport_tube_plain.png new file mode 100644 index 0000000..23a793d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_teleport_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_teleport_tube_short.png b/mods/pipeworks/textures/pipeworks_teleport_tube_short.png new file mode 100644 index 0000000..e0a15b9 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_teleport_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_testobject.png b/mods/pipeworks/textures/pipeworks_testobject.png new file mode 100644 index 0000000..5e26cbe Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_testobject.png differ diff --git a/mods/pipeworks/textures/pipeworks_trashcan_bottom.png b/mods/pipeworks/textures/pipeworks_trashcan_bottom.png new file mode 100644 index 0000000..91fd944 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_trashcan_bottom.png differ diff --git a/mods/pipeworks/textures/pipeworks_trashcan_side.png b/mods/pipeworks/textures/pipeworks_trashcan_side.png new file mode 100644 index 0000000..cf0a3bf Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_trashcan_side.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_connection_metallic.png b/mods/pipeworks/textures/pipeworks_tube_connection_metallic.png new file mode 100644 index 0000000..10becfe Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_connection_metallic.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_connection_stony.png b/mods/pipeworks/textures/pipeworks_tube_connection_stony.png new file mode 100644 index 0000000..78a9979 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_connection_stony.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_connection_wooden.png b/mods/pipeworks/textures/pipeworks_tube_connection_wooden.png new file mode 100644 index 0000000..36548df Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_connection_wooden.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_end.png b/mods/pipeworks/textures/pipeworks_tube_end.png new file mode 100644 index 0000000..e9d01ba Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_end.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_inv.png b/mods/pipeworks/textures/pipeworks_tube_inv.png new file mode 100644 index 0000000..51c728d Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_inv.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_noctr.png b/mods/pipeworks/textures/pipeworks_tube_noctr.png new file mode 100644 index 0000000..6f07886 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_noctr.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_plain.png b/mods/pipeworks/textures/pipeworks_tube_plain.png new file mode 100644 index 0000000..9d6442b Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_plain.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_short.png b/mods/pipeworks/textures/pipeworks_tube_short.png new file mode 100644 index 0000000..6729c53 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_short.png differ diff --git a/mods/pipeworks/textures/pipeworks_tube_transparent.png b/mods/pipeworks/textures/pipeworks_tube_transparent.png new file mode 100644 index 0000000..52a8348 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_tube_transparent.png differ diff --git a/mods/pipeworks/textures/pipeworks_valve.png b/mods/pipeworks/textures/pipeworks_valve.png new file mode 100644 index 0000000..60ef960 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_valve.png differ diff --git a/mods/pipeworks/textures/pipeworks_white.png b/mods/pipeworks/textures/pipeworks_white.png new file mode 100644 index 0000000..faf0ec1 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_white.png differ diff --git a/mods/pipeworks/textures/pipeworks_yellow.png b/mods/pipeworks/textures/pipeworks_yellow.png new file mode 100644 index 0000000..ce1af41 Binary files /dev/null and b/mods/pipeworks/textures/pipeworks_yellow.png differ diff --git a/mods/pipeworks/trashcan.lua b/mods/pipeworks/trashcan.lua new file mode 100644 index 0000000..87980ab --- /dev/null +++ b/mods/pipeworks/trashcan.lua @@ -0,0 +1,49 @@ +minetest.register_node("pipeworks:trashcan", { + description = "Trash Can", + drawtype = "normal", + tiles = { + "pipeworks_trashcan_bottom.png", + "pipeworks_trashcan_bottom.png", + "pipeworks_trashcan_side.png", + "pipeworks_trashcan_side.png", + "pipeworks_trashcan_side.png", + "pipeworks_trashcan_side.png", + }, + groups = {snappy = 3, tubedevice = 1, tubedevice_receiver = 1}, + tube = { + insert_object = function(pos, node, stack, direction) + return ItemStack("") + end, + connect_sides = {left = 1, right = 1, front = 1, back = 1, top = 1, bottom = 1}, + priority = 1, -- Lower than anything else + }, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "size[8,7]".. + "item_image[0,0;1,1;pipeworks:trashcan]".. + "label[1,0;Trash Can]".. + "list[context;trash;3.5,1;1,1;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + default.get_hotbar_bg(0,3) .. + "list[current_player;main;0,3;8,4;]") + meta:set_string("infotext", "Trash Can") + meta:get_inventory():set_size("trash", 1) + end, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.get_meta(pos):get_inventory():set_stack(listname, index, ItemStack("")) + end, +}) + +minetest.register_craft({ + output = "pipeworks:trashcan", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "default:steel_ingot", "", "default:steel_ingot" }, + { "default:steel_ingot", "default:steel_ingot", "default:steel_ingot" }, + }, +}) diff --git a/mods/pipeworks/tube_registration.lua b/mods/pipeworks/tube_registration.lua new file mode 100644 index 0000000..c926216 --- /dev/null +++ b/mods/pipeworks/tube_registration.lua @@ -0,0 +1,240 @@ +-- This file supplies the various kinds of pneumatic tubes + +local tubenodes = {} +pipeworks.tubenodes = tubenodes + +minetest.register_alias("pipeworks:tube", "pipeworks:tube_000000") + +-- now, a function to define the tubes + +local REGISTER_COMPATIBILITY = true + +local vti = {4, 3, 2, 1, 6, 5} + +local default_noctrs = { "pipeworks_tube_noctr.png" } +local default_plain = { "pipeworks_tube_plain.png" } +local default_ends = { "pipeworks_tube_end.png" } + +local texture_mt = { + __index = function(table, key) + local size, idx = #table, tonumber(key) + if size > 0 then -- avoid endless loops with empty tables + while idx > size do idx = idx - size end + return table[idx] + end + end +} + +local register_one_tube = function(name, tname, dropname, desc, plain, noctrs, ends, short, inv, special, connects, style) + noctrs = noctrs or default_noctrs + setmetatable(noctrs, texture_mt) + plain = plain or default_plain + setmetatable(plain, texture_mt) + ends = ends or default_ends + setmetatable(ends, texture_mt) + short = short or "pipeworks_tube_short.png" + inv = inv or "pipeworks_tube_inv.png" + + local outboxes = {} + local outsel = {} + local outimgs = {} + + for i = 1, 6 do + outimgs[vti[i]] = plain[i] + end + + for _, v in ipairs(connects) do + table.extend(outboxes, pipeworks.tube_boxes[v]) + table.insert(outsel, pipeworks.tube_selectboxes[v]) + outimgs[vti[v]] = noctrs[v] + end + + if #connects == 1 then + local v = connects[1] + v = v-1 + 2*(v%2) -- Opposite side + outimgs[vti[v]] = ends[v] + end + + local tgroups = {snappy = 3, tube = 1, tubedevice = 1, not_in_creative_inventory = 1} + local tubedesc = string.format("%s %s... You hacker, you.", desc, dump(connects)) + local iimg = plain[1] + local wscale = {x = 1, y = 1, z = 1} + + if #connects == 0 then + tgroups = {snappy = 3, tube = 1, tubedevice = 1} + tubedesc = desc + iimg=inv + outimgs = { + short, short, + ends[3],ends[4], + short, short + } + outboxes = { -24/64, -9/64, -9/64, 24/64, 9/64, 9/64 } + outsel = { -24/64, -10/64, -10/64, 24/64, 10/64, 10/64 } + wscale = {x = 1, y = 1, z = 0.01} + end + + local rname = string.format("%s_%s", name, tname) + table.insert(tubenodes, rname) + + local nodedef = { + description = tubedesc, + drawtype = "nodebox", + tiles = outimgs, + sunlight_propagates = true, + inventory_image = iimg, + wield_image = iimg, + wield_scale = wscale, + paramtype = "light", + selection_box = { + type = "fixed", + fixed = outsel + }, + node_box = { + type = "fixed", + fixed = outboxes + }, + groups = tgroups, + sounds = default.node_sound_wood_defaults(), + walkable = true, + stack_max = 99, + basename = name, + style = style, + drop = string.format("%s_%s", name, dropname), + tubelike = 1, + tube = { + connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}, + priority = 50 + }, + after_place_node = pipeworks.after_place, + after_dig_node = pipeworks.after_dig + } + if style == "6d" then + nodedef.paramtype2 = "facedir" + end + + if special == nil then special = {} end + + for key, value in pairs(special) do + --if key == "after_dig_node" or key == "after_place_node" then + -- nodedef[key.."_"] = value + if key == "groups" then + for group, val in pairs(value) do + nodedef.groups[group] = val + end + elseif key == "tube" then + for key, val in pairs(value) do + nodedef.tube[key] = val + end + else + nodedef[key] = table.recursive_replace(value, "#id", tname) + end + end + + minetest.register_node(rname, nodedef) +end + +local register_all_tubes = function(name, desc, plain, noctrs, ends, short, inv, special, old_registration) + if old_registration then + for xm = 0, 1 do + for xp = 0, 1 do + for ym = 0, 1 do + for yp = 0, 1 do + for zm = 0, 1 do + for zp = 0, 1 do + local connects = {} + if xm == 1 then + connects[#connects+1] = 1 + end + if xp == 1 then + connects[#connects+1] = 2 + end + if ym == 1 then + connects[#connects+1] = 3 + end + if yp == 1 then + connects[#connects+1] = 4 + end + if zm == 1 then + connects[#connects+1] = 5 + end + if zp == 1 then + connects[#connects+1] = 6 + end + local tname = xm..xp..ym..yp..zm..zp + register_one_tube(name, tname, "000000", desc, plain, noctrs, ends, short, inv, special, connects, "old") + end + end + end + end + end + end + else + -- 6d tubes: uses only 10 nodes instead of 64, but the textures must be rotated + local cconnects = {{}, {1}, {1, 2}, {1, 3}, {1, 3, 5}, {1, 2, 3}, {1, 2, 3, 5}, {1, 2, 3, 4}, {1, 2, 3, 4, 5}, {1, 2, 3, 4, 5, 6}} + for index, connects in ipairs(cconnects) do + register_one_tube(name, tostring(index), "1", desc, plain, noctrs, ends, short, inv, special, connects, "6d") + end + if REGISTER_COMPATIBILITY then + local cname = name.."_compatibility" + minetest.register_node(cname, { + drawtype = "airlike", + style = "6d", + basename = name, + inventory_image = inv, + wield_image = inv, + paramtype = "light", + sunlight_propagates = true, + description = "Pneumatic tube segment (legacy)", + after_place_node = pipeworks.after_place, + groups = {not_in_creative_inventory = 1, tube_to_update = 1, tube = 1}, + tube = {connect_sides = {front = 1, back = 1, left = 1, right = 1, top = 1, bottom = 1}}, + drop = name.."_1", + }) + table.insert(tubenodes, cname) + for xm = 0, 1 do + for xp = 0, 1 do + for ym = 0, 1 do + for yp = 0, 1 do + for zm = 0, 1 do + for zp = 0, 1 do + local tname = xm..xp..ym..yp..zm..zp + minetest.register_alias(name.."_"..tname, cname) + end + end + end + end + end + end + end + end +end + +pipeworks.register_tube = function(name, def, ...) + if type(def) == "table" then + register_all_tubes(name, def.description, + def.plain, def.noctr, def.ends, def.short, + def.inventory_image, def.node_def, def.no_facedir) + else + -- we assert to be the old function with the second parameter being the description + -- function(name, desc, plain, noctrs, ends, short, inv, special, old_registration) + assert(type(def) == "string", "invalid arguments to pipeworks.register_tube") + register_all_tubes(name, def, ...) + end +end + + +if REGISTER_COMPATIBILITY then + minetest.register_abm({ + nodenames = {"group:tube_to_update"}, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local minp = vector.subtract(pos, 1) + local maxp = vector.add(pos, 1) + if table.getn(minetest.find_nodes_in_area(minp, maxp, "ignore")) == 0 then + pipeworks.scan_for_tube_objects(pos) + end + end + }) +end diff --git a/mods/pipeworks/vacuum_tubes.lua b/mods/pipeworks/vacuum_tubes.lua new file mode 100644 index 0000000..2c14781 --- /dev/null +++ b/mods/pipeworks/vacuum_tubes.lua @@ -0,0 +1,122 @@ +if pipeworks.enable_sand_tube then + pipeworks.register_tube("pipeworks:sand_tube", { + description = "Vacuuming Pneumatic Tube Segment", + inventory_image = "pipeworks_sand_tube_inv.png", + short = "pipeworks_sand_tube_short.png", + noctr = { "pipeworks_sand_tube_noctr.png" }, + plain = { "pipeworks_sand_tube_plain.png" }, + ends = { "pipeworks_sand_tube_end.png" }, + node_def = { groups = {vacuum_tube = 1}}, + }) + + minetest.register_craft( { + output = "pipeworks:sand_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "group:sand", "group:sand", "group:sand" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) + + minetest.register_craft( { + output = "pipeworks:sand_tube_1", + recipe = { + { "group:sand", "pipeworks:tube_1", "group:sand" }, + }, + }) +end + +if pipeworks.enable_mese_sand_tube then + pipeworks.register_tube("pipeworks:mese_sand_tube", { + description = "Adjustable Vacuuming Pneumatic Tube Segment", + inventory_image = "pipeworks_mese_sand_tube_inv.png", + short = "pipeworks_mese_sand_tube_short.png", + noctr = { "pipeworks_mese_sand_tube_noctr.png" }, + plain = { "pipeworks_mese_sand_tube_plain.png" }, + ends = { "pipeworks_mese_sand_tube_end.png" }, + node_def = { + groups = {vacuum_tube = 1}, + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_int("dist", 0) + meta:set_string("formspec", "size[2.1,0.8]".. + "image[0,0;1,1;pipeworks_mese_sand_tube_inv.png]".. + "field[1.3,0.4;1,1;dist;radius;${dist}]".. + default.gui_bg.. + default.gui_bg_img) + meta:set_string("infotext", "Adjustable Vacuuming Pneumatic Tube Segment") + end, + on_receive_fields = function(pos,formname,fields,sender) + if not pipeworks.may_configure(pos, sender) then return end + local meta = minetest.get_meta(pos) + local dist = tonumber(fields.dist) + if dist then + dist = math.max(0, dist) + dist = math.min(8, dist) + meta:set_int("dist", dist) + meta:set_string("infotext", ("Adjustable Vacuuming Pneumatic Tube Segment (%dm)"):format(dist)) + end + end, + }, + }) + + minetest.register_craft( { + output = "pipeworks:mese_sand_tube_1 2", + recipe = { + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" }, + { "group:sand", "default:mese_crystal", "group:sand" }, + { "homedecor:plastic_sheeting", "homedecor:plastic_sheeting", "homedecor:plastic_sheeting" } + }, + }) + + minetest.register_craft( { + type = "shapeless", + output = "pipeworks:mese_sand_tube_1", + recipe = { + "pipeworks:sand_tube_1", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment", + "default:mese_crystal_fragment" + }, + }) +end + +local sqrt_3 = math.sqrt(3) +local tube_inject_item = pipeworks.tube_inject_item +local get_objects_inside_radius = minetest.get_objects_inside_radius +local function vacuum(pos, radius) + radius = radius + 0.5 + for _, object in pairs(get_objects_inside_radius(pos, sqrt_3 * radius)) do + local lua_entity = object:get_luaentity() + if not object:is_player() and lua_entity and lua_entity.name == "__builtin:item" then + local obj_pos = object:getpos() + local x1, y1, z1 = pos.x, pos.y, pos.z + local x2, y2, z2 = obj_pos.x, obj_pos.y, obj_pos.z + + if x1 - radius <= x2 and x2 <= x1 + radius + and y1 - radius <= y2 and y2 <= y1 + radius + and z1 - radius <= z2 and z2 <= z1 + radius then + if lua_entity.itemstring ~= "" then + tube_inject_item(pos, pos, vector.new(0, 0, 0), lua_entity.itemstring) + lua_entity.itemstring = "" + end + object:remove() + end + end + end +end + +minetest.register_abm({nodenames = {"group:vacuum_tube"}, + interval = 1, + chance = 1, + label = "Vacuum tubes", + action = function(pos, node, active_object_count, active_object_count_wider) + if node.name == "pipeworks:sand_tube" then + vacuum(pos, 2) + else + local radius = minetest.get_meta(pos):get_int("dist") + vacuum(pos, radius) + end + end +}) diff --git a/mods/pipeworks/wielder.lua b/mods/pipeworks/wielder.lua new file mode 100644 index 0000000..f4bdcfe --- /dev/null +++ b/mods/pipeworks/wielder.lua @@ -0,0 +1,424 @@ +local assumed_eye_pos = vector.new(0, 1.5, 0) + +local function vector_copy(v) + return { x = v.x, y = v.y, z = v.z } +end + +local function delay(x) + return (function() return x end) +end + +local function set_wielder_formspec(data, meta) + meta:set_string("formspec", + "invsize[8,"..(6+data.wield_inv_height)..";]".. + "item_image[0,0;1,1;"..data.name_base.."_off]".. + "label[1,0;"..minetest.formspec_escape(data.description).."]".. + "list[current_name;"..minetest.formspec_escape(data.wield_inv_name)..";"..((8-data.wield_inv_width)*0.5)..",1;"..data.wield_inv_width..","..data.wield_inv_height..";]".. + "list[current_player;main;0,"..(2+data.wield_inv_height)..";8,4;]") + meta:set_string("infotext", data.description) +end + +local function wielder_on(data, wielder_pos, wielder_node) + data.fixup_node(wielder_pos, wielder_node) + if wielder_node.name ~= data.name_base.."_off" then return end + wielder_node.name = data.name_base.."_on" + minetest.swap_node(wielder_pos, wielder_node) + nodeupdate(wielder_pos) + local wielder_meta = minetest.get_meta(wielder_pos) + local inv = wielder_meta:get_inventory() + local wield_inv_name = data.wield_inv_name + local wieldindex, wieldstack + for i, stack in ipairs(inv:get_list(wield_inv_name)) do + if not stack:is_empty() then + wieldindex = i + wieldstack = stack + break + end + end + if not wieldindex then + if not data.ghost_inv_name then return end + wield_inv_name = data.ghost_inv_name + inv:set_stack(wield_inv_name, 1, ItemStack(data.ghost_tool)) + wieldindex = 1 + wieldstack = inv:get_stack(wield_inv_name, 1) + end + local dir = minetest.facedir_to_dir(wielder_node.param2) + -- under/above is currently intentionally left switched + -- even though this causes some problems with deployers and e.g. seeds + -- as there are some issues related to nodebreakers otherwise breaking 2 nodes afar. + -- solidity would have to be checked as well, + -- but would open a whole can of worms related to difference in nodebreaker/deployer behavior + -- and the problems of wielders acting on themselves if below is solid + local under_pos = vector.subtract(wielder_pos, dir) + local above_pos = vector.subtract(under_pos, dir) + local pitch + local yaw + if dir.z < 0 then + yaw = 0 + pitch = 0 + elseif dir.z > 0 then + yaw = math.pi + pitch = 0 + elseif dir.x < 0 then + yaw = 3*math.pi/2 + pitch = 0 + elseif dir.x > 0 then + yaw = math.pi/2 + pitch = 0 + elseif dir.y > 0 then + yaw = 0 + pitch = -math.pi/2 + else + yaw = 0 + pitch = math.pi/2 + end + local virtplayer = { + get_inventory_formspec = delay(wielder_meta:get_string("formspec")), + get_look_dir = delay(vector.multiply(dir, -1)), + get_look_pitch = delay(pitch), + get_look_yaw = delay(yaw), + get_player_control = delay({ jump=false, right=false, left=false, LMB=false, RMB=false, sneak=data.sneak, aux1=false, down=false, up=false }), + get_player_control_bits = delay(data.sneak and 64 or 0), + get_player_name = delay(data.masquerade_as_owner and wielder_meta:get_string("owner") or ":pipeworks:"..minetest.pos_to_string(wielder_pos)), + is_player = delay(true), + is_fake_player = true, + set_inventory_formspec = delay(), + getpos = delay(vector.subtract(wielder_pos, assumed_eye_pos)), + get_hp = delay(20), + get_inventory = delay(inv), + get_wielded_item = delay(wieldstack), + get_wield_index = delay(wieldindex), + get_wield_list = delay(wield_inv_name), + moveto = delay(), + punch = delay(), + remove = delay(), + right_click = delay(), + setpos = delay(), + set_hp = delay(), + set_properties = delay(), + set_wielded_item = function(self, item) + wieldstack = item + inv:set_stack(wield_inv_name, wieldindex, item) + end, + set_animation = delay(), + set_attach = delay(), + set_detach = delay(), + set_bone_position = delay(), + } + local pointed_thing = { type="node", under=under_pos, above=above_pos } + data.act(virtplayer, pointed_thing) + if data.eject_drops then + for i, stack in ipairs(inv:get_list("main")) do + if not stack:is_empty() then + pipeworks.tube_inject_item(wielder_pos, wielder_pos, dir, stack) + inv:set_stack("main", i, ItemStack("")) + end + end + end +end + +local function wielder_off(data, pos, node) + if node.name == data.name_base.."_on" then + node.name = data.name_base.."_off" + minetest.swap_node(pos, node) + nodeupdate(pos) + end +end + +local function register_wielder(data) + data.fixup_node = data.fixup_node or function (pos, node) end + data.fixup_oldmetadata = data.fixup_oldmetadata or function (m) return m end + for _, state in ipairs({ "off", "on" }) do + local groups = { snappy=2, choppy=2, oddly_breakable_by_hand=2, mesecon=2, tubedevice=1, tubedevice_receiver=1 } + if state == "on" then groups.not_in_creative_inventory = 1 end + local tile_images = {} + for _, face in ipairs({ "top", "bottom", "side2", "side1", "back", "front" }) do + table.insert(tile_images, data.texture_base.."_"..face..(data.texture_stateful[face] and "_"..state or "")..".png") + end + minetest.register_node(data.name_base.."_"..state, { + description = data.description, + tiles = tile_images, + mesecons = { + effector = { + rules = pipeworks.rules_all, + action_on = function (pos, node) + wielder_on(data, pos, node) + end, + action_off = function (pos, node) + wielder_off(data, pos, node) + end, + }, + }, + tube = { + can_insert = function(pos, node, stack, tubedir) + if not data.tube_permit_anteroposterior_insert then + local nodedir = minetest.facedir_to_dir(node.param2) + if vector.equals(tubedir, nodedir) or vector.equals(tubedir, vector.multiply(nodedir, -1)) then + return false + end + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item(data.wield_inv_name, stack) + end, + insert_object = function(pos, node, stack, tubedir) + if not data.tube_permit_anteroposterior_insert then + local nodedir = minetest.facedir_to_dir(node.param2) + if vector.equals(tubedir, nodedir) or vector.equals(tubedir, vector.multiply(nodedir, -1)) then + return stack + end + end + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:add_item(data.wield_inv_name, stack) + end, + input_inventory = data.wield_inv_name, + connect_sides = data.tube_connect_sides, + can_remove = function(pos, node, stack, tubedir) + return stack:get_count() + end, + }, + is_ground_content = true, + paramtype2 = "facedir", + tubelike = 1, + groups = groups, + sounds = default.node_sound_stone_defaults(), + drop = data.name_base.."_off", + on_construct = function(pos) + local meta = minetest.get_meta(pos) + set_wielder_formspec(data, meta) + local inv = meta:get_inventory() + inv:set_size(data.wield_inv_name, data.wield_inv_width*data.wield_inv_height) + if data.ghost_inv_name then + inv:set_size(data.ghost_inv_name, 1) + end + if data.eject_drops then + inv:set_size("main", 100) + end + end, + after_place_node = function (pos, placer) + pipeworks.scan_for_tube_objects(pos) + local placer_pos = placer:getpos() + if placer_pos and placer:is_player() then placer_pos = vector.add(placer_pos, assumed_eye_pos) end + if placer_pos then + local dir = vector.subtract(pos, placer_pos) + local node = minetest.get_node(pos) + node.param2 = minetest.dir_to_facedir(dir, true) + minetest.set_node(pos, node) + minetest.log("action", "real (6d) facedir: " .. node.param2) + end + minetest.get_meta(pos):set_string("owner", placer:get_player_name()) + end, + can_dig = (data.can_dig_nonempty_wield_inv and delay(true) or function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty(data.wield_inv_name) + end), + after_dig_node = function(pos, oldnode, oldmetadata, digger) + -- The legacy-node fixup is done here in a + -- different form from the standard fixup, + -- rather than relying on a standard fixup + -- in an on_dig callback, because some + -- non-standard diggers (such as technic's + -- mining drill) don't respect on_dig. + oldmetadata = data.fixup_oldmetadata(oldmetadata) + for _, stack in ipairs(oldmetadata.inventory[data.wield_inv_name] or {}) do + if not stack:is_empty() then + minetest.add_item(pos, stack) + end + end + pipeworks.scan_for_tube_objects(pos) + end, + on_punch = data.fixup_node, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + return stack:get_count() + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if not pipeworks.may_configure(pos, player) then return 0 end + return stack:get_count() + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if not pipeworks.may_configure(pos, player) then return 0 end + return count + end + }) + end +end + +if pipeworks.enable_node_breaker then + local data + data = { + name_base = "pipeworks:nodebreaker", + description = "Node Breaker", + texture_base = "pipeworks_nodebreaker", + texture_stateful = { top = true, bottom = true, side2 = true, side1 = true, front = true }, + tube_connect_sides = { top=1, bottom=1, left=1, right=1, back=1 }, + tube_permit_anteroposterior_insert = false, + wield_inv_name = "pick", + wield_inv_width = 1, + wield_inv_height = 1, + can_dig_nonempty_wield_inv = true, + ghost_inv_name = "ghost_pick", + ghost_tool = "default:pick_mese", + fixup_node = function (pos, node) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + -- Node breakers predating the visible pick slot + -- may have been partially updated. This code + -- fully updates them. Some have been observed + -- to have no pick slot at all; first add one. + if inv:get_size("pick") ~= 1 then + inv:set_size("pick", 1) + end + -- Originally, they had a ghost pick in a "pick" + -- inventory, no other inventory, and no form. + -- The partial update of early with-form node + -- breaker code gives them "ghost_pick" and "main" + -- inventories, but leaves the old ghost pick in + -- the "pick" inventory, and doesn't add a form. + -- First perform that partial update. + if inv:get_size("ghost_pick") ~= 1 then + inv:set_size("ghost_pick", 1) + inv:set_size("main", 100) + end + -- If the node breaker predates the visible pick + -- slot, which we can detect by it not having a + -- form, then the pick slot needs to be cleared + -- of the old ghost pick. + if (meta:get_string("formspec") or "") == "" then + inv:set_stack("pick", 1, ItemStack("")) + end + -- Finally, unconditionally set the formspec + -- and infotext. This not only makes the + -- pick slot visible for node breakers where + -- it wasn't before; it also updates the form + -- for node breakers that had an older version + -- of the form, and sets infotext where it was + -- missing for early with-form node breakers. + set_wielder_formspec(data, meta) + end, + fixup_oldmetadata = function (oldmetadata) + -- Node breakers predating the visible pick slot, + -- with node form, kept their ghost pick in an + -- inventory named "pick", the same name as the + -- later visible pick slot. The pick must be + -- removed to avoid spilling it. + if not oldmetadata.fields.formspec then + return { inventory = { pick = {} }, fields = oldmetadata.fields } + else + return oldmetadata + end + end, + masquerade_as_owner = true, + sneak = false, + act = function(virtplayer, pointed_thing) + local wieldstack = virtplayer:get_wielded_item() + local oldwieldstack = ItemStack(wieldstack) + local on_use = (minetest.registered_items[wieldstack:get_name()] or {}).on_use + if on_use then + wieldstack = on_use(wieldstack, virtplayer, pointed_thing) or wieldstack + virtplayer:set_wielded_item(wieldstack) + else + local under_node = minetest.get_node(pointed_thing.under) + local on_dig = (minetest.registered_nodes[under_node.name] or {on_dig=minetest.node_dig}).on_dig + on_dig(pointed_thing.under, under_node, virtplayer) + wieldstack = virtplayer:get_wielded_item() + end + local wieldname = wieldstack:get_name() + if wieldname == oldwieldstack:get_name() then + -- don't mechanically wear out tool + if wieldstack:get_count() == oldwieldstack:get_count() and + wieldstack:get_metadata() == oldwieldstack:get_metadata() and + ((minetest.registered_items[wieldstack:get_name()] or {}).wear_represents or "mechanical_wear") == "mechanical_wear" then + virtplayer:set_wielded_item(oldwieldstack) + end + elseif wieldname ~= "" then + -- tool got replaced by something else: + -- treat it as a drop + virtplayer:get_inventory():add_item("main", wieldstack) + virtplayer:set_wielded_item(ItemStack("")) + end + end, + eject_drops = true, + } + register_wielder(data) + minetest.register_craft({ + output = "pipeworks:nodebreaker_off", + recipe = { + { "group:wood", "default:pick_mese", "group:wood" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } + }) + -- aliases for when someone had technic installed, but then uninstalled it but not pipeworks + minetest.register_alias("technic:nodebreaker_off", "pipeworks:nodebreaker_off") + minetest.register_alias("technic:nodebreaker_on", "pipeworks:nodebreaker_on") + minetest.register_alias("technic:node_breaker_off", "pipeworks:nodebreaker_off") + minetest.register_alias("technic:node_breaker_on", "pipeworks:nodebreaker_on") + -- turn legacy auto-tree-taps into node breakers + dofile(pipeworks.modpath.."/legacy.lua") +end + +if pipeworks.enable_deployer then + register_wielder({ + name_base = "pipeworks:deployer", + description = "Deployer", + texture_base = "pipeworks_deployer", + texture_stateful = { front = true }, + tube_connect_sides = { back=1 }, + tube_permit_anteroposterior_insert = true, + wield_inv_name = "main", + wield_inv_width = 3, + wield_inv_height = 3, + can_dig_nonempty_wield_inv = false, + masquerade_as_owner = true, + sneak = false, + act = function(virtplayer, pointed_thing) + local wieldstack = virtplayer:get_wielded_item() + virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_place=minetest.item_place}).on_place(wieldstack, virtplayer, pointed_thing) or wieldstack) + end, + eject_drops = false, + }) + minetest.register_craft({ + output = "pipeworks:deployer_off", + recipe = { + { "group:wood", "default:chest", "group:wood" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } + }) + -- aliases for when someone had technic installed, but then uninstalled it but not pipeworks + minetest.register_alias("technic:deployer_off", "pipeworks:deployer_off") + minetest.register_alias("technic:deployer_on", "pipeworks:deployer_on") +end + +if pipeworks.enable_dispenser then + register_wielder({ + name_base = "pipeworks:dispenser", + description = "Dispenser", + texture_base = "pipeworks_dispenser", + texture_stateful = { front = true }, + tube_connect_sides = { back=1 }, + tube_permit_anteroposterior_insert = true, + wield_inv_name = "main", + wield_inv_width = 3, + wield_inv_height = 3, + can_dig_nonempty_wield_inv = false, + masquerade_as_owner = false, + sneak = true, + act = function(virtplayer, pointed_thing) + local wieldstack = virtplayer:get_wielded_item() + virtplayer:set_wielded_item((minetest.registered_items[wieldstack:get_name()] or {on_drop=minetest.item_drop}).on_drop(wieldstack, virtplayer, virtplayer:getpos()) or wieldstack) + end, + eject_drops = false, + }) + minetest.register_craft({ + output = "pipeworks:dispenser_off", + recipe = { + { "default:desert_sand", "default:chest", "default:desert_sand" }, + { "default:stone", "mesecons:piston", "default:stone" }, + { "default:stone", "mesecons:mesecon", "default:stone" }, + } + }) +end diff --git a/mods/plants_lib/API.txt b/mods/plants_lib/API.txt new file mode 100644 index 0000000..8f6455c --- /dev/null +++ b/mods/plants_lib/API.txt @@ -0,0 +1,579 @@ +This document describes the Plantlife mod API. + +Last revision: 2015-02-16 + + +========= +Functions +========= + +There are three main functions defined by the main "plants_lib" mod: + +spawn_on_surfaces() +register_generate_plant() +grow_plants() + +There are also several internal, helper functions that can be called if so +desired, but they are not really intended for use by other mods and may change +at any time. They are briefly described below these main functions, but see +init.lua for details. + +Most functions in plants lib are declared locally to avoid namespace +collisions with other mods. They are accessible via the "plantslib" method, +e.g. plantslib:spawn_on_surfaces() and so forth. + +===== +spawn_on_surfaces(biome) +spawn_on_surfaces(sdelay, splant, sradius, schance, ssurface, savoid) + +This first function is an ABM-based spawner function originally created as +part of Ironzorg's flowers mod. It has since been largely extended and +expanded. There are two ways to call this function: You can either pass it +several individual string and number parameters to use the legacy interface, +or you can pass a single biome definition as a table, with all of your options +spelled out nicely. This is the preferred method. + +When used with the legacy interface, you must specify the parameters exactly +in order, with the first five being mandatory (even if some are set to nil), +and the last one being optional: + +sdelay: The value passed to the ABM's interval parameter, in seconds. +splant: The node name of the item to spawn (e.g. + "flowers:flower_rose"). A plant will of course only be + spawned if the node about to be replaced is air. +sradius: Don't spawn within this many nodes of the avoid items + mentioned below. If set to nil, this check is skipped. +schance: The value passed to the ABM's chance parameter, normally in + the 10-100 range (1-in-X chance of operating on a given node) +ssurface: String with the name of the node on which to spawn the plant + in question, such as "default:sand" or + "default:dirt_with_grass". It is not recommended to put air, + stone, or plain dirt here if you can use some other node, as + doing so will cause the engine to process potentially large + numbers of such nodes when deciding when to execute the ABM + and where it should operate. +savoid: Table with a list of groups and/or node names to avoid when + spawning the plant, such as {"group:flowers", "default:tree"}. + +When passed a table as the argument, and thus using the modern calling method, +you must pass a number of arguments in the form of an ordinary keyed-value +table. Below is a list of everything supported by this function: + +biome = { + spawn_plants = something, -- [*] String or table; see below. + spawn_delay = number, -- same as sdelay, above. + spawn_chance = number, -- same as schance, above. + spawn_surfaces = {table}, -- List of node names on which the plants + -- should be spawned. As with the single-node "ssurface" + -- option in the legacy API, you should not put stone, air, + -- etc. here. + + ---- From here down are a number of optional parameters. You will + ---- most likely want to use at least some of these to limit how and + ---- where your objects are spawned. + + avoid_nodes = {table}, -- same meaning as savoid, above + avoid_radius = num, -- same as sradius + seed_diff = num, -- The Perlin seed difference value passed to the + -- minetest.get_perlin() function. Used along with + -- the global Perlin controls below to create the + -- "biome" in which the plants will spawn. Defaults + -- to 0 if not provided. + light_min = num, -- Minimum amount of light necessary to make a plant + -- spawn. Defaults to 0. + light_max = num, -- Maximum amount of light needed to spawn. Defaults + -- to the engine's MAX_LIGHT value of 14. + neighbors = {table}, -- List of neighboring nodes that need to be + -- immediately next to the node the plant is about to + -- spawn on. Can also be a string with a single node + -- name. It is both passed to the ABM as the + -- "neighbors" parameter, and is used to manually + -- check the adjacent nodes. It only takes one of + -- these for the spawn routine to mark the target as + -- spawnable. Defaults to nil (ignored). + ncount = num, -- There must be at least this many of the above + -- neighbors in the eight spaces immediately + -- surrounding the node the plant is about to spawn on + -- for it to happen. If not provided, this check is + -- disabled. + facedir = num, -- The value passed to the param2 variable when adding + -- the node to the map. Defaults to 0. Be sure that + -- the value you use here (and the range thereof) is + -- appropriate for the type of node you're spawning. + random_facedir = {table}, -- If set, the table should contain two values. + -- If they're both provided, the spawned plant will be + -- given a random facedir value in the range specified + -- by these two numbers. Overrides the facedir + -- parameter above, if it exists. Use {0,3} if you + -- want the full range for wallmounted nodes, or {2,5} + -- for most everything else, or any other pair of + -- numbers appropriate for the node you want to spawn. + depth_max = num, -- If the object spawns on top of a water source, the + -- water must be at most this deep. Defaults to 1. + min_elevation = num, -- Surface must be at this altitude or higher to + -- spawn at all. Defaults to -31000... + max_elevation = num, -- ...but must be no higher than this altitude. + -- Defaults to +31000. + near_nodes = {table}, -- List of nodes that must be somewhere in the + -- vicinity in order for the plant to spawn. Can also + -- be a string with a single node name. If not + -- provided, this check is disabled. + near_nodes_size = num, -- How large of an area to check for the above + -- node. Specifically, this checks a flat, horizontal + -- area centered on the node to be spawned on. + -- Defaults to 0, but is ignored if the above + -- near_nodes value is not set. + near_nodes_vertical = num, -- Used with the size value above, this extends + -- the vertical range of the near nodes search. + -- Basically, this turns the flat region described + -- above into a cuboid region. The area to be checked + -- will extend this high and this low above/below the + -- target node, centered thereon. Defaults to 1 (only + -- check the layer above, the layer at, and the layer + -- below the target node), but is ignored if + -- near_nodes is not set. + near_nodes_count = num, -- How many of the above nodes must be within that + -- radius. Defaults to 1 but is ignored if near_nodes + -- isn't set. Bear in mind that the total area to be + -- checked is equal to: + -- (near_nodes_size^2)*near_nodes_vertical*2 + -- For example, if size is 10 and vertical is 4, then + -- the area is (10^2)*8 = 800 nodes in size, so you'll + -- want to make sure you specify a value appropriate + -- for the size of the area being tested. + air_size = num, -- How large of an area to check for air above and + -- around the target. If omitted, only the space + -- above the target is checked. This does not check + -- for air at the sides or below the target. + air_count = num, -- How many of the surrounding nodes need to be air + -- for the above check to return true. If omitted, + -- only the space above the target is checked. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Minimum temperature needed for the desired object + -- to spawn. This is a 2d Perlin value, which has an + -- inverted range of +1 to -1. Larger values + -- represent *colder* temperatures, so this value is + -- actually the upper end of the desired Perlin range. + -- See the temperature map section at the bottom of + -- this document for details on how these values work. + -- Defaults to +1 (unlimited coldness). + temp_max = num, -- Maximum temperature/lower end of the Perlin range. + -- Defaults to -1 (unlimited heat). + humidity_min = num, -- Minimum humidity for the plant to spawn in. Like + -- the temperature map, this is a Perlin value where + -- lower numbers mean more humidity in the area. + -- Defaults to +1 (0% humidity). + humidity_max = num, -- Maximum humidity for the plant to spawn at. + -- Defaults to -1 (100% humidity). + verticals_list = {table}, -- List of nodes that should be considered to be + -- natural walls. + alt_wallnode = "string", -- If specified, this node will be substituted in + -- place of the plant(s) defined by spawn_plants + -- above, if the spawn target has one or more adjacent + -- walls. In such a case, the two above facedir + -- parameters will be ignored. + spawn_on_side = bool, -- Set this to true to immediately spawn the node on + -- one side of the target node rather than the top. + -- The code will search for an airspace to the side of + -- the target, then spawn the plant at the first one + -- found. The above facedir and random_facedir + -- parameters are ignored in this case. If the above + -- parameters for selecting generic wall nodes are + -- provided, this option is ignored. Important note: + -- the facedir values assigned by this option only + -- make sense with wallmounted nodes (nodes which + -- don't use facedir won't be affected). + choose_random_wall = bool, -- if set to true, and searching for walls is + -- being done, just pick any random wall if there is + -- one, rather than returning the first one. + spawn_on_bottom = bool, -- If set to true, spawn the object below the + -- target node instead of above it. The above + -- spawn_on_side variable takes precedence over this + -- one if both happen to be true. When using this + -- option with the random facedir function above, the + -- values given to the facedir parameter are for + -- regular nodes, not wallmounted. + spawn_replace_node = bool, -- If set to true, the target node itself is + -- replaced by the spawned object. Overrides the + -- spawn_on_bottom and spawn_on_side settings. +} + +[*] spawn_plants must be either a table or a string. If it's a table, the +values therein are treated as a list of nodenames to pick from randomly on +each application of the ABM code. The more nodes you can pack into this +parameter to avoid making too many calls to this function, the lower the CPU +load will likely be. + +You can also specify a string containing the name of a function to execute. +In this case, the function will be passed a single position parameter +indicating where the function should place the desired object, and the checks +for spawning on top vs. sides vs. bottom vs. replacing the target node will be +skipped. + +By default, if a biome node, size, and count are not defined, the biome +checking is disabled. Same holds true for the nneighbors bit above that. + + +===== +plantslib:register_generate_plant(biome, nodes_or_function_or_treedef) + +To register an object to be spawned at mapgen time rather than via an ABM, +call this function with two parameters: a table with your object's biome +information, and a string, function, or table describing what to do if the +engine finds a suitable surface node (see below). + +The biome table contains quite a number of options, though there are fewer +here than are available in the ABM-based spawner, as some stuff doesn't make +sense at map-generation time. + +biome = { + surface = something, -- What node(s). May be a string such as + -- "default:dirt_with_grass" or a table with + -- multiple such entries. + + ---- Everything else is optional, but you'll definitely want to use + ---- some of these other fields to limit where and under what + ---- conditions the objects are spawned. + + below_nodes = {table}, -- List of nodes that must be below the target + -- node. Useful in snow biomes to keep objects from + -- spawning in snow that's on the wrong surface for + -- that object. + avoid_nodes = {table}, -- List of nodes to avoid when spawning. Groups are + -- not supported here. + avoid_radius = num, -- How much distance to leave between the object to be + -- added and the objects to be avoided. If this or + -- the avoid_nodes value is nil/omitted, this check is + -- skipped. Avoid using excessively large radii. + rarity = num, -- How rare should this object be in its biome? Larger + -- values make objects more rare, via: + -- math.random(1,100) > this + max_count = num, -- The absolute maximum number of your object that + -- should be allowed to spawn in a 5x5x5 mapblock area + -- (80x80x80 nodes). Defaults to 5, but be sure you + -- set this to some reasonable value depending on your + -- object and its size if 5 is insufficient. + seed_diff = num, -- Perlin seed-diff value. Defaults to 0, which + -- causes the function to inherit the global value of + -- 329. + neighbors = {table}, -- What ground nodes must be right next to and at the + -- same elevation as the node to be spawned on. + ncount = num, -- At least this many of the above nodes must be next + -- to the node to spawn on. Any value greater than 8 + -- will probably cause the code to never spawn + -- anything. Defaults to 0. + depth = num, -- How deep/thick of a layer the spawned-on node must + -- be. Typically used for water. + min_elevation = num, -- Minimum elevation in meters/nodes. Defaults to + -- -31000 (unlimited). + max_elevation = num, -- Max elevation. Defaults to +31000 (unlimited). + near_nodes = {table}, -- what nodes must be in the general vicinity of the + -- object being spawned. + near_nodes_size = num, -- how wide of a search area to look for the nodes + -- in that list. + near_nodes_vertical = num, -- How high/low of an area to search from the + -- target node. + near_nodes_count = num, -- at least this many of those nodes must be in + -- the area. + plantlife_limit = num, -- The value compared against the generic "plants + -- can grow here" Perlin noise layer. Smaller numbers + -- result in more abundant plants. Range of -1 to +1, + -- with values in the range of about 0 to 0.5 being + -- most useful. Defaults to 0.1. + temp_min = num, -- Coldest allowable temperature for a plant to spawn + -- (that is, the largest Perlin value). + temp_max = num, -- warmest allowable temperature to spawn a plant + -- (lowest Perlin value). + verticals_list = {table}, -- Same as with the spawn_on_surfaces function. + check_air = bool, -- Flag to tell the mapgen code to check for air above + -- the spawn target. Defaults to true if not + -- explicitly set to false. Set this to false VERY + -- SPARINGLY, as it will slow the map generator down. + delete_above = bool, -- Flag to tell the mapgen code to delete the two + -- nodes directly above the spawn target just before + -- adding the plant or tree. Useful when generating + -- in snow biomes. Defaults to false. + delete_above_surround = bool, -- Flag to tell the mapgen code to also + -- delete the five nodes surrounding the above space, + -- and the five nodes above those, resulting in a two- + -- node-deep cross-shaped empty region above/around + -- the spawn target. Useful when adding trees to snow + -- biomes. Defaults to false. + spawn_replace_node = bool, -- same as with the ABM spawner. + random_facedir = {table}, -- same as with the ABM spawner. +} + +Regarding nodes_or_function_or_treedef, this must either be a string naming +a node to spawn, a table with a list of nodes to choose from, a table with an +L-Systems tree definition, or a function. + +If you specified a string, the code will attempt to determine whether that +string specifies a valid node name. If it does, that node will be placed on +top of the target position directly (unless one of the other mapgen options +directs the code to do otherwise). + +If you specified a table and there is no "axiom" field, the code assumes that +it is a list of nodes. Simply name one node per entry in the list, e.g. +{"default:junglegrass", "default:dry_shrub"} and so on, for as many nodes as +you want to list. A random node from the list will be chosen each time the +code goes to place a node. + +If you specified a table, and there *is* an "axiom" field, the code assumes +that this table contains an L-Systems tree definition, which will be passed +directly to the engine's spawn_tree() function along with the position on +which to spawn the tree. + +You can also supply a function to be directly executed, which is given the +current node position (the usual "pos" table format) as its sole argument. It +will be called in the form: + + somefunction(pos) + + +===== +plantslib:grow_plants(options) + +The third function, grow_plants() is used to turn the spawned nodes above +into something else over time. This function has no return value, and accepts +a biome definition table as the only parameter. These are defined like so: + +options = { + grow_plant = "string", -- Name of the node to be grown into something + -- else. This value is passed to the ABM as the + -- "nodenames" parameter, so it is the plants + -- themselves that are the ABM trigger, rather than + -- the ground they spawned on. A plant will only grow + -- if the node above it is air. Can also be a table, + -- but note that all nodes referenced therein will be + -- grown into the same object. + grow_delay = num, -- Passed as the ABM "interval" parameter, as with + -- spawning. + grow_chance = num, -- Passed as the ABM "chance" parameter. + grow_result = "string", -- Name of the node into which the grow_plant + -- node(s) should transform when the ABM executes. + + ---- Everything from here down is optional. + + dry_early_node = "string", -- This value is ignored except for jungle + -- grass (a corner case needed by that mod), where it + -- indicates which node the grass must be on in order + -- for it to turn from the short size to + -- "default:dry_shrub" instead of the medium size. + grow_nodes = {table}, -- One of these nodes must be under the plant in + -- order for it to grow at all. Normally this should + -- be the same as the list of surfaces passed to the + -- spawning ABM as the "nodenames" parameter. This is + -- so that the plant can be manually placed on + -- something like a flower pot or something without it + -- necessarily growing and perhaps dieing. Defaults + -- to "default:dirt_with_grass". + facedir = num, -- Same as with spawning a plant. + need_wall = bool, -- Set this to true if you the plant needs to grow + -- against a wall. Defaults to false. + verticals_list = {table}, -- same as with spawning a plant. + choose_random_wall = bool, -- same as with spawning a plant. + grow_vertically = bool, -- Set this to true if the plant needs to grow + -- vertically, as in climbing poison ivy. Defaults to + -- false. + height_limit = num, -- Set this to limit how tall the desired node can + -- grow. The mod will search straight down from the + -- position being spawned at to find a ground node, + -- set via the field below. Defaults to 5 nodes. + ground_nodes = {table}, -- What nodes should be treated as "the ground" + -- below a vertically-growing plant. Usually this + -- should be the same as the grow_nodes table, but + -- might also include, for example, water or some + -- other surrounding material. Defaults to + -- "default:dirt_with_grass". + grow_function = something, -- [*] see below. + seed_diff = num, -- [*] see below. +} + +[*] grow_function can take one of three possible settings: it can be nil (or + not provided), a string, or a table. + +If it is not provided or it's set to nil, all of the regular growing code is +executed normally, the value of seed_diff, if any, is ignored, and the node to +be placed is assumed to be specified in the grow_result variable. + +If this value is set to a simple string, this is treated as the name of the +function to use to grow the plant. In this case, all of the usual growing +code is executeed, but then instead of a plant being simply added to the +world, grow_result is ignored and the named function is executed and passed a +few parmeters in the following general form: + + somefunction(pos, perlin1, perlin2) + +These values represent the current position (the usual table), the Perlin +noise value for that spot in the generic "plants can grow here" map for the +seed_diff value above, the Perlin value for that same spot from the +temperature map, and the detected neighboring wall face, if there was one (or +nil if not). If seed_diff is not provided, it defaults to 0. + +If this variable is instead set to a table, it is treated an an L-Systems tree +definition. All of the growing code is executed in the usual manner, then the +tree described by that definition is spawned at the current position instead, +and grow_result is ignored. + + +===== +find_adjacent_wall(pos, verticals, randomflag) + +Of the few helper functions, this one expects a position parameter and a table +with the list of nodes that should be considered as walls. The code will +search around the given position for a neighboring wall, returning the first +one it finds as a facedir value, or nil if there are no adjacent walls. + +If randomflag is set to true, the function will just return the facedir of any +random wall it finds adjacent to the target position. Defaults to false if +not specified. + +===== +is_node_loaded(pos) + +This acts as a wrapper for the minetest.get_node_or_nil(node_pos) +function and accepts a single position parameter. Returns true if the node in +question is already loaded, or false if not. + + +===== +dbg(string) + +This is a simple debug output function which takes one string parameter. It +just checks if DEBUG is true and outputs the phrase "[Plantlife] " followed by +the supplied string, via the print() function, if so. + +===== +plantslib:generate_tree(pos, treemodel) +plantslib:grow_tree(pos, treemodel) + +In the case of the growing code and the mapgen-based tree generator code, +generating a tree is done via the above two calls, which in turn immediately +call the usual spawn_tree() functions. This rerouting exists as a way for +other mods to hook into plants_lib's tree-growing functions in general, +perhaps to execute something extra whenever a tree is spawned. + +plantslib:generate_tree(pos, treemodel) is called any time a tree is spawned +at map generation time. 'pos' is the position of the block on which the tree +is to be placed. 'treemodel' is the standard L-Systems tree definition table +expected by the spawn_tree() function. Refer to the 'trunk' field in that +table to derive the name of the tree being spawned. + +plantslib:grow_tree(pos, treemodel) does the same sort of thing whenever a +tree is spawned within the abm-based growing code, for example when growing a +sapling into a tree. + + +===== +There are other, internal helper functions that are not meant for use by other +mods. Don't rely on them, as they are subject to change without notice. + + +=============== +Global Settings +=============== + +Set this to true if you want the mod to spam your console with debug info :-) + + plantlife_debug = false + + +====================== +Fertile Ground Mapping +====================== + +The mod uses Perlin noise to create "biomes" of the various plants, via the +minetest.get_perlin() function. At present, there are three layers of +Perlin noise used. + +The first one is for a "fertile ground" layer, which I tend to refer to as the +generic "stuff can potentially grow here" layer. Its values are hard-coded: + + plantslib.plantlife_seed_diff = 329 + perlin_octaves = 3 + perlin_persistence = 0.6 + perlin_scale = 100 + +For more information on how Perlin noise is generated, you will need to search +the web, as these default values were from that which is used by minetest_game +to spawn jungle grass at mapgen time, and I'm still learning how Perlin noise +works. ;-) + + +=================== +Temperature Mapping +=================== + +The second Perlin layer is a temperature map, with values taken from +SPlizard's Snow Biomes mod so that the two will be compatible, since that mod +appears to be the standard now. Those values are: + + temperature_seeddiff = 112 + temperature_octaves = 3 + temperature_persistence = 0.5 + temperature_scale = 150 + +The way Perlin values are used by this mod, in keeping with the snow mod's +apparent methods, larger values returned by the Perlin function represent +*colder* temperatures. In this mod, the following table gives a rough +approximation of how temperature maps to these values, normalized to +0.53 = 0 °C and +1.0 = -25 °C. + +Perlin Approx. Temperature +-1.0 81 °C ( 178 °F) +-0.75 68 °C ( 155 °F) +-0.56 58 °C ( 136 °F) +-0.5 55 °C ( 131 °F) +-0.25 41 °C ( 107 °F) +-0.18 38 °C ( 100 °F) + 0 28 °C ( 83 °F) + 0.13 21 °C ( 70 °F) + 0.25 15 °C ( 59 °F) + 0.5 2 °C ( 35 °F) + 0.53 0 °C ( 32 °F) + 0.75 -12 °C ( 11 °F) + 0.86 -18 °C ( 0 °F) + 1.0 -25 °C (- 13 °F) + +Included in this table are even 0.25 steps in Perlin values along with some +common temperatures on both the Centigrade and Fahrenheit scales. Note that +unless you're trying to model the Moon or perhaps Mercury in your mods/maps, +you probably won't need to bother with Perlin values of less than -0.56 or so. + + +================ +Humidity Mapping +================ + +Last but not least is a moisture/humidity map. Like the temperature map +above, Perlin values can be tested to determine the approximate humidity of +the *air* in the area. This humidity map is basically the perlin layer used +for deserts. + +A value of +1.0 is very moist (basically a thick fog, if it could be seen), a +value of roughly +0.25 represents the edge of a desert as usually seen in the +game, and a value of -1.0 is as dry as a bone. + +This does not check for nearby water, just general air humidity, and that +being the case, nearby ground does not affect the reported humidity of a +region (because this isn't yet possible to calculate yet). Use the near_nodes +and avoid_nodes parameters and their related options to check for water and +such. + +The Perlin values use for this layer are: + + humidity_seeddiff = 9130 + humidity_octaves = 3 + humidity_persistence = 0.5 + humidity_scale = 250 + +And this particular one is mapped slightly differently from the others: + + noise3 = perlin3:get2d({x=p_top.x+150, y=p_top.z+50}) + +(Note the +150 and +50 offsets) + diff --git a/mods/plants_lib/depends.txt b/mods/plants_lib/depends.txt new file mode 100644 index 0000000..c48fe0d --- /dev/null +++ b/mods/plants_lib/depends.txt @@ -0,0 +1,3 @@ +default +intllib? + diff --git a/mods/plants_lib/init.lua b/mods/plants_lib/init.lua new file mode 100644 index 0000000..d0401ae --- /dev/null +++ b/mods/plants_lib/init.lua @@ -0,0 +1,735 @@ +-- Plantlife library mod by Vanessa Ezekowitz +-- +-- License: WTFPL +-- +-- I got the temperature map idea from "hmmmm", values used for it came from +-- Splizard's snow mod. +-- + +-- Various settings - most of these probably won't need to be changed + +plantslib = {} + +plantslib.blocklist_aircheck = {} +plantslib.blocklist_no_aircheck = {} + +plantslib.surface_nodes_aircheck = {} +plantslib.surface_nodes_no_aircheck = {} + +plantslib.surfaceslist_aircheck = {} +plantslib.surfaceslist_no_aircheck = {} + +plantslib.actioncount_aircheck = {} +plantslib.actioncount_no_aircheck = {} + +plantslib.actionslist_aircheck = {} +plantslib.actionslist_no_aircheck = {} + +plantslib.modpath = minetest.get_modpath("plants_lib") + +plantslib.total_no_aircheck_calls = 0 + +-- Boilerplate to support localized strings if intllib mod is installed. +local S +if minetest.get_modpath("intllib") then + S = intllib.Getter() +else + S = function(s) return s end +end +plantslib.intllib = S + +local DEBUG = false --... except if you want to spam the console with debugging info :-) + +function plantslib:dbg(msg) + if DEBUG then + print("[Plantlife] "..msg) + minetest.log("verbose", "[Plantlife] "..msg) + end +end + +plantslib.plantlife_seed_diff = 329 -- needs to be global so other mods can see it + +local perlin_octaves = 3 +local perlin_persistence = 0.6 +local perlin_scale = 100 + +local temperature_seeddiff = 112 +local temperature_octaves = 3 +local temperature_persistence = 0.5 +local temperature_scale = 150 + +local humidity_seeddiff = 9130 +local humidity_octaves = 3 +local humidity_persistence = 0.5 +local humidity_scale = 250 + +local time_scale = 1 +local time_speed = tonumber(minetest.setting_get("time_speed")) + +if time_speed and time_speed > 0 then + time_scale = 72 / time_speed +end + +--PerlinNoise(seed, octaves, persistence, scale) + +plantslib.perlin_temperature = PerlinNoise(temperature_seeddiff, temperature_octaves, temperature_persistence, temperature_scale) +plantslib.perlin_humidity = PerlinNoise(humidity_seeddiff, humidity_octaves, humidity_persistence, humidity_scale) + +-- Local functions + +function plantslib:is_node_loaded(node_pos) + local n = minetest.get_node_or_nil(node_pos) + if (not n) or (n.name == "ignore") then + return false + end + return true +end + +function plantslib:set_defaults(biome) + biome.seed_diff = biome.seed_diff or 0 + biome.min_elevation = biome.min_elevation or -31000 + biome.max_elevation = biome.max_elevation or 31000 + biome.temp_min = biome.temp_min or 1 + biome.temp_max = biome.temp_max or -1 + biome.humidity_min = biome.humidity_min or 1 + biome.humidity_max = biome.humidity_max or -1 + biome.plantlife_limit = biome.plantlife_limit or 0.1 + biome.near_nodes_vertical = biome.near_nodes_vertical or 1 + +-- specific to on-generate + + biome.neighbors = biome.neighbors or biome.surface + biome.near_nodes_size = biome.near_nodes_size or 0 + biome.near_nodes_count = biome.near_nodes_count or 1 + biome.rarity = biome.rarity or 50 + biome.max_count = biome.max_count or 5 + if biome.check_air ~= false then biome.check_air = true end + +-- specific to abm spawner + biome.seed_diff = biome.seed_diff or 0 + biome.light_min = biome.light_min or 0 + biome.light_max = biome.light_max or 15 + biome.depth_max = biome.depth_max or 1 + biome.facedir = biome.facedir or 0 +end + +local function search_table(t, s) + for i = 1, #t do + if t[i] == s then return true end + end + return false +end + +-- register the list of surfaces to spawn stuff on, filtering out all duplicates. +-- separate the items by air-checking or non-air-checking map eval methods + +function plantslib:register_generate_plant(biomedef, nodes_or_function_or_model) + + -- if calling code passes an undefined node for a surface or + -- as a node to be spawned, don't register an action for it. + + if type(nodes_or_function_or_model) == "string" + and string.find(nodes_or_function_or_model, ":") + and not minetest.registered_nodes[nodes_or_function_or_model] then + plantslib:dbg("Warning: Ignored registration for undefined spawn node: "..dump(nodes_or_function_or_model)) + return + end + + if type(nodes_or_function_or_model) == "string" + and not string.find(nodes_or_function_or_model, ":") then + plantslib:dbg("Warning: Registered function call using deprecated string method: "..dump(nodes_or_function_or_model)) + end + + if biomedef.check_air == false then + plantslib:dbg("Register no-air-check mapgen hook: "..dump(nodes_or_function_or_model)) + plantslib.actionslist_no_aircheck[#plantslib.actionslist_no_aircheck + 1] = { biomedef, nodes_or_function_or_model } + local s = biomedef.surface + if type(s) == "string" then + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(plantslib.surfaceslist_no_aircheck, s) then + plantslib.surfaceslist_no_aircheck[#plantslib.surfaceslist_no_aircheck + 1] = s + end + else + plantslib:dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s)) + end + else + for i = 1, #biomedef.surface do + local s = biomedef.surface[i] + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(plantslib.surfaceslist_no_aircheck, s) then + plantslib.surfaceslist_no_aircheck[#plantslib.surfaceslist_no_aircheck + 1] = s + end + else + plantslib:dbg("Warning: Ignored no-air-check registration for undefined surface node: "..dump(s)) + end + end + end + else + plantslib:dbg("Register with-air-checking mapgen hook: "..dump(nodes_or_function_or_model)) + plantslib.actionslist_aircheck[#plantslib.actionslist_aircheck + 1] = { biomedef, nodes_or_function_or_model } + local s = biomedef.surface + if type(s) == "string" then + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(plantslib.surfaceslist_aircheck, s) then + plantslib.surfaceslist_aircheck[#plantslib.surfaceslist_aircheck + 1] = s + end + else + plantslib:dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s)) + end + else + for i = 1, #biomedef.surface do + local s = biomedef.surface[i] + if s and (string.find(s, "^group:") or minetest.registered_nodes[s]) then + if not search_table(plantslib.surfaceslist_aircheck, s) then + plantslib.surfaceslist_aircheck[#plantslib.surfaceslist_aircheck + 1] = s + end + else + plantslib:dbg("Warning: Ignored with-air-checking registration for undefined surface node: "..dump(s)) + end + end + end + end +end + +function plantslib:populate_surfaces(biome, nodes_or_function_or_model, snodes, checkair) + + plantslib:set_defaults(biome) + + -- filter stage 1 - find nodes from the supplied surfaces that are within the current biome. + + local in_biome_nodes = {} + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) + + for i = 1, #snodes do + local pos = snodes[i] + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z}) + local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z}) + local noise3 = plantslib.perlin_humidity:get2d({x=pos.x+150, y=pos.z+50}) + local biome_surfaces_string = dump(biome.surface) + local surface_ok = false + + if not biome.depth then + local dest_node = minetest.get_node(pos) + if string.find(biome_surfaces_string, dest_node.name) then + surface_ok = true + else + if string.find(biome_surfaces_string, "group:") then + for j = 1, #biome.surface do + if string.find(biome.surface[j], "^group:") + and minetest.get_item_group(dest_node.name, biome.surface[j]) then + surface_ok = true + break + end + end + end + end + elseif not string.find(biome_surfaces_string, minetest.get_node({ x = pos.x, y = pos.y-biome.depth-1, z = pos.z }).name) then + surface_ok = true + end + + if surface_ok + and (not checkair or minetest.get_node(p_top).name == "air") + and pos.y >= biome.min_elevation + and pos.y <= biome.max_elevation + and noise1 > biome.plantlife_limit + and noise2 <= biome.temp_min + and noise2 >= biome.temp_max + and noise3 <= biome.humidity_min + and noise3 >= biome.humidity_max + and (not biome.ncount or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount) + and (not biome.near_nodes or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count) + and math.random(1,100) > biome.rarity + and (not biome.below_nodes or string.find(dump(biome.below_nodes), minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name) ) + then + in_biome_nodes[#in_biome_nodes + 1] = pos + end + end + + -- filter stage 2 - find places within that biome area to place the plants. + + local num_in_biome_nodes = #in_biome_nodes + + if num_in_biome_nodes > 0 then + for i = 1, math.min(biome.max_count, num_in_biome_nodes) do + local tries = 0 + local spawned = false + while tries < 2 and not spawned do + local pos = in_biome_nodes[math.random(1, num_in_biome_nodes)] + if biome.spawn_replace_node then + pos.y = pos.y-1 + end + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + + if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) then + if biome.delete_above then + minetest.remove_node(p_top) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z}) + end + + if biome.delete_above_surround then + minetest.remove_node({x=p_top.x-1, y=p_top.y, z=p_top.z}) + minetest.remove_node({x=p_top.x+1, y=p_top.y, z=p_top.z}) + minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z-1}) + minetest.remove_node({x=p_top.x, y=p_top.y, z=p_top.z+1}) + + minetest.remove_node({x=p_top.x-1, y=p_top.y+1, z=p_top.z}) + minetest.remove_node({x=p_top.x+1, y=p_top.y+1, z=p_top.z}) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z-1}) + minetest.remove_node({x=p_top.x, y=p_top.y+1, z=p_top.z+1}) + end + + if biome.spawn_replace_node then + minetest.remove_node(pos) + end + + local objtype = type(nodes_or_function_or_model) + + if objtype == "table" then + if nodes_or_function_or_model.axiom then + plantslib:generate_tree(pos, nodes_or_function_or_model) + spawned = true + else + local fdir = nil + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) + end + minetest.set_node(p_top, { name = nodes_or_function_or_model[math.random(#nodes_or_function_or_model)], param2 = fdir }) + spawned = true + end + elseif objtype == "string" and + minetest.registered_nodes[nodes_or_function_or_model] then + local fdir = nil + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1], biome.random_facedir[2]) + end + minetest.set_node(p_top, { name = nodes_or_function_or_model, param2 = fdir }) + spawned = true + elseif objtype == "function" then + nodes_or_function_or_model(pos) + spawned = true + elseif objtype == "string" and pcall(loadstring(("return %s(...)"): + format(nodes_or_function_or_model)),pos) then + spawned = true + else + plantslib:dbg("Warning: Ignored invalid definition for object "..dump(nodes_or_function_or_model).." that was pointed at {"..dump(pos).."}") + end + else + tries = tries + 1 + end + end + end + end +end + +-- Primary mapgen spawner, for mods that can work with air checking enabled on +-- a surface during the initial map read stage. + +function plantslib:generate_block_with_air_checking() + if #plantslib.blocklist_aircheck > 0 then + + local minp = plantslib.blocklist_aircheck[1][1] + local maxp = plantslib.blocklist_aircheck[1][2] + + -- use the block hash as a unique key into the surface nodes + -- tables, so that we can write the tables thread-safely. + + local blockhash = minetest.hash_node_position(minp) + + if not plantslib.surface_nodes_aircheck.blockhash then + + if type(minetest.find_nodes_in_area_under_air) == "function" then -- use newer API call + plantslib.surface_nodes_aircheck.blockhash = + minetest.find_nodes_in_area_under_air(minp, maxp, plantslib.surfaceslist_aircheck) + else + local search_area = minetest.find_nodes_in_area(minp, maxp, plantslib.surfaceslist_aircheck) + + -- search the generated block for air-bounded surfaces the slow way. + + plantslib.surface_nodes_aircheck.blockhash = {} + + for i = 1, #search_area do + local pos = search_area[i] + local p_top = { x=pos.x, y=pos.y+1, z=pos.z } + if minetest.get_node(p_top).name == "air" then + plantslib.surface_nodes_aircheck.blockhash[#plantslib.surface_nodes_aircheck.blockhash + 1] = pos + end + end + end + plantslib.actioncount_aircheck.blockhash = 1 + + else + if plantslib.actioncount_aircheck.blockhash <= #plantslib.actionslist_aircheck then + -- [1] is biome, [2] is node/function/model + plantslib:populate_surfaces( + plantslib.actionslist_aircheck[plantslib.actioncount_aircheck.blockhash][1], + plantslib.actionslist_aircheck[plantslib.actioncount_aircheck.blockhash][2], + plantslib.surface_nodes_aircheck.blockhash, true) + plantslib.actioncount_aircheck.blockhash = plantslib.actioncount_aircheck.blockhash + 1 + else + if plantslib.surface_nodes_aircheck.blockhash then + table.remove(plantslib.blocklist_aircheck, 1) + plantslib.surface_nodes_aircheck.blockhash = nil + end + end + end + end +end + +-- Secondary mapgen spawner, for mods that require disabling of +-- checking for air during the initial map read stage. + +function plantslib:generate_block_no_aircheck() + if #plantslib.blocklist_no_aircheck > 0 then + + local minp = plantslib.blocklist_no_aircheck[1][1] + local maxp = plantslib.blocklist_no_aircheck[1][2] + + local blockhash = minetest.hash_node_position(minp) + + if not plantslib.surface_nodes_no_aircheck.blockhash then + + -- directly read the block to be searched into the chunk cache + + plantslib.surface_nodes_no_aircheck.blockhash = + minetest.find_nodes_in_area(minp, maxp, plantslib.surfaceslist_no_aircheck) + plantslib.actioncount_no_aircheck.blockhash = 1 + + else + if plantslib.actioncount_no_aircheck.blockhash <= #plantslib.actionslist_no_aircheck then + plantslib:populate_surfaces( + plantslib.actionslist_no_aircheck[plantslib.actioncount_no_aircheck.blockhash][1], + plantslib.actionslist_no_aircheck[plantslib.actioncount_no_aircheck.blockhash][2], + plantslib.surface_nodes_no_aircheck.blockhash, false) + plantslib.actioncount_no_aircheck.blockhash = plantslib.actioncount_no_aircheck.blockhash + 1 + else + if plantslib.surface_nodes_no_aircheck.blockhash then + table.remove(plantslib.blocklist_no_aircheck, 1) + plantslib.surface_nodes_no_aircheck.blockhash = nil + end + end + end + end +end + +-- "Record" the chunks being generated by the core mapgen + +minetest.register_on_generated(function(minp, maxp, blockseed) + plantslib.blocklist_aircheck[#plantslib.blocklist_aircheck + 1] = { minp, maxp } +end) + +minetest.register_on_generated(function(minp, maxp, blockseed) + plantslib.blocklist_no_aircheck[#plantslib.blocklist_no_aircheck + 1] = { minp, maxp } +end) + +-- "Play" them back, populating them with new stuff in the process + +minetest.register_globalstep(function(dtime) + if dtime < 0.2 and -- don't attempt to populate if lag is already too high + (#plantslib.blocklist_aircheck > 0 or #plantslib.blocklist_no_aircheck > 0) then + plantslib.globalstep_start_time = minetest.get_us_time() + plantslib.globalstep_runtime = 0 + while (#plantslib.blocklist_aircheck > 0 or #plantslib.blocklist_no_aircheck > 0) + and plantslib.globalstep_runtime < 200000 do -- 0.2 seconds, in uS. + if #plantslib.blocklist_aircheck > 0 then + plantslib:generate_block_with_air_checking() + end + if #plantslib.blocklist_no_aircheck > 0 then + plantslib:generate_block_no_aircheck() + end + plantslib.globalstep_runtime = minetest.get_us_time() - plantslib.globalstep_start_time + end + end +end) + +-- Play out the entire log all at once on shutdown +-- to prevent unpopulated map areas + +minetest.register_on_shutdown(function() + print("[plants_lib] Stand by, playing out the rest of the aircheck mapblock log") + print("(there are "..#plantslib.blocklist_aircheck.." entries)...") + while true do + plantslib:generate_block_with_air_checking(0.1) + if #plantslib.blocklist_aircheck == 0 then return end + end +end) + +minetest.register_on_shutdown(function() + print("[plants_lib] Stand by, playing out the rest of the no-aircheck mapblock log") + print("(there are "..#plantslib.blocklist_aircheck.." entries)...") + while true do + plantslib:generate_block_no_aircheck(0.1) + if #plantslib.blocklist_no_aircheck == 0 then return end + end +end) + +-- The spawning ABM + +function plantslib:spawn_on_surfaces(sd,sp,sr,sc,ss,sa) + + local biome = {} + + if type(sd) ~= "table" then + biome.spawn_delay = sd -- old api expects ABM interval param here. + biome.spawn_plants = {sp} + biome.avoid_radius = sr + biome.spawn_chance = sc + biome.spawn_surfaces = {ss} + biome.avoid_nodes = sa + else + biome = sd + end + + if biome.spawn_delay*time_scale >= 1 then + biome.interval = biome.spawn_delay*time_scale + else + biome.interval = 1 + end + + plantslib:set_defaults(biome) + biome.spawn_plants_count = #(biome.spawn_plants) + + minetest.register_abm({ + nodenames = biome.spawn_surfaces, + interval = biome.interval, + chance = biome.spawn_chance, + neighbors = biome.neighbors, + action = function(pos, node, active_object_count, active_object_count_wider) + local p_top = { x = pos.x, y = pos.y + 1, z = pos.z } + local n_top = minetest.get_node(p_top) + local perlin_fertile_area = minetest.get_perlin(biome.seed_diff, perlin_octaves, perlin_persistence, perlin_scale) + local noise1 = perlin_fertile_area:get2d({x=p_top.x, y=p_top.z}) + local noise2 = plantslib.perlin_temperature:get2d({x=p_top.x, y=p_top.z}) + local noise3 = plantslib.perlin_humidity:get2d({x=p_top.x+150, y=p_top.z+50}) + if noise1 > biome.plantlife_limit + and noise2 <= biome.temp_min + and noise2 >= biome.temp_max + and noise3 <= biome.humidity_min + and noise3 >= biome.humidity_max + and plantslib:is_node_loaded(p_top) then + local n_light = minetest.get_node_light(p_top, nil) + if not (biome.avoid_nodes and biome.avoid_radius and minetest.find_node_near(p_top, biome.avoid_radius + math.random(-1.5,2), biome.avoid_nodes)) + and n_light >= biome.light_min + and n_light <= biome.light_max + and (not(biome.neighbors and biome.ncount) or #(minetest.find_nodes_in_area({x=pos.x-1, y=pos.y, z=pos.z-1}, {x=pos.x+1, y=pos.y, z=pos.z+1}, biome.neighbors)) > biome.ncount ) + and (not(biome.near_nodes and biome.near_nodes_count and biome.near_nodes_size) or #(minetest.find_nodes_in_area({x=pos.x-biome.near_nodes_size, y=pos.y-biome.near_nodes_vertical, z=pos.z-biome.near_nodes_size}, {x=pos.x+biome.near_nodes_size, y=pos.y+biome.near_nodes_vertical, z=pos.z+biome.near_nodes_size}, biome.near_nodes)) >= biome.near_nodes_count) + and (not(biome.air_count and biome.air_size) or #(minetest.find_nodes_in_area({x=p_top.x-biome.air_size, y=p_top.y, z=p_top.z-biome.air_size}, {x=p_top.x+biome.air_size, y=p_top.y, z=p_top.z+biome.air_size}, "air")) >= biome.air_count) + and pos.y >= biome.min_elevation + and pos.y <= biome.max_elevation + then + local walldir = plantslib:find_adjacent_wall(p_top, biome.verticals_list, biome.choose_random_wall) + if biome.alt_wallnode and walldir then + if n_top.name == "air" then + minetest.set_node(p_top, { name = biome.alt_wallnode, param2 = walldir }) + end + else + local currentsurface = minetest.get_node(pos).name + if currentsurface ~= "default:water_source" + or (currentsurface == "default:water_source" and #(minetest.find_nodes_in_area({x=pos.x, y=pos.y-biome.depth_max-1, z=pos.z}, {x=pos.x, y=pos.y, z=pos.z}, {"default:dirt", "default:dirt_with_grass", "default:sand"})) > 0 ) + then + local rnd = math.random(1, biome.spawn_plants_count) + local plant_to_spawn = biome.spawn_plants[rnd] + local fdir = biome.facedir + if biome.random_facedir then + fdir = math.random(biome.random_facedir[1],biome.random_facedir[2]) + end + if type(biome.spawn_plants) == "string" then + assert(loadstring(biome.spawn_plants.."(...)"))(pos) + elseif not biome.spawn_on_side and not biome.spawn_on_bottom and not biome.spawn_replace_node then + if n_top.name == "air" then + minetest.set_node(p_top, { name = plant_to_spawn, param2 = fdir }) + end + elseif biome.spawn_replace_node then + minetest.set_node(pos, { name = plant_to_spawn, param2 = fdir }) + + elseif biome.spawn_on_side then + local onside = plantslib:find_open_side(pos) + if onside then + minetest.set_node(onside.newpos, { name = plant_to_spawn, param2 = onside.facedir }) + end + elseif biome.spawn_on_bottom then + if minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name == "air" then + minetest.set_node({x=pos.x, y=pos.y-1, z=pos.z}, { name = plant_to_spawn, param2 = fdir} ) + end + end + end + end + end + end + end + }) +end + +-- The growing ABM + +function plantslib:grow_plants(opts) + + local options = opts + + options.height_limit = options.height_limit or 5 + options.ground_nodes = options.ground_nodes or { "default:dirt_with_grass" } + options.grow_nodes = options.grow_nodes or { "default:dirt_with_grass" } + options.seed_diff = options.seed_diff or 0 + + if options.grow_delay*time_scale >= 1 then + options.interval = options.grow_delay*time_scale + else + options.interval = 1 + end + + minetest.register_abm({ + nodenames = { options.grow_plant }, + interval = options.interval, + chance = options.grow_chance, + action = function(pos, node, active_object_count, active_object_count_wider) + local p_top = {x=pos.x, y=pos.y+1, z=pos.z} + local p_bot = {x=pos.x, y=pos.y-1, z=pos.z} + local n_top = minetest.get_node(p_top) + local n_bot = minetest.get_node(p_bot) + local root_node = minetest.get_node({x=pos.x, y=pos.y-options.height_limit, z=pos.z}) + local walldir = nil + if options.need_wall and options.verticals_list then + walldir = plantslib:find_adjacent_wall(p_top, options.verticals_list, options.choose_random_wall) + end + if n_top.name == "air" and (not options.need_wall or (options.need_wall and walldir)) + then + -- corner case for changing short junglegrass + -- to dry shrub in desert + if n_bot.name == options.dry_early_node and options.grow_plant == "junglegrass:short" then + minetest.set_node(pos, { name = "default:dry_shrub" }) + + elseif options.grow_vertically and walldir then + if plantslib:search_downward(pos, options.height_limit, options.ground_nodes) then + minetest.set_node(p_top, { name = options.grow_plant, param2 = walldir}) + end + + elseif not options.grow_result and not options.grow_function then + minetest.remove_node(pos) + + else + plantslib:replace_object(pos, options.grow_result, options.grow_function, options.facedir, options.seed_diff) + end + end + end + }) +end + +-- Function to decide how to replace a plant - either grow it, replace it with +-- a tree, run a function, or die with an error. + +function plantslib:replace_object(pos, replacement, grow_function, walldir, seeddiff) + local growtype = type(grow_function) + if growtype == "table" then + minetest.remove_node(pos) + plantslib:grow_tree(pos, grow_function) + return + elseif growtype == "function" then + local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) + local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z}) + local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z}) + grow_function(pos,noise1,noise2,walldir) + return + elseif growtype == "string" then + local perlin_fertile_area = minetest.get_perlin(seeddiff, perlin_octaves, perlin_persistence, perlin_scale) + local noise1 = perlin_fertile_area:get2d({x=pos.x, y=pos.z}) + local noise2 = plantslib.perlin_temperature:get2d({x=pos.x, y=pos.z}) + assert(loadstring(grow_function.."(...)"))(pos,noise1,noise2,walldir) + return + elseif growtype == "nil" then + minetest.set_node(pos, { name = replacement, param2 = walldir}) + return + elseif growtype ~= "nil" and growtype ~= "string" and growtype ~= "table" then + error("Invalid grow function "..dump(grow_function).." used on object at ("..dump(pos)..")") + end +end + +-- function to decide if a node has a wall that's in verticals_list{} +-- returns wall direction of valid node, or nil if invalid. + +function plantslib:find_adjacent_wall(pos, verticals, randomflag) + local verts = dump(verticals) + if randomflag then + local walltab = {} + + if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 3 end + if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then walltab[#walltab + 1] = 2 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then walltab[#walltab + 1] = 5 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then walltab[#walltab + 1] = 4 end + + if #walltab > 0 then return walltab[math.random(1, #walltab)] end + + else + if string.find(verts, minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name) then return 3 end + if string.find(verts, minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name) then return 2 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z-1 }).name) then return 5 end + if string.find(verts, minetest.get_node({ x=pos.x , y=pos.y, z=pos.z+1 }).name) then return 4 end + end + return nil +end + +-- Function to search downward from the given position, looking for the first +-- node that matches the ground table. Returns the new position, or nil if +-- height limit is exceeded before finding it. + +function plantslib:search_downward(pos, heightlimit, ground) + for i = 0, heightlimit do + if string.find(dump(ground), minetest.get_node({x=pos.x, y=pos.y-i, z = pos.z}).name) then + return {x=pos.x, y=pos.y-i, z = pos.z} + end + end + return false +end + +function plantslib:find_open_side(pos) + if minetest.get_node({ x=pos.x-1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x-1, y=pos.y, z=pos.z }, facedir = 2} + end + if minetest.get_node({ x=pos.x+1, y=pos.y, z=pos.z }).name == "air" then + return {newpos = { x=pos.x+1, y=pos.y, z=pos.z }, facedir = 3} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z-1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z-1 }, facedir = 4} + end + if minetest.get_node({ x=pos.x, y=pos.y, z=pos.z+1 }).name == "air" then + return {newpos = { x=pos.x, y=pos.y, z=pos.z+1 }, facedir = 5} + end + return nil +end + +-- spawn_tree() on generate is routed through here so that other mods can hook +-- into it. + +function plantslib:generate_tree(pos, nodes_or_function_or_model) + minetest.spawn_tree(pos, nodes_or_function_or_model) +end + +-- and this one's for the call used in the growing code + +function plantslib:grow_tree(pos, nodes_or_function_or_model) + minetest.spawn_tree(pos, nodes_or_function_or_model) +end + +-- Check for infinite stacks + +if minetest.get_modpath("unified_inventory") or not minetest.setting_getbool("creative_mode") then + plantslib.expect_infinite_stacks = false +else + plantslib.expect_infinite_stacks = true +end + +-- read a field from a node's definition + +function plantslib:get_nodedef_field(nodename, fieldname) + if not minetest.registered_nodes[nodename] then + return nil + end + return minetest.registered_nodes[nodename][fieldname] +end + +print("[Plants Lib] Loaded") + +minetest.after(0, function() + print("[Plants Lib] Registered a total of "..(#plantslib.surfaceslist_aircheck)+(#plantslib.surfaceslist_no_aircheck).." surface types to be evaluated, spread") + print("[Plants Lib] across "..#plantslib.actionslist_aircheck.." actions with air-checking and "..#plantslib.actionslist_no_aircheck.." actions without.") +end) + diff --git a/mods/plants_lib/locale/de.txt b/mods/plants_lib/locale/de.txt new file mode 100644 index 0000000..2886786 --- /dev/null +++ b/mods/plants_lib/locale/de.txt @@ -0,0 +1,5 @@ +# Translation by Xanthin + +someone = jemand +Sorry, %s owns that spot. = Entschuldige, %s gehoert diese Stelle. +[Plantlife Library] Loaded = [Plantlife Library] Geladen diff --git a/mods/plants_lib/locale/fr.txt b/mods/plants_lib/locale/fr.txt new file mode 100644 index 0000000..9070900 --- /dev/null +++ b/mods/plants_lib/locale/fr.txt @@ -0,0 +1,5 @@ +# Template + +someone = quelqu'un +Sorry, %s owns that spot. = Désolé, %s possède cet endroit. +[Plantlife Library] Loaded = [Librairie Plantlife] Chargée. diff --git a/mods/plants_lib/locale/template.txt b/mods/plants_lib/locale/template.txt new file mode 100644 index 0000000..0f5fbbd --- /dev/null +++ b/mods/plants_lib/locale/template.txt @@ -0,0 +1,5 @@ +# Template + +someone = +Sorry, %s owns that spot. = +[Plantlife Library] Loaded = diff --git a/mods/plants_lib/locale/tr.txt b/mods/plants_lib/locale/tr.txt new file mode 100644 index 0000000..4b596f4 --- /dev/null +++ b/mods/plants_lib/locale/tr.txt @@ -0,0 +1,5 @@ +# Turkish translation by mahmutelmas06 + +someone = birisi +Sorry, %s owns that spot. = Ãœzgünüm, buranın sahibi %s. +[Plantlife Library] Loaded = [Plantlife Library] yüklendi diff --git a/mods/quartz/README.txt b/mods/quartz/README.txt new file mode 100644 index 0000000..8e6fd5d --- /dev/null +++ b/mods/quartz/README.txt @@ -0,0 +1,82 @@ + ___ _ __ __ _ + / _ \ _ _ __ _ _ __| |_ ____ | \/ | ___ __| | + | | | | | | |/ _` | '__| __|_ / | |\/| |/ _ \ / _` | + | |_| | |_| | (_| | | | |_ / / | | | | (_) | (_| | + \__\_\\__,_|\__,_|_| \__/___| |_| |_|\___/ \__,_| + + +This mod adds quartz ore and some decorative blocks to minetest. + + +Crafting: + +Quartz Block: +c = quartz crystal x = nothing + +x|x|x +----- +c|c|x +----- +c|c|x + +Quartz Pillar: +q = quartz block x = nothing + +x|x|x +----- +x|q|x +----- +x|x|x + + +Quartz Slab: +q = quartz block x = nothing + +x|x|x +----- +x|x|x +----- +q|q|q + +Quartz Stairs: +q = quartz block x = nothing + +q|x|x +q|q|x +q|q|q + +Quartz Pillar Slab: +q = quartz pillar x = nothing + +x|x|x +----- +x|x|x +----- +q|q|q + +Chiseled Quartz: +q = quartz slab x = nothing + +x|x|x +----- +x|q|x +----- +x|q|x + +Quartz Crystal Piece (usless as of now): +c = quartz crystal x = nothing + +x|x|x +----- +x|c|x +----- +x|x|x + + +License: + +CC BY-SA 3.0 + +More info at http://creativecommons.org/licenses/by-sa/3.0/ + + diff --git a/mods/quartz/depends.txt b/mods/quartz/depends.txt new file mode 100644 index 0000000..40c22ed --- /dev/null +++ b/mods/quartz/depends.txt @@ -0,0 +1,3 @@ +default, +stairs, +moreblocks? diff --git a/mods/quartz/init.lua b/mods/quartz/init.lua new file mode 100644 index 0000000..72dfb19 --- /dev/null +++ b/mods/quartz/init.lua @@ -0,0 +1,203 @@ +dofile(minetest.get_modpath("quartz").."/settings.txt") + +--Node Registration + +--Quartz Crystal +minetest.register_craftitem("quartz:quartz_crystal", { + description = "Quartz Crystal", + inventory_image = "quartz_crystal_full.png", +}) +minetest.register_craftitem("quartz:quartz_crystal_piece", { + description = "Quartz Crystal Piece", + inventory_image = "quartz_crystal_piece.png", +}) + +--Ore +minetest.register_node("quartz:quartz_ore", { + description = "Quartz Ore", + tiles = {"default_stone.png^quartz_ore.png"}, + paramtype = "light", + light_source = 3, + groups = {cracky=3, stone=1}, + drop = 'quartz:quartz_crystal', + sounds = default.node_sound_stone_defaults(), +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "quartz:quartz_ore", + wherein = "default:stone", + clust_scarcity = 48*48*48, + clust_num_ores = 27, + clust_size = 3, + height_min = -1000, + height_max = 64, +}) + +minetest.register_ore({ + ore_type = "scatter", + ore = "quartz:quartz_ore", + wherein = "default:stone", + clust_scarcity = 24*24*24, + clust_num_ores = 95, + clust_size = 5, + height_min = -1000, + height_max = 0, +}) + +--Quartz Block +minetest.register_node("quartz:block", { + description = "Quartz Block", + tiles = {"quartz_block.png"}, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), +}) + +--Chiseled Quartz +minetest.register_node("quartz:chiseled", { + description = "Chiseled Quartz", + tiles = {"quartz_chiseled.png"}, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), +}) + +--Quartz Pillar +minetest.register_node("quartz:pillar", { + description = "Quartz Pillar", + paramtype2 = "facedir", + tiles = {"quartz_pillar_top.png", "quartz_pillar_top.png", "quartz_pillar_side.png"}, + groups = {cracky=3, oddly_breakable_by_hand=1}, + sounds = default.node_sound_glass_defaults(), + on_place = minetest.rotate_node +}) + + +--Stairs & Slabs +stairs.register_stair_and_slab("quartzblock", "quartz:block", + {cracky=3, oddly_breakable_by_hand=1}, + {"quartz_block.png"}, + "Quartz stair", + "Quartz slab", + default.node_sound_glass_defaults()) + +stairs.register_slab("quartzstair", "quartz:pillar", + {cracky=3, oddly_breakable_by_hand=1}, + {"quartz_pillar_top.png", "quartz_pillar_top.png", "quartz_pillar_side.png"}, + "Quartz Pillar stair", + "Quartz Pillar slab", + default.node_sound_glass_defaults()) + + + + + + + +--Crafting + +--Quartz Crystal Piece +minetest.register_craft({ + output = '"quartz:quartz_crystal_piece" 3', + recipe = { + {'quartz:quartz_crystal'} + } +}) + +--Quartz Block +minetest.register_craft({ + output = '"quartz:block" 4', + recipe = { + {'quartz:quartz_crystal', 'quartz:quartz_crystal', ''}, + {'quartz:quartz_crystal', 'quartz:quartz_crystal', ''}, + {'', '', ''} + } +}) + +--Chiseled Quartz +minetest.register_craft({ + output = 'quartz:chiseled 2', + recipe = { + {'stairs:slab_quartzblock', '', ''}, + {'stairs:slab_quartzblock', '', ''}, + {'', '', ''}, + } +}) + +--Chiseled Quartz(for stairsplus) +minetest.register_craft({ + output = 'quartz:chiseled 2', + recipe = { + {'quartz:slab_block', '', ''}, + {'quartz:slab_block', '', ''}, + {'', '', ''}, + } +}) + +--Quartz Pillar +minetest.register_craft({ + output = 'quartz:pillar 2', + recipe = { + {'quartz:block', '', ''}, + {'quartz:block', '', ''}, + {'', '', ''}, + } +}) + +--abms +local dirs2 = { 12, 9, 18, 7, 12 } + +minetest.register_abm({ + nodenames = { "quartz:pillar_horizontal" }, + interval = 1, + chance = 1, + action = function(pos, node, active_object_count, active_object_count_wider) + local fdir = node.param2 or 0 + nfdir = dirs2[fdir+1] + minetest.add_node(pos, {name = "quartz:pillar", param2 = nfdir}) + end, +}) + +--These are deprecated, don't use them + +if enable_horizontal_pillar then + --Quartz Pillar (horizontal) + minetest.register_node("quartz:pillar_horizontal", { + description = "Quartz Pillar Horizontal", + tiles = {"quartz_pillar_side.png", "quartz_pillar_side.png", "quartz_pillar_side.png^[transformR90", + "quartz_pillar_side.png^[transformR90", "quartz_pillar_top.png", "quartz_pillar_top.png"}, + paramtype2 = "facedir", + drop = 'quartz:pillar', + groups = {cracky=3, oddly_breakable_by_hand=1, not_in_creative_inventory=1}, + sounds = default.node_sound_glass_defaults(), + }) +end + + +--Compatibility with stairsplus + +if minetest.get_modpath("moreblocks") and enable_stairsplus then + register_stair_slab_panel_micro("quartz", "block", "quartz:block", + {cracky=3}, + {"quartz_block.png"}, + "Quartz Block", + "block", + 0) + + register_stair_slab_panel_micro("quartz", "chiseled", "quartz:chiseled", + {cracky=3}, + {"quartz_chiseled.png"}, + "Chiseled Quartz", + "chiseled", + 0) + + register_stair_slab_panel_micro("quartz", "pillar", "quartz:pillar", + {cracky=3}, + {"quartz_pillar_top.png", "quartz_pillar_top.png", "quartz_pillar_side.png"}, + "Quartz Pillar", + "pillar", + 0) + + table.insert(circular_saw.known_stairs, "quartz:block") + table.insert(circular_saw.known_stairs, "quartz:chiseled") + table.insert(circular_saw.known_stairs, "quartz:pillar") +end diff --git a/mods/quartz/settings.txt b/mods/quartz/settings.txt new file mode 100644 index 0000000..246021e --- /dev/null +++ b/mods/quartz/settings.txt @@ -0,0 +1,7 @@ +-- Set this to true to allow usage of the stairsplus mod in moreblocks + +enable_stairsplus = false + +-- This enables the old horizontal pillar block(deprecated, be sure to convert them back to normal pillars) + +enable_horizontal_pillar = true diff --git a/mods/quartz/textures/quartz_block.png b/mods/quartz/textures/quartz_block.png new file mode 100644 index 0000000..802b3d5 Binary files /dev/null and b/mods/quartz/textures/quartz_block.png differ diff --git a/mods/quartz/textures/quartz_chiseled.png b/mods/quartz/textures/quartz_chiseled.png new file mode 100644 index 0000000..aef1c2f Binary files /dev/null and b/mods/quartz/textures/quartz_chiseled.png differ diff --git a/mods/quartz/textures/quartz_crystal_full.png b/mods/quartz/textures/quartz_crystal_full.png new file mode 100644 index 0000000..c647df0 Binary files /dev/null and b/mods/quartz/textures/quartz_crystal_full.png differ diff --git a/mods/quartz/textures/quartz_crystal_piece.png b/mods/quartz/textures/quartz_crystal_piece.png new file mode 100644 index 0000000..45e448f Binary files /dev/null and b/mods/quartz/textures/quartz_crystal_piece.png differ diff --git a/mods/quartz/textures/quartz_ore.png b/mods/quartz/textures/quartz_ore.png new file mode 100644 index 0000000..805666a Binary files /dev/null and b/mods/quartz/textures/quartz_ore.png differ diff --git a/mods/quartz/textures/quartz_pillar_side.png b/mods/quartz/textures/quartz_pillar_side.png new file mode 100644 index 0000000..71a5c30 Binary files /dev/null and b/mods/quartz/textures/quartz_pillar_side.png differ diff --git a/mods/quartz/textures/quartz_pillar_side_horizontal.png b/mods/quartz/textures/quartz_pillar_side_horizontal.png new file mode 100644 index 0000000..4d58985 Binary files /dev/null and b/mods/quartz/textures/quartz_pillar_side_horizontal.png differ diff --git a/mods/quartz/textures/quartz_pillar_top.png b/mods/quartz/textures/quartz_pillar_top.png new file mode 100644 index 0000000..9ad9a03 Binary files /dev/null and b/mods/quartz/textures/quartz_pillar_top.png differ diff --git a/mods/railcorridors/README.md b/mods/railcorridors/README.md new file mode 100644 index 0000000..5faef46 --- /dev/null +++ b/mods/railcorridors/README.md @@ -0,0 +1,12 @@ +RailCaves +========= + +Minetest Mod for adding caves with rails and wood constructions similar to Minecraft. + +Screenshots and information: +https://forum.minetest.net/viewtopic.php?f=9&t=10225 + +License is WTFPL. You just do what the fuck you want to. + +You can install this mod by putting the directory "RailCorridors" into the "mods" subfolder of your minetest folder. +Maybe it is needed to convert into lower case: "railcorridors" diff --git a/mods/railcorridors/chests.lua b/mods/railcorridors/chests.lua new file mode 100644 index 0000000..f7edcb1 --- /dev/null +++ b/mods/railcorridors/chests.lua @@ -0,0 +1,50 @@ +-- Random chest items +-- Zufälliger Kisteninhalt +function rci() + if nextrandom(0,1) < 0.03 then + return "farming:bread "..nextrandom(1,3) + elseif nextrandom(0,1) < 0.05 then + if nextrandom(0,1) < 0.3 then + return "farming:seed_cotton "..math.floor(nextrandom(1,4)) + elseif nextrandom(0,1) < 0.5 then + return "default:sapling "..math.floor(nextrandom(1,4)) + else + return "farming:seed_wheat "..math.floor(nextrandom(1,4)) + end + elseif nextrandom(0,1) < 0.005 then + return "tnt:tnt "..nextrandom(1,3) + elseif nextrandom(0,1) < 0.003 then + if nextrandom(0,1) < 0.8 then + return "default:mese_crystal "..math.floor(nextrandom(1,3)) + else + return "default:diamond "..math.floor(nextrandom(1,3)) + end + end +end +-- chests +function place_chest(pos) + minetest.set_node(pos, {name="default:chest"}) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", + "invsize[8,9;]".. + "list[context;main;0,0;8,4;]".. + "list[current_player;main;0,5;8,4;]") + meta:set_string("infotext", "Chest"); + local inv = meta:get_inventory() + inv:set_size("main", 8*4) + --print(dump(meta:to_table())) + meta:from_table({ + inventory = { + main = { + [1] = rci(),[2] = rci(),[3] = rci(),[4] = rci(),[5] = rci(),[6] = rci(),[7] = rci(),[8] = rci(), + [9] = rci(),[10] = rci(),[11] = rci(),[12] = rci(),[13] = rci(),[14] = rci(),[15] = rci(),[16] = rci(), + [17] = rci(),[18] = rci(),[19] = rci(),[20] = rci(),[21] = rci(),[22] = rci(),[23] = rci(),[24] = rci(), + [25] = rci(),[26] = rci(),[27] = rci(),[28] = rci(),[29] = rci(),[30] = rci(),[31] = rci(),[32] = rci()} + }, -- Why the f does the number of fields vary in the mod?? + fields = { + formspec = "invsize[8,9;]list[context;main;0,0;8,4;]list[current_player;main;0,5;8,4;]", + infotext = "Chest" + } + } + ) + end diff --git a/mods/railcorridors/depends.txt b/mods/railcorridors/depends.txt new file mode 100644 index 0000000..d77ba25 --- /dev/null +++ b/mods/railcorridors/depends.txt @@ -0,0 +1,2 @@ +default +farming diff --git a/mods/railcorridors/description.txt b/mods/railcorridors/description.txt new file mode 100644 index 0000000..3348250 --- /dev/null +++ b/mods/railcorridors/description.txt @@ -0,0 +1,3 @@ +This mod tries to imitate the known rail corridors of Minecraft. + +Diese Modifikation versucht die aus Minecraft bekannten Minenschächte mit Schienen nachzubilden. diff --git a/mods/railcorridors/init.lua b/mods/railcorridors/init.lua new file mode 100644 index 0000000..0814444 --- /dev/null +++ b/mods/railcorridors/init.lua @@ -0,0 +1,351 @@ +-- „Parameter“/„Settings“ + +-- Wahrscheinlichkeit für jeden Chunk, solche Gänge mit Schienen zu bekommen +-- Probability for every newly generated chunk to get corridors +local probability_railcaves_in_chunk = 2/3 + +-- Innerhalb welcher Parameter soll sich die Pfadlänge bewegen? +-- Minimal and maximal value of path length +local way_min = 4; +local way_max = 7; + +-- Wahrsch. für jeden geraden Teil eines Korridors, keine Fackeln zu bekommen +-- Probability for every horizontal part of a corridor to be without light +local probability_torches_in_segment = 0.5 + +-- Wahrsch. für jeden Teil eines Korridors, nach oben oder nach unten zu gehen +-- Probability for every part of a corridor to go up or down +local probability_up_or_down = 0.2 + +-- Wahrscheinlichkeit für jeden Teil eines Korridors, sich zu verzweigen – vorsicht, wenn fast jeder Gang sich verzweigt, kann der Algorithmus unlösbar werden und MT hängt sich auf +-- Probability for every part of a corridor to fork – caution, too high values may cause MT to hang on. +local propability_fork = 0.5 + +-- Wahrscheinlichkeit für Kisten +-- Probability for chests +local probability_chest = 1/100 + +-- Spielerische Generation, braucht aber mehr Rechenleistung +-- Fancy mode; deactivate if world generation too laggy +local fancy = true + +-- Parameter Ende + +local node_maincave = {name="default:dirt"} +local node_air = {name="air"} +local node_rails = {name="default:rail"} +local node_woodplanks = {name="default:wood"} +local node_fence = {name="default:fence_wood"} +local name_torch = "default:torch" +local node_water = {name="default:water_source"} +local node_lava = {name="default:lava_source"} + +function nextrandom(min, max) + return pr:next() / 32767 * (max - min) + min +end + +dofile(minetest.get_modpath("railcorridors").."/chests.lua") + +function Between(a,b) + return a+(b-a)/2 +end + +function vec3_add(a,b) + return {x=a.x+b.x, y=a.y+b.y, z=a.z+b.z} +end + +function vec3_sub(a,b) + return {x=a.x-b.x, y=a.y-b.y, z=a.z-b.z} +end + +function vec3_mul(v,s) + return {x=s*v.x, y=s*v.y, z=s*v.z} +end + +function MinMax(a,b) + if a < b then + return {min=a, max=b} + else + return {min=b, max=a} + end +end + +function isPointProper(p) + return (minetest.get_node(p).name ~= "air") and (minetest.get_node(p).name ~= "default:water_source") +end + +function FillNodes(minp, maxp, node) + for yi = minp.y, maxp.y do + for zi = minp.z, maxp.z do + for xi = minp.x, maxp.x do + minetest.set_node({x=xi, y=yi, z=zi}, node) + end + end + end +end + +function FillNodesProbable(minp, maxp, p, node) + local y = MinMax(minp.y, maxp.y) + local z = MinMax(minp.z, maxp.z) + local x = MinMax(minp.x, maxp.x) + for yi = y.min, y.max do + for zi = z.min,z.max do + for xi = x.min, x.max do + if nextrandom(0,1) < p then + minetest.set_node({x=xi, y=yi, z=zi}, node) + end + end + end + end +end + +function sqDistance(a,b,c) + return a*a + b*b + c*c +end + +function FillNodesCircled(centrum, radius, node) + local sqradius = radius * radius + for yi = centrum.y-radius-1,centrum.y+radius+1 do + for zi = centrum.z-radius-1,centrum.z+radius+1 do + for xi = centrum.x-radius-1,centrum.x+radius+1 do + if sqDistance(centrum.x-xi, centrum.y-yi, centrum.z-zi) < sqradius then + minetest.set_node({x=xi, y=yi, z=zi}, node) + end + end + end + end +end + +function placeStaff(coord) + minetest.set_node(coord, node_woodplanks) + minetest.set_node({x=coord.x, y=coord.y-1, z=coord.z}, node_fence) + minetest.set_node({x=coord.x, y=coord.y-2, z=coord.z}, node_fence) +end + +function placeMaybePlanks(pt) + if minetest.get_node(pt).name == "air" then + if nextrandom(0,1) < 0.9 then + minetest.set_node(pt, node_woodplanks) + end + end +end + +function mainCave(coord) + local xdif = 4 + --air + FillNodes({x=coord.x-3, y=coord.y-2, z=coord.z-3}, {x=coord.x+3, y=coord.y+2, z=coord.z+3}, node_air) + -- roof + FillNodes({x=coord.x-3, z=coord.z-3, y=coord.y-3}, {x=coord.x+3, z=coord.z+3, y=coord.y-3}, node_maincave) + FillNodes({x=coord.x-3, z=coord.z-3, y=coord.y+3}, {x=coord.x+3, z=coord.z+3, y=coord.y+3}, node_maincave) + -- walls + FillNodes({x=coord.x-4, z=coord.z-3, y=coord.y-2}, {x=coord.x-4, z=coord.z+3, y=coord.y+2}, node_maincave) + FillNodes({x=coord.x+4, z=coord.z-3, y=coord.y-2}, {x=coord.x+4, z=coord.z+3, y=coord.y+2}, node_maincave) + + FillNodes({x=coord.x-3, z=coord.z-4, y=coord.y-2}, {x=coord.x+3, z=coord.z-4, y=coord.y+2}, node_maincave) + FillNodes({x=coord.x-3, z=coord.z+4, y=coord.y-2}, {x=coord.x+3, z=coord.z+4, y=coord.y+2}, node_maincave) + -- round inner edges + FillNodes({x=coord.x-3, z=coord.z-3, y=coord.y-2}, {x=coord.x+3, z=coord.z-3, y=coord.y-2}, node_maincave) + FillNodes({x=coord.x-3, z=coord.z+3, y=coord.y-2}, {x=coord.x+3, z=coord.z+3, y=coord.y-2}, node_maincave) + FillNodes({x=coord.x-3, z=coord.z-3, y=coord.y-2}, {x=coord.x-3, z=coord.z+3, y=coord.y-2}, node_maincave) + FillNodes({x=coord.x+3, z=coord.z-3, y=coord.y-2}, {x=coord.x+3, z=coord.z+3, y=coord.y-2}, node_maincave) + + FillNodes({x=coord.x-3, z=coord.z-3, y=coord.y+2}, {x=coord.x+3, z=coord.z-3, y=coord.y+2}, node_maincave) + FillNodes({x=coord.x-3, z=coord.z+3, y=coord.y+2}, {x=coord.x+3, z=coord.z+3, y=coord.y+2}, node_maincave) + FillNodes({x=coord.x-3, z=coord.z-3, y=coord.y+2}, {x=coord.x-3, z=coord.z+3, y=coord.y+2}, node_maincave) + FillNodes({x=coord.x+3, z=coord.z-3, y=coord.y+2}, {x=coord.x+3, z=coord.z+3, y=coord.y+2}, node_maincave) +end + +-- horizontal even corridor part +function corridor_part(point, direction, length, i_offset) + local vector = vec3_add(point, direction); + local place_torches = nextrandom(0,1) < probability_torches_in_segment + if place_torches then + torchdir = {1,1} + if direction.z > 0 then + torchdir = {5, 4} + elseif direction.z < 0 then + torchdir = {4,5} + elseif direction.x < 0 then + torchdir = {2, 3} + elseif direction.x > 0 then + torchdir = {3, 2} + else torchdir = {1,1} + end + end + for i = 1+i_offset,length+i_offset+2 do + minetest.set_node(vector, node_air) + + minetest.set_node({x=vector.x-direction.z, y=vector.y, z=vector.z+direction.x}, node_air) + minetest.set_node({x=vector.x-direction.z, y=vector.y-1, z=vector.z+direction.x}, node_air) + minetest.set_node({x=vector.x+direction.z, y=vector.y, z=vector.z-direction.x}, node_air) + minetest.set_node({x=vector.x+direction.z, y=vector.y-1, z=vector.z-direction.x}, node_air) + + -- Decke + FillNodesProbable({x=vector.x-direction.z, y=vector.y+1, z=vector.z-direction.x}, {x=vector.x+direction.z, y=vector.y+1, z=vector.z+direction.x}, 0.9, node_air) + if direction.y == 0 then + if nextrandom(0,2) < 1 then + minetest.set_node({x=vector.x, y=vector.y-1, z=vector.z}, node_rails) + elseif nextrandom(1,10) > 1 then + minetest.set_node({x=vector.x, y=vector.y-1, z=vector.z}, node_air) + end + -- when there is no floor: maybe wood will make it! + placeMaybePlanks({x=vector.x-direction.z, y=vector.y-2, z=vector.z+direction.x}) + placeMaybePlanks({x=vector.x, y=vector.y-2, z=vector.z}) + placeMaybePlanks({x=vector.x+direction.z, y=vector.y-2, z=vector.z-direction.x}) + vector.y = vector.y+1 + if i % 5 == 0 then + -- Wooden staff structures + minetest.set_node(vector, node_woodplanks) + placeStaff({x=vector.x+direction.z, y=vector.y, z=vector.z-direction.x}) + placeStaff({x=vector.x-direction.z, y=vector.y, z=vector.z+direction.x}) + -- torches + elseif place_torches and (i % 5 == 1) and (i > 1+i_offset) then + minetest.set_node(vector, {name=name_torch,param2=torchdir[1]}) + elseif place_torches and (i % 5 == 4) then + minetest.set_node(vector, {name=name_torch,param2=torchdir[2]}) + -- water or lava in the corridors? + elseif vector.y < 0 and nextrandom(0,1) < 0.001 then + local cnode + if nextrandom(0,02) < 0.3 then + cnode = node_lava + else + cnode = node_water + end + minetest.set_node({x=vector.x+2*direction.z, y=vector.y+nextrandom(-2,-1), z=vector.z-2*direction.x}, cnode) + -- chests? + elseif nextrandom(0,1) < probability_chest then + place_chest({x=vector.x-direction.z, y=vector.y-2, z=vector.z+direction.x}) + end + vector.y = vector.y-1 + end + + vector = vec3_add(vector, direction); + end + return vec3_sub(vector, vec3_mul(direction, 2)) +end + +-- up or down going corridor part +function coridor_part_with_y(point, direction) + local air_disc = function(p, facedir) + FillNodesProbable({x=p.x-facedir.z, y=p.y+1, z=p.z-facedir.x}, + {x=p.x+facedir.z, y=p.y-1, z=p.z+facedir.x}, 0.99, node_air) + --FillNodesProbable({x=p.x-direction.z, y=p.y-1, z=p.z-direction.x}, {x=p.x+direction.z, y=p.y-1, z=p.z+direction.x}, 0.95, node_air) + --FillNodesProbable({x=p.x-direction.z, y=p.y, z=p.z-direction.x}, {x=p.x+direction.z, y=p.y, z=p.z+direction.x}, 0.95, node_air) + --FillNodesProbable({x=p.x-direction.z, y=p.y+1, z=p.z-direction.x}, {x=p.x+direction.z, y=p.y+1, z=p.z+direction.x}, 0.95, node_air) + --minetest.set_node(p, node_air) + --print("air_disc at "..p.x..", "..p.y..", "..p.z) + end + if direction.y < 0 then + direction.y = -1 + else + direction.y = 1 + end + local vector = vec3_add(point, {x=direction.x, z=direction.z, y=0}) + air_disc(vector, direction) + vector = vec3_add(vector, direction) + air_disc(vector, direction) + vector = vec3_add(vector, {x=direction.x, z=direction.z, y=0}) + air_disc(vector, direction) + vector = vec3_add(vector, direction) + air_disc(vector, direction) + vector = vec3_add(vector, direction) + air_disc(vector, direction) + vector = vec3_add(vector, {x=direction.x, z=direction.z, y=0}) + air_disc(vector, direction) + vector = vec3_add(vector, direction) + air_disc(vector, direction) + return vector +end + +function BulkOfWood(pt, height) + -- Luftkreuz + FillNodes({x=pt.x-2, z=pt.z-1, y=pt.y-1}, {x=pt.x+2, z=pt.z+1, y=pt.y+height-1}, node_air) + FillNodes({x=pt.x-1, z=pt.z-2, y=pt.y-1}, {x=pt.x+1, z=pt.z+2, y=pt.y+height-1}, node_air) + for yi = -1,height-1 do + -- Holz + minetest.set_node({x=pt.x+1, z=pt.z+1, y=pt.y+yi-1}, node_woodplanks) + minetest.set_node({x=pt.x+1, z=pt.z-1, y=pt.y+yi-1}, node_woodplanks) + minetest.set_node({x=pt.x-1, z=pt.z+1, y=pt.y+yi-1}, node_woodplanks) + minetest.set_node({x=pt.x-1, z=pt.z-1, y=pt.y+yi-1}, node_woodplanks) + end +end + +function cross(point, lastdir, new_way_probability) + --print("cross at "..point.x..", "..point.y..", "..point.z) + local wood = nextrandom(0,5) < 1 + local second_floor = wood and nextrandom(1,3) < 2 + if wood then + if second_floor then + BulkOfWood(point, 7) + else + BulkOfWood(point, 3) + end + end + local startpoint + -- Code reduction by defining function + local newway_func = function(midpoint, direction) + if nextrandom(0,1) < new_way_probability then + if wood then + startpoint = vec3_add(midpoint, vec3_mul(direction, 2)) + else + startpoint = midpoint + end + start_corridors(startpoint, direction) + end + end + if not wood and nextrandom(0,1) < probability_up_or_down then + lastdir.y = nextrandom(-0.5, 0.5) + end + newway_func(point, lastdir) + newway_func(point, {x=-lastdir.z, y=0, z=lastdir.x}) + newway_func(point, {x=lastdir.z, y=0, z=-lastdir.x}) + if second_floor then + newway_func({x=point.x, y=point.y+4, z=point.z}, lastdir) + newway_func({x=point.x, y=point.y+4, z=point.z}, {x=-lastdir.z, y=0, z=lastdir.x}) + newway_func({x=point.x, y=point.y+4, z=point.z}, {x=lastdir.z, y=0, z=-lastdir.x}) + newway_func({x=point.x, y=point.y+4, z=point.z}, {x=-lastdir.x, y=0, z=-lastdir.z}) + end +end + +function start_corridors(startpoint, direction) + local length = nextrandom(1,4)*4 + local waypoint = vec3_add(startpoint, vec3_mul(direction, length)) + local gofurther = isPointProper(waypoint) + if direction.y ~= 0 then + waypoint = coridor_part_with_y(startpoint, direction) + else + waypoint = corridor_part(startpoint, direction, length, 3) + end + if not gofurther then + return + end + local fork = nextrandom(0,1) < propability_fork + if fork then + cross(waypoint, direction, 0.5) + end +end + +function railcaves(main_cave_coord) + mainCave(main_cave_coord) + local dir = {x=1,y=0,z=0} + local waypoint = corridor_part(vec3_add(main_cave_coord, vec3_mul(dir, 3)), dir, nextrandom(4,5)*3, 2) + cross(waypoint, dir, 1) +end + +minetest.register_on_generated(function(minp, maxp, seed) + if not pr then + pr = PseudoRandom(seed) + end + if nextrandom(0,1) < probability_railcaves_in_chunk and maxp.y < 10 then + local mp + for i = 1,3 do + mp = {x=nextrandom(minp.x,maxp.x), y=nextrandom(minp.y,maxp.y), z=nextrandom(minp.z,maxp.z)} + if isPointProper(mp) then + break + end + end + if isPointProper(mp) then + railcaves(mp) + end + end +end) diff --git a/mods/railcorridors/screenshot.png b/mods/railcorridors/screenshot.png new file mode 100644 index 0000000..be02a2e Binary files /dev/null and b/mods/railcorridors/screenshot.png differ diff --git a/mods/screwdriver/init.lua b/mods/screwdriver/init.lua new file mode 100644 index 0000000..0c77754 --- /dev/null +++ b/mods/screwdriver/init.lua @@ -0,0 +1,113 @@ +screwdriver = {} + +local function nextrange(x, max) + x = x + 1 + if x > max then + x = 0 + end + return x +end + +screwdriver.ROTATE_FACE = 1 +screwdriver.ROTATE_AXIS = 2 +screwdriver.disallow = function(pos, node, user, mode, new_param2) + return false +end +screwdriver.rotate_simple = function(pos, node, user, mode, new_param2) + if mode ~= screwdriver.ROTATE_FACE then + return false + end +end +local USES = 200 + +-- Handles rotation +local function screwdriver_handler(itemstack, user, pointed_thing, mode) + if pointed_thing.type ~= "node" then + return + end + + local pos = pointed_thing.under + + if minetest.is_protected(pos, user:get_player_name()) then + minetest.record_protection_violation(pos, user:get_player_name()) + return + end + + local node = minetest.get_node(pos) + local ndef = minetest.registered_nodes[node.name] + -- Compute param2 + local rotationPart = node.param2 % 32 -- get first 4 bits + local preservePart = node.param2 - rotationPart + local axisdir = math.floor(rotationPart / 4) + local rotation = rotationPart - axisdir * 4 + if mode == screwdriver.ROTATE_FACE then + rotationPart = axisdir * 4 + nextrange(rotation, 3) + elseif mode == screwdriver.ROTATE_AXIS then + rotationPart = nextrange(axisdir, 5) * 4 + end + + local new_param2 = preservePart + rotationPart + local should_rotate = true + + if ndef and ndef.on_rotate then -- Node provides a handler, so let the handler decide instead if the node can be rotated + -- Copy pos and node because callback can modify it + local result = ndef.on_rotate(vector.new(pos), + {name = node.name, param1 = node.param1, param2 = node.param2}, + user, mode, new_param2) + if result == false then -- Disallow rotation + return + elseif result == true then + should_rotate = false + end + else + if not ndef or not ndef.paramtype2 == "facedir" or + (ndef.drawtype == "nodebox" and + not ndef.node_box.type == "fixed") or + node.param2 == nil then + return + end + + if ndef.can_dig and not ndef.can_dig(pos, user) then + return + end + end + + if should_rotate then + node.param2 = new_param2 + minetest.swap_node(pos, node) + end + + if not minetest.setting_getbool("creative_mode") then + itemstack:add_wear(65535 / (USES - 1)) + end + + return itemstack +end + +-- Screwdriver +minetest.register_tool("screwdriver:screwdriver", { + description = "Screwdriver (left-click rotates face, right-click rotates axis)", + inventory_image = "screwdriver.png", + on_use = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, screwdriver.ROTATE_FACE) + return itemstack + end, + on_place = function(itemstack, user, pointed_thing) + screwdriver_handler(itemstack, user, pointed_thing, screwdriver.ROTATE_AXIS) + return itemstack + end, +}) + + +minetest.register_craft({ + output = "screwdriver:screwdriver", + recipe = { + {"default:steel_ingot"}, + {"group:stick"} + } +}) + +minetest.register_alias("screwdriver:screwdriver1", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver2", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver3", "screwdriver:screwdriver") +minetest.register_alias("screwdriver:screwdriver4", "screwdriver:screwdriver") diff --git a/mods/screwdriver/readme.txt b/mods/screwdriver/readme.txt new file mode 100644 index 0000000..ced1ff5 --- /dev/null +++ b/mods/screwdriver/readme.txt @@ -0,0 +1,21 @@ +Minetest mod: screwdriver +========================= + +License of source code: +----------------------- +Copyright (C) 2013 RealBadAngel, Maciej Kasatkin + +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/ + +Created by Gambit (WTFPL): + screwdriver.png \ No newline at end of file diff --git a/mods/screwdriver/textures/screwdriver.png b/mods/screwdriver/textures/screwdriver.png new file mode 100644 index 0000000..b2a56d5 Binary files /dev/null and b/mods/screwdriver/textures/screwdriver.png differ diff --git a/mods/sethome/init.lua b/mods/sethome/init.lua new file mode 100644 index 0000000..590086b --- /dev/null +++ b/mods/sethome/init.lua @@ -0,0 +1,65 @@ +local homes_file = minetest.get_worldpath() .. "/homes" +local homepos = {} + +local function loadhomes() + local input = io.open(homes_file, "r") + if input then + repeat + local x = input:read("*n") + if x == nil then + break + end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + homepos[name:sub(2)] = {x = x, y = y, z = z} + until input:read(0) == nil + io.close(input) + else + homepos = {} + end +end + +loadhomes() + +minetest.register_privilege("home", "Can use /sethome and /home") + +local changed = false + +minetest.register_chatcommand("home", { + description = "Teleport you to your home point", + privs = {home=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + if player == nil then + -- just a check to prevent the server crashing + return false + end + if homepos[player:get_player_name()] then + player:setpos(homepos[player:get_player_name()]) + minetest.chat_send_player(name, "Teleported to home!") + else + minetest.chat_send_player(name, "Set a home using /sethome") + end + end, +}) + +minetest.register_chatcommand("sethome", { + description = "Set your home point", + privs = {home=true}, + func = function(name) + local player = minetest.get_player_by_name(name) + local pos = player:getpos() + homepos[player:get_player_name()] = pos + minetest.chat_send_player(name, "Home set!") + changed = true + if changed then + local output = io.open(homes_file, "w") + for i, v in pairs(homepos) do + output:write(v.x.." "..v.y.." "..v.z.." "..i.."\n") + end + io.close(output) + changed = false + end + end, +}) diff --git a/mods/signs/README.txt b/mods/signs/README.txt new file mode 100644 index 0000000..66e3b2b --- /dev/null +++ b/mods/signs/README.txt @@ -0,0 +1,43 @@ +=== SIGNS-MOD for MINETEST-C55=== +by xyz +modified by PilzAdam + +Introduction: +This mod adds signs to Minetest, wich you can read without pointing at +the sign. The text is integrated into the 3D world. + +How to install: +Unzip the archive an place it in minetest-base-directory/mods/minetest/ +if you have a windows client or a linux run-in-place client. If you have +a linux system-wide instalation place it in ~/.minetest/mods/minetest/. +If you want to install this mod only in one world create the folder +worldmods/ in your worlddirectory. +For further information or help see: +http://wiki.minetest.com/wiki/Installing_Mods + +How to use the mod: +Craft a sign like the default signs and place them. Rightclick it and enter +your text. You can use " | " to create a newline. Hitting enter or +clicking proceed will save the text and add it to the sign. +If the text of a sign disapears just rightclick it and hit enter again. + +License: +Sourcecode: WTFPL (see below) +Font: 04b-03 (http://04.jp.org/) + +See also: +http://minetest.net/ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/signs/changelog.txt b/mods/signs/changelog.txt new file mode 100644 index 0000000..271575d --- /dev/null +++ b/mods/signs/changelog.txt @@ -0,0 +1,10 @@ +This mod is modified by PilzAdam + +Changes: +- Remove shadows under signs +- New input system: - There is just one text line that automatically will be splitted up to the lines on the sign + - You can force a newline with " | " +- It overrides the default signs +- Make it stackable + +License of code: WTFPL diff --git a/mods/signs/characters b/mods/signs/characters new file mode 100644 index 0000000..83d6505 --- /dev/null +++ b/mods/signs/characters @@ -0,0 +1,279 @@ +A +_a_ +7 +B +_b_ +5 +C +_c_ +6 +D +_d_ +6 +E +_e_ +5 +F +_f_ +5 +G +_g_ +6 +H +_h_ +6 +I +_i_ +1 +J +_j_ +4 +K +_k_ +5 +L +_l_ +4 +M +_m_ +7 +N +_n_ +6 +O +_o_ +6 +P +_p_ +5 +Q +_q_ +7 +R +_r_ +5 +S +_s_ +5 +T +_t_ +5 +U +_u_ +6 +V +_v_ +7 +W +_w_ +9 +X +_x_ +5 +Y +_y_ +7 +Z +_z_ +5 +a +_a +5 +b +_b +5 +c +_c +4 +d +_d +5 +e +_e +4 +f +_f +4 +g +_g +5 +h +_h +5 +i +_i +1 +j +_j +1 +k +_k +4 +l +_l +1 +m +_m +7 +n +_n +5 +o +_o +5 +p +_p +5 +q +_q +5 +r +_r +3 +s +_s +4 +t +_t +3 +u +_u +4 +v +_v +5 +w +_w +7 +x +_x +5 +y +_y +4 +z +_z +4 + +_sp +2 +0 +_0 +4 +1 +_1 +2 +2 +_2 +4 +3 +_3 +4 +4 +_4 +4 +5 +_5 +4 +6 +_6 +4 +7 +_7 +4 +8 +_8 +4 +9 +_9 +4 +( +_bl +2 +) +_br +2 +{ +_cl +3 +} +_cr +3 +[ +_sl +2 +] +_sr +2 +' +_ap +1 +! +_ex +1 +? +_qu +4 +@ +_at +5 +# +_hs +5 +$ +_dl +4 +% +_pr +5 +^ +_ca +3 +& +_am +5 +* +_as +3 +_ +_un +3 ++ +_ps +3 +- +_mn +3 += +_eq +3 +; +_sm +1 +, +_cm +2 +" +_qo +3 +/ +_dv +5 +~ +_tl +4 +< +_lt +3 +> +_gt +3 +\ +_re +5 +| +_vb +1 +. +_dt +1 diff --git a/mods/signs/depends.txt b/mods/signs/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/signs/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/signs/init.lua b/mods/signs/init.lua new file mode 100644 index 0000000..9d2254f --- /dev/null +++ b/mods/signs/init.lua @@ -0,0 +1,300 @@ +-- Font: 04.jp.org + +-- load characters map +local chars_file = io.open(minetest.get_modpath("signs").."/characters", "r") +local charmap = {} +local max_chars = 16 +if not chars_file then + print("[signs] E: character map file not found") +else + while true do + local char = chars_file:read("*l") + if char == nil then + break + end + local img = chars_file:read("*l") + chars_file:read("*l") + charmap[char] = img + end +end + +local signs = { + {delta = {x = 0, y = 0, z = 0.399}, yaw = 0}, + {delta = {x = 0.399, y = 0, z = 0}, yaw = math.pi / -2}, + {delta = {x = 0, y = 0, z = -0.399}, yaw = math.pi}, + {delta = {x = -0.399, y = 0, z = 0}, yaw = math.pi / 2}, +} + +local signs_yard = { + {delta = {x = 0, y = 0, z = -0.05}, yaw = 0}, + {delta = {x = -0.05, y = 0, z = 0}, yaw = math.pi / -2}, + {delta = {x = 0, y = 0, z = 0.05}, yaw = math.pi}, + {delta = {x = 0.05, y = 0, z = 0}, yaw = math.pi / 2}, +} + +local sign_groups = {choppy=2, dig_immediate=2} + +local construct_sign = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", "field[text;;${text}]") + meta:set_string("infotext", "") +end + +local destruct_sign = function(pos) + local objects = minetest.env:get_objects_inside_radius(pos, 0.5) + for _, v in ipairs(objects) do + if v:get_entity_name() == "signs:text" then + v:remove() + end + end +end + +local update_sign = function(pos, fields) + local meta = minetest.env:get_meta(pos) + meta:set_string("infotext", "") + if fields then + meta:set_string("text", fields.text) + end + local text = meta:get_string("text") + local objects = minetest.env:get_objects_inside_radius(pos, 0.5) + for _, v in ipairs(objects) do + if v:get_entity_name() == "signs:text" then + v:set_properties({textures={generate_texture(create_lines(text))}}) + return + end + end + + -- if there is no entity + local sign_info + if minetest.env:get_node(pos).name == "signs:sign_yard" then + sign_info = signs_yard[minetest.env:get_node(pos).param2 + 1] + elseif minetest.env:get_node(pos).name == "default:sign_wall" then + sign_info = signs[minetest.env:get_node(pos).param2 + 1] + end + if sign_info == nil then + return + end + local text = minetest.env:add_entity({x = pos.x + sign_info.delta.x, + y = pos.y + sign_info.delta.y, + z = pos.z + sign_info.delta.z}, "signs:text") + text:setyaw(sign_info.yaw) +end + +minetest.register_node(":default:sign_wall", { + description = "Sign", + inventory_image = "default_sign_wall.png", + wield_image = "default_sign_wall.png", + node_placement_prediction = "", + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = {type = "fixed", fixed = {-0.45, -0.15, 0.4, 0.45, 0.45, 0.498}}, + selection_box = {type = "fixed", fixed = {-0.45, -0.15, 0.4, 0.45, 0.45, 0.498}}, + tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"}, + groups = sign_groups, + + on_place = function(itemstack, placer, pointed_thing) + local above = pointed_thing.above + local under = pointed_thing.under + local dir = {x = under.x - above.x, + y = under.y - above.y, + z = under.z - above.z} + + local wdir = minetest.dir_to_wallmounted(dir) + + local placer_pos = placer:getpos() + if placer_pos then + dir = { + x = above.x - placer_pos.x, + y = above.y - placer_pos.y, + z = above.z - placer_pos.z + } + end + + local fdir = minetest.dir_to_facedir(dir) + + local sign_info + if wdir == 0 then + --how would you add sign to ceiling? + minetest.env:add_item(above, "default:sign_wall") + itemstack:take_item() + return itemstack + elseif wdir == 1 then + minetest.env:add_node(above, {name = "signs:sign_yard", param2 = fdir}) + sign_info = signs_yard[fdir + 1] + else + minetest.env:add_node(above, {name = "default:sign_wall", param2 = fdir}) + sign_info = signs[fdir + 1] + end + + local text = minetest.env:add_entity({x = above.x + sign_info.delta.x, + y = above.y + sign_info.delta.y, + z = above.z + sign_info.delta.z}, "signs:text") + text:setyaw(sign_info.yaw) + + itemstack:take_item() + return itemstack + end, + on_construct = function(pos) + construct_sign(pos) + end, + on_destruct = function(pos) + destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + update_sign(pos, fields) + end, + on_punch = function(pos, node, puncher) + update_sign(pos) + end, +}) + +minetest.register_node("signs:sign_yard", { + paramtype = "light", + sunlight_propagates = true, + paramtype2 = "facedir", + drawtype = "nodebox", + node_box = {type = "fixed", fixed = { + {-0.45, -0.15, -0.049, 0.45, 0.45, 0.049}, + {-0.05, -0.5, -0.049, 0.05, -0.15, 0.049} + }}, + selection_box = {type = "fixed", fixed = {-0.45, -0.15, -0.049, 0.45, 0.45, 0.049}}, + tiles = {"signs_top.png", "signs_bottom.png", "signs_side.png", "signs_side.png", "signs_back.png", "signs_front.png"}, + groups = {choppy=2, dig_immediate=2}, + drop = "default:sign_wall", + + on_construct = function(pos) + construct_sign(pos) + end, + on_destruct = function(pos) + destruct_sign(pos) + end, + on_receive_fields = function(pos, formname, fields, sender) + update_sign(pos, fields) + end, + on_punch = function(pos, node, puncher) + update_sign(pos) + end, +}) + +minetest.register_entity("signs:text", { + collisionbox = { 0, 0, 0, 0, 0, 0 }, + visual = "upright_sprite", + textures = {}, + + on_activate = function(self) + local meta = minetest.env:get_meta(self.object:getpos()) + local text = meta:get_string("text") + self.object:set_properties({textures={generate_texture(create_lines(text))}}) + end +}) + +-- CONSTANTS +local SIGN_WITH = 110 +local SIGN_PADDING = 8 + +local LINE_LENGTH = 16 +local NUMBER_OF_LINES = 4 + +local LINE_HEIGHT = 14 +local CHAR_WIDTH = 5 + +string_to_array = function(str) + local tab = {} + for i=1,string.len(str) do + table.insert(tab, string.sub(str, i,i)) + end + return tab +end + +string_to_word_array = function(str) + local tab = {} + local current = 1 + tab[1] = "" + for _,char in ipairs(string_to_array(str)) do + if char ~= " " then + tab[current] = tab[current]..char + else + current = current+1 + tab[current] = "" + end + end + return tab +end + +create_lines = function(text) + local line = "" + local line_num = 1 + local tab = {} + for _,word in ipairs(string_to_word_array(text)) do + if string.len(line)+string.len(word) < LINE_LENGTH and word ~= "|" then + if line ~= "" then + line = line.." "..word + else + line = word + end + else + table.insert(tab, line) + if word ~= "|" then + line = word + else + line = "" + end + line_num = line_num+1 + if line_num > NUMBER_OF_LINES then + return tab + end + end + end + table.insert(tab, line) + return tab +end + +generate_texture = function(lines) + local texture = "[combine:"..SIGN_WITH.."x"..SIGN_WITH + local ypos = 12 + for i = 1, #lines do + texture = texture..generate_line(lines[i], ypos) + ypos = ypos + LINE_HEIGHT + end + return texture +end + +generate_line = function(s, ypos) + local i = 1 + local parsed = {} + local width = 0 + local chars = 0 + while chars < max_chars and i <= #s do + local file = nil + if charmap[s:sub(i, i)] ~= nil then + file = charmap[s:sub(i, i)] + i = i + 1 + elseif i < #s and charmap[s:sub(i, i + 1)] ~= nil then + file = charmap[s:sub(i, i + 1)] + i = i + 2 + else + print("[signs] W: unknown symbol in '"..s.."' at "..i.." (probably "..s:sub(i, i)..")") + i = i + 1 + end + if file ~= nil then + width = width + CHAR_WIDTH + table.insert(parsed, file) + chars = chars + 1 + end + end + width = width - 1 + + local texture = "" + local xpos = math.floor((SIGN_WITH - 2 * SIGN_PADDING - width) / 2 + SIGN_PADDING) + for i = 1, #parsed do + texture = texture..":"..xpos..","..ypos.."="..parsed[i]..".png" + xpos = xpos + CHAR_WIDTH + 1 + end + return texture +end + +if minetest.setting_get("log_mods") then + minetest.log("action", "signs loaded") +end diff --git a/mods/signs/textures/_0.png b/mods/signs/textures/_0.png new file mode 100644 index 0000000..b030879 Binary files /dev/null and b/mods/signs/textures/_0.png differ diff --git a/mods/signs/textures/_1.png b/mods/signs/textures/_1.png new file mode 100644 index 0000000..ae28369 Binary files /dev/null and b/mods/signs/textures/_1.png differ diff --git a/mods/signs/textures/_2.png b/mods/signs/textures/_2.png new file mode 100644 index 0000000..7375c68 Binary files /dev/null and b/mods/signs/textures/_2.png differ diff --git a/mods/signs/textures/_3.png b/mods/signs/textures/_3.png new file mode 100644 index 0000000..d724811 Binary files /dev/null and b/mods/signs/textures/_3.png differ diff --git a/mods/signs/textures/_4.png b/mods/signs/textures/_4.png new file mode 100644 index 0000000..0fff433 Binary files /dev/null and b/mods/signs/textures/_4.png differ diff --git a/mods/signs/textures/_5.png b/mods/signs/textures/_5.png new file mode 100644 index 0000000..43010df Binary files /dev/null and b/mods/signs/textures/_5.png differ diff --git a/mods/signs/textures/_6.png b/mods/signs/textures/_6.png new file mode 100644 index 0000000..1eba38c Binary files /dev/null and b/mods/signs/textures/_6.png differ diff --git a/mods/signs/textures/_7.png b/mods/signs/textures/_7.png new file mode 100644 index 0000000..dbcd2d1 Binary files /dev/null and b/mods/signs/textures/_7.png differ diff --git a/mods/signs/textures/_8.png b/mods/signs/textures/_8.png new file mode 100644 index 0000000..edf6ef5 Binary files /dev/null and b/mods/signs/textures/_8.png differ diff --git a/mods/signs/textures/_9.png b/mods/signs/textures/_9.png new file mode 100644 index 0000000..c276c11 Binary files /dev/null and b/mods/signs/textures/_9.png differ diff --git a/mods/signs/textures/_a.png b/mods/signs/textures/_a.png new file mode 100644 index 0000000..8f3f59c Binary files /dev/null and b/mods/signs/textures/_a.png differ diff --git a/mods/signs/textures/_a_.png b/mods/signs/textures/_a_.png new file mode 100644 index 0000000..4da193c Binary files /dev/null and b/mods/signs/textures/_a_.png differ diff --git a/mods/signs/textures/_am.png b/mods/signs/textures/_am.png new file mode 100644 index 0000000..75d0287 Binary files /dev/null and b/mods/signs/textures/_am.png differ diff --git a/mods/signs/textures/_ap.png b/mods/signs/textures/_ap.png new file mode 100644 index 0000000..5dd3325 Binary files /dev/null and b/mods/signs/textures/_ap.png differ diff --git a/mods/signs/textures/_as.png b/mods/signs/textures/_as.png new file mode 100644 index 0000000..3c7a25a Binary files /dev/null and b/mods/signs/textures/_as.png differ diff --git a/mods/signs/textures/_at.png b/mods/signs/textures/_at.png new file mode 100644 index 0000000..4f9841c Binary files /dev/null and b/mods/signs/textures/_at.png differ diff --git a/mods/signs/textures/_b.png b/mods/signs/textures/_b.png new file mode 100644 index 0000000..baf4eaa Binary files /dev/null and b/mods/signs/textures/_b.png differ diff --git a/mods/signs/textures/_b_.png b/mods/signs/textures/_b_.png new file mode 100644 index 0000000..b00a378 Binary files /dev/null and b/mods/signs/textures/_b_.png differ diff --git a/mods/signs/textures/_bl.png b/mods/signs/textures/_bl.png new file mode 100644 index 0000000..546ca4e Binary files /dev/null and b/mods/signs/textures/_bl.png differ diff --git a/mods/signs/textures/_br.png b/mods/signs/textures/_br.png new file mode 100644 index 0000000..5700fa6 Binary files /dev/null and b/mods/signs/textures/_br.png differ diff --git a/mods/signs/textures/_c.png b/mods/signs/textures/_c.png new file mode 100644 index 0000000..eedd639 Binary files /dev/null and b/mods/signs/textures/_c.png differ diff --git a/mods/signs/textures/_c_.png b/mods/signs/textures/_c_.png new file mode 100644 index 0000000..cab6518 Binary files /dev/null and b/mods/signs/textures/_c_.png differ diff --git a/mods/signs/textures/_ca.png b/mods/signs/textures/_ca.png new file mode 100644 index 0000000..d359c88 Binary files /dev/null and b/mods/signs/textures/_ca.png differ diff --git a/mods/signs/textures/_cl.png b/mods/signs/textures/_cl.png new file mode 100644 index 0000000..55396b9 Binary files /dev/null and b/mods/signs/textures/_cl.png differ diff --git a/mods/signs/textures/_cm.png b/mods/signs/textures/_cm.png new file mode 100644 index 0000000..28beedf Binary files /dev/null and b/mods/signs/textures/_cm.png differ diff --git a/mods/signs/textures/_cr.png b/mods/signs/textures/_cr.png new file mode 100644 index 0000000..ac466a9 Binary files /dev/null and b/mods/signs/textures/_cr.png differ diff --git a/mods/signs/textures/_d.png b/mods/signs/textures/_d.png new file mode 100644 index 0000000..a5f0699 Binary files /dev/null and b/mods/signs/textures/_d.png differ diff --git a/mods/signs/textures/_d_.png b/mods/signs/textures/_d_.png new file mode 100644 index 0000000..9a0e3ed Binary files /dev/null and b/mods/signs/textures/_d_.png differ diff --git a/mods/signs/textures/_dl.png b/mods/signs/textures/_dl.png new file mode 100644 index 0000000..72184ad Binary files /dev/null and b/mods/signs/textures/_dl.png differ diff --git a/mods/signs/textures/_dt.png b/mods/signs/textures/_dt.png new file mode 100644 index 0000000..61c1e4a Binary files /dev/null and b/mods/signs/textures/_dt.png differ diff --git a/mods/signs/textures/_dv.png b/mods/signs/textures/_dv.png new file mode 100644 index 0000000..996d7cd Binary files /dev/null and b/mods/signs/textures/_dv.png differ diff --git a/mods/signs/textures/_e.png b/mods/signs/textures/_e.png new file mode 100644 index 0000000..29e32e6 Binary files /dev/null and b/mods/signs/textures/_e.png differ diff --git a/mods/signs/textures/_e_.png b/mods/signs/textures/_e_.png new file mode 100644 index 0000000..c7f19c1 Binary files /dev/null and b/mods/signs/textures/_e_.png differ diff --git a/mods/signs/textures/_eq.png b/mods/signs/textures/_eq.png new file mode 100644 index 0000000..daf8424 Binary files /dev/null and b/mods/signs/textures/_eq.png differ diff --git a/mods/signs/textures/_ex.png b/mods/signs/textures/_ex.png new file mode 100644 index 0000000..b5da8e9 Binary files /dev/null and b/mods/signs/textures/_ex.png differ diff --git a/mods/signs/textures/_f.png b/mods/signs/textures/_f.png new file mode 100644 index 0000000..6835912 Binary files /dev/null and b/mods/signs/textures/_f.png differ diff --git a/mods/signs/textures/_f_.png b/mods/signs/textures/_f_.png new file mode 100644 index 0000000..3698ed2 Binary files /dev/null and b/mods/signs/textures/_f_.png differ diff --git a/mods/signs/textures/_g.png b/mods/signs/textures/_g.png new file mode 100644 index 0000000..5a85cde Binary files /dev/null and b/mods/signs/textures/_g.png differ diff --git a/mods/signs/textures/_g_.png b/mods/signs/textures/_g_.png new file mode 100644 index 0000000..cc7bbc5 Binary files /dev/null and b/mods/signs/textures/_g_.png differ diff --git a/mods/signs/textures/_gt.png b/mods/signs/textures/_gt.png new file mode 100644 index 0000000..f30855a Binary files /dev/null and b/mods/signs/textures/_gt.png differ diff --git a/mods/signs/textures/_h.png b/mods/signs/textures/_h.png new file mode 100644 index 0000000..1a66a9e Binary files /dev/null and b/mods/signs/textures/_h.png differ diff --git a/mods/signs/textures/_h_.png b/mods/signs/textures/_h_.png new file mode 100644 index 0000000..87beafc Binary files /dev/null and b/mods/signs/textures/_h_.png differ diff --git a/mods/signs/textures/_ha.png b/mods/signs/textures/_ha.png new file mode 100644 index 0000000..4618ced Binary files /dev/null and b/mods/signs/textures/_ha.png differ diff --git a/mods/signs/textures/_hs.png b/mods/signs/textures/_hs.png new file mode 100644 index 0000000..6f12bec Binary files /dev/null and b/mods/signs/textures/_hs.png differ diff --git a/mods/signs/textures/_i.png b/mods/signs/textures/_i.png new file mode 100644 index 0000000..f001142 Binary files /dev/null and b/mods/signs/textures/_i.png differ diff --git a/mods/signs/textures/_i_.png b/mods/signs/textures/_i_.png new file mode 100644 index 0000000..fc658b8 Binary files /dev/null and b/mods/signs/textures/_i_.png differ diff --git a/mods/signs/textures/_j.png b/mods/signs/textures/_j.png new file mode 100644 index 0000000..87d2f26 Binary files /dev/null and b/mods/signs/textures/_j.png differ diff --git a/mods/signs/textures/_j_.png b/mods/signs/textures/_j_.png new file mode 100644 index 0000000..c0d9ac2 Binary files /dev/null and b/mods/signs/textures/_j_.png differ diff --git a/mods/signs/textures/_k.png b/mods/signs/textures/_k.png new file mode 100644 index 0000000..34f9336 Binary files /dev/null and b/mods/signs/textures/_k.png differ diff --git a/mods/signs/textures/_k_.png b/mods/signs/textures/_k_.png new file mode 100644 index 0000000..86b623d Binary files /dev/null and b/mods/signs/textures/_k_.png differ diff --git a/mods/signs/textures/_l.png b/mods/signs/textures/_l.png new file mode 100644 index 0000000..defe7ec Binary files /dev/null and b/mods/signs/textures/_l.png differ diff --git a/mods/signs/textures/_l_.png b/mods/signs/textures/_l_.png new file mode 100644 index 0000000..3fe1de2 Binary files /dev/null and b/mods/signs/textures/_l_.png differ diff --git a/mods/signs/textures/_lt.png b/mods/signs/textures/_lt.png new file mode 100644 index 0000000..ec7219d Binary files /dev/null and b/mods/signs/textures/_lt.png differ diff --git a/mods/signs/textures/_m.png b/mods/signs/textures/_m.png new file mode 100644 index 0000000..e0fe039 Binary files /dev/null and b/mods/signs/textures/_m.png differ diff --git a/mods/signs/textures/_m_.png b/mods/signs/textures/_m_.png new file mode 100644 index 0000000..9164da6 Binary files /dev/null and b/mods/signs/textures/_m_.png differ diff --git a/mods/signs/textures/_mn.png b/mods/signs/textures/_mn.png new file mode 100644 index 0000000..935a2fe Binary files /dev/null and b/mods/signs/textures/_mn.png differ diff --git a/mods/signs/textures/_n.png b/mods/signs/textures/_n.png new file mode 100644 index 0000000..ac10fd9 Binary files /dev/null and b/mods/signs/textures/_n.png differ diff --git a/mods/signs/textures/_n_.png b/mods/signs/textures/_n_.png new file mode 100644 index 0000000..d4355c1 Binary files /dev/null and b/mods/signs/textures/_n_.png differ diff --git a/mods/signs/textures/_o.png b/mods/signs/textures/_o.png new file mode 100644 index 0000000..080e99d Binary files /dev/null and b/mods/signs/textures/_o.png differ diff --git a/mods/signs/textures/_o_.png b/mods/signs/textures/_o_.png new file mode 100644 index 0000000..2d19051 Binary files /dev/null and b/mods/signs/textures/_o_.png differ diff --git a/mods/signs/textures/_p.png b/mods/signs/textures/_p.png new file mode 100644 index 0000000..3050959 Binary files /dev/null and b/mods/signs/textures/_p.png differ diff --git a/mods/signs/textures/_p_.png b/mods/signs/textures/_p_.png new file mode 100644 index 0000000..0cca011 Binary files /dev/null and b/mods/signs/textures/_p_.png differ diff --git a/mods/signs/textures/_pr.png b/mods/signs/textures/_pr.png new file mode 100644 index 0000000..b835141 Binary files /dev/null and b/mods/signs/textures/_pr.png differ diff --git a/mods/signs/textures/_ps.png b/mods/signs/textures/_ps.png new file mode 100644 index 0000000..1f4b5c1 Binary files /dev/null and b/mods/signs/textures/_ps.png differ diff --git a/mods/signs/textures/_q.png b/mods/signs/textures/_q.png new file mode 100644 index 0000000..945b6cf Binary files /dev/null and b/mods/signs/textures/_q.png differ diff --git a/mods/signs/textures/_q_.png b/mods/signs/textures/_q_.png new file mode 100644 index 0000000..f3bf455 Binary files /dev/null and b/mods/signs/textures/_q_.png differ diff --git a/mods/signs/textures/_qo.png b/mods/signs/textures/_qo.png new file mode 100644 index 0000000..5d261e3 Binary files /dev/null and b/mods/signs/textures/_qo.png differ diff --git a/mods/signs/textures/_qu.png b/mods/signs/textures/_qu.png new file mode 100644 index 0000000..5eb597a Binary files /dev/null and b/mods/signs/textures/_qu.png differ diff --git a/mods/signs/textures/_r.png b/mods/signs/textures/_r.png new file mode 100644 index 0000000..39e9fce Binary files /dev/null and b/mods/signs/textures/_r.png differ diff --git a/mods/signs/textures/_r_.png b/mods/signs/textures/_r_.png new file mode 100644 index 0000000..6c71c1e Binary files /dev/null and b/mods/signs/textures/_r_.png differ diff --git a/mods/signs/textures/_re.png b/mods/signs/textures/_re.png new file mode 100644 index 0000000..1614837 Binary files /dev/null and b/mods/signs/textures/_re.png differ diff --git a/mods/signs/textures/_s.png b/mods/signs/textures/_s.png new file mode 100644 index 0000000..a0ada1a Binary files /dev/null and b/mods/signs/textures/_s.png differ diff --git a/mods/signs/textures/_s_.png b/mods/signs/textures/_s_.png new file mode 100644 index 0000000..9b018bb Binary files /dev/null and b/mods/signs/textures/_s_.png differ diff --git a/mods/signs/textures/_sl.png b/mods/signs/textures/_sl.png new file mode 100644 index 0000000..08c9547 Binary files /dev/null and b/mods/signs/textures/_sl.png differ diff --git a/mods/signs/textures/_sm.png b/mods/signs/textures/_sm.png new file mode 100644 index 0000000..385c64f Binary files /dev/null and b/mods/signs/textures/_sm.png differ diff --git a/mods/signs/textures/_sp.png b/mods/signs/textures/_sp.png new file mode 100644 index 0000000..4f38a35 Binary files /dev/null and b/mods/signs/textures/_sp.png differ diff --git a/mods/signs/textures/_sr.png b/mods/signs/textures/_sr.png new file mode 100644 index 0000000..bc9c0a2 Binary files /dev/null and b/mods/signs/textures/_sr.png differ diff --git a/mods/signs/textures/_t.png b/mods/signs/textures/_t.png new file mode 100644 index 0000000..c55731a Binary files /dev/null and b/mods/signs/textures/_t.png differ diff --git a/mods/signs/textures/_t_.png b/mods/signs/textures/_t_.png new file mode 100644 index 0000000..773e666 Binary files /dev/null and b/mods/signs/textures/_t_.png differ diff --git a/mods/signs/textures/_tl.png b/mods/signs/textures/_tl.png new file mode 100644 index 0000000..059fe68 Binary files /dev/null and b/mods/signs/textures/_tl.png differ diff --git a/mods/signs/textures/_u.png b/mods/signs/textures/_u.png new file mode 100644 index 0000000..98bf8e6 Binary files /dev/null and b/mods/signs/textures/_u.png differ diff --git a/mods/signs/textures/_u_.png b/mods/signs/textures/_u_.png new file mode 100644 index 0000000..35ce915 Binary files /dev/null and b/mods/signs/textures/_u_.png differ diff --git a/mods/signs/textures/_un.png b/mods/signs/textures/_un.png new file mode 100644 index 0000000..01f547a Binary files /dev/null and b/mods/signs/textures/_un.png differ diff --git a/mods/signs/textures/_v.png b/mods/signs/textures/_v.png new file mode 100644 index 0000000..b692d11 Binary files /dev/null and b/mods/signs/textures/_v.png differ diff --git a/mods/signs/textures/_v_.png b/mods/signs/textures/_v_.png new file mode 100644 index 0000000..8049771 Binary files /dev/null and b/mods/signs/textures/_v_.png differ diff --git a/mods/signs/textures/_vb.png b/mods/signs/textures/_vb.png new file mode 100644 index 0000000..7fed7dc Binary files /dev/null and b/mods/signs/textures/_vb.png differ diff --git a/mods/signs/textures/_w.png b/mods/signs/textures/_w.png new file mode 100644 index 0000000..6a58b07 Binary files /dev/null and b/mods/signs/textures/_w.png differ diff --git a/mods/signs/textures/_w_.png b/mods/signs/textures/_w_.png new file mode 100644 index 0000000..64904de Binary files /dev/null and b/mods/signs/textures/_w_.png differ diff --git a/mods/signs/textures/_x.png b/mods/signs/textures/_x.png new file mode 100644 index 0000000..b769e13 Binary files /dev/null and b/mods/signs/textures/_x.png differ diff --git a/mods/signs/textures/_x_.png b/mods/signs/textures/_x_.png new file mode 100644 index 0000000..2f6d067 Binary files /dev/null and b/mods/signs/textures/_x_.png differ diff --git a/mods/signs/textures/_y.png b/mods/signs/textures/_y.png new file mode 100644 index 0000000..777b55e Binary files /dev/null and b/mods/signs/textures/_y.png differ diff --git a/mods/signs/textures/_y_.png b/mods/signs/textures/_y_.png new file mode 100644 index 0000000..0c40de9 Binary files /dev/null and b/mods/signs/textures/_y_.png differ diff --git a/mods/signs/textures/_z.png b/mods/signs/textures/_z.png new file mode 100644 index 0000000..ae010fe Binary files /dev/null and b/mods/signs/textures/_z.png differ diff --git a/mods/signs/textures/_z_.png b/mods/signs/textures/_z_.png new file mode 100644 index 0000000..1c3e053 Binary files /dev/null and b/mods/signs/textures/_z_.png differ diff --git a/mods/signs/textures/signs_back.png b/mods/signs/textures/signs_back.png new file mode 100644 index 0000000..d3fa19a Binary files /dev/null and b/mods/signs/textures/signs_back.png differ diff --git a/mods/signs/textures/signs_bottom.png b/mods/signs/textures/signs_bottom.png new file mode 100644 index 0000000..604a0fc Binary files /dev/null and b/mods/signs/textures/signs_bottom.png differ diff --git a/mods/signs/textures/signs_front.png b/mods/signs/textures/signs_front.png new file mode 100644 index 0000000..e426bec Binary files /dev/null and b/mods/signs/textures/signs_front.png differ diff --git a/mods/signs/textures/signs_side.png b/mods/signs/textures/signs_side.png new file mode 100644 index 0000000..8bd809d Binary files /dev/null and b/mods/signs/textures/signs_side.png differ diff --git a/mods/signs/textures/signs_sign.png b/mods/signs/textures/signs_sign.png new file mode 100644 index 0000000..bd1fc7a Binary files /dev/null and b/mods/signs/textures/signs_sign.png differ diff --git a/mods/signs/textures/signs_top.png b/mods/signs/textures/signs_top.png new file mode 100644 index 0000000..144656e Binary files /dev/null and b/mods/signs/textures/signs_top.png differ diff --git a/mods/smartfs/README.md b/mods/smartfs/README.md new file mode 100644 index 0000000..df0e166 --- /dev/null +++ b/mods/smartfs/README.md @@ -0,0 +1,88 @@ +smartfs +======= + +This mod provides a 2nd generation way of creating forms - this means that the modder does not need to worry about complex formspec strings + +* Expandable: you can register your own elements to use on the form. +* Easy event handling: use binding to handle events. +* New elements: Includes a toggle button + +License: WTFPL +To install this library, place the smartfs.lua file in your mod and then include it (dofile). +There is an init.lua file in the download that shows you how to do this. + +#Using Smart Formspec +Smartfs provides 2nd generation Minetest forms to replace clunky formspec strings. Each smartfs form is a container filled with GUI elements. A number of default elements are included with smartfs, but modders can also define their own custom elements. This document describes the basic usage of the smartfs API. + +##Installation +Smartfs can be used as a library or a mod. + +To use smartfs as a library, copy the smartfs.lua file to your mod folder and add + dofile(minetest.get\_modpath(minetest.get\_current\_modname()).."/smartfs.lua") +to the top of any files that use it. + +To use smartfs as a mod, add it to your game's mods folder or to the user mods folder and enable it. + +## Creating and showing forms +A form is a rectangular area of the screen upon which all elements are placed. Use the smartfs.create() function to create a new form. This function takes two arguments and returns a form object. + +The first argument is a unique string that identifies the form. The second argument is a function that should take a single argument called state which is used to set form properties like size and background color. State also has constructors for all form elements and can be used with state:element_name. Below is a quick example. + + myform = smartfs.create("My Form",function(state) + --sets the form's size + -- (width, hieght) + state:size(5,5) + + --creates a label and places it on the form + --(x-pos, y-pos, name, text) + state:label(3,3,"label1", "A label!") + end) + +Forms can be shown to the player by using the show(target) function. The target argument is the name of the player that will see the form. + + myform:show("singleplayer") + +Here is a list of steps the library takes. +* You create a new form using smartfs.create(). +* The form is registered and stored for later use. +* You show a form to a player using the myform:show() +* The state is created and stored. +* The function in smartfs.create runs and creates the elements. +* The form is displayed to the player. + +## Modifying Elements +Elements have functions of the form element:function(args) where you need to have access to the element object. + +You can get the element object by assigning a variable to its creation function like so: + + local button1 = state:button(0,0, 1,4, "btn1", "A button") + --button1 is now a table representing the button + +You can also get the element by using state:get(name). The example below will retrieve a button with the name "btn1": + + button1 = state:get("btn1") + --or + state:get("btn1"):onClick(your\_onclick\_function + +Both of these methods should be used inside the form creation callback function, the function you pass to smartfs.create, or in event callbacks. + +Now that you have located your element you can modify it. + + button1:setPos(4,0) + +## Inventory Support +Smartfs supports adding a button to Inventory+ or Unified Inventory which will open one of your own custom forms. Use the smartfs.add\_to\_inventory(form, icon, title) function where form is the smartfs form linked to by the button, icon is the button image (only for unified inventory), and title is the button text (only for inventory+). + + smartfs.add_to_inventory(form, icon, title) + +## Dynamic forms +Dynamic forms allow you to make a form without having to register it before the game finished loading. + + local state = smartfs.dynamic("smartfs:dyn_form", name) + state:load(minetest.get_modpath("smartfs").."/example.smartfs") + state:get("btn"):click(function(self,state) + print("Button clicked!") + end) + state:show() + +Make sure you call state:show() diff --git a/mods/smartfs/api.md b/mods/smartfs/api.md new file mode 100644 index 0000000..69e3f47 --- /dev/null +++ b/mods/smartfs/api.md @@ -0,0 +1,107 @@ +#Full API +##Smartfs +* smartfs( name ) - returns the form regisered with the name 'name' +* smartfs.create( name,function ) - creates a new form and adds elements to it by running the function. Use before Minetest loads. (like minetest.register_node) +* smartfs.element( name, data ) - creates a new element type. +* smartfs.dynamic( formname, playername ) - creates a dynamic form. Returns state. See example.lua for example. Remember to call state:show() +* smartfs.add\_to\_inventory(form, icon, title) - Adds a form to an installed advanced inventory. Returns true on success. +* smartfs.inventory_mod() - Returns the name of an installed and supported inventory mod that will be used above, or null. +* smartfs.override\_load\_checks() - Allows you to use smartfs.create after the game loads. Not recommended! + +##Form +* form:show( playername [, parameters] ) - shows the form to a player. See state.param. +* form.name - the name of the form. + +##State + +### Methods +* state:size( width,height ) - sets the forms width and height. +* state:get( name ) - gets an element by name. +* state:show() - reshows the form to the player. +* state:close() - closes the form (does not work yet, due to no MT api support). +* state:load( filepath ) - Loads elements from a file. +* state:save( filepath ) - Saves elements to a file. +* state:button( x,y,w,h,name,text [, exit_on_click] ) - create a new button at x,y with name and caption (text) + * ^ optional: exit_on_click - set to true to exit the form when the button is clicked. ( Also see button.setClose() ) +* state:toggle( x,y,w,h,name,list ) - create a new toggle button at x,y with name and possible list of values +* state:label( x,y,name,text ) - create a new label at x,y with name and caption (text) +* state:field( x,y,w,h,name,label ) - create a new field at x,y with label + * state:pwdfield( x,y,w,h,name,label ) - create a password field + * state:textarea( x,y,w,h,name,label ) - create a new textarea +* state:image( x,y,w,h,name,imagepath ) - create an image box. +* state:inventory( x,y,w,h,name ) - create an inventory listing (use 'main' as name for the main player inventory) +* state:checkbox( x,y,name,label,selected ) - create a check box. +* state:element( element_type, data ) - Semi-private, create an element with type and data. + +### Variables +* state.player - The name of the player. +* state.param - The parameters supplied by form:show. +* state.def - The form definition. +* state.is_inv - Boolean which is true if this form is being shown as an inventory. + +##Button +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setSize( w,h ) - set the size +* element:getSize() - get the size +* element:setText( text ) - set the caption of the button +* element:getText() - get the caption of the button +* element:setImage( filename ) - sets the background of the button +* element:getImage() - get the background filename of the button +* element:click( func(self,state) ) - specify a function to run when the button is clicked + +##Toggle Button +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setSize( w,h ) - set the size +* element:getSize() - get the size +* element:getText() - get the text of the toggle option +* element:setId( filename ) - sets the selected id +* element:getId() - get the selected id +* element:onToggle( func(self,state) ) - specify a function to run when the value if toggled + +##Label +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setText( text ) - set the caption of the label +* element:getText() - get the caption of the label + +##Field and Text Area +* element:setPosition( x,y ) - change the position +* element:getPosition() - get the current position +* element:setSize( w,h ) - set the size +* element:getSize() - get the size +* element:setText( text ) - set the caption of the button +* element:getText() - get the caption of the field +* element:setImage( filename ) - sets the background of the field +* element:getImage() - get the background filename of the field + +##List box +* element:onClick( func(self,state,idx) ) - function to run when listbox item idx is clicked +* element:onDoubleClick( func(self,state,idx) ) - function to run when listbox item idx is double clicked +* element:setPosition( x,y ) - set the position +* element:getPosition() - returns {x=x, y=y} +* element:setSize( w,h ) - set the size +* element:getSize() - gets the size {w=w, h=h} +* element:addItem( item ) - appends and item +* element:removeItem( idx ) - remove item +* element:popItem() - removes last item and returns + +##Inventory listing +* element:setPosition( x,y ) - set the position +* element:getPosition() - returns {x=x, y=y} +* element:setSize( w,h ) - set the size +* element:getSize() - gets the size {w=w, h=h} +* element:setLocation( location ) - set a custom inventory location or nil for the default (current_player) + * element:usePosition( position ) - use a node metadata attached inventory of the node at the given positon + * element:useDetached( name ) - use a detached inventory with the given name + * element:usePlayer( name ) - use a player inventory other than the current player +* element:getLocation() - returns the inventory location (default: current_player) +* element:setIndex( index ) - set the inventory starting index +* element:getIndex() - returns the inventory starting index + +##Custom Code +* element:onSubmit( func(self) ) - on form submit +* element:onBuild( func(self) ) - run every time form is shown. You can set code from here +* element:setCode( code ) - set the formspec code +* element:getCode( code ) - get the formspec code diff --git a/mods/smartfs/depends.txt b/mods/smartfs/depends.txt new file mode 100644 index 0000000..4893cdc --- /dev/null +++ b/mods/smartfs/depends.txt @@ -0,0 +1,2 @@ +unified_inventory? +inventory_plus? diff --git a/mods/smartfs/example.lua b/mods/smartfs/example.lua new file mode 100644 index 0000000..935dd70 --- /dev/null +++ b/mods/smartfs/example.lua @@ -0,0 +1,66 @@ +dofile(minetest.get_modpath("smartfs").."/smartfs.lua") + +s = smartfs.create("smartfs:form",function(state) + state:size(10,7) + state:label(2,0,"lbl","SmartFS example formspec!") + state:field(7,1,3,1,"txt","Textbox") + state:image(0,0,2,2,"img","default_stone.png") + state:toggle(0,2,3,1,"tg",{"plenty..","of..","custom..","elements"}) + state:checkbox(2,1,"c","Easy code",true) + local res = "smartfs.create(\"smartfs:form\",function(state)\n" + res = res .. "\tstate:size(10,7)\n" + res = res .. "\tstate:label(2,0,\"lbl\",\"SmartFS example formspec!\")\n" + res = res .. "\tstate:field(7,1,3,1,\"txt\",\"Textbox\")\n" + res = res .. "\tstate:image(0,0,2,2,\"img\",\"default_stone.png\")\n" + res = res .. "\tstate:toggle(0,2,3,1,\"tg\",{\"plenty..\",\"of..\",\"custom..\",\"elements\"})\n" + res = res .. "\tstate:checkbox(2,1,\"c\",\"Easy code\",true)\n" + res = res .. "end)" + state:textarea(1,3.5,9,4,"ta","Code:"):setText(res) + return true +end) + +l = smartfs.create("smartfs:load",function(state) + state:load(minetest.get_modpath("smartfs").."/example.smartfs") + state:get("btn"):click(function(self,state) + print("Button clicked!") + end) + return true +end) + +smartfs.add_to_inventory(l,"icon.png","SmartFS") + +minetest.register_chatcommand("sfs_s", { + params = "", + description = "SmartFS test formspec 1: basics", + func = function(name, param) + s:show(name) + end, +}) +minetest.register_chatcommand("sfs_l", { + params = "", + description = "SmartFS test formspec 2: loading", + func = function(name, param) + l:show(name) + end, +}) + +minetest.register_chatcommand("sfs_d", { + params = "", + description = "SmartFS test formspec 3: dynamic", + func = function(name, param) + local state = smartfs.dynamic("smartfs:dyn_form", name) + state:load(minetest.get_modpath("smartfs").."/example.smartfs") + state:get("btn"):click(function(self,state) + print("Button clicked!") + end) + state:show() + end, +}) + +minetest.register_chatcommand("sfs_lc", { + params = "", + description = "SmartFS test formspec 4: smartfs.create error catching", + func = function(name, param) + smartfs.create("asdinas",function() end) + end +}) diff --git a/mods/smartfs/example.smartfs b/mods/smartfs/example.smartfs new file mode 100644 index 0000000..cbbaabf --- /dev/null +++ b/mods/smartfs/example.smartfs @@ -0,0 +1 @@ +return { ["ele"] = { ["c"] = { ["pos"] = { ["y"] = 1, ["x"] = 1 }, ["label"] = "Check", ["value"] = true, ["type"] = "checkbox", ["name"] = "c" }, ["btn"] = { ["pos"] = { ["y"] = 2, ["x"] = 1 }, ["size"] = { ["h"] = 1, ["w"] = 1 }, ["value"] = "Button", ["type"] = "button", ["name"] = "btn" } }, ["size"] = { ["h"] = 3, ["w"] = 5 } } \ No newline at end of file diff --git a/mods/smartfs/init.lua b/mods/smartfs/init.lua new file mode 100644 index 0000000..b2aaa29 --- /dev/null +++ b/mods/smartfs/init.lua @@ -0,0 +1,2 @@ +dofile(minetest.get_modpath("smartfs").."/smartfs.lua") +--dofile(minetest.get_modpath("smartfs").."/example.lua") diff --git a/mods/smartfs/smartfs.lua b/mods/smartfs/smartfs.lua new file mode 100644 index 0000000..f1900cf --- /dev/null +++ b/mods/smartfs/smartfs.lua @@ -0,0 +1,761 @@ +--------------------------- +-- SmartFS: Smart Formspecs +-- by Rubenwardy +--------------------------- + +smartfs = { + _fdef = {}, + _edef = {}, + opened = {}, + inv = {} +} + +-- the smartfs() function +function smartfs.__call(self, name) + return smartfs._fdef[name] +end + +-- Register forms and elements +function smartfs.create(name,onload) + if smartfs._fdef[name] then + error("Form "..name.." already exists!") + end + if smartfs.loaded and not smartfs._loaded_override then + error("[SMARTFS, ERROR] Forms should be declared while the game loads.") + end + + smartfs._fdef[name] = { + _reg = onload, + name = name, + show = smartfs._show_ + } + + return smartfs._fdef[name] +end +function smartfs.override_load_checks() + smartfs._loaded_override = true +end + +minetest.after(0, function() + smartfs.loaded = true +end) +function smartfs.dynamic(name,player) + print ("[SMARTFS, WARNING!] On the fly forms are being used. May cause bad things to happen") + local state = smartfs._makeState_({name=name},player,nil,false) + state.show = state._show_ + smartfs.opened[player] = state + return state +end +function smartfs.element(name,data) + if smartfs._edef[name] then + error("Element type "..name.." already exists!") + end + smartfs._edef[name] = data + return smartfs._edef[name] +end + +function smartfs.inventory_mod() + if unified_inventory then + return "unified_inventory" + elseif inventory_plus then + return "inventory_plus" + else + return nil + end +end + +function smartfs.add_to_inventory(form,icon,title) + if unified_inventory then + unified_inventory.register_button(form.name, { + type = "image", + image = icon, + }) + unified_inventory.register_page(form.name, { + get_formspec = function(player, formspec) + local name = player:get_player_name() + local opened = smartfs._show_(form, name, nil, true) + return {formspec = opened:_getFS_(false)} + end + }) + return true + elseif inventory_plus then + minetest.register_on_joinplayer(function(player) + inventory_plus.register_button(player, form.name, title) + end) + minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname == "" and fields[form.name] then + local name = player:get_player_name() + local opened = smartfs._show_(form, name, nil, true) + inventory_plus.set_inventory_formspec(player, opened:_getFS_(true)) + end + end) + return true + else + print("[SMARTFS] (Warning!) No advanced inventories are installed") + return false + end +end + +function smartfs._makeState_(form,player,params,is_inv) + return { + _ele = {}, + def = form, + player = player, + param = params, + is_inv = is_inv, + get = function(self,name) + return self._ele[name] + end, + close = function(self) + self.closed = true + end, + size = function(self,w,h) + self._size = {w=w,h=h} + end, + _getFS_ = function(self,size) + local res = "" + if self._size and size then + res = "size["..self._size.w..","..self._size.h.."]" + end + for key,val in pairs(self._ele) do + res = res .. val:build() + end + return res + end, + _show_ = function(self) + if self.is_inv then + if unified_inventory then + unified_inventory.set_inventory_formspec(minetest.get_player_by_name(self.player), self.def.name) + elseif inventory_plus then + inventory_plus.set_inventory_formspec(minetest.get_player_by_name(self.player), self:_getFS_(true)) + end + else + local res = self:_getFS_(true) + print ("FS: "..res) + minetest.show_formspec(player,form.name,res) + end + end, + load = function(self,file) + local file = io.open(file, "r") + if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + if table.size then + self._size = table.size + end + for key,val in pairs(table.ele) do + self:element(val.type,val) + end + return true + end + end + return false + end, + save = function(self,file) + local res = {ele={}} + + if self._size then + res.size = self._size + end + + for key,val in pairs(self._ele) do + res.ele[key] = val.data + end + + local file = io.open(file, "w") + if file then + file:write(minetest.serialize(res)) + file:close() + return true + end + return false + end, + button = function(self,x,y,w,h,name,text,exitf) + if exitf == nil then exitf = false end + return self:element("button",{pos={x=x,y=y},size={w=w,h=h},name=name,value=text,closes=exitf}) + end, + label = function(self,x,y,name,text) + return self:element("label",{pos={x=x,y=y},name=name,value=text}) + end, + toggle = function(self,x,y,w,h,name,list) + return self:element("toggle",{pos={x=x,y=y},size={w=w,h=h},name=name,id=1,list=list}) + end, + field = function(self,x,y,w,h,name,label) + return self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label}) + end, + pwdfield = function(self,x,y,w,h,name,label) + local res = self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label}) + res:isPassword(true) + return res + end, + textarea = function(self,x,y,w,h,name,label) + local res = self:element("field",{pos={x=x,y=y},size={w=w,h=h},name=name,value="",label=label}) + res:isMultiline(true) + return res + end, + image = function(self,x,y,w,h,name,img) + return self:element("image",{pos={x=x,y=y},size={w=w,h=h},name=name,value=img}) + end, + checkbox = function(self,x,y,name,label,selected) + return self:element("checkbox",{pos={x=x,y=y},name=name,value=selected,label=label}) + end, + listbox = function(self,x,y,w,h,name) + return self:element("list", { pos={x=x,y=y}, size={w=w,h=h}, name=name }) + end, + inventory = function(self,x,y,w,h,name) + return self:element("inventory", { pos={x=x,y=y}, size={w=w,h=h}, name=name }) + end, + element = function(self,typen,data) + local type = smartfs._edef[typen] + + if not type then + error("Element type "..typen.." does not exist!") + end + + if self._ele[data.name] then + error("Element "..data.name.." already exists") + end + data.type = typen + + local ele = { + name = data.name, + root = self, + data = data, + remove = function(self) + self.root._ele[self.name] = nil + end + } + + for key,val in pairs(type) do + ele[key] = val + end + + self._ele[data.name] = ele + + return self._ele[data.name] + end + } +end + +-- Show a formspec to a user +function smartfs._show_(form, player, params, is_inv) + local state = smartfs._makeState_(form, player, params, is_inv) + state.show = state._show_ + if form._reg(state)~=false then + if not is_inv then + smartfs.opened[player] = state + state:_show_() + else + smartfs.inv[player] = state + end + end + return state +end + +-- Receive fields from formspec +local function _sfs_recieve_(state,name,fields) + if (fields.quit == "true") then + if not state.is_inv then + smartfs.opened[name] = nil + end + return true + end + + print(dump(fields)) + + for key,val in pairs(fields) do + if state._ele[key] then + state._ele[key].data.value = val + end + end + for key,val in pairs(state._ele) do + if val.submit then + if (val:submit(fields)==true) then + return true + end + end + end + if state.closed ~= true then + state:_show_() + else + minetest.show_formspec(name,"","size[5,1]label[0,0;Formspec closing not yet created!]") + if not state.is_inv then + smartfs.opened[name] = nil + end + end + return true +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if smartfs.opened[name] and not smartfs.opened[name].is_inv then + if smartfs.opened[name].def.name == formname then + local state = smartfs.opened[name] + return _sfs_recieve_(state,name,fields) + else + smartfs.opened[name] = nil + end + elseif smartfs.inv[name] and smartfs.inv[name].is_inv then + local state = smartfs.inv[name] + _sfs_recieve_(state,name,fields) + end + return false +end) + + +----------------------------------------------------------------- +------------------------- ELEMENTS ---------------------------- +----------------------------------------------------------------- + +smartfs.element("button",{ + build = function(self) + if self.data.img then + return "image_button[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.data.img.. + ";".. + self.name.. + ";".. + self.data.value.. + "]" + else + if self.data.closes then + return "button_exit[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.value.. + "]" + else + return "button[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.value.. + "]" + end + end + end, + submit = function(self,fields,state) + if fields[self.name] and self._click then + self:_click(self.root) + end + + if self.data.closes then + return true + end + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + onClick = function(self,func) + self._click = func + end, + click = function(self,func) + self._click = func + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end, + setImage = function(self,image) + self.data.img = image + end, + getImage = function(self) + return self.data.img + end, + setClose = function(self,bool) + self.data.closes = bool + end +}) + +smartfs.element("toggle",{ + build = function(self) + return "button[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.list[self.data.id].. + "]" + end, + submit = function(self,fields) + if fields[self.name] then + self.data.id = self.data.id + 1 + if self.data.id > #self.data.list then + self.data.id = 1 + end + if self._tog then + self:_tog(self.root) + end + end + end, + onToggle = function(self,func) + self._tog = func + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setId = function(self,id) + self.data.id = id + end, + getId = function(self) + return self.data.id + end, + getText = function(self) + return self.data.list[self.data.id] + end +}) + +smartfs.element("label",{ + build = function(self) + return "label[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.value.. + "]" + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end +}) + +smartfs.element("field",{ + build = function(self) + if self.data.ml then + return "textarea[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.label.. + ";".. + self.data.value.. + "]" + elseif self.data.pwd then + return "pwdfield[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.label.. + "]" + else + return "field[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.name.. + ";".. + self.data.label.. + ";".. + self.data.value.. + "]" + end + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end, + isPassword = function(self,bool) + self.data.pwd = bool + end, + isMultiline = function(self,bool) + self.data.ml = bool + end +}) + +smartfs.element("image",{ + build = function(self) + return "image[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.data.value.. + "]" + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setImage = function(self,text) + self.data.value = text + end, + getImage = function(self) + return self.data.value + end +}) + +smartfs.element("checkbox",{ + build = function(self) + if self.data.value then + return "checkbox[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.name.. + ";".. + self.data.label.. + ";true]" + else + return "checkbox[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.name.. + ";".. + self.data.label.. + ";false]" + end + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + setText = function(self,text) + self.data.value = text + end, + getText = function(self) + return self.data.value + end +}) + +smartfs.element("list",{ + build = function(self) + local listformspec = "textlist[".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + self.data.name.. + ";" + + --loop through the list's items and add them to the formspec + if not self.data.items then + self.data.items = {" "} + end + for i,value in ipairs(self.data.items) do + listformspec = listformspec..value.."," + end + listformspec = string.sub(listformspec, 0, -2) --removes extra , + --close out the list items section + listformspec = listformspec..";" + + --TODO support selected idx and transparency + + --close formspec definition and return formspec + listformspec = listformspec.."]" + return listformspec + end, + submit = function(self,fields) + if fields[self.name] then + local _type = string.sub(fields[self.data.name],1,3) + local index = string.sub(fields[self.data.name],5) + if _type == "CHG" and self._click then + self:_click(self.root, index) + elseif _type == "DCL" and self._doubleClick then + self:_doubleClick(self.root, index) + end + end + end, + onClick = function(self, func) + self._click = func + end, + click = function(self, func) + self._click = func + end, + onDoubleClick = function(self, func) + self._doubleClick = func + end, + doubleclick = function(self, func) + self._doubleClick = func + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + addItem = function(self, item) + if not self.data.items then + self.data.items = {" "} + end + table.insert(self.data.items, item) + end, + removeItem = function(self,idx) + if not self.data.items then + self.data.items = {" "} + end + table.remove(self.data.items,idx) + end, + popItem = function(self) + if not self.data.items then + self.data.items = {" "} + end + local item = self.data.items[#self.data.items] + table.remove(self.data.items) + return item + end +}) + +smartfs.element("inventory",{ + build = function(self) + return "list[".. + (self.data.location or "current_player") .. + ";".. + self.name.. + ";".. + self.data.pos.x..","..self.data.pos.y.. + ";".. + self.data.size.w..","..self.data.size.h.. + ";".. + (self.data.index or "") .. + "]" + end, + setPosition = function(self,x,y) + self.data.pos = {x=x,y=y} + end, + getPosition = function(self,x,y) + return self.data.pos + end, + setSize = function(self,w,h) + self.data.size = {w=w,h=h} + end, + getSize = function(self,x,y) + return self.data.size + end, + -- available inventory locations + -- "current_player": Player to whom the menu is shown + -- "player:": Any player + -- "nodemeta:,,": Any node metadata + -- "detached:": A detached inventory + -- "context" does not apply to smartfs, since there is no node-metadata as context available + setLocation = function(self,location) + self.data.location = location + end, + getLocation = function(self) + return self.data.location or "current_player" + end, + usePosition = function(self, pos) + self.data.location = string.format("nodemeta:%d,%d,%d", pos.x, pos.y, pos.z) + end, + usePlayer = function(self, name) + self.data.location = "player:" .. name + end, + useDetached = function(self, name) + self.data.location = "detached:" .. name + end, + setIndex = function(self,index) + self.data.index = index + end, + getIndex = function(self) + return self.data.index + end +}) + +smartfs.element("code",{ + build = function(self) + if self._build then + self:_build() + end + + return self.data.code + end, + submit = function(self,fields) + if self._sub then + self:_sub(fields) + end + end, + onSubmit = function(self,func) + self._sub = func + end, + onBuild = function(self,func) + self._build = func + end, + setCode = function(self,code) + self.data.code = code + end, + getCode = function(self) + return self.data.code + end +}) diff --git a/mods/sprint/COPYING b/mods/sprint/COPYING new file mode 100644 index 0000000..0e259d4 --- /dev/null +++ b/mods/sprint/COPYING @@ -0,0 +1,121 @@ +Creative Commons Legal Code + +CC0 1.0 Universal + + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator +and subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for +the purpose of contributing to a commons of creative, cultural and +scientific works ("Commons") that the public can reliably and without fear +of later claims of infringement build upon, modify, incorporate in other +works, reuse and redistribute as freely as possible in any form whatsoever +and for any purposes, including without limitation commercial purposes. +These owners may contribute to the Commons to promote the ideal of a free +culture and the further production of creative, cultural and scientific +works, or to gain reputation or greater distribution for their Work in +part through the use and efforts of others. + +For these and/or other purposes and motivations, and without any +expectation of additional consideration or compensation, the person +associating CC0 with a Work (the "Affirmer"), to the extent that he or she +is an owner of Copyright and Related Rights in the Work, voluntarily +elects to apply CC0 to the Work and publicly distribute the Work under its +terms, with knowledge of his or her Copyright and Related Rights in the +Work and the meaning and intended legal effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not +limited to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); +iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and +vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention +of, applicable law, Affirmer hereby overtly, fully, permanently, +irrevocably and unconditionally waives, abandons, and surrenders all of +Affirmer's Copyright and Related Rights and associated claims and causes +of action, whether now known or unknown (including existing as well as +future claims and causes of action), in the Work (i) in all territories +worldwide, (ii) for the maximum duration provided by applicable law or +treaty (including future time extensions), (iii) in any current or future +medium and for any number of copies, and (iv) for any purpose whatsoever, +including without limitation commercial, advertising or promotional +purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each +member of the public at large and to the detriment of Affirmer's heirs and +successors, fully intending that such Waiver shall not be subject to +revocation, rescission, cancellation, termination, or any other legal or +equitable action to disrupt the quiet enjoyment of the Work by the public +as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason +be judged legally invalid or ineffective under applicable law, then the +Waiver shall be preserved to the maximum extent permitted taking into +account Affirmer's express Statement of Purpose. In addition, to the +extent the Waiver is so judged Affirmer hereby grants to each affected +person a royalty-free, non transferable, non sublicensable, non exclusive, +irrevocable and unconditional license to exercise Affirmer's Copyright and +Related Rights in the Work (i) in all territories worldwide, (ii) for the +maximum duration provided by applicable law or treaty (including future +time extensions), (iii) in any current or future medium and for any number +of copies, and (iv) for any purpose whatsoever, including without +limitation commercial, advertising or promotional purposes (the +"License"). The License shall be deemed effective as of the date CC0 was +applied by Affirmer to the Work. Should any part of the License for any +reason be judged legally invalid or ineffective under applicable law, such +partial invalidity or ineffectiveness shall not invalidate the remainder +of the License, and in such case Affirmer hereby affirms that he or she +will not (i) exercise any of his or her remaining Copyright and Related +Rights in the Work or (ii) assert any associated claims and causes of +action with respect to the Work, in either case contrary to Affirmer's +express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. diff --git a/mods/sprint/README.md b/mods/sprint/README.md new file mode 100644 index 0000000..71e7d44 --- /dev/null +++ b/mods/sprint/README.md @@ -0,0 +1,62 @@ +Sprint Mod For Minetest by GunshipPenguin + +Allows the player to sprint by either double tapping w or pressing e. +By default, sprinting will make the player travel 80% faster and +allow him/her to jump 10% higher. Also adds a stamina bar that goes +down when the player sprints and goes up when he/she isn't +sprinting. + +This mod is compatible with the HUD bars [hudbars] mod, but does +not depend on it. In this care, a green HUD bar will be displayed, +also showing a number. +If this mod is not present, a standard statbar with 0-20 +“half-arrows†is shown, which is a bit more coarse than the HUD +bar version. + + +Licence: CC0 (see COPYING file) + +--- + +This mod can be configured by changing the variables declared in +the start of init.lua. The following is a brief explanation of each +one. + +SPRINT_METHOD (default 1) + +What a player has to do to start sprinting. 0 = double tap w, 1 = press e. +Note that if you have the fast privlige, and have the fast +speed turned on, you will run very, very fast. You can toggle this +by pressing j. + +SPRINT_SPEED (default 1.5) + +How fast the player will move when sprinting as opposed to normal +movement speed. 1.0 represents normal speed so 1.5 would mean that a +sprinting player would travel 50% faster than a walking player and +2.4 would mean that a sprinting player would travel 140% faster than +a walking player. + +SPRINT_JUMP (default 1.1) + +How high the player will jump when sprinting as opposed to normal +jump height. Same as SPRINT_SPEED, just controls jump height while +sprinting rather than speed. + +SPRINT_STAMINA (default 20) + +How long the player can sprint for in seconds. Each player has a +stamina variable assigned to them, it is initially set to +SPRINT_STAMINA and can go no higher. When the player is sprinting, +this variable ticks down once each second, and when it reaches 0, +the player stops sprinting. It ticks back up when the player isn't +sprinting and stops at SPRINT_STAMINA. Set this to a huge value if +you want unlimited sprinting. + +SPRINT_TIMEOUT (default 0.5) + +Only used if SPRINT_METHOD = 0. +How much time the player has after releasing w, to press w again and +start sprinting. Setting this too high will result in unwanted +sprinting and setting it too low will result in it being +difficult/impossible to sprint. diff --git a/mods/sprint/depends.txt b/mods/sprint/depends.txt new file mode 100644 index 0000000..3e1d5c2 --- /dev/null +++ b/mods/sprint/depends.txt @@ -0,0 +1 @@ +hudbars? diff --git a/mods/sprint/esprint.lua b/mods/sprint/esprint.lua new file mode 100644 index 0000000..f103c7f --- /dev/null +++ b/mods/sprint/esprint.lua @@ -0,0 +1,125 @@ +--[[ +Sprint mod for Minetest by GunshipPenguin + +To the extent possible under law, the author(s) +have dedicated all copyright and related and neighboring rights +to this software to the public domain worldwide. This software is +distributed without any warranty. +]] + +local players = {} +local staminaHud = {} + +minetest.register_on_joinplayer(function(player) + local playerName = player:get_player_name() + + players[playerName] = { + sprinting = false, + timeOut = 0, + stamina = SPRINT_STAMINA, + shouldSprint = false, + } + if SPRINT_HUDBARS_USED then + hb.init_hudbar(player, "sprint") + else + players[playerName].hud = player:hud_add({ + hud_elem_type = "statbar", + position = {x=0.5,y=1}, + size = {x=24, y=24}, + text = "sprint_stamina_icon.png", + number = 20, + alignment = {x=0,y=1}, + offset = {x=-263, y=-110}, + } + ) + end +end) +minetest.register_on_leaveplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = nil +end) +minetest.register_globalstep(function(dtime) + --Get the gametime + local gameTime = minetest.get_gametime() + + --Loop through all connected players + for playerName,playerInfo in pairs(players) do + local player = minetest.get_player_by_name(playerName) + if player ~= nil then + --Check if the player should be sprinting + if player:get_player_control()["aux1"] and player:get_player_control()["up"] then + players[playerName]["shouldSprint"] = true + else + players[playerName]["shouldSprint"] = false + end + + --If the player is sprinting, create particles behind him/her + if playerInfo["sprinting"] == true and gameTime % 0.1 == 0 then + local numParticles = math.random(1, 2) + local playerPos = player:getpos() + local playerNode = minetest.get_node({x=playerPos["x"], y=playerPos["y"]-1, z=playerPos["z"]}) + if playerNode["name"] ~= "air" then + for i=1, numParticles, 1 do + minetest.add_particle({ + pos = {x=playerPos["x"]+math.random(-1,1)*math.random()/2,y=playerPos["y"]+0.1,z=playerPos["z"]+math.random(-1,1)*math.random()/2}, + vel = {x=0, y=5, z=0}, + acc = {x=0, y=-13, z=0}, + expirationtime = math.random(), + size = math.random()+0.5, + collisiondetection = true, + vertical = false, + texture = "sprint_particle.png", + }) + end + end + end + + --Adjust player states + if players[playerName]["shouldSprint"] == true then --Stopped + setSprinting(playerName, true) + elseif players[playerName]["shouldSprint"] == false then + setSprinting(playerName, false) + end + + --Lower the player's stamina by dtime if he/she is sprinting and set his/her state to 0 if stamina is zero + if playerInfo["sprinting"] == true then + playerInfo["stamina"] = playerInfo["stamina"] - dtime + if playerInfo["stamina"] <= 0 then + playerInfo["stamina"] = 0 + setSprinting(playerName, false) + end + + --Increase player's stamina if he/she is not sprinting and his/her stamina is less than SPRINT_STAMINA + elseif playerInfo["sprinting"] == false and playerInfo["stamina"] < SPRINT_STAMINA then + playerInfo["stamina"] = playerInfo["stamina"] + dtime + end + -- Cap stamina at SPRINT_STAMINA + if playerInfo["stamina"] > SPRINT_STAMINA then + playerInfo["stamina"] = SPRINT_STAMINA + end + + --Update the players's hud sprint stamina bar + + if SPRINT_HUDBARS_USED then + hb.change_hudbar(player, "sprint", playerInfo["stamina"]) + else + local numBars = (playerInfo["stamina"]/SPRINT_STAMINA)*20 + player:hud_change(playerInfo["hud"], "number", numBars) + end + end + end +end) + +function setSprinting(playerName, sprinting) --Sets the state of a player (0=stopped/moving, 1=sprinting) + local player = minetest.get_player_by_name(playerName) + if players[playerName] then + players[playerName]["sprinting"] = sprinting + if sprinting == true then + player:set_physics_override({speed=SPRINT_SPEED,jump=SPRINT_JUMP}) + elseif sprinting == false then + player:set_physics_override({speed=1.0,jump=1.0}) + end + return true + end + return false +end diff --git a/mods/sprint/init.lua b/mods/sprint/init.lua new file mode 100644 index 0000000..5108bac --- /dev/null +++ b/mods/sprint/init.lua @@ -0,0 +1,34 @@ +--[[ +Sprint mod for Minetest by GunshipPenguin + +To the extent possible under law, the author(s) +have dedicated all copyright and related and neighboring rights +to this software to the public domain worldwide. This software is +distributed without any warranty. +]] + +--Configuration variables, these are all explained in README.md +SPRINT_METHOD = 1 +SPRINT_SPEED = 1.8 +SPRINT_JUMP = 1.1 +SPRINT_STAMINA = 20 +SPRINT_TIMEOUT = 0.5 --Only used if SPRINT_METHOD = 0 + +if minetest.get_modpath("hudbars") ~= nil then + hb.register_hudbar("sprint", 0xFFFFFF, "Stamina", + { bar = "sprint_stamina_bar.png", icon = "sprint_stamina_icon.png" }, + SPRINT_STAMINA, SPRINT_STAMINA, + false, "%s: %.1f/%.1f") + SPRINT_HUDBARS_USED = true +else + SPRINT_HUDBARS_USED = false +end + +if SPRINT_METHOD == 0 then + dofile(minetest.get_modpath("sprint") .. "/wsprint.lua") +elseif SPRINT_METHOD == 1 then + dofile(minetest.get_modpath("sprint") .. "/esprint.lua") +else + minetest.log("error", "Sprint Mod - SPRINT_METHOD is not set properly, using e to sprint") + dofile(minetest.get_modpath("sprint") .. "/esprint.lua") +end diff --git a/mods/sprint/textures/sprint_particle.png b/mods/sprint/textures/sprint_particle.png new file mode 100644 index 0000000..451fbba Binary files /dev/null and b/mods/sprint/textures/sprint_particle.png differ diff --git a/mods/sprint/textures/sprint_stamina_bar.png b/mods/sprint/textures/sprint_stamina_bar.png new file mode 100644 index 0000000..1ca7a75 Binary files /dev/null and b/mods/sprint/textures/sprint_stamina_bar.png differ diff --git a/mods/sprint/textures/sprint_stamina_icon.png b/mods/sprint/textures/sprint_stamina_icon.png new file mode 100644 index 0000000..eb661eb Binary files /dev/null and b/mods/sprint/textures/sprint_stamina_icon.png differ diff --git a/mods/sprint/wsprint.lua b/mods/sprint/wsprint.lua new file mode 100644 index 0000000..3a832e2 --- /dev/null +++ b/mods/sprint/wsprint.lua @@ -0,0 +1,135 @@ +--[[ +Sprint mod for Minetest by GunshipPenguin + +To the extent possible under law, the author(s) +have dedicated all copyright and related and neighboring rights +to this software to the public domain worldwide. This software is +distributed without any warranty. +]] + +local players = {} +local staminaHud = {} + +minetest.register_on_joinplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = { + state = 0, + timeOut = 0, + stamina = SPRINT_STAMINA, + moving = false, + } + + if SPRINT_HUDBARS_USED then + hb.init_hudbar(player, "sprint") + else + players[playerName].hud = player:hud_add({ + hud_elem_type = "statbar", + position = {x=0.5,y=1}, + size = {x=24, y=24}, + text = "sprint_stamina_icon.png", + number = 20, + alignment = {x=0,y=1}, + offset = {x=-263, y=-110}, + } + ) + end +end) +minetest.register_on_leaveplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = nil +end) +minetest.register_globalstep(function(dtime) + --Get the gametime + local gameTime = minetest.get_gametime() + + --Loop through all connected players + for playerName,playerInfo in pairs(players) do + local player = minetest.get_player_by_name(playerName) + if player ~= nil then + --Check if they are moving or not + players[playerName]["moving"] = player:get_player_control()["up"] + + --If the player has tapped w longer than SPRINT_TIMEOUT ago, set his/her state to 0 + if playerInfo["state"] == 2 then + if playerInfo["timeOut"] + SPRINT_TIMEOUT < gameTime then + players[playerName]["timeOut"] = nil + setState(playerName, 0) + end + + --If the player is sprinting, create particles behind him/her + elseif playerInfo["state"] == 3 and gameTime % 0.1 == 0 then + local numParticles = math.random(1, 2) + local playerPos = player:getpos() + local playerNode = minetest.get_node({x=playerPos["x"], y=playerPos["y"]-1, z=playerPos["z"]}) + if playerNode["name"] ~= "air" then + for i=1, numParticles, 1 do + minetest.add_particle({ + pos = {x=playerPos["x"]+math.random(-1,1)*math.random()/2,y=playerPos["y"]+0.1,z=playerPos["z"]+math.random(-1,1)*math.random()/2}, + vel = {x=0, y=5, z=0}, + acc = {x=0, y=-13, z=0}, + expirationtime = math.random(), + size = math.random()+0.5, + collisiondetection = true, + vertical = false, + texture = "sprint_particle.png", + }) + end + end + end + + --Adjust player states + if players[playerName]["moving"] == false and playerInfo["state"] == 3 then --Stopped + setState(playerName, 0) + elseif players[playerName]["moving"] == true and playerInfo["state"] == 0 then --Moving + setState(playerName, 1) + elseif players[playerName]["moving"] == false and playerInfo["state"] == 1 then --Primed + setState(playerName, 2) + elseif players[playerName]["moving"] == true and playerInfo["state"] == 2 then --Sprinting + setState(playerName, 3) + end + + --Lower the player's stamina by dtime if he/she is sprinting and set his/her state to 0 if stamina is zero + if playerInfo["state"] == 3 then + playerInfo["stamina"] = playerInfo["stamina"] - dtime + if playerInfo["stamina"] <= 0 then + playerInfo["stamina"] = 0 + setState(playerName, 0) + end + + --Increase player's stamina if he/she is not sprinting and his/her stamina is less than SPRINT_STAMINA + elseif playerInfo["state"] ~= 3 and playerInfo["stamina"] < SPRINT_STAMINA then + playerInfo["stamina"] = playerInfo["stamina"] + dtime + end + -- Cap stamina at SPRINT_STAMINA + if playerInfo["stamina"] > SPRINT_STAMINA then + playerInfo["stamina"] = SPRINT_STAMINA + end + + --Update the players's hud sprint stamina bar + + if SPRINT_HUDBARS_USED then + hb.change_hudbar(player, "sprint", playerInfo["stamina"]) + else + local numBars = (playerInfo["stamina"]/SPRINT_STAMINA)*20 + player:hud_change(playerInfo["hud"], "number", numBars) + end + end + end +end) + +function setState(playerName, state) --Sets the state of a player (0=stopped, 1=moving, 2=primed, 3=sprinting) + local player = minetest.get_player_by_name(playerName) + local gameTime = minetest.get_gametime() + if players[playerName] then + players[playerName]["state"] = state + if state == 0 then--Stopped + player:set_physics_override({speed=1.0,jump=1.0}) + elseif state == 2 then --Primed + players[playerName]["timeOut"] = gameTime + elseif state == 3 then --Sprinting + player:set_physics_override({speed=SPRINT_SPEED,jump=SPRINT_JUMP}) + end + return true + end + return false +end diff --git a/mods/stairs/README.txt b/mods/stairs/README.txt new file mode 100644 index 0000000..716a677 --- /dev/null +++ b/mods/stairs/README.txt @@ -0,0 +1,26 @@ +Minetest 0.4 mod: stairs +========================= + +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 + + diff --git a/mods/stairs/depends.txt b/mods/stairs/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/stairs/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua new file mode 100644 index 0000000..645afb1 --- /dev/null +++ b/mods/stairs/init.lua @@ -0,0 +1,311 @@ +-- Minetest 0.4 mod: stairs +-- See README.txt for licensing and other information. + +stairs = {} + +-- Node will be called stairs:stair_ +function stairs.register_stair(subname, recipeitem, groups, images, description, sounds) + minetest.register_node(":stairs:stair_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = { + {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + {-0.5, 0, 0, 0.5, 0.5, 0.5}, + }, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local param2 = 0 + + local placer_pos = placer:getpos() + if placer_pos then + local dir = { + x = p1.x - placer_pos.x, + y = p1.y - placer_pos.y, + z = p1.z - placer_pos.z + } + param2 = minetest.dir_to_facedir(dir) + end + + if p0.y-1 == p1.y then + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 + end + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + }) + + -- for replace ABM + minetest.register_node(":stairs:stair_" .. subname.."upside_down", { + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace=1}, + }) + + minetest.register_craft({ + output = 'stairs:stair_' .. subname .. ' 6', + recipe = { + {recipeitem, "", ""}, + {recipeitem, recipeitem, ""}, + {recipeitem, recipeitem, recipeitem}, + }, + }) + + -- Flipped recipe for the silly minecrafters + minetest.register_craft({ + output = 'stairs:stair_' .. subname .. ' 6', + recipe = { + {"", "", recipeitem}, + {"", recipeitem, recipeitem}, + {recipeitem, recipeitem, recipeitem}, + }, + }) +end + +-- Node will be called stairs:slab_ +function stairs.register_slab(subname, recipeitem, groups, images, description, sounds) + minetest.register_node(":stairs:slab_" .. subname, { + description = description, + drawtype = "nodebox", + tiles = images, + paramtype = "light", + paramtype2 = "facedir", + is_ground_content = false, + groups = groups, + sounds = sounds, + node_box = { + type = "fixed", + fixed = {-0.5, -0.5, -0.5, 0.5, 0, 0.5}, + }, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + -- If it's being placed on an another similar one, replace it with + -- a full block + local slabpos = nil + local slabnode = nil + local p0 = pointed_thing.under + local p1 = pointed_thing.above + local n0 = minetest.get_node(p0) + local n1 = minetest.get_node(p1) + local param2 = 0 + + local n0_is_upside_down = (n0.name == "stairs:slab_" .. subname and + n0.param2 >= 20) + + if n0.name == "stairs:slab_" .. subname and not n0_is_upside_down and p0.y+1 == p1.y then + slabpos = p0 + slabnode = n0 + elseif n1.name == "stairs:slab_" .. subname then + slabpos = p1 + slabnode = n1 + end + if slabpos then + -- Remove the slab at slabpos + minetest.remove_node(slabpos) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = slabpos + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(slabpos, slabnode) + end + return itemstack + end + + -- Upside down slabs + if p0.y-1 == p1.y then + -- Turn into full block if pointing at a existing slab + if n0_is_upside_down then + -- Remove the slab at the position of the slab + minetest.remove_node(p0) + -- Make a fake stack of a single item and try to place it + local fakestack = ItemStack(recipeitem) + fakestack:set_count(itemstack:get_count()) + + pointed_thing.above = p0 + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) + -- If the item was taken from the fake stack, decrement original + if success then + itemstack:set_count(fakestack:get_count()) + -- Else put old node back + else + minetest.set_node(p0, n0) + end + return itemstack + end + + -- Place upside down slab + param2 = 20 + end + + -- If pointing at the side of a upside down slab + if n0_is_upside_down and p0.y+1 ~= p1.y then + param2 = 20 + end + + return minetest.item_place(itemstack, placer, pointed_thing, param2) + end, + }) + + -- for replace ABM + minetest.register_node(":stairs:slab_" .. subname.."upside_down", { + replace_name = "stairs:slab_"..subname, + groups = {slabs_replace=1}, + }) + + minetest.register_craft({ + output = 'stairs:slab_' .. subname .. ' 6', + recipe = { + {recipeitem, recipeitem, recipeitem}, + }, + }) +end + +-- Replace old "upside_down" nodes with new param2 versions +minetest.register_abm({ + nodenames = {"group:slabs_replace"}, + interval = 1, + chance = 1, + action = function(pos, node) + node.name = minetest.registered_nodes[node.name].replace_name + node.param2 = node.param2 + 20 + if node.param2 == 21 then + node.param2 = 23 + elseif node.param2 == 23 then + node.param2 = 21 + end + minetest.set_node(pos, node) + end, +}) + +-- Nodes will be called stairs:{stair,slab}_ +function stairs.register_stair_and_slab(subname, recipeitem, groups, images, desc_stair, desc_slab, sounds) + stairs.register_stair(subname, recipeitem, groups, images, desc_stair, sounds) + stairs.register_slab(subname, recipeitem, groups, images, desc_slab, sounds) +end + +stairs.register_stair_and_slab("wood", "default:wood", + {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + {"default_wood.png"}, + "Wooden Stair", + "Wooden Slab", + default.node_sound_wood_defaults()) + +stairs.register_stair_and_slab("stone", "default:stone", + {cracky=3}, + {"default_stone.png"}, + "Stone Stair", + "Stone Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("cobble", "default:cobble", + {cracky=3}, + {"default_cobble.png"}, + "Cobblestone Stair", + "Cobblestone Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("desert_stone", "default:desert_stone", + {cracky=3}, + {"default_desert_stone.png"}, + "Desertstone Stair", + "Desertstone Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("desert_cobble", "default:desert_cobble", + {cracky=3}, + {"default_desert_cobble.png"}, + "Desert Cobblestone Stair", + "Desert Cobblestone Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("desert_stonebrick", "default:desert_stonebrick", + {cracky=3}, + {"default_desert_stone_brick.png"}, + "Desert Stone Brick Stair", + "Desert Stone Brick Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("brick", "default:brick", + {cracky=3}, + {"default_brick.png"}, + "Brick Stair", + "Brick Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("sandstone", "default:sandstone", + {crumbly=2,cracky=2}, + {"default_sandstone.png"}, + "Sandstone Stair", + "Sandstone Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("sandstonebrick", "default:sandstonebrick", + {crumbly=2,cracky=2}, + {"default_sandstone_brick.png"}, + "Sandstone Brick Stair", + "Sandstone Brick Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("junglewood", "default:junglewood", + {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + {"default_junglewood.png"}, + "Junglewood Stair", + "Junglewood Slab", + default.node_sound_wood_defaults()) + +stairs.register_stair_and_slab("stonebrick", "default:stonebrick", + {cracky=3}, + {"default_stone_brick.png"}, + "Stone Brick Stair", + "Stone Brick Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("pinewood", "default:pinewood", + {snappy=2,choppy=2,oddly_breakable_by_hand=2,flammable=3}, + {"default_pinewood.png"}, + "Pinewood Stair", + "Pinewood Slab", + default.node_sound_wood_defaults()) + +stairs.register_stair_and_slab("obsidian", "default:obsidian", + {cracky=1,level=2}, + {"default_obsidian.png"}, + "Obsidian Stair", + "Obsidian Slab", + default.node_sound_stone_defaults()) + +stairs.register_stair_and_slab("obsidianbrick", "default:obsidianbrick", + {cracky=1,level=2}, + {"default_obsidian_brick.png"}, + "Obsidian Brick Stair", + "Obsidian Brick Slab", + default.node_sound_stone_defaults()) diff --git a/mods/stats/init.lua b/mods/stats/init.lua new file mode 100644 index 0000000..0b9e230 --- /dev/null +++ b/mods/stats/init.lua @@ -0,0 +1,213 @@ +--[[ +Stats Mod +Copyright (C) 2013 PilzAdam + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 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 General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see . +]] + +-- +-- API +-- + +stats = {} +local playerstats = {} + +--[[ +def = { + name = "digged_nodes", + description = function(value) + return " - Digged nodes: "..value) + end, +} +]] +stats.registered_stats = {} +function stats.register_stat(def) + table.insert(stats.registered_stats, def) +end + +function stats.set_stat(player, name, value) + local pname = player + if type(pname) ~= "string" then + pname = player:get_player_name() + end + if not playerstats[pname] then + playerstats[pname] = {} + end + playerstats[pname][name] = value +end + +function stats.increase_stat(player, name, value) + local pname = player + if type(pname) ~= "string" then + pname = player:get_player_name() + end + if not playerstats[pname] then + playerstats[pname] = {} + end + if not playerstats[pname][name] then + playerstats[pname][name] = 0 + end + playerstats[pname][name] = playerstats[pname][name] + value +end + +function stats.get_stat(player, name) + local pname = player + if type(pname) ~= "string" then + pname = player:get_player_name() + end + if not playerstats[pname] then + playerstats[pname] = {} + end + if not playerstats[pname][name] then + playerstats[pname][name] = 0 + end + return playerstats[pname][name] +end + +-- +-- End API +-- + +stats.register_stat({ + name = "digged_nodes", + description = function(value) + return " - Digged nodes: "..value + end, +}) + +stats.register_stat({ + name = "placed_nodes", + description = function(value) + return " - Placed nodes: "..value + end, +}) + +stats.register_stat({ + name = "died", + description = function(value) + return " - Died: "..value + end, +}) + +stats.register_stat({ + name = "played_time", + description = function(time) + time = math.floor(time) + local timestring = "" .. (time%60) .. "s" + time = math.floor(time/60) + if time > 0 then + timestring = (time%60) .. "m " .. timestring + end + time = math.floor(time/60) + if time > 0 then + timestring = (time%24) .. "h " .. timestring + end + time = math.floor(time/24) + if time > 0 then + timestring = time .. "d " .. timestring + end + return " - Time played: "..timestring + end, +}) + +stats.register_stat({ + name = "crafted", + description = function(value) + return " - Crafted items: "..value + end, +}) + +local file = io.open(minetest:get_worldpath().."/stats.txt", "r") +if file then + local table = minetest.deserialize(file:read("*all")) + if type(table) == "table" then + playerstats = table + else + minetest.log("error", "Corrupted stats file") + end + file:close() +end + +local function save_stats() + local file = io.open(minetest:get_worldpath().."/stats.txt", "w") + if file then + file:write(minetest.serialize(playerstats)) + file:close() + else + minetest.log("error", "Can't save stats") + end +end + +local timer = 0 +local timer2 = 0 +minetest.register_globalstep(function(dtime) + timer = timer + dtime + timer2 = timer2 + dtime + + -- NOTE: Set this to a higher value to remove some load from the server + if timer > 0 then + for _,player in ipairs(minetest.get_connected_players()) do + stats.increase_stat(player, "played_time", timer) + end + timer = 0 + end + + if timer2 > 30 then + timer2 = 0 + save_stats() + end +end) + +minetest.register_on_shutdown(function() + save_stats() +end) + +minetest.register_on_dignode(function(pos, oldnode, player) + if player and player:is_player() then + stats.increase_stat(player, "digged_nodes", 1) + end +end) + +minetest.register_on_placenode(function(pos, newnode, player, oldnode, itemstack) + if player and player:is_player() then + stats.increase_stat(player, "placed_nodes", 1) + end +end) + +minetest.register_on_dieplayer(function(player) + stats.increase_stat(player, "died", 1) +end) + +minetest.register_on_craft(function(itemstack, player, old_craft_grid, craft_inv) + stats.increase_stat(player, "crafted", itemstack:get_count()) +end) + +minetest.register_chatcommand("stats", { + params = "", + description = "Prints the stats of the player", + privs = {}, + func = function(name, param) + local playername = name + local player = minetest.get_player_by_name(param) + if player then + playername = player:get_player_name() + end + + minetest.chat_send_player(name, "Stats for "..playername..":") + for _,def in ipairs(stats.registered_stats) do + local value = stats.get_stat(playername, def.name) + minetest.chat_send_player(name, def.description(value)) + end + end, +}) diff --git a/mods/throwing/README.txt b/mods/throwing/README.txt new file mode 100644 index 0000000..88e9094 --- /dev/null +++ b/mods/throwing/README.txt @@ -0,0 +1,102 @@ +=== THROWING ENHANCED for MINETEST === + +Inroduction: +This mod adds many bows and arrows to Minetest. +It began as a fork of PilzAdam's throwing mod with some enhancements from me. Enjoy! +Echoes91 + +How to install: +http://wiki.minetest.com/wiki/Installing_Mods + +How to use the mod: +Select the bow and place the arrows into the slot next to it; shoot with left mouse click. +Every shoot will take 1 arrow from your inventory and wears out the bow. + +License: +This mod was originally published by Jeija and reworked by PilzAdam +Sourcecode: LGPLv2.1 (see http://www.gnu.org/licenses/lgpl-2.1.html) +Grahpics & sounds: CC-BY 3.0 (see http://creativecommons.org/licenses/by/3.0/legalcode) + + +Changelog: + +Update 1.3: +- Added automated arbalest, the ultimate weapon +- New arbalest texture coherent with steel color + +Update 1.2: +- Added arbalest +- Defaults initialized + +Update 1.1: +- Added crossbow +- Code shrink +- Offensive arrows go through flora's and farming's +- Small fixes + +Update 1.0: +- Definitive reload, unload and shot system based on tool metadata, new global functions, no more "throw" privilege +- New textures for loaded bows +- Fireworks arrows to celebrate! + +Update 1.0rc2: +- Fixed "compare nil with number" due to self.break not being retained +- Filled conf.example's list +- Added Royal bow + +Update 1.0rc1: +- Added longbow and removed golden bow, definitive bow set for stable release. Feature freeze +- Fixed torch arrow recipe, thanks to Excalibur Zero +- Removed config.lua, configuration now goes int throwing.config, see example + +Update 0.9.8: +- New damage calculation for offensive arrows based on arrow's speed and material. Beware that dependency is more than linear for both, so that differences between arrows will be enhanced if they're shot at higher speed. +- Fixed bug that blocked ability to shot after shooting with empty arrow stack. +- Removed annoying debug symbols + +Update 0.9.7: +- Added visual feedback for reload +- Fixed reload for players who die while reloading and for multiplayer +- Changed license for the code to LGPLv2 + +Update 0.9.6: +- Any bow and arrow is now deactivable under config.lua, which won't be overwritten +- Changed license for media to CC-BY + +Update 0.9.5: +- Added shell arrows +- Revised sounds and some textures +- General balancing of bow's statistics + +Update 0.9.4: +- New bow texture +- Made recipes coherent + +Update 0.9.3: +- Added symmetric recipes, fixed golden bow recipe +- Adjusted few parameters + +Update 0.9.2: +- Added a chance to break for many arrows, so they don't last forever and outclass any other tool +- Build and torch arrows won't build on fluids and torches any more, build arrows won't place torches +- TNT arrow digs instead if removing blocks, eventual indestructible nodes are safe +- Added golden bow with possible new bow style +- Changed the (bit OP) composite bow resistance and new recipe +- New teleport arrow recipe, cheaper but single use + +Update 0.9.1: +- Good improvement for torch arrows, now they always attach and are often turned to the right direction +- Git repository will make things nicer + +Update 0.9: +- Now bows have reload times! They depend on weight and quality, anyway no more machine-gun-style shell swarms +- Fixed build arrow behavior, now it placed and consumes the node from the slot [b]right next to the arrow[/b] or drops the item beside it if not a node; no more disappearing nor 'CONTENT_IGNORE' errors +- Code cleanup and rationalization + +Update 0.8.1: +- Fixed wrong texture reference which made some arrows get a bad color during flight. +- Now bows have different stiffness besides wear resistances, which means that they shot arrows at different initial speed and learning to hit the target will become even harder. + Get rid of the old .env: API + Added new bows and new offensive, utility and harmful arrows (these are just my categories, they're not present into the code at all). + Removed stone bow, at least as long as somebody discovers an elastic rock ;) + Non-exploding arrows won't disappear any more after hitting target. \ No newline at end of file diff --git a/mods/throwing/build_arrow.lua b/mods/throwing/build_arrow.lua new file mode 100644 index 0000000..7f09a63 --- /dev/null +++ b/mods/throwing/build_arrow.lua @@ -0,0 +1,104 @@ +minetest.register_craftitem("throwing:arrow_build", { + description = "Build Arrow", + inventory_image = "throwing_arrow_build.png", +}) + +minetest.register_node("throwing:arrow_build_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_build.png", "throwing_arrow_build.png", "throwing_arrow_build_back.png", "throwing_arrow_build_front.png", "throwing_arrow_build_2.png", "throwing_arrow_build.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_build_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + node = "", +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_build_entity" and obj:get_luaentity().name ~= "__builtin:item" then + self.object:remove() + if self.inventory and self.stack and not minetest.setting_getbool("creative_mode") then + self.inventory:remove_item("main", {name=self.stack:get_name()}) + end + if self.stack then + minetest.add_item(self.lastpos, {name=self.stack:get_name()}) + end + local toughness = 0.95 + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_build') + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" then + self.object:remove() + if self.inventory and self.stack and not minetest.setting_getbool("creative_mode") then + self.inventory:remove_item("main", {name=self.stack:get_name()}) + end + if self.stack then + if not string.find(node.name, "water") and not string.find(node.name, "lava") and not string.find(node.name, "torch") and self.stack:get_definition().type == "node" and self.stack:get_name() ~= "default:torch" then + minetest.place_node(self.lastpos, {name=self.stack:get_name()}) + else + minetest.add_item(self.lastpos, {name=self.stack:get_name()}) + end + end + minetest.add_item(self.lastpos, 'default:shovel_steel') + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_build_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_build', + recipe = { + {'default:stick', 'default:stick', 'default:shovel_steel'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_build', + recipe = { + {'default:shovel_steel', 'default:stick', 'default:stick'}, + } +}) diff --git a/mods/throwing/defaults.lua b/mods/throwing/defaults.lua new file mode 100644 index 0000000..ba3876e --- /dev/null +++ b/mods/throwing/defaults.lua @@ -0,0 +1,24 @@ +DISABLE_WOODEN_BOW = false +DISABLE_LONGBOW = false +DISABLE_COMPOSITE_BOW = false +DISABLE_STEEL_BOW = false +DISABLE_ROYAL_BOW = false +DISABLE_CROSSBOW = false +DISABLE_ARBALEST = false +DISABLE_AUTOMATED_ARBALEST = false + +DISABLE_TELEPORT_ARROW = true +DISABLE_DIG_ARROW = true +DISABLE_BUILD_ARROW = true +DISABLE_TNT_ARROW = true +DISABLE_FIRE_ARROW = true +DISABLE_TORCH_ARROW = false +DISABLE_SHELL_ARROW = false + +DISABLE_FIREWORKS_BLUE_ARROW = false +DISABLE_FIREWORKS_RED_ARROW = false + +DISABLE_STONE_ARROW = false +DISABLE_STEEL_ARROW = false +DISABLE_DIAMOND_ARROW = false +DISABLE_OBSIDIAN_ARROW = false \ No newline at end of file diff --git a/mods/throwing/depends.txt b/mods/throwing/depends.txt new file mode 100644 index 0000000..db178d1 --- /dev/null +++ b/mods/throwing/depends.txt @@ -0,0 +1,6 @@ +default +farming +dye +bucket? +fire? +tnt? diff --git a/mods/throwing/description.txt b/mods/throwing/description.txt new file mode 100644 index 0000000..ee25fb4 --- /dev/null +++ b/mods/throwing/description.txt @@ -0,0 +1 @@ +This mod adds many bows and arrows to Minetest. diff --git a/mods/throwing/dig_arrow.lua b/mods/throwing/dig_arrow.lua new file mode 100644 index 0000000..4e7cf9b --- /dev/null +++ b/mods/throwing/dig_arrow.lua @@ -0,0 +1,100 @@ +minetest.register_craftitem("throwing:arrow_dig", { + description = "Dig Arrow", + inventory_image = "throwing_arrow_dig.png", +}) + +minetest.register_node("throwing:arrow_dig_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_dig.png", "throwing_arrow_dig.png", "throwing_arrow_dig_back.png", "throwing_arrow_dig_front.png", "throwing_arrow_dig_2.png", "throwing_arrow_dig.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_dig_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 1) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_dig_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local damage = 1.5 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + self.object:remove() + local toughness = 0.9 + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_dig') + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" then + self.object:remove() + if node.diggable ~= false then + minetest.dig_node(pos) + end + local toughness = 0.65 + if math.random() < toughness then + minetest.add_item(self.lastpos, 'default:pick_steel') + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_dig_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_dig', + recipe = { + {'default:stick', 'default:stick', 'default:pick_steel'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_dig', + recipe = { + {'default:pick_steel', 'default:stick', 'default:stick'}, + } +}) diff --git a/mods/throwing/fire_arrow.lua b/mods/throwing/fire_arrow.lua new file mode 100644 index 0000000..9457a87 --- /dev/null +++ b/mods/throwing/fire_arrow.lua @@ -0,0 +1,125 @@ +minetest.register_craftitem("throwing:arrow_fire", { + description = "Fire Arrow", + inventory_image = "throwing_arrow_fire.png", +}) + +minetest.register_node("throwing:arrow_fire_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_fire.png", "throwing_arrow_fire.png", "throwing_arrow_fire_back.png", "throwing_arrow_fire_front.png", "throwing_arrow_fire_2.png", "throwing_arrow_fire.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_fire_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_fire_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local damage = 4 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + self.object:remove() + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" and node.name ~= "throwing:light" then + minetest.set_node(self.lastpos, {name="fire:basic_flame"}) + self.object:remove() + end + if math.floor(self.lastpos.x+0.5) ~= math.floor(pos.x+0.5) or math.floor(self.lastpos.y+0.5) ~= math.floor(pos.y+0.5) or math.floor(self.lastpos.z+0.5) ~= math.floor(pos.z+0.5) then + if minetest.get_node(self.lastpos).name == "throwing:light" then + minetest.remove_node(self.lastpos) + end + if minetest.get_node(pos).name == "air" then + minetest.set_node(pos, {name="throwing:light"}) + end + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_fire_entity", THROWING_ARROW_ENTITY) + +minetest.register_node("throwing:light", { + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + tiles = {"throwing_empty.png"}, + light_source = LIGHT_MAX-4, + selection_box = { + type = "fixed", + fixed = { + {0,0,0,0,0,0} + } + }, + groups = {not_in_creative_inventory=1} +}) + +minetest.register_abm({ + nodenames = {"throwing:light"}, + interval = 10, + chance = 1, + action = function(pos, node) + minetest.remove_node(pos) + end +}) + +minetest.register_craft({ + output = 'throwing:arrow_fire 4', + recipe = { + {'default:stick', 'default:stick', 'bucket:bucket_lava'}, + }, + replacements = { + {"bucket:bucket_lava", "bucket:bucket_empty"} + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_fire 4', + recipe = { + {'bucket:bucket_lava', 'default:stick', 'default:stick'}, + }, + replacements = { + {"bucket:bucket_lava", "bucket:bucket_empty"} + } +}) diff --git a/mods/throwing/fireworks_arrows.lua b/mods/throwing/fireworks_arrows.lua new file mode 100644 index 0000000..4dd38fe --- /dev/null +++ b/mods/throwing/fireworks_arrows.lua @@ -0,0 +1,195 @@ +local function throwing_register_fireworks(color, desc) + minetest.register_craftitem("throwing:arrow_fireworks_" .. color, { + description = desc .. "fireworks arrow", + inventory_image = "throwing_arrow_fireworks_" .. color .. ".png", + }) + + minetest.register_node("throwing:arrow_fireworks_" .. color .. "_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_fireworks_" .. color .. ".png", "throwing_arrow_fireworks_" .. color .. ".png", "throwing_arrow_fireworks_" .. color .. "_back.png", "throwing_arrow_fireworks_" .. color .. "_front.png", "throwing_arrow_fireworks_" .. color .. "_2.png", "throwing_arrow_fireworks_" .. color .. ".png"}, + groups = {not_in_creative_inventory=1}, + }) + + local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_fireworks_" .. color .. "_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + } + + local radius = 0.5 + + local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 256, + time = 0.2, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-5, y=-5, z=-5}, + maxvel = {x=5, y=5, z=5}, + minacc = {x=0, y=-8, z=0}, + --~ maxacc = {x=-20, y=-50, z=-50}, + minexptime = 2.5, + maxexptime = 3, + minsize = 1, + maxsize = 2.5, + texture = "throwing_sparkle_" .. color .. ".png", + }) + end + + + local function boom(pos) + minetest.sound_play("throwing_firework_boom", {pos=pos, gain=1, max_hear_distance=2*64}) + if minetest.get_node(pos).name == 'air' or minetest.get_node(pos).name == 'throwing:firework_trail' then + minetest.add_node(pos, {name="throwing:firework_boom"}) + minetest.get_node_timer(pos):start(0.2) + end + add_effects(pos, radius) + end + + -- Back to the arrow + + THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + if self.timer < 0.07 then + minetest.sound_play("throwing_firework_launch", {pos=pos, gain=0.8, max_hear_distance=2*64}) + end + minetest.add_particlespawner({ + amount = 16, + time = 0.1, + minpos = pos, + maxpos = pos, + minvel = {x=-5, y=-5, z=-5}, + maxvel = {x=5, y=5, z=5}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 0.3, + maxexptime = 0.5, + minsize = 0.5, + maxsize = 1, + texture = "throwing_sparkle.png", + }) + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_fireworks_" .. color .. "_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local damage = 2 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + self.object:remove() + boom(pos) + end + end + end + end + if self.timer > 2 then + self.object:remove() + boom(self.lastpos) + end + if self.lastpos.x~=nil then + if node.name ~= "air" and node.name ~= "throwing:firework_trail" then + self.object:remove() + boom(self.lastpos) + end + end + if node.name == 'air' then + minetest.add_node(pos, {name="throwing:firework_trail"}) + minetest.get_node_timer(pos):start(0.1) + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + + minetest.register_entity("throwing:arrow_fireworks_" .. color .. "_entity", THROWING_ARROW_ENTITY) + + minetest.register_craft({ + output = 'throwing:arrow_fireworks_' .. color .. ' 8', + recipe = { + {'default:stick', 'tnt:gunpowder', 'dye:' .. color}, + } + }) + + minetest.register_craft({ + output = 'throwing:arrow_fireworks_' .. color .. ' 8', + recipe = { + {'dye:' .. color, 'tnt:gunpowder', 'default:stick'}, + } + }) +end + +--~ Arrows + +if not DISABLE_FIREWORKS_BLUE_ARROW then + throwing_register_fireworks('blue', 'Blue') +end + +if not DISABLE_FIREWORKS_RED_ARROW then + throwing_register_fireworks('red', 'Red') +end + +--~ Nodes + +minetest.register_node("throwing:firework_trail", { + drawtype = "airlike", + light_source = 9, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, +}) + +minetest.register_node("throwing:firework_boom", { + drawtype = "plantlike", + tiles = {"throwing_sparkle.png"}, + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, + after_destruct = function(pos, oldnode) + minetest.set_node(pos, {name="throwing:firework_light"}) + minetest.get_node_timer(pos):start(3) + end, +}) + +minetest.register_node("throwing:firework_light", { + drawtype = "airlike", + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, +}) diff --git a/mods/throwing/functions.lua b/mods/throwing/functions.lua new file mode 100644 index 0000000..568ad6e --- /dev/null +++ b/mods/throwing/functions.lua @@ -0,0 +1,131 @@ +--~ +--~ Shot and reload system +--~ + +local players = {} + +minetest.register_on_joinplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = { + reloading=false, + } +end) + +minetest.register_on_leaveplayer(function(player) + local playerName = player:get_player_name() + players[playerName] = nil +end) + +function throwing_shoot_arrow (itemstack, player, stiffness, is_cross) + local arrow = itemstack:get_metadata() + itemstack:set_metadata("") + player:set_wielded_item(itemstack) + local playerpos = player:getpos() + local obj = minetest.add_entity({x=playerpos.x,y=playerpos.y+1.5,z=playerpos.z}, arrow) + local dir = player:get_look_dir() + obj:setvelocity({x=dir.x*stiffness, y=dir.y*stiffness, z=dir.z*stiffness}) + obj:setacceleration({x=dir.x*-3, y=-10, z=dir.z*-3}) + obj:setyaw(player:get_look_yaw()+math.pi) + if is_cross then + minetest.sound_play("throwing_crossbow_sound", {pos=playerpos}) + else + minetest.sound_play("throwing_bow_sound", {pos=playerpos}) + end + obj:get_luaentity().player = player + obj:get_luaentity().inventory = player:get_inventory() + obj:get_luaentity().stack = player:get_inventory():get_stack("main", player:get_wield_index()-1) + return true +end + +function throwing_unload (itemstack, player, unloaded, wear) + if itemstack:get_metadata() then + for _,arrow in ipairs(throwing_arrows) do + if itemstack:get_metadata() == arrow[2] then + if not minetest.setting_getbool("creative_mode") then + player:get_inventory():add_item("main", arrow[1]) + end + end + end + end + if wear >= 65535 then + player:set_wielded_item({}) + else + player:set_wielded_item({name=unloaded, wear=wear}) + end +end + +function throwing_reload (itemstack, player, pos, is_cross, loaded) + local playerName = player:get_player_name() + players[playerName]['reloading'] = false + if itemstack:get_name() == player:get_wielded_item():get_name() then + if (pos.x == player:getpos().x and pos.y == player:getpos().y and pos.z == player:getpos().z) or not is_cross then + local wear = itemstack:get_wear() + for _,arrow in ipairs(throwing_arrows) do + if player:get_inventory():get_stack("main", player:get_wield_index()+1):get_name() == arrow[1] then + if not minetest.setting_getbool("creative_mode") then + player:get_inventory():remove_item("main", arrow[1]) + end + local meta = arrow[2] + player:set_wielded_item({name=loaded, wear=wear, metadata=meta}) + end + end + end + end +end + +-- Bows and crossbows + +function throwing_register_bow (name, desc, scale, stiffness, reload_time, toughness, is_cross, craft) + minetest.register_tool("throwing:" .. name, { + description = desc, + inventory_image = "throwing_" .. name .. ".png", + wield_scale = scale, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + local pos = user:getpos() + local playerName = user:get_player_name() + if not players[playerName]['reloading'] then + players[playerName]['reloading'] = true + minetest.after(reload_time, throwing_reload, itemstack, user, pos, is_cross, "throwing:" .. name .. "_loaded") + end + return itemstack + end, + }) + + minetest.register_tool("throwing:" .. name .. "_loaded", { + description = desc, + inventory_image = "throwing_" .. name .. "_loaded.png", + wield_scale = scale, + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + local wear = itemstack:get_wear() + if not minetest.setting_getbool("creative_mode") then + wear = wear + (65535/toughness) + end + local unloaded = "throwing:" .. name + throwing_shoot_arrow(itemstack, user, stiffness, is_cross) + minetest.after(0, throwing_unload, itemstack, user, unloaded, wear) + return itemstack + end, + on_drop = function(itemstack, dropper, pointed_thing) + local wear = itemstack:get_wear() + local unloaded = "throwing:" .. name + minetest.after(0, throwing_unload, itemstack, dropper, unloaded, wear) + end, + groups = {not_in_creative_inventory=1}, + }) + + minetest.register_craft({ + output = 'throwing:' .. name, + recipe = craft + }) + + minetest.register_craft({ + output = 'throwing:' .. name, + recipe = { + {craft[1][3], craft[1][2], craft[1][1]}, + {craft[2][3], craft[2][2], craft[2][1]}, + {craft[3][3], craft[3][2], craft[3][1]}, + } + }) +end diff --git a/mods/throwing/init.lua b/mods/throwing/init.lua new file mode 100644 index 0000000..be1d42a --- /dev/null +++ b/mods/throwing/init.lua @@ -0,0 +1,66 @@ +throwing_arrows = { + {"throwing:arrow_steel", "throwing:arrow_steel_entity"}, + {"throwing:arrow_stone", "throwing:arrow_stone_entity"}, + {"throwing:arrow_obsidian", "throwing:arrow_obsidian_entity"}, + {"throwing:arrow_fire", "throwing:arrow_fire_entity"}, + {"throwing:arrow_teleport", "throwing:arrow_teleport_entity"}, + {"throwing:arrow_dig", "throwing:arrow_dig_entity"}, + {"throwing:arrow_build", "throwing:arrow_build_entity"}, + {"throwing:arrow_tnt", "throwing:arrow_tnt_entity"}, + {"throwing:arrow_torch", "throwing:arrow_torch_entity"}, + {"throwing:arrow_diamond", "throwing:arrow_diamond_entity"}, + {"throwing:arrow_shell", "throwing:arrow_shell_entity"}, + {"throwing:arrow_fireworks_blue", "throwing:arrow_fireworks_blue_entity"}, + {"throwing:arrow_fireworks_red", "throwing:arrow_fireworks_red_entity"}, +} + +dofile(minetest.get_modpath("throwing").."/defaults.lua") + +local input = io.open(minetest.get_modpath("throwing").."/throwing.conf", "r") +if input then + dofile(minetest.get_modpath("throwing").."/throwing.conf") + input:close() + input = nil +end + +dofile(minetest.get_modpath("throwing").."/functions.lua") + +dofile(minetest.get_modpath("throwing").."/tools.lua") + +dofile(minetest.get_modpath("throwing").."/standard_arrows.lua") + +if minetest.get_modpath('fire') and minetest.get_modpath('bucket') and not DISABLE_FIRE_ARROW then + dofile(minetest.get_modpath("throwing").."/fire_arrow.lua") +end + +if not DISABLE_TELEPORT_ARROW then + dofile(minetest.get_modpath("throwing").."/teleport_arrow.lua") +end + +if not DISABLE_DIG_ARROW then + dofile(minetest.get_modpath("throwing").."/dig_arrow.lua") +end + +if not DISABLE_BUILD_ARROW then + dofile(minetest.get_modpath("throwing").."/build_arrow.lua") +end + +if minetest.get_modpath('fire') and minetest.get_modpath('tnt') and not DISABLE_TNT_ARROW then + dofile(minetest.get_modpath("throwing").."/tnt_arrow.lua") +end + +if not DISABLE_TORCH_ARROW then + dofile(minetest.get_modpath("throwing").."/torch_arrow.lua") +end + +if minetest.get_modpath('tnt') and not DISABLE_SHELL_ARROW then + dofile(minetest.get_modpath("throwing").."/shell_arrow.lua") +end + +if minetest.get_modpath('tnt') then + dofile(minetest.get_modpath("throwing").."/fireworks_arrows.lua") +end + +if minetest.setting_get("log_mods") then + minetest.log("action", "throwing loaded") +end diff --git a/mods/throwing/screenshot.png b/mods/throwing/screenshot.png new file mode 100644 index 0000000..32a89d1 Binary files /dev/null and b/mods/throwing/screenshot.png differ diff --git a/mods/throwing/shell_arrow.lua b/mods/throwing/shell_arrow.lua new file mode 100644 index 0000000..76750e9 --- /dev/null +++ b/mods/throwing/shell_arrow.lua @@ -0,0 +1,118 @@ +minetest.register_craftitem("throwing:arrow_shell", { + description = "Shell arrow", + inventory_image = "throwing_arrow_shell.png", +}) + +minetest.register_node("throwing:arrow_shell_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_shell.png", "throwing_arrow_shell.png", "throwing_arrow_shell_back.png", "throwing_arrow_shell_front.png", "throwing_arrow_shell_2.png", "throwing_arrow_shell.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_shell_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, +} + +local radius = 1 + +local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 8, + time = 0.5, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-10, y=-10, z=-10}, + maxvel = {x=10, y=10, z=10}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 0.5, + maxexptime = 1, + minsize = 0.5, + maxsize = 1, + texture = "tnt_smoke.png", + }) +end + + +local function boom(pos) + minetest.sound_play("shell_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) + minetest.set_node(pos, {name="tnt:boom"}) + minetest.get_node_timer(pos):start(0.1) + add_effects(pos, radius) +end + +-- Back to the arrow + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_shell_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local speed = vector.length(self.object:getvelocity()) + local damage = ((speed + 5)^1.2)/10 + 12 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + self.object:remove() + boom(pos) + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" and not string.find(node.name, 'default:grass') and not string.find(node.name, 'default:junglegrass') and not string.find(node.name, 'flowers:') and not string.find(node.name, 'farming:') then + self.object:remove() + boom(self.lastpos) + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_shell_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_shell 8', + recipe = { + {'default:stick', 'tnt:gunpowder', 'default:bronze_ingot'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_shell 8', + recipe = { + {'default:bronze_ingot', 'tnt:gunpowder', 'default:stick'}, + } +}) diff --git a/mods/throwing/sounds/throwing_bow_sound.ogg b/mods/throwing/sounds/throwing_bow_sound.ogg new file mode 100644 index 0000000..411598c Binary files /dev/null and b/mods/throwing/sounds/throwing_bow_sound.ogg differ diff --git a/mods/throwing/sounds/throwing_crossbow_sound.ogg b/mods/throwing/sounds/throwing_crossbow_sound.ogg new file mode 100644 index 0000000..e30b1e0 Binary files /dev/null and b/mods/throwing/sounds/throwing_crossbow_sound.ogg differ diff --git a/mods/throwing/sounds/throwing_firework_boom.ogg b/mods/throwing/sounds/throwing_firework_boom.ogg new file mode 100644 index 0000000..c25b96a Binary files /dev/null and b/mods/throwing/sounds/throwing_firework_boom.ogg differ diff --git a/mods/throwing/sounds/throwing_firework_launch.ogg b/mods/throwing/sounds/throwing_firework_launch.ogg new file mode 100644 index 0000000..e6165a4 Binary files /dev/null and b/mods/throwing/sounds/throwing_firework_launch.ogg differ diff --git a/mods/throwing/sounds/throwing_shell_explode.ogg b/mods/throwing/sounds/throwing_shell_explode.ogg new file mode 100644 index 0000000..ec827f8 Binary files /dev/null and b/mods/throwing/sounds/throwing_shell_explode.ogg differ diff --git a/mods/throwing/standard_arrows.lua b/mods/throwing/standard_arrows.lua new file mode 100644 index 0000000..900b4b8 --- /dev/null +++ b/mods/throwing/standard_arrows.lua @@ -0,0 +1,114 @@ +function throwing_register_arrow_standard (kind, desc, eq, toughness, craft) + minetest.register_craftitem("throwing:arrow_" .. kind, { + description = desc .. " arrow", + inventory_image = "throwing_arrow_" .. kind .. ".png", + }) + + minetest.register_node("throwing:arrow_" .. kind .. "_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_" .. kind .. ".png", "throwing_arrow_" .. kind .. ".png", "throwing_arrow_" .. kind .. "_back.png", "throwing_arrow_" .. kind .. "_front.png", "throwing_arrow_" .. kind .. "_2.png", "throwing_arrow_" .. kind .. ".png"}, + groups = {not_in_creative_inventory=1}, + }) + + local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_" .. kind .. "_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + } + + THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_" .. kind .. "_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local speed = vector.length(self.object:getvelocity()) + local damage = ((speed + eq)^1.2)/10 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + self.object:remove() + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_' .. kind) + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" and not string.find(node.name, 'default:grass') and not string.find(node.name, 'default:junglegrass') and not string.find(node.name, 'flowers:') and not string.find(node.name, 'farming:') then + self.object:remove() + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_' .. kind) + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} + end + + minetest.register_entity("throwing:arrow_" .. kind .. "_entity", THROWING_ARROW_ENTITY) + + minetest.register_craft({ + output = 'throwing:arrow_' .. kind .. ' 16', + recipe = { + {'default:stick', 'default:stick', craft}, + } + }) + + minetest.register_craft({ + output = 'throwing:arrow_' .. kind .. ' 16', + recipe = { + {craft, 'default:stick', 'default:stick'}, + } + }) +end + +if not DISABLE_STONE_ARROW then + throwing_register_arrow_standard ('stone', 'Stone', 0, 0.88, 'group:stone') +end + +if not DISABLE_STEEL_ARROW then + throwing_register_arrow_standard ('steel', 'Steel', 5, 0.94, 'default:steel_ingot') +end + +if not DISABLE_DIAMOND_ARROW then + throwing_register_arrow_standard ('diamond', 'Diamond', 10, 0.97, 'default:diamond') +end + +if not DISABLE_OBSIDIAN_ARROW then + throwing_register_arrow_standard ('obsidian', 'Obsidian', 15, 0.88, 'default:obsidian') +end diff --git a/mods/throwing/teleport_arrow.lua b/mods/throwing/teleport_arrow.lua new file mode 100644 index 0000000..0eadc6e --- /dev/null +++ b/mods/throwing/teleport_arrow.lua @@ -0,0 +1,89 @@ +minetest.register_craftitem("throwing:arrow_teleport", { + description = "Teleport Arrow", + inventory_image = "throwing_arrow_teleport.png", +}) + +minetest.register_node("throwing:arrow_teleport_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_teleport.png", "throwing_arrow_teleport.png", "throwing_arrow_teleport_back.png", "throwing_arrow_teleport_front.png", "throwing_arrow_teleport_2.png", "throwing_arrow_teleport.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_teleport_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + player = "", +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_teleport_entity" and obj:get_luaentity().name ~= "__builtin:item" then + self.object:remove() + if self.player ~= "" then + self.player:setpos(pos) + self.player:get_inventory():add_item("main", ItemStack("default:stick 2")) + end + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" then + self.object:remove() + if self.player ~= "" then + self.player:setpos(self.lastpos) + self.player:get_inventory():add_item("main", ItemStack("default:stick 2")) + end + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_teleport_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_teleport', + recipe = { + {'default:stick', 'default:stick', 'default:mese_crystal_fragment'} + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_teleport', + recipe = { + {'default:mese_crystal_fragment', 'default:stick', 'default:stick'} + } +}) diff --git a/mods/throwing/textures/throwing_arbalest.png b/mods/throwing/textures/throwing_arbalest.png new file mode 100644 index 0000000..f53e377 Binary files /dev/null and b/mods/throwing/textures/throwing_arbalest.png differ diff --git a/mods/throwing/textures/throwing_arbalest_auto.png b/mods/throwing/textures/throwing_arbalest_auto.png new file mode 100644 index 0000000..c40cd92 Binary files /dev/null and b/mods/throwing/textures/throwing_arbalest_auto.png differ diff --git a/mods/throwing/textures/throwing_arbalest_auto_loaded.png b/mods/throwing/textures/throwing_arbalest_auto_loaded.png new file mode 100644 index 0000000..f971b24 Binary files /dev/null and b/mods/throwing/textures/throwing_arbalest_auto_loaded.png differ diff --git a/mods/throwing/textures/throwing_arbalest_loaded.png b/mods/throwing/textures/throwing_arbalest_loaded.png new file mode 100644 index 0000000..09b2cc8 Binary files /dev/null and b/mods/throwing/textures/throwing_arbalest_loaded.png differ diff --git a/mods/throwing/textures/throwing_arrow_build.png b/mods/throwing/textures/throwing_arrow_build.png new file mode 100644 index 0000000..09d01ec Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_build.png differ diff --git a/mods/throwing/textures/throwing_arrow_build_2.png b/mods/throwing/textures/throwing_arrow_build_2.png new file mode 100644 index 0000000..4fdbd92 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_build_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_build_back.png b/mods/throwing/textures/throwing_arrow_build_back.png new file mode 100644 index 0000000..621f258 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_build_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_build_front.png b/mods/throwing/textures/throwing_arrow_build_front.png new file mode 100644 index 0000000..4a651a5 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_build_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_diamond.png b/mods/throwing/textures/throwing_arrow_diamond.png new file mode 100644 index 0000000..ae34eb0 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_diamond.png differ diff --git a/mods/throwing/textures/throwing_arrow_diamond_2.png b/mods/throwing/textures/throwing_arrow_diamond_2.png new file mode 100644 index 0000000..9bc1219 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_diamond_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_diamond_back.png b/mods/throwing/textures/throwing_arrow_diamond_back.png new file mode 100644 index 0000000..0c92fba Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_diamond_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_diamond_front.png b/mods/throwing/textures/throwing_arrow_diamond_front.png new file mode 100644 index 0000000..791c88d Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_diamond_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_dig.png b/mods/throwing/textures/throwing_arrow_dig.png new file mode 100644 index 0000000..f54a7ae Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_dig.png differ diff --git a/mods/throwing/textures/throwing_arrow_dig_2.png b/mods/throwing/textures/throwing_arrow_dig_2.png new file mode 100644 index 0000000..3370387 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_dig_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_dig_back.png b/mods/throwing/textures/throwing_arrow_dig_back.png new file mode 100644 index 0000000..3bc4a60 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_dig_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_dig_front.png b/mods/throwing/textures/throwing_arrow_dig_front.png new file mode 100644 index 0000000..7a29499 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_dig_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_fire.png b/mods/throwing/textures/throwing_arrow_fire.png new file mode 100644 index 0000000..8f5075a Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fire.png differ diff --git a/mods/throwing/textures/throwing_arrow_fire_2.png b/mods/throwing/textures/throwing_arrow_fire_2.png new file mode 100644 index 0000000..ed0aa5f Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fire_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_fire_back.png b/mods/throwing/textures/throwing_arrow_fire_back.png new file mode 100644 index 0000000..8a7d993 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fire_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_fire_front.png b/mods/throwing/textures/throwing_arrow_fire_front.png new file mode 100644 index 0000000..3994257 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fire_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_blue.png b/mods/throwing/textures/throwing_arrow_fireworks_blue.png new file mode 100644 index 0000000..36c30bc Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_blue.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_blue_2.png b/mods/throwing/textures/throwing_arrow_fireworks_blue_2.png new file mode 100644 index 0000000..672805c Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_blue_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_blue_back.png b/mods/throwing/textures/throwing_arrow_fireworks_blue_back.png new file mode 100644 index 0000000..85956a6 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_blue_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_blue_front.png b/mods/throwing/textures/throwing_arrow_fireworks_blue_front.png new file mode 100644 index 0000000..fca7c92 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_blue_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_red.png b/mods/throwing/textures/throwing_arrow_fireworks_red.png new file mode 100644 index 0000000..fe0fd89 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_red.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_red_2.png b/mods/throwing/textures/throwing_arrow_fireworks_red_2.png new file mode 100644 index 0000000..566c5cb Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_red_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_red_back.png b/mods/throwing/textures/throwing_arrow_fireworks_red_back.png new file mode 100644 index 0000000..8e90fc5 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_red_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_fireworks_red_front.png b/mods/throwing/textures/throwing_arrow_fireworks_red_front.png new file mode 100644 index 0000000..d84e5a1 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_fireworks_red_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_obsidian.png b/mods/throwing/textures/throwing_arrow_obsidian.png new file mode 100644 index 0000000..86e5ef2 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_obsidian.png differ diff --git a/mods/throwing/textures/throwing_arrow_obsidian_2.png b/mods/throwing/textures/throwing_arrow_obsidian_2.png new file mode 100644 index 0000000..fefcd91 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_obsidian_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_obsidian_back.png b/mods/throwing/textures/throwing_arrow_obsidian_back.png new file mode 100644 index 0000000..bd1232f Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_obsidian_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_obsidian_front.png b/mods/throwing/textures/throwing_arrow_obsidian_front.png new file mode 100644 index 0000000..f74c13e Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_obsidian_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_shell.png b/mods/throwing/textures/throwing_arrow_shell.png new file mode 100644 index 0000000..a1204d0 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_shell.png differ diff --git a/mods/throwing/textures/throwing_arrow_shell_2.png b/mods/throwing/textures/throwing_arrow_shell_2.png new file mode 100644 index 0000000..ad7bc43 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_shell_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_shell_back.png b/mods/throwing/textures/throwing_arrow_shell_back.png new file mode 100644 index 0000000..4b64eaf Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_shell_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_shell_front.png b/mods/throwing/textures/throwing_arrow_shell_front.png new file mode 100644 index 0000000..06b9454 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_shell_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_steel.png b/mods/throwing/textures/throwing_arrow_steel.png new file mode 100644 index 0000000..3d70610 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_steel.png differ diff --git a/mods/throwing/textures/throwing_arrow_steel_2.png b/mods/throwing/textures/throwing_arrow_steel_2.png new file mode 100644 index 0000000..b989983 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_steel_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_steel_back.png b/mods/throwing/textures/throwing_arrow_steel_back.png new file mode 100644 index 0000000..c7edf56 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_steel_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_steel_front.png b/mods/throwing/textures/throwing_arrow_steel_front.png new file mode 100644 index 0000000..38ccec4 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_steel_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_stone.png b/mods/throwing/textures/throwing_arrow_stone.png new file mode 100644 index 0000000..c7a14e9 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_stone.png differ diff --git a/mods/throwing/textures/throwing_arrow_stone_2.png b/mods/throwing/textures/throwing_arrow_stone_2.png new file mode 100644 index 0000000..23617ef Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_stone_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_stone_back.png b/mods/throwing/textures/throwing_arrow_stone_back.png new file mode 100644 index 0000000..293334e Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_stone_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_stone_front.png b/mods/throwing/textures/throwing_arrow_stone_front.png new file mode 100644 index 0000000..c93a35c Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_stone_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_teleport.png b/mods/throwing/textures/throwing_arrow_teleport.png new file mode 100644 index 0000000..235745a Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_teleport.png differ diff --git a/mods/throwing/textures/throwing_arrow_teleport_2.png b/mods/throwing/textures/throwing_arrow_teleport_2.png new file mode 100644 index 0000000..db786ca Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_teleport_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_teleport_back.png b/mods/throwing/textures/throwing_arrow_teleport_back.png new file mode 100644 index 0000000..325c203 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_teleport_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_teleport_front.png b/mods/throwing/textures/throwing_arrow_teleport_front.png new file mode 100644 index 0000000..c2e693f Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_teleport_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_tnt.png b/mods/throwing/textures/throwing_arrow_tnt.png new file mode 100644 index 0000000..6625cb0 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_tnt.png differ diff --git a/mods/throwing/textures/throwing_arrow_tnt_2.png b/mods/throwing/textures/throwing_arrow_tnt_2.png new file mode 100644 index 0000000..426ebff Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_tnt_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_tnt_back.png b/mods/throwing/textures/throwing_arrow_tnt_back.png new file mode 100644 index 0000000..230bb18 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_tnt_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_tnt_front.png b/mods/throwing/textures/throwing_arrow_tnt_front.png new file mode 100644 index 0000000..38d22e3 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_tnt_front.png differ diff --git a/mods/throwing/textures/throwing_arrow_torch.png b/mods/throwing/textures/throwing_arrow_torch.png new file mode 100644 index 0000000..0126df1 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_torch.png differ diff --git a/mods/throwing/textures/throwing_arrow_torch_2.png b/mods/throwing/textures/throwing_arrow_torch_2.png new file mode 100644 index 0000000..6bf9e11 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_torch_2.png differ diff --git a/mods/throwing/textures/throwing_arrow_torch_back.png b/mods/throwing/textures/throwing_arrow_torch_back.png new file mode 100644 index 0000000..12754c7 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_torch_back.png differ diff --git a/mods/throwing/textures/throwing_arrow_torch_front.png b/mods/throwing/textures/throwing_arrow_torch_front.png new file mode 100644 index 0000000..764a263 Binary files /dev/null and b/mods/throwing/textures/throwing_arrow_torch_front.png differ diff --git a/mods/throwing/textures/throwing_bow_composite.png b/mods/throwing/textures/throwing_bow_composite.png new file mode 100644 index 0000000..630af5a Binary files /dev/null and b/mods/throwing/textures/throwing_bow_composite.png differ diff --git a/mods/throwing/textures/throwing_bow_composite_loaded.png b/mods/throwing/textures/throwing_bow_composite_loaded.png new file mode 100644 index 0000000..67bf8e5 Binary files /dev/null and b/mods/throwing/textures/throwing_bow_composite_loaded.png differ diff --git a/mods/throwing/textures/throwing_bow_royal.png b/mods/throwing/textures/throwing_bow_royal.png new file mode 100644 index 0000000..43c20f8 Binary files /dev/null and b/mods/throwing/textures/throwing_bow_royal.png differ diff --git a/mods/throwing/textures/throwing_bow_royal_loaded.png b/mods/throwing/textures/throwing_bow_royal_loaded.png new file mode 100644 index 0000000..3416f2e Binary files /dev/null and b/mods/throwing/textures/throwing_bow_royal_loaded.png differ diff --git a/mods/throwing/textures/throwing_bow_steel.png b/mods/throwing/textures/throwing_bow_steel.png new file mode 100644 index 0000000..0e1d3d1 Binary files /dev/null and b/mods/throwing/textures/throwing_bow_steel.png differ diff --git a/mods/throwing/textures/throwing_bow_steel_loaded.png b/mods/throwing/textures/throwing_bow_steel_loaded.png new file mode 100644 index 0000000..16150a6 Binary files /dev/null and b/mods/throwing/textures/throwing_bow_steel_loaded.png differ diff --git a/mods/throwing/textures/throwing_bow_wood.png b/mods/throwing/textures/throwing_bow_wood.png new file mode 100644 index 0000000..9a6c6da Binary files /dev/null and b/mods/throwing/textures/throwing_bow_wood.png differ diff --git a/mods/throwing/textures/throwing_bow_wood_loaded.png b/mods/throwing/textures/throwing_bow_wood_loaded.png new file mode 100644 index 0000000..251e643 Binary files /dev/null and b/mods/throwing/textures/throwing_bow_wood_loaded.png differ diff --git a/mods/throwing/textures/throwing_crossbow.png b/mods/throwing/textures/throwing_crossbow.png new file mode 100644 index 0000000..f8a400b Binary files /dev/null and b/mods/throwing/textures/throwing_crossbow.png differ diff --git a/mods/throwing/textures/throwing_crossbow_loaded.png b/mods/throwing/textures/throwing_crossbow_loaded.png new file mode 100644 index 0000000..5d2b0c7 Binary files /dev/null and b/mods/throwing/textures/throwing_crossbow_loaded.png differ diff --git a/mods/throwing/textures/throwing_empty.png b/mods/throwing/textures/throwing_empty.png new file mode 100644 index 0000000..6bbd554 Binary files /dev/null and b/mods/throwing/textures/throwing_empty.png differ diff --git a/mods/throwing/textures/throwing_longbow.png b/mods/throwing/textures/throwing_longbow.png new file mode 100644 index 0000000..7bdae2f Binary files /dev/null and b/mods/throwing/textures/throwing_longbow.png differ diff --git a/mods/throwing/textures/throwing_longbow_loaded.png b/mods/throwing/textures/throwing_longbow_loaded.png new file mode 100644 index 0000000..e03299a Binary files /dev/null and b/mods/throwing/textures/throwing_longbow_loaded.png differ diff --git a/mods/throwing/textures/throwing_sparkle.png b/mods/throwing/textures/throwing_sparkle.png new file mode 100644 index 0000000..432786e Binary files /dev/null and b/mods/throwing/textures/throwing_sparkle.png differ diff --git a/mods/throwing/textures/throwing_sparkle_blue.png b/mods/throwing/textures/throwing_sparkle_blue.png new file mode 100644 index 0000000..d4710a3 Binary files /dev/null and b/mods/throwing/textures/throwing_sparkle_blue.png differ diff --git a/mods/throwing/textures/throwing_sparkle_red.png b/mods/throwing/textures/throwing_sparkle_red.png new file mode 100644 index 0000000..59ec68c Binary files /dev/null and b/mods/throwing/textures/throwing_sparkle_red.png differ diff --git a/mods/throwing/throwing.conf.example b/mods/throwing/throwing.conf.example new file mode 100644 index 0000000..f0e1ba5 --- /dev/null +++ b/mods/throwing/throwing.conf.example @@ -0,0 +1,52 @@ +# You can disable or disable any bow and arrow by writing lines like these inside throwing.conf +# +# DISABLE_WOODEN_BOW = true +# +# +# DISABLE_LONGBOW = true +# +# +# DISABLE_COMPOSITE_BOW = true +# +# +# DISABLE_STEEL_BOW = true +# +# +# DISABLE_ROYAL_BOW = true +# +# +# DISABLE_CROSSBOW = true +# +# +# DISABLE_BUILD_ARROW = false +# +# +# DISABLE_DIG_ARROW = false +# +# +# DISABLE_DIAMOND_ARROW = true +# +# +# DISABLE_OBSIDIAN_ARROW = true +# +# +# DISABLE_SHELL_ARROW = true +# +# +# DISABLE_STEEL_ARROW = true +# +# +# DISABLE_STONE_ARROW = false +# +# +# DISABLE_TELEPORT_ARROW = false +# +# +# DISABLE_FIRE_ARROW = false +# +# +# DISABLE_TNT_ARROW = false +# +# +# DISABLE_TORCH_ARROW = true +# \ No newline at end of file diff --git a/mods/throwing/tnt_arrow.lua b/mods/throwing/tnt_arrow.lua new file mode 100644 index 0000000..d0a4f7d --- /dev/null +++ b/mods/throwing/tnt_arrow.lua @@ -0,0 +1,286 @@ +minetest.register_craftitem("throwing:arrow_tnt", { + description = "TNT arrow", + inventory_image = "throwing_arrow_tnt.png", +}) + +minetest.register_node("throwing:arrow_tnt_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_tnt.png", "throwing_arrow_tnt.png", "throwing_arrow_tnt_back.png", "throwing_arrow_tnt_front.png", "throwing_arrow_tnt_2.png", "throwing_arrow_tnt.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_tnt_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, +} + +-- TNT functions copied, would be nice to directly call them through an API... + +-- loss probabilities array (one in X will be lost) +local loss_prob = {} + +loss_prob["default:cobble"] = 3 +loss_prob["default:dirt"] = 4 + +local radius = tonumber(minetest.setting_get("tnt_radius") or 3) + +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.after(0, function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + } + end +end) + +local function rand_pos(center, pos, radius) + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + for _, item in pairs(drops) do + local count = item:get_count() + local max = item:get_stack_max() + if count > max then + item:set_count(max) + end + while count > 0 do + if count < max then + item:set_count(count) + end + rand_pos(pos, drop_pos, radius) + local obj = minetest.add_item(drop_pos, item) + if obj then + obj:get_luaentity().collect = true + obj:setacceleration({x=0, y=-10, z=0}) + obj:setvelocity({x=math.random(-3, 3), y=10, + z=math.random(-3, 3)}) + end + count = count - max + end + end +end + +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return + end + + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local fire_node = {name="fire:basic_flame"} + +local function destroy(drops, pos, cid) + if minetest.is_protected(pos, "") then + return + end + local def = cid_data[cid] + if def and def.flammable then + minetest.set_node(pos, fire_node) + else + minetest.dig_node(pos) + if def then + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in ipairs(node_drops) do + add_drop(drops, item) + end + end + end +end + + +local function calc_velocity(pos1, pos2, old_vel, power) + local vel = vector.direction(pos1, pos2) + vel = vector.normalize(vel) + vel = vector.multiply(vel, power) + + -- Divide by distance + local dist = vector.distance(pos1, pos2) + dist = math.max(dist, 1) + vel = vector.divide(vel, dist) + + -- Add old velocity + vel = vector.add(vel, old_vel) + return vel +end + +local function entity_physics(pos, radius) + -- Make the damage radius larger than the destruction radius + radius = radius * 2 + local objs = minetest.get_objects_inside_radius(pos, radius) + for _, obj in pairs(objs) do + local obj_pos = obj:getpos() + local obj_vel = obj:getvelocity() + local dist = math.max(1, vector.distance(pos, obj_pos)) + + if obj_vel ~= nil then + obj:setvelocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + + local damage = (5 / dist) * radius + obj:set_hp(obj:get_hp() - damage) + end +end + +local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 128, + time = 1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-20, y=-20, z=-20}, + maxvel = {x=20, y=20, z=20}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 3, + minsize = 8, + maxsize = 16, + texture = "tnt_smoke.png", + }) +end + + +local function explode(pos, radius) + local pos = vector.round(pos) + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + local p1 = vector.subtract(pos, radius) + local p2 = vector.add(pos, radius) + local minp, maxp = vm:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + local drops = {} + local p = {} + + local c_air = minetest.get_content_id("air") + local c_tnt = minetest.get_content_id("tnt:tnt") + local c_tnt_burning = minetest.get_content_id("tnt:tnt_burning") + local c_gunpowder = minetest.get_content_id("tnt:gunpowder") + local c_gunpowder_burning = minetest.get_content_id("tnt:gunpowder_burning") + local c_boom = minetest.get_content_id("tnt:boom") + local c_fire = minetest.get_content_id("fire:basic_flame") + + for z = -radius, radius do + for y = -radius, radius do + local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + for x = -radius, radius do + if (x * x) + (y * y) + (z * z) <= + (radius * radius) + pr:next(-radius, radius) then + local cid = data[vi] + p.x = pos.x + x + p.y = pos.y + y + p.z = pos.z + z + if cid == c_tnt or cid == c_gunpowder then + burn(p) + elseif cid ~= c_tnt_burning and + cid ~= c_gunpowder_burning and + cid ~= c_air and + cid ~= c_fire and + cid ~= c_boom then + destroy(drops, p, cid) + end + end + vi = vi + 1 + end + end + end + + return drops +end + + +local function boom(pos) + minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) + minetest.set_node(pos, {name="tnt:boom"}) + minetest.get_node_timer(pos):start(0.5) + + local drops = explode(pos, radius) + entity_physics(pos, radius) + eject_drops(drops, pos, radius) + add_effects(pos, radius) +end + +-- Back to the arrow + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 2) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_tnt_entity" and obj:get_luaentity().name ~= "__builtin:item" then + self.object:remove() + boom(pos) + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" then + self.object:remove() + boom(self.lastpos) + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_tnt_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_tnt', + recipe = { + {'default:stick', 'tnt:tnt', 'default:bronze_ingot'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_tnt', + recipe = { + {'default:bronze_ingot', 'tnt:tnt', 'default:stick'}, + } +}) diff --git a/mods/throwing/tools.lua b/mods/throwing/tools.lua new file mode 100644 index 0000000..57ef85c --- /dev/null +++ b/mods/throwing/tools.lua @@ -0,0 +1,63 @@ +if not DISABLE_WOODEN_BOW then + throwing_register_bow ('bow_wood', 'Wooden bow', {x=1, y=1, z=0.5}, 11, 0.8, 50, false, { + {'', 'default:stick', ''}, + {'farming:string', '', 'default:stick'}, + {'', 'default:stick', ''}, + }) +end + +if not DISABLE_LONGBOW then + throwing_register_bow ('longbow', 'Longbow', {x=1, y=2.5, z=0.5}, 17, 1.8, 100, false, { + {'farming:string', 'group:wood', ''}, + {'farming:string', '', 'group:wood'}, + {'farming:string', 'group:wood', ''}, + }) +end + +if not DISABLE_COMPOSITE_BOW then + throwing_register_bow ('bow_composite', 'Composite bow', {x=1, y=1.4, z=0.5}, 17, 1, 150, false, { + {'farming:string', 'group:wood', ''}, + {'farming:string', '', 'default:steel_ingot'}, + {'farming:string', 'group:wood', ''}, + }) +end + +if not DISABLE_STEEL_BOW then + throwing_register_bow ('bow_steel', 'Steel bow', {x=1, y=1.4, z=0.5}, 20, 1.3, 250, false, { + {'farming:string', 'default:steel_ingot', ''}, + {'farming:string', '', 'default:steel_ingot'}, + {'farming:string', 'default:steel_ingot', ''}, + }) +end + +if not DISABLE_ROYAL_BOW then + throwing_register_bow ('bow_royal', 'Royal bow', {x=1, y=1.5, z=0.5}, 18, 1.4, 750, false, { + {'farming:string', 'group:wood', 'default:diamond'}, + {'farming:string', '', 'default:gold_ingot'}, + {'farming:string', 'group:wood', 'default:diamond'}, + }) +end + +if not DISABLE_CROSSBOW then + throwing_register_bow ('crossbow', 'Crossbow', {x=1, y=1.3, z=0.5}, 28, 5, 80, true, { + {'group:wood', 'farming:string', ''}, + {'default:steel_ingot', 'farming:string', 'group:wood'}, + {'group:wood', 'farming:string', ''}, + }) +end + +if not DISABLE_ARBALEST then + throwing_register_bow ('arbalest', 'Arbalest', {x=1, y=1.3, z=0.5}, 35, 7.5, 120, true, { + {'default:steel_ingot', 'farming:string', 'default:stick'}, + {'default:steel_ingot', 'farming:string', 'default:steel_ingot'}, + {'default:steel_ingot', 'farming:string', 'default:stick'}, + }) +end + +if not DISABLE_AUTOMATED_ARBALEST then + throwing_register_bow ('arbalest_auto', 'Automated arbalest', {x=1, y=1.3, z=0.5}, 40, 3.5, 60, true, { + {'default:steel_ingot', 'farming:string', 'default:mese_crystal'}, + {'default:steel_ingot', 'farming:string', 'default:steel_ingot'}, + {'default:steel_ingot', 'farming:string', 'default:mese_crystal'}, + }) +end diff --git a/mods/throwing/torch_arrow.lua b/mods/throwing/torch_arrow.lua new file mode 100644 index 0000000..004b73d --- /dev/null +++ b/mods/throwing/torch_arrow.lua @@ -0,0 +1,104 @@ +minetest.register_craftitem("throwing:arrow_torch", { + description = "Torch Arrow", + inventory_image = "throwing_arrow_torch.png", +}) + +minetest.register_node("throwing:arrow_torch_box", { + drawtype = "nodebox", + node_box = { + type = "fixed", + fixed = { + -- Shaft + {-6.5/17, -1.5/17, -1.5/17, 6.5/17, 1.5/17, 1.5/17}, + --Spitze + {-4.5/17, 2.5/17, 2.5/17, -3.5/17, -2.5/17, -2.5/17}, + {-8.5/17, 0.5/17, 0.5/17, -6.5/17, -0.5/17, -0.5/17}, + --Federn + {6.5/17, 1.5/17, 1.5/17, 7.5/17, 2.5/17, 2.5/17}, + {7.5/17, -2.5/17, 2.5/17, 6.5/17, -1.5/17, 1.5/17}, + {7.5/17, 2.5/17, -2.5/17, 6.5/17, 1.5/17, -1.5/17}, + {6.5/17, -1.5/17, -1.5/17, 7.5/17, -2.5/17, -2.5/17}, + + {7.5/17, 2.5/17, 2.5/17, 8.5/17, 3.5/17, 3.5/17}, + {8.5/17, -3.5/17, 3.5/17, 7.5/17, -2.5/17, 2.5/17}, + {8.5/17, 3.5/17, -3.5/17, 7.5/17, 2.5/17, -2.5/17}, + {7.5/17, -2.5/17, -2.5/17, 8.5/17, -3.5/17, -3.5/17}, + } + }, + tiles = {"throwing_arrow_torch.png", "throwing_arrow_torch.png", "throwing_arrow_torch_back.png", "throwing_arrow_torch_front.png", "throwing_arrow_torch_2.png", "throwing_arrow_torch.png"}, + groups = {not_in_creative_inventory=1}, +}) + +local THROWING_ARROW_ENTITY={ + physical = false, + timer=0, + visual = "wielditem", + visual_size = {x=0.1, y=0.1}, + textures = {"throwing:arrow_torch_box"}, + lastpos={}, + collisionbox = {0,0,0,0,0,0}, + node = "", +} + +THROWING_ARROW_ENTITY.on_step = function(self, dtime) + self.timer=self.timer+dtime + local pos = self.object:getpos() + local node = minetest.get_node(pos) + + if self.timer>0.2 then + local objs = minetest.get_objects_inside_radius({x=pos.x,y=pos.y,z=pos.z}, 0.5) + for k, obj in pairs(objs) do + if obj:get_luaentity() ~= nil then + if obj:get_luaentity().name ~= "throwing:arrow_torch_entity" and obj:get_luaentity().name ~= "__builtin:item" then + local damage = 0.5 + obj:punch(self.object, 1.0, { + full_punch_interval=1.0, + damage_groups={fleshy=damage}, + }, nil) + self.object:remove() + local toughness = 0.9 + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_torch') + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + end + end + + if self.lastpos.x~=nil then + if node.name ~= "air" then + self.object:remove() + if not string.find(node.name, "water") and not string.find(node.name, "lava") and not string.find(node.name, "torch") then + local dir=vector.direction(self.lastpos, pos) + local wall=minetest.dir_to_wallmounted(dir) + minetest.add_node(self.lastpos, {name="default:torch", param2 = wall}) + else + local toughness = 0.9 + if math.random() < toughness then + minetest.add_item(self.lastpos, 'throwing:arrow_torch') + else + minetest.add_item(self.lastpos, 'default:stick') + end + end + end + end + self.lastpos={x=pos.x, y=pos.y, z=pos.z} +end + +minetest.register_entity("throwing:arrow_torch_entity", THROWING_ARROW_ENTITY) + +minetest.register_craft({ + output = 'throwing:arrow_torch 4', + recipe = { + {'default:stick', 'default:stick', 'group:coal'}, + } +}) + +minetest.register_craft({ + output = 'throwing:arrow_torch 4', + recipe = { + {'group:coal', 'default:stick', 'default:stick'}, + } +}) diff --git a/mods/tnt/README.txt b/mods/tnt/README.txt new file mode 100644 index 0000000..90a3467 --- /dev/null +++ b/mods/tnt/README.txt @@ -0,0 +1,36 @@ +=== TNT mod for Minetest === +by PilzAdam and ShadowNinja + +Introduction: +This mod adds TNT to Minetest. TNT is a tool to help the player +in mining. + +How to use the mod: +Craft gunpowder by placing coal and gravel in the crafting area. The +gunpowder can be used to craft TNT or as fuze for TNT. To craft TNT +surround gunpowder with 4 wood in a + shape. +There are different ways to blow up TNT: + 1. Hit it with a torch. + 2. Hit a gunpowder fuze that leads to a TNT block with a torch. + 3. Activate it with mesecons (fastest way) +Be aware of the damage radius of 7 blocks! + +License: +WTFPL (see below) + +See also: +http://minetest.net/ + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + + Copyright (C) 2004 Sam Hocevar + + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. You just DO WHAT THE FUCK YOU WANT TO. diff --git a/mods/tnt/depends.txt b/mods/tnt/depends.txt new file mode 100644 index 0000000..5ff216f --- /dev/null +++ b/mods/tnt/depends.txt @@ -0,0 +1,3 @@ +default +fire + diff --git a/mods/tnt/init.lua b/mods/tnt/init.lua new file mode 100644 index 0000000..8ce018b --- /dev/null +++ b/mods/tnt/init.lua @@ -0,0 +1,390 @@ + +-- Default to enabled in singleplayer and disabled in multiplayer +local singleplayer = minetest.is_singleplayer() +local setting = minetest.setting_getbool("enable_tnt") +if (not singleplayer and setting ~= true) or + (singleplayer and setting == false) then + return +end + +-- loss probabilities array (one in X will be lost) +local loss_prob = {} + +loss_prob["default:cobble"] = 3 +loss_prob["default:dirt"] = 4 + +local radius = tonumber(minetest.setting_get("tnt_radius") or 3) + +-- Fill a list with data for content IDs, after all nodes are registered +local cid_data = {} +minetest.after(0, function() + for name, def in pairs(minetest.registered_nodes) do + cid_data[minetest.get_content_id(name)] = { + name = name, + drops = def.drops, + flammable = def.groups.flammable, + on_blast = def.on_blast, + } + end +end) + +local function rand_pos(center, pos, radius) + pos.x = center.x + math.random(-radius, radius) + pos.z = center.z + math.random(-radius, radius) +end + +local function eject_drops(drops, pos, radius) + local drop_pos = vector.new(pos) + for _, item in pairs(drops) do + local count = item:get_count() + local max = item:get_stack_max() + if count > max then + item:set_count(max) + end + while count > 0 do + if count < max then + item:set_count(count) + end + rand_pos(pos, drop_pos, radius) + local obj = minetest.add_item(drop_pos, item) + if obj then + obj:get_luaentity().collect = true + obj:setacceleration({x=0, y=-10, z=0}) + obj:setvelocity({x=math.random(-3, 3), y=10, + z=math.random(-3, 3)}) + end + count = count - max + end + end +end + +local function add_drop(drops, item) + item = ItemStack(item) + local name = item:get_name() + if loss_prob[name] ~= nil and math.random(1, loss_prob[name]) == 1 then + return + end + + local drop = drops[name] + if drop == nil then + drops[name] = item + else + drop:set_count(drop:get_count() + item:get_count()) + end +end + +local fire_node = {name="fire:basic_flame"} + +local function destroy(drops, pos, cid) + if minetest.is_protected(pos, "") then + return + end + local def = cid_data[cid] + if def and def.on_blast then + def.on_blast(vector.new(pos), 1) + return + end + if def and def.flammable then + minetest.set_node(pos, fire_node) + else + minetest.remove_node(pos) + if def then + local node_drops = minetest.get_node_drops(def.name, "") + for _, item in ipairs(node_drops) do + add_drop(drops, item) + end + end + end +end + + +local function calc_velocity(pos1, pos2, old_vel, power) + local vel = vector.direction(pos1, pos2) + vel = vector.normalize(vel) + vel = vector.multiply(vel, power) + + -- Divide by distance + local dist = vector.distance(pos1, pos2) + dist = math.max(dist, 1) + vel = vector.divide(vel, dist) + + -- Add old velocity + vel = vector.add(vel, old_vel) + return vel +end + +local function entity_physics(pos, radius) + -- Make the damage radius larger than the destruction radius + radius = radius * 2 + local objs = minetest.get_objects_inside_radius(pos, radius) + for _, obj in pairs(objs) do + local obj_pos = obj:getpos() + local obj_vel = obj:getvelocity() + local dist = math.max(1, vector.distance(pos, obj_pos)) + + if obj_vel ~= nil then + obj:setvelocity(calc_velocity(pos, obj_pos, + obj_vel, radius * 10)) + end + + local damage = (4 / dist) * radius + obj:set_hp(obj:get_hp() - damage) + end +end + +local function add_effects(pos, radius) + minetest.add_particlespawner({ + amount = 128, + time = 1, + minpos = vector.subtract(pos, radius / 2), + maxpos = vector.add(pos, radius / 2), + minvel = {x=-20, y=-20, z=-20}, + maxvel = {x=20, y=20, z=20}, + minacc = vector.new(), + maxacc = vector.new(), + minexptime = 1, + maxexptime = 3, + minsize = 8, + maxsize = 16, + texture = "tnt_smoke.png", + }) +end + +local function burn(pos) + local name = minetest.get_node(pos).name + if name == "tnt:tnt" then + minetest.sound_play("tnt_ignite", {pos=pos}) + minetest.set_node(pos, {name="tnt:tnt_burning"}) + minetest.get_node_timer(pos):start(1) + elseif name == "tnt:gunpowder" then + minetest.sound_play("tnt_gunpowder_burning", {pos=pos, gain=2}) + minetest.set_node(pos, {name="tnt:gunpowder_burning"}) + minetest.get_node_timer(pos):start(1) + end +end + +local function explode(pos, radius) + local pos = vector.round(pos) + local vm = VoxelManip() + local pr = PseudoRandom(os.time()) + local p1 = vector.subtract(pos, radius) + local p2 = vector.add(pos, radius) + local minp, maxp = vm:read_from_map(p1, p2) + local a = VoxelArea:new({MinEdge = minp, MaxEdge = maxp}) + local data = vm:get_data() + + local drops = {} + local p = {} + + local c_air = minetest.get_content_id("air") + + for z = -radius, radius do + for y = -radius, radius do + local vi = a:index(pos.x + (-radius), pos.y + y, pos.z + z) + for x = -radius, radius do + if (x * x) + (y * y) + (z * z) <= + (radius * radius) + pr:next(-radius, radius) then + local cid = data[vi] + p.x = pos.x + x + p.y = pos.y + y + p.z = pos.z + z + if cid ~= c_air then + destroy(drops, p, cid) + end + end + vi = vi + 1 + end + end + end + + return drops +end + + +local function boom(pos) + minetest.sound_play("tnt_explode", {pos=pos, gain=1.5, max_hear_distance=2*64}) + minetest.set_node(pos, {name="tnt:boom"}) + minetest.get_node_timer(pos):start(0.5) + + local drops = explode(pos, radius) + entity_physics(pos, radius) + eject_drops(drops, pos, radius) + add_effects(pos, radius) +end + +minetest.register_node("tnt:tnt", { + description = "TNT", + tiles = {"tnt_top.png", "tnt_bottom.png", "tnt_side.png"}, + is_ground_content = false, + groups = {dig_immediate=2, mesecon=2}, + sounds = default.node_sound_wood_defaults(), + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + minetest.sound_play("tnt_ignite", {pos=pos}) + minetest.set_node(pos, {name="tnt:tnt_burning"}) + minetest.get_node_timer(pos):start(4) + end + end, + on_blast = function(pos, intensity) + burn(pos) + end, + mesecons = {effector = {action_on = boom}}, +}) + +minetest.register_node("tnt:tnt_burning", { + tiles = { + { + name = "tnt_top_burning_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + "tnt_bottom.png", "tnt_side.png"}, + light_source = 5, + drop = "", + sounds = default.node_sound_wood_defaults(), + on_timer = boom, + -- unaffected by explosions + on_blast = function() end, +}) + +minetest.register_node("tnt:boom", { + drawtype = "plantlike", + tiles = {"tnt_boom.png"}, + light_source = default.LIGHT_MAX, + walkable = false, + drop = "", + groups = {dig_immediate=3}, + on_timer = function(pos, elapsed) + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, +}) + +minetest.register_node("tnt:gunpowder", { + description = "Gun Powder", + drawtype = "raillike", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + tiles = {"tnt_gunpowder_straight.png", "tnt_gunpowder_curved.png", "tnt_gunpowder_t_junction.png", "tnt_gunpowder_crossing.png"}, + inventory_image = "tnt_gunpowder_inventory.png", + wield_image = "tnt_gunpowder_inventory.png", + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + groups = {dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("gunpowder")}, + sounds = default.node_sound_leaves_defaults(), + + on_punch = function(pos, node, puncher) + if puncher:get_wielded_item():get_name() == "default:torch" then + burn(pos) + end + end, + on_blast = function(pos, intensity) + burn(pos) + end, +}) + +minetest.register_node("tnt:gunpowder_burning", { + drawtype = "raillike", + paramtype = "light", + sunlight_propagates = true, + walkable = false, + light_source = 5, + tiles = {{ + name = "tnt_gunpowder_burning_straight_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_curved_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_t_junction_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }, + { + name = "tnt_gunpowder_burning_crossing_animated.png", + animation = { + type = "vertical_frames", + aspect_w = 16, + aspect_h = 16, + length = 1, + } + }}, + selection_box = { + type = "fixed", + fixed = {-1/2, -1/2, -1/2, 1/2, -1/2+1/16, 1/2}, + }, + drop = "", + groups = {dig_immediate=2,attached_node=1,connect_to_raillike=minetest.raillike_group("gunpowder")}, + sounds = default.node_sound_leaves_defaults(), + on_timer = function(pos, elapsed) + for dx = -1, 1 do + for dz = -1, 1 do + for dy = -1, 1 do + if not (dx == 0 and dz == 0) then + burn({ + x = pos.x + dx, + y = pos.y + dy, + z = pos.z + dz, + }) + end + end + end + end + minetest.remove_node(pos) + end, + -- unaffected by explosions + on_blast = function() end, +}) + +minetest.register_abm({ + nodenames = {"tnt:tnt", "tnt:gunpowder"}, + neighbors = {"fire:basic_flame", "default:lava_source", "default:lava_flowing"}, + interval = 1, + chance = 1, + action = burn, +}) + +minetest.register_craft({ + output = "tnt:gunpowder", + type = "shapeless", + recipe = {"default:coal_lump", "default:gravel"} +}) + +minetest.register_craft({ + output = "tnt:tnt", + recipe = { + {"", "group:wood", ""}, + {"group:wood", "tnt:gunpowder", "group:wood"}, + {"", "group:wood", ""} + } +}) + +if minetest.setting_get("log_mods") then + minetest.debug("[TNT] Loaded!") +end + diff --git a/mods/tnt/sounds/tnt_explode.ogg b/mods/tnt/sounds/tnt_explode.ogg new file mode 100644 index 0000000..a414ea0 Binary files /dev/null and b/mods/tnt/sounds/tnt_explode.ogg differ diff --git a/mods/tnt/sounds/tnt_gunpowder_burning.ogg b/mods/tnt/sounds/tnt_gunpowder_burning.ogg new file mode 100644 index 0000000..5c5bfaf Binary files /dev/null and b/mods/tnt/sounds/tnt_gunpowder_burning.ogg differ diff --git a/mods/tnt/sounds/tnt_ignite.ogg b/mods/tnt/sounds/tnt_ignite.ogg new file mode 100644 index 0000000..199f206 Binary files /dev/null and b/mods/tnt/sounds/tnt_ignite.ogg differ diff --git a/mods/tnt/textures/tnt_boom.png b/mods/tnt/textures/tnt_boom.png new file mode 100644 index 0000000..c848bfc Binary files /dev/null and b/mods/tnt/textures/tnt_boom.png differ diff --git a/mods/tnt/textures/tnt_bottom.png b/mods/tnt/textures/tnt_bottom.png new file mode 100644 index 0000000..95f66cb Binary files /dev/null and b/mods/tnt/textures/tnt_bottom.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png new file mode 100644 index 0000000..a901f7b Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_crossing_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png new file mode 100644 index 0000000..bc01806 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_curved_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png new file mode 100644 index 0000000..c860ace Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_straight_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png b/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png new file mode 100644 index 0000000..a556072 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_burning_t_junction_animated.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_crossing.png b/mods/tnt/textures/tnt_gunpowder_crossing.png new file mode 100644 index 0000000..916c84e Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_crossing.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_curved.png b/mods/tnt/textures/tnt_gunpowder_curved.png new file mode 100644 index 0000000..cb8b4ea Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_curved.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_inventory.png b/mods/tnt/textures/tnt_gunpowder_inventory.png new file mode 100644 index 0000000..105a2d2 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_inventory.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_straight.png b/mods/tnt/textures/tnt_gunpowder_straight.png new file mode 100644 index 0000000..8ab0e3c Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_straight.png differ diff --git a/mods/tnt/textures/tnt_gunpowder_t_junction.png b/mods/tnt/textures/tnt_gunpowder_t_junction.png new file mode 100644 index 0000000..ac997a7 Binary files /dev/null and b/mods/tnt/textures/tnt_gunpowder_t_junction.png differ diff --git a/mods/tnt/textures/tnt_side.png b/mods/tnt/textures/tnt_side.png new file mode 100644 index 0000000..d303473 Binary files /dev/null and b/mods/tnt/textures/tnt_side.png differ diff --git a/mods/tnt/textures/tnt_smoke.png b/mods/tnt/textures/tnt_smoke.png new file mode 100644 index 0000000..488b50f Binary files /dev/null and b/mods/tnt/textures/tnt_smoke.png differ diff --git a/mods/tnt/textures/tnt_top.png b/mods/tnt/textures/tnt_top.png new file mode 100644 index 0000000..31b807c Binary files /dev/null and b/mods/tnt/textures/tnt_top.png differ diff --git a/mods/tnt/textures/tnt_top_burning.png b/mods/tnt/textures/tnt_top_burning.png new file mode 100644 index 0000000..fc0d490 Binary files /dev/null and b/mods/tnt/textures/tnt_top_burning.png differ diff --git a/mods/tnt/textures/tnt_top_burning_animated.png b/mods/tnt/textures/tnt_top_burning_animated.png new file mode 100644 index 0000000..18a270f Binary files /dev/null and b/mods/tnt/textures/tnt_top_burning_animated.png differ diff --git a/mods/torches/LICENSE.txt b/mods/torches/LICENSE.txt new file mode 100644 index 0000000..4362b49 --- /dev/null +++ b/mods/torches/LICENSE.txt @@ -0,0 +1,502 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +[This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence + the version number 2.1.] + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +Licenses are intended to guarantee your freedom to share and change +free software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software packages--typically libraries--of the +Free Software Foundation and other authors who decide to use it. You +can use it too, but we suggest you first think carefully about whether +this license or the ordinary General Public License is the better +strategy to use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of +it in new free programs; and that you are informed that you can do +these things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know +that what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and +is quite different from the ordinary General Public License. We use +this license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does Less to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it becomes +a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of +free software. For example, permission to use the GNU C Library in +non-free programs enables many more people to use the whole GNU +operating system, as well as its variant, the GNU/Linux operating +system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run +that program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License Agreement applies to any software library or other +program which contains a notice placed by the copyright holder or +other authorized party saying it may be distributed under the terms of +this Lesser General Public License (also called "this License"). +Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data +prepared so as to be conveniently linked with application programs +(which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work +which has been distributed under these terms. A "work based on the +Library" means either the Library or any derivative work under +copyright law: that is to say, a work containing the Library or a +portion of it, either verbatim or with modifications and/or translated +straightforwardly into another language. (Hereinafter, translation is +included without limitation in the term "modification".) + + "Source code" for a work means the preferred form of the work for +making modifications to it. For a library, complete source code means +all the source code for all modules it contains, plus any associated +interface definition files, plus the scripts used to control compilation +and installation of the library. + + Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running a program using the Library is not restricted, and output from +such a program is covered only if its contents constitute a work based +on the Library (independent of the use of the Library in a tool for +writing it). Whether that is true depends on what the Library does +and what the program that uses the Library does. + + 1. You may copy and distribute verbatim copies of the Library's +complete source code as you receive it, in any medium, provided that +you conspicuously and appropriately publish on each copy an +appropriate copyright notice and disclaimer of warranty; keep intact +all the notices that refer to this License and to the absence of any +warranty; and distribute a copy of this License along with the +Library. + + You may charge a fee for the physical act of transferring a copy, +and you may at your option offer warranty protection in exchange for a +fee. + + 2. You may modify your copy or copies of the Library or any portion +of it, thus forming a work based on the Library, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) The modified work must itself be a software library. + + b) You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c) You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d) If a facility in the modified Library refers to a function or a + table of data to be supplied by an application program that uses + the facility, other than as an argument passed when the facility + is invoked, then you must make a good faith effort to ensure that, + in the event an application does not supply such function or + table, the facility still operates, and performs whatever part of + its purpose remains meaningful. + + (For example, a function in a library to compute square roots has + a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function must + be optional: if the application does not supply it, the square + root function must still compute square roots.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Library, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Library, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Library. + +In addition, mere aggregation of another work not based on the Library +with the Library (or with a work based on the Library) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public +License instead of this License to a given copy of the Library. To do +this, you must alter all the notices that refer to this License, so +that they refer to the ordinary GNU General Public License, version 2, +instead of to this License. (If a newer version than version 2 of the +ordinary GNU General Public License has appeared, then you can specify +that version instead if you wish.) Do not make any other change in +these notices. + + Once this change is made in a given copy, it is irreversible for +that copy, so the ordinary GNU General Public License applies to all +subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of +the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or +derivative of it, under Section 2) in object code or executable form +under the terms of Sections 1 and 2 above provided that you accompany +it with the complete corresponding machine-readable source code, which +must be distributed under the terms of Sections 1 and 2 above on a +medium customarily used for software interchange. + + If distribution of object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the +source code from the same place satisfies the requirement to +distribute the source code, even though third parties are not +compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the +Library, but is designed to work with the Library by being compiled or +linked with it, is called a "work that uses the Library". Such a +work, in isolation, is not a derivative work of the Library, and +therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library +creates an executable that is a derivative of the Library (because it +contains portions of the Library), rather than a "work that uses the +library". The executable is therefore covered by this License. +Section 6 states terms for distribution of such executables. + + When a "work that uses the Library" uses material from a header file +that is part of the Library, the object code for the work may be a +derivative work of the Library even though the source code is not. +Whether this is true is especially significant if the work can be +linked without the Library, or if the work is itself a library. The +threshold for this to be true is not precisely defined by law. + + If such an object file uses only numerical parameters, data +structure layouts and accessors, and small macros and small inline +functions (ten lines or less in length), then the use of the object +file is unrestricted, regardless of whether it is legally a derivative +work. (Executables containing this object code plus portions of the +Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may +distribute the object code for the work under the terms of Section 6. +Any executables containing that work also fall under Section 6, +whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or +link a "work that uses the Library" with the Library to produce a +work containing portions of the Library, and distribute that work +under terms of your choice, provided that the terms permit +modification of the work for the customer's own use and reverse +engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the +Library is used in it and that the Library and its use are covered by +this License. You must supply a copy of this License. If the work +during execution displays copyright notices, you must include the +copyright notice for the Library among them, as well as a reference +directing the user to the copy of this License. Also, you must do one +of these things: + + a) Accompany the work with the complete corresponding + machine-readable source code for the Library including whatever + changes were used in the work (which must be distributed under + Sections 1 and 2 above); and, if the work is an executable linked + with the Library, with the complete machine-readable "work that + uses the Library", as object code and/or source code, so that the + user can modify the Library and then relink to produce a modified + executable containing the modified Library. (It is understood + that the user who changes the contents of definitions files in the + Library will not necessarily be able to recompile the application + to use the modified definitions.) + + b) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run time a + copy of the library already present on the user's computer system, + rather than copying library functions into the executable, and (2) + will operate properly with a modified version of the library, if + the user installs one, as long as the modified version is + interface-compatible with the version that the work was made with. + + c) Accompany the work with a written offer, valid for at + least three years, to give the same user the materials + specified in Subsection 6a, above, for a charge no more + than the cost of performing this distribution. + + d) If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the above + specified materials from the same place. + + e) Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the +Library" must include any data and utility programs needed for +reproducing the executable from it. However, as a special exception, +the materials to be distributed need not include anything that is +normally distributed (in either source or binary form) with the major +components (compiler, kernel, and so on) of the operating system on +which the executable runs, unless that component itself accompanies +the executable. + + It may happen that this requirement contradicts the license +restrictions of other proprietary libraries that do not normally +accompany the operating system. Such a contradiction means you cannot +use both them and the Library together in an executable that you +distribute. + + 7. You may place library facilities that are a work based on the +Library side-by-side in a single library together with other library +facilities not covered by this License, and distribute such a combined +library, provided that the separate distribution of the work based on +the Library and of the other library facilities is otherwise +permitted, and provided that you do these two things: + + a) Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b) Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same work. + + 8. You may not copy, modify, sublicense, link with, or distribute +the Library except as expressly provided under this License. Any +attempt otherwise to copy, modify, sublicense, link with, or +distribute the Library is void, and will automatically terminate your +rights under this License. However, parties who have received copies, +or rights, from you under this License will not have their licenses +terminated so long as such parties remain in full compliance. + + 9. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Library or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Library (or any work based on the +Library), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the +Library), the recipient automatically receives a license from the +original licensor to copy, distribute, link with or modify the Library +subject to these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties with +this License. + + 11. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Library at all. For example, if a patent +license would not permit royalty-free redistribution of the Library by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Library. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply, +and the section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Library under this License may add +an explicit geographical distribution limitation excluding those countries, +so that distribution is permitted only in or among countries not thus +excluded. In such case, this License incorporates the limitation as if +written in the body of this License. + + 13. The Free Software Foundation may publish revised and/or new +versions of the Lesser General Public License from time to time. +Such new versions will be similar in spirit to the present version, +but may differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Library +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Library does not specify a +license version number, you may choose any version ever published by +the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free +programs whose distribution conditions are incompatible with these, +write to the author to ask for permission. For software which is +copyrighted by the Free Software Foundation, write to the Free +Software Foundation; we sometimes make exceptions for this. Our +decision will be guided by the two goals of preserving the free status +of all derivatives of our free software and of promoting the sharing +and reuse of software generally. + + NO WARRANTY + + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Libraries + + If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of the +ordinary General Public License). + + To apply these terms, attach the following notices to the library. It is +safest to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least the +"copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +Also add information on how to contact you by electronic and paper mail. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the library, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the + library `Frob' (a library for tweaking knobs) written by James Random Hacker. + + , 1 April 1990 + Ty Coon, President of Vice + +That's all there is to it! diff --git a/mods/torches/README.txt b/mods/torches/README.txt new file mode 100644 index 0000000..bd9f9c8 --- /dev/null +++ b/mods/torches/README.txt @@ -0,0 +1,60 @@ +Minetest mod "Torches" +====================== +Version: 3.0 + +(c) Copyright BlockMen (2013-2015) + + +About this mod: +~~~~~~~~~~~~~~~ +This mod adds two different styles of 3D torches to Minetest, by default in Minetest style (flames are animated textures). +The second style is Minecraft like, so flames are "animated" by using particles + +Minetest styled: +Those torches use the same textures as the 2D torch, so its fully compatible with Texture Packs. By default ceiling torches +are removed and cannot be placed aswell. You can change this behavior by adding "torches_enable_ceiling = true" to your minetest.conf +Furthermore this style is more server traffic friendly, so it is enabled by default + +Minecraft styled: +Those torches have a non-animated texture and needs to be supported by Texture Packs (currently most don't support this mod). +"Animation" is done like in Minecraft with particles, which cause (in the current implementation in the Minetest engine) +some amount of traffic and can cause lags at slow connections. The rate and distance when particles are send is configurable +in the first lines of "mc_style.lua". Enable this style by adding "torches_style = minecraft" to your minetest.conf. Note that +the ceiling setting is ignored with this style. + +More informations: +Both styles convert existing torches to the new style. Keep in mind that by default ceiling torches get removed! + + +License: +~~~~~~~~ +(c) Copyright BlockMen (2013-2015) + +Textures and Meshes/Models: +CC-BY 3.0 BlockMen + +Code: +Licensed under the GNU LGPL version 2.1 or higher. +You can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License +as published by the Free Software Foundation; + +You should have received a copy of the GNU Lesser General Public +License along with this library; if not, write to the Free Software +Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +See LICENSE.txt and http://www.gnu.org/licenses/lgpl-2.1.txt + + +Github: +~~~~~~~ +https://github.com/BlockMen/torches + +Forum: +~~~~~~ +https://forum.minetest.net/viewtopic.php?id=6099 + + +Changelog: +~~~~~~~~~~ +see changelog.txt diff --git a/mods/torches/changelog.txt b/mods/torches/changelog.txt new file mode 100644 index 0000000..525331b --- /dev/null +++ b/mods/torches/changelog.txt @@ -0,0 +1,34 @@ +Changelog: +---------- +1.1 - 1.2.x: +- Torches on wall dont fall when node under it is dug +- Torches fall directly when not placed on floor or wall +- fixed different placing bugs + +1.3: +- Torches only show flames when player is near (13 blocks) +- Old torches are converted to new, ceiling torches are dropped + +1.3.1: +- fix dropping torches when digging a block next to it +- all torches attached to a block get droped when dug + +1.3.2: +- fix crashes by unknown nodes + +2.0: +- Use new mesh drawtype to improve wallmounted torches +- Update particle usage +- New textures; flame texture fix by Yepoleb +- Fix for doors, chests, etc (rightclick support) + +2.1 +- Fix wallmounted torch mesh +- Clean up code, use wallmounted paramtype2 +- Fix torches being placeable on ceilings (reported by kilbith) + +3.0 +- Minetest style added and used by default +- style can be changed via settings +- using Minetest style allows ceiling torches via settings +- Minetest style supports all texturepacks (as long torch shaped) diff --git a/mods/torches/depends.txt b/mods/torches/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/torches/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/torches/init.lua b/mods/torches/init.lua new file mode 100644 index 0000000..b7fd7ba --- /dev/null +++ b/mods/torches/init.lua @@ -0,0 +1,13 @@ +torches = {} +torches.enable_ceiling = true +--torches.enable_ceiling = minetest.setting_getbool("torches_enable_ceiling") or false +--local style = minetest.setting_get("torches_style") + +local modpath = minetest.get_modpath("torches") + +-- load torch definition depending on stlye +--if style == "minecraft" then + dofile(modpath.."/mc_style.lua") +--else +-- dofile(modpath.."/mt_style.lua") +--end diff --git a/mods/torches/mc_style.lua b/mods/torches/mc_style.lua new file mode 100644 index 0000000..f984d67 --- /dev/null +++ b/mods/torches/mc_style.lua @@ -0,0 +1,202 @@ +-- Reduce particles send to client if on Server +local SERVER = minetest.is_singleplayer() or false +SERVER = not SERVER +local dur = 2 +if SERVER then + dur = 9 -- lowering sends more pakets to clients and let flames faster disappear (not recommended) +end + +local VIEW_DISTANCE = 13 -- from what distance (in nodes) flames are send to player/client + +-- constants +local rotat = {"I", "FX"} +local particle_def = { + pos = {x = 0, y = 0, z = 0}, + velocity = { x= 0, y = 0, z = 0}, + acceleration = {x = 0, y = 0, z = 0}, + expirationtime = 1, + size = 3.0, + collisiondetection = true, + vertical = false, + texture = "torches_fire_1.png", +} + +-- fire particles (flames) +local function add_fire(pos, duration, offset) + if offset then + pos.x = pos.x + offset.x + pos.z = pos.z + offset.z + pos.y = pos.y + offset.y + end + pos.y = pos.y + 0.19 + particle_def.pos = pos + particle_def.expirationtime = duration + particle_def.texture = "torches_fire"..tostring(math.random(1, 2)) ..".png^[transform"..rotat[math.random(1,2)] + minetest.add_particle(particle_def) + + pos.y = pos.y + 0.01 + particle_def.pos = pos + particle_def.texture = "torches_fire"..tostring(math.random(1, 2)) ..".png^[transform"..rotat[math.random(1,2)] + minetest.add_particle(particle_def) +end + +-- helper functions +local function player_near(pos) + for _,object in ipairs(minetest.get_objects_inside_radius(pos, VIEW_DISTANCE)) do + if object:is_player() then + return true + end + end + + return false +end + +local function get_offset(wdir) + local z = 0 + local x = 0 + if wdir == 4 then + z = 0.25 + elseif wdir == 2 then + x = 0.25 + elseif wdir == 5 then + z = -0.25 + elseif wdir == 3 then + x = -0.25 + end + return {x = x, y = 0.08, z = z} + +end + +-- abms for flames +minetest.register_abm({ + nodenames = {"torches:wand"}, + interval = dur - 1, + chance = 1, + action = function(pos) + if player_near(pos) then + local n = minetest.get_node_or_nil(pos) + local dir = {x = 0, y = 0, z = 0} + if n and n.param2 then + dir = get_offset(n.param2) + end + add_fire(pos, dur - .9, dir) + end + end +}) + +minetest.register_abm({ + nodenames = {"torches:floor"}, + interval = dur - 1, + chance = 1, + action = function(pos) + if player_near(pos) then + add_fire(pos, dur - .9) + end + end +}) + +-- convert old torches and remove ceiling placed +minetest.register_abm({ + nodenames = {"default:torch"}, + interval = 1, + chance = 1, + action = function(pos) + local n = minetest.get_node(pos) + local def = minetest.registered_nodes[n.name] + if n and def then + local wdir = n.param2 + if wdir == 0 then + minetest.remove_node(pos) + elseif wdir == 1 then + minetest.set_node(pos, {name = "torches:floor", param2 = wdir}) + else + minetest.set_node(pos, {name = "torches:wall", param2 = wdir}) + end + end + end +}) + +-- Item definitions +minetest.register_craftitem(":default:torch", { + description = "Torch", + inventory_image = "torches_torch.png", + wield_image = "torches_torch.png", + wield_scale = {x = 1, y = 1, z = 1 + 1/16}, + liquids_pointable = false, + on_place = function(itemstack, placer, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + + local above = pointed_thing.above + local under = pointed_thing.under + local wdir = minetest.dir_to_wallmounted({x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}) + + local fakestack = itemstack + local retval = false + if wdir < 1 then + return itemstack + elseif wdir == 1 then + retval = fakestack:set_name("torches:floor") + else + retval = fakestack:set_name("torches:wall") + end + if not retval then + return itemstack + end + itemstack, retval = minetest.item_place(fakestack, placer, pointed_thing, wdir) + itemstack:set_name("default:torch") + + -- add flame if placing was sucessfull + if retval then + -- expect node switch one sever step (default 0.1) delayed + minetest.after(0.1, add_fire, above, dur, get_offset(wdir)) + end + return itemstack + end +}) + +minetest.register_node("torches:floor", { + inventory_image = "default_torch.png", + wield_image = "torches_torch.png", + wield_scale = {x = 1, y = 1, z = 1 + 2/16}, + drawtype = "mesh", + mesh = "torch_floor.obj", + tiles = {"torches_torch.png"}, + paramtype = "light", + paramtype2 = "none", + sunlight_propagates = true, + drop = "default:torch", + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + legacy_wallmounted = true, + selection_box = { + type = "fixed", + fixed = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, + }, +}) + +minetest.register_node("torches:wall", { + inventory_image = "default_torch.png", + wield_image = "torches_torch.png", + wield_scale = {x = 1, y = 1, z = 1 + 1/16}, + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = {"torches_torch.png"}, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-0.1, -0.1, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, 0.1, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.2, 0.3, 0.1}, + }, +}) + +minetest.register_alias("torches:wand", "torches:wall") diff --git a/mods/torches/models/torch_floor.obj b/mods/torches/models/torch_floor.obj new file mode 100644 index 0000000..bb82af5 --- /dev/null +++ b/mods/torches/models/torch_floor.obj @@ -0,0 +1,48 @@ +# Blender v2.73 (sub 0) OBJ File: 'mt_torch_full_vertices3.blend' +# www.blender.org +mtllib mt_torch_full_vertices3.mtl +o Cube_Cube.001 +v 0.061653 -0.496733 0.061674 +v 0.061653 -0.496733 -0.062460 +v -0.059258 -0.496733 0.061674 +v -0.059258 -0.496733 -0.062460 +v -0.059994 -0.497234 0.497315 +v -0.059994 -0.497234 -0.498102 +v -0.059994 0.507706 -0.498102 +v -0.059994 0.507706 0.497315 +v -0.494900 0.507706 0.061709 +v -0.494900 -0.497234 0.061709 +v 0.497295 0.507706 0.061709 +v 0.497295 -0.497234 0.061709 +v 0.062686 0.507706 -0.498102 +v 0.062686 -0.497234 -0.498102 +v 0.062686 0.507706 0.497315 +v 0.062686 -0.497234 0.497315 +v -0.494900 0.507706 -0.063149 +v -0.494900 -0.497234 -0.063149 +v 0.497295 0.507706 -0.063149 +v 0.497295 -0.497234 -0.063149 +v -0.058217 0.134520 0.060216 +v -0.058217 0.135872 -0.061813 +v 0.061944 0.135872 -0.061813 +v 0.061944 0.134520 0.060216 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437541 0.625000 +vt 0.437541 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +usemtl None +s off +f 11/1 9/2 10/3 12/4 +f 22/5 21/6 24/7 23/8 +f 17/2 19/1 20/4 18/3 +f 13/2 15/1 16/4 14/3 +f 3/9 4/10 2/11 1/12 +f 8/1 7/2 6/3 5/4 diff --git a/mods/torches/models/torch_wall.obj b/mods/torches/models/torch_wall.obj new file mode 100644 index 0000000..2385563 --- /dev/null +++ b/mods/torches/models/torch_wall.obj @@ -0,0 +1,48 @@ +# Blender v2.73 (sub 0) OBJ File: 'mt_torch_full_vertices3.blend' +# www.blender.org +mtllib torch_wall4.mtl +o Cube_Cube.001 +v 0.061653 -0.554493 -0.328908 +v 0.061653 -0.442208 -0.381835 +v -0.059258 -0.554493 -0.328908 +v -0.059258 -0.442208 -0.381835 +v -0.059994 -0.948766 -0.143618 +v -0.059994 -0.048361 -0.568031 +v -0.059994 0.380112 0.340988 +v -0.059994 -0.520293 0.765401 +v -0.494900 -0.126265 0.579672 +v -0.494900 -0.554738 -0.329346 +v 0.497295 -0.126265 0.579672 +v 0.497295 -0.554738 -0.329346 +v 0.062686 0.380112 0.340988 +v 0.062686 -0.048361 -0.568031 +v 0.062686 -0.520293 0.765401 +v 0.062686 -0.948766 -0.143618 +v -0.494900 -0.013324 0.526437 +v -0.494900 -0.441797 -0.382582 +v 0.497295 -0.013324 0.526437 +v 0.497295 -0.441797 -0.382582 +v -0.058217 -0.284029 0.241470 +v -0.058217 -0.173071 0.190665 +v 0.061944 -0.173071 0.190665 +v 0.061944 -0.284029 0.241470 +vt 0.000000 1.000000 +vt 1.000000 1.000000 +vt 1.000000 0.000000 +vt 0.000000 0.000000 +vt 0.437500 0.500000 +vt 0.562500 0.500000 +vt 0.562500 0.625000 +vt 0.437541 0.625000 +vt 0.437541 0.000000 +vt 0.562500 0.000000 +vt 0.562500 0.125000 +vt 0.437500 0.125000 +usemtl None +s off +f 11/1 9/2 10/3 12/4 +f 22/5 21/6 24/7 23/8 +f 17/2 19/1 20/4 18/3 +f 13/2 15/1 16/4 14/3 +f 3/9 4/10 2/11 1/12 +f 8/1 7/2 6/3 5/4 diff --git a/mods/torches/mt_style.lua b/mods/torches/mt_style.lua new file mode 100644 index 0000000..efda8bc --- /dev/null +++ b/mods/torches/mt_style.lua @@ -0,0 +1,105 @@ +minetest.register_craftitem(":default:torch", { + description = "Torch", + inventory_image = "default_torch_on_floor.png", + wield_image = "default_torch_on_floor.png", + wield_scale = {x = 1, y = 1, z = 1 + 1/16}, + liquids_pointable = false, + on_place = function(itemstack, placer, pointed_thing) + local above = pointed_thing.above + local under = pointed_thing.under + local wdir = minetest.dir_to_wallmounted({x = under.x - above.x, y = under.y - above.y, z = under.z - above.z}) + if wdir < 1 and not torches.enable_ceiling then + return itemstack + end + local fakestack = itemstack + local retval = false + if wdir <= 1 then + retval = fakestack:set_name("torches:floor") + else + retval = fakestack:set_name("torches:wall") + end + if not retval then + return itemstack + end + itemstack, retval = minetest.item_place(fakestack, placer, pointed_thing, dir) + itemstack:set_name("default:torch") + + return itemstack + end +}) + +minetest.register_node("torches:floor", { + description = "Torch", + inventory_image = "default_torch.png", + wield_image = "default_torch.png", + wield_scale = {x = 1, y = 1, z = 1 + 1/16}, + drawtype = "mesh", + mesh = "torch_floor.obj", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + } + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-1/16, -2/16, -1/16, 1/16, 0.5, 1/16}, + wall_bottom = {-1/16, -0.5, -1/16, 1/16, 2/16, 1/16}, + }, +}) + +minetest.register_node("torches:wall", { + inventory_image = "default_torch.png", + wield_image = "default_torch.png", + wield_scale = {x = 1, y = 1, z = 1 + 1/16}, + drawtype = "mesh", + mesh = "torch_wall.obj", + tiles = { + { + name = "default_torch_on_floor_animated.png", + animation = {type = "vertical_frames", aspect_w = 16, aspect_h = 16, length = 3.3} + } + }, + paramtype = "light", + paramtype2 = "wallmounted", + sunlight_propagates = true, + walkable = false, + light_source = 13, + groups = {choppy=2, dig_immediate=3, flammable=1, not_in_creative_inventory=1, attached_node=1, torch=1}, + drop = "default:torch", + selection_box = { + type = "wallmounted", + wall_top = {-0.1, -0.1, -0.1, 0.1, 0.5, 0.1}, + wall_bottom = {-0.1, -0.5, -0.1, 0.1, 0.1, 0.1}, + wall_side = {-0.5, -0.3, -0.1, -0.2, 0.3, 0.1}, + }, +}) + +-- convert old torches and remove ceiling placed +minetest.register_abm({ + nodenames = {"default:torch"}, + interval = 1, + chance = 1, + action = function(pos) + local n = minetest.get_node(pos) + local def = minetest.registered_nodes[n.name] + if n and def then + local wdir = n.param2 + local node_name = "torches:wall" + if wdir < 1 and not torches.enable_ceiling then + minetest.remove_node(pos) + return + elseif wdir <= 1 then + node_name = "torches:floor" + end + minetest.set_node(pos, {name = node_name, param2 = wdir}) + end + end +}) diff --git a/mods/torches/textures/torches_fire1.png b/mods/torches/textures/torches_fire1.png new file mode 100644 index 0000000..e5bd9d1 Binary files /dev/null and b/mods/torches/textures/torches_fire1.png differ diff --git a/mods/torches/textures/torches_fire2.png b/mods/torches/textures/torches_fire2.png new file mode 100644 index 0000000..294bea6 Binary files /dev/null and b/mods/torches/textures/torches_fire2.png differ diff --git a/mods/torches/textures/torches_torch.png b/mods/torches/textures/torches_torch.png new file mode 100644 index 0000000..69c6dc8 Binary files /dev/null and b/mods/torches/textures/torches_torch.png differ diff --git a/mods/treecapitator/LICENSE.txt b/mods/treecapitator/LICENSE.txt new file mode 100644 index 0000000..fcc7a63 --- /dev/null +++ b/mods/treecapitator/LICENSE.txt @@ -0,0 +1,3 @@ +the mod's code's origin is from Jeija's timber mod (GPL) +sound from http://www.freesound.org/people/ecfike/sounds/139952/, edited with audacity (WTFPL) +rest WTFPL diff --git a/mods/treecapitator/README.txt b/mods/treecapitator/README.txt new file mode 100644 index 0000000..2a81a1a --- /dev/null +++ b/mods/treecapitator/README.txt @@ -0,0 +1,8 @@ +[13.04.2015] Added in trees for moretrees, working out getting proper naming for capitating to work. + +[14.03.2015] Added sound of a falling tree (taken from there http://www.freesound.org/people/ecfike/sounds/139952/). Made "drop_items" and "drop_leaf" both "true" by default. (mintpick) + +TODO: +— add more trees +— add more types of trees +— play sound if much nodes are removed diff --git a/mods/treecapitator/depends.txt b/mods/treecapitator/depends.txt new file mode 100644 index 0000000..b150670 --- /dev/null +++ b/mods/treecapitator/depends.txt @@ -0,0 +1,4 @@ +default +nyanland? +farming_plus? +moretrees? diff --git a/mods/treecapitator/init.lua b/mods/treecapitator/init.lua new file mode 100644 index 0000000..b498b45 --- /dev/null +++ b/mods/treecapitator/init.lua @@ -0,0 +1,429 @@ +local load_time_start = os.clock() + + +--------------------------------------Settings---------------------------------------------- + +treecapitator = { + drop_items = false, --drop them / get them in the inventory + drop_leaf = false, + play_sound = true, + moretrees_support = true, + delay = 0, --lets trees become capitated seconds later + default_tree = { --replaces not defined stuff (see below) + trees = {"default:tree"}, + leaves = {"default:leaves"}, + range = 2, + fruits = {}, + type = "default", + }, +} + +--------------------------------------------------------------------------------------------- + + +--the table where the trees are stored at +treecapitator.trees = {} + +--a table of trunks which couldn't be redefined +treecapitator.rest_tree_nodes = {} + + +--------------------------------------------fcts---------------------------------------------- + +-- don't use minetest.get_node more times for the same position +local known_nodes = {} +local function remove_node(pos) + known_nodes[pos.z .." "..pos.y .." "..pos.x] = {name="air", param2=0} + minetest.remove_node(pos) +end + +local function dig_node(pos, node, digger) + known_nodes[pos.z .." "..pos.y .." "..pos.x] = {name="air", param2=0} + minetest.node_dig(pos, node, digger) +end + +local function get_node(pos) + local pstr = pos.z .." "..pos.y .." "..pos.x + local node = known_nodes[pstr] + if node then + return node + end + node = minetest.get_node(pos) + known_nodes[pstr] = node + return node +end + +--definitions of functions for the destruction of nodes +local destroy_node, drop_leaf, remove_leaf +if treecapitator.drop_items then + function drop_leaf(pos, item, inv) + minetest.add_item(pos, item) + end + + function destroy_node(pos, node, digger) + local drops = minetest.get_node_drops(node.name) + for _,item in pairs(drops) do + minetest.add_item(pos, item) + end + remove_node(pos) + end +else + function drop_leaf(pos, item, inv) + if inv + and inv:room_for_item("main", item) then + inv:add_item("main", item) + else + minetest.add_item(pos, item) + end + end + + destroy_node = dig_node +end + +if not treecapitator.drop_leaf then + function remove_leaf(p, leaf, inv) + local leaves_drops = minetest.get_node_drops(leaf) + for _, itemname in pairs(leaves_drops) do + if itemname ~= leaf then + drop_leaf(p, itemname, inv) + end + end + remove_node(p) --remove the leaves + end +else + function remove_leaf(p, _, _, node, digger) + destroy_node(p, node, digger) + end +end + + +table.icontains = table.icontains or function(t, v) + for i = 1,#t do + if t[i] == v then + return true + end + end + return false +end + +--tests if the node is a trunk +local function findtree(node) + if node == 0 then + return true + end + return table.icontains(treecapitator.rest_tree_nodes, node.name) +end + +--returns positions for leaves allowed to be dug +local function find_next_trees(pos, range, trees, leaves, fruits) + local tab = {} + local r = 2*range + for i = -r, r do + for j = -r, r do + for h = r,-r,-1 do + local p = {x=pos.x+j, y=pos.y+h, z=pos.z+i} + + -- tests if a trunk is at the current pos + local nd = get_node(p) + if table.icontains(trees, nd.name) + and nd.param2 == 0 + and (pos.x ~= p.x or pos.z ~= p.z) then + -- search for a leaves or fruit node next to the trunk + local leaf = get_node({x=p.x, y=p.y+1, z=p.z}).name + local leaf_found = table.icontains(leaves, leaf) or table.icontains(fruits, leaf) + if not leaf_found then + leaf = get_node({x=p.x, y=p.y, z=p.z+1}).name + leaf_found = table.icontains(leaves, leaf) or table.icontains(fruits, leaf) + end + + if leaf_found then + local z1 = math.max(-range+i, -range) + local z2 = math.min(range+i, range) + local y1 = math.max(-range+h, -range) + local y2 = math.min(range+h, range) + local x1 = math.max(-range+j, -range) + local x2 = math.min(range+j, range) + for z = z1,z2 do + for y = y1,y2 do + for x = x1,x2 do + tab[z.." "..y.." "..x] = true + end + end + end + end + end + end + end + end + --minetest.chat_send_all(dump(tab)) <— I used these to find my mistake + local tab2,n = {},1 + for z = -range,range do + for y = -range,range do + for x = -range,range do + if not tab[z.." "..y.." "..x] then + local p = {x=x, y=y, z=z} + tab2[n] = p + n = n+1 + end + end + end + end + return tab2 +end + +-- table iteration instead of recursion +local function get_tab(pos, func, max) + local todo = {pos} + local tab_avoid = {[pos.x.." "..pos.y.." "..pos.z] = true} + local tab_done,num = {pos},2 + while todo[1] do + for n,p in pairs(todo) do + --[[ + for i = -1,1,2 do + for _,p2 in pairs({ + {x=p.x+i, y=p.y, z=p.z}, + {x=p.x, y=p.y+i, z=p.z}, + {x=p.x, y=p.y, z=p.z+i}, + }) do]] + for i = -1,1 do + for j = -1,1 do + for k = -1,1 do + local p2 = {x=p.x+i, y=p.y+j, z=p.z+k} + local pstr = p2.x.." "..p2.y.." "..p2.z + if not tab_avoid[pstr] + and func(p2) then + tab_avoid[pstr] = true + tab_done[num] = p2 + num = num+1 + table.insert(todo, p2) + if max + and num > max then + return false + end + end + end + end + end + todo[n] = nil + end + end + return tab_done +end + + +--the function which is used for capitating +local capitating = false --necessary if minetest.node_dig is used +local function capitate_tree(pos, node, digger) + if capitating + or not digger then + return + end + --minetest.chat_send_all("test0") <— and this + if digger:get_player_control().sneak + or not findtree(node) then + return + end + local t1 = os.clock() + capitating = true + local nd = get_node({x=pos.x, y=pos.y+1, z=pos.z}) + for _,tr in pairs(treecapitator.trees) do + local trees = tr.trees + local tree_found = table.icontains(trees, nd.name) and nd.param2 == 0 + if tree_found then + if tr.type == "default" then + local np = {x=pos.x, y=pos.y+1, z=pos.z} + local nd = nd + local tab, n = {}, 1 + while tree_found do + tab[n] = {vector.new(np), nd} + n = n+1 + np.y = np.y+1 + nd = get_node(np) + tree_found = table.icontains(trees, nd.name) and nd.param2 == 0 + end + local leaves = tr.leaves + local fruits = tr.fruits + + np.y = np.y-1 + local leaf_found = table.icontains(leaves, nd.name) or table.icontains(fruits, nd.name) + if not leaf_found then + local leaf = get_node({x=np.x, y=np.y, z=np.z+1}).name + leaf_found = table.icontains(leaves, leaf) or table.icontains(fruits, leaf) + end + + if leaf_found then + if treecapitator.play_sound then + minetest.sound_play("tree_falling", {pos = pos, gain = 0.1, max_hear_distance = 16}) + end + for _,i in pairs(tab) do + destroy_node(i[1], i[2], digger) + end + local range = tr.range + local inv = digger:get_inventory() + local head_ps = find_next_trees(np, range, trees, leaves, fruits) --definition of the leavespositions + --minetest.chat_send_all("test1") <— this too + for _,i in pairs(head_ps) do + local p = vector.add(np, i) + local node = get_node(p) + local nodename = node.name + if not table.icontains(trees, nodename) + or node.param2 ~= 0 then + if table.icontains(leaves, nodename) then + remove_leaf(p, nodename, inv, node, digger) + elseif table.icontains(fruits, nodename) then + destroy_node(p, node, digger) + end + end + end + break + end + elseif tr.type == "moretrees" then + local leaves = tr.leaves + local fruits = tr.fruits + local minx = pos.x-tr.range + local maxx = pos.x+tr.range + local minz = pos.z-tr.range + local maxz = pos.z+tr.range + local maxy = pos.z+tr.height + local num_trunks = 0 + local num_leaves = 0 + local ps = get_tab({x=pos.x, y=pos.y+1, z=pos.z}, function(pos) + if pos.x < minx + or pos.x > maxx + or pos.z < minz + or pos.z > maxz + or pos.y > maxy then + return false + end + local nam = get_node(pos).name + if table.icontains(trees, nam) then + num_trunks = num_trunks+1 + elseif table.icontains(leaves, nam) then + num_leaves = num_leaves+1 + elseif not table.icontains(fruits, nam) then + return false + end + return true + end, tr.max_nodes) + if not ps then + print("no ps found") + elseif num_trunks < tr.num_trunks_min + or num_trunks > tr.num_trunks_max then + print("wrong trunks num") + elseif num_leaves < tr.num_leaves_min + or num_leaves > tr.num_leaves_max then + print("wrong leaves num") + else + if treecapitator.play_sound then + minetest.sound_play("tree_falling", {pos = pos, gain = 0.1, max_hear_distance = 16}) + end + local inv = digger:get_inventory() + for _,p in pairs(ps) do + local node = get_node(p) + local nodename = node.name + if table.icontains(leaves, nodename) then + remove_leaf(p, nodename, inv, node, digger) + else + destroy_node(p, node, digger) + end + end + break + end + end + end + end + known_nodes = {} + capitating = false + minetest.log("info", string.format("[treecapitator] tree capitated at ("..pos.x.."|"..pos.y.."|"..pos.z..") after ca. %.2fs", os.clock() - t1)) +end + +local delay = treecapitator.delay +if delay > 0 then + local oldfunc = capitate_tree + function capitate_tree(...) + minetest.after(delay, function(...) + oldfunc(...) + end, ...) + end +end + +--adds trunks to rest_tree_nodes if they were overwritten by other mods +local tmp_trees = {} +local function test_overwritten(tree) + table.insert(tmp_trees, tree) +end + +minetest.after(0, function() + for _,tree in pairs(tmp_trees) do + if not minetest.registered_nodes[tree].after_dig_node then + minetest.log("error", "[treecapitator] Error: Overwriting "..tree.." went wrong.") + table.insert(treecapitator.rest_tree_nodes, tree) + end + end + tmp_trees = nil +end) + +-- the function to overide trunks +local override +if minetest.override_item then + function override(name) + minetest.override_item(name, { + after_dig_node = function(pos, _, _, digger) + capitate_tree(pos, 0, digger) + end + }) + end +else + table.copy = table.copy or function(tab) + local tab2 = {} + for n,i in pairs(tab) do + tab2[n] = i + end + return tab2 + end + function override(name, data) + data = table.copy(data) + data.after_dig_node = function(pos, _, _, digger) + capitate_tree(pos, 0, digger) + end + minetest.register_node(":"..name, data) + end +end + +--the function to register trees to become capitated +local num = 1 +function treecapitator.register_tree(tab) + for name,value in pairs(treecapitator.default_tree) do + tab[name] = tab[name] or value --replaces not defined stuff + end + treecapitator.trees[num] = tab + num = num+1 + + for _,tree in pairs(tab.trees) do + local data = minetest.registered_nodes[tree] + if not data then + minetest.log("info", "[treecapitator] Info: "..tree.." isn't registered yet.") + table.insert(treecapitator.rest_tree_nodes, tree) + else + if data.after_dig_node then + minetest.log("info", "[treecapitator] Info: "..tree.." already has an after_dig_node.") + table.insert(treecapitator.rest_tree_nodes, tree) + else + override(tree, data) + test_overwritten(tree) + end + end + end +end + +dofile(minetest.get_modpath("treecapitator").."/trees.lua") + +--------------------------------------------------------------------------------------------- + + +--use register_on_dignode if trunks are left +if treecapitator.rest_tree_nodes[1] then + minetest.register_on_dignode(capitate_tree) +end + +minetest.log("info", string.format("[treecapitator] loaded after ca. %.2fs", os.clock() - load_time_start)) diff --git a/mods/treecapitator/sounds/tree_falling.ogg b/mods/treecapitator/sounds/tree_falling.ogg new file mode 100644 index 0000000..3e838ac Binary files /dev/null and b/mods/treecapitator/sounds/tree_falling.ogg differ diff --git a/mods/treecapitator/trees.lua b/mods/treecapitator/trees.lua new file mode 100644 index 0000000..f57204f --- /dev/null +++ b/mods/treecapitator/trees.lua @@ -0,0 +1,268 @@ +--[[ +treecapitator.register_tree({ + trees = {, , ...}, + leaves = {, , ...}, + range = , + fruits = {, , ...}, + type = "default", +}) + +trees: the straight stem nodes with param2=0 +leaves: nodes of the tree head which only drop their main item if drop_leaf is enabled +range: the size of the tree head +fruits: similar to leaves but without the drop_leaf setting condition + + +treecapitator.register_tree({ + trees = {, , ...}, + leaves = {, , ...}, + range = , + fruits = {, , ...}, + height = , + max_nodes = , + num_trunks_min = , + num_trunks_max = , + num_leaves_min = , + num_leaves_max = , + type = "moretrees", +}) + +height: maximum tree height +max_nodes: maximum amount of nodes the tree is allowed to consist of +num_trunks_min… +]] + +treecapitator.register_tree({ + trees = {"default:tree"}, + leaves = {"default:leaves"}, + range = 2, + fruits = {"default:apple"} +}) + +treecapitator.register_tree({ + trees = {"default:pinetree"}, + leaves = {"default:pine_needles"}, + range = 6, +}) + +treecapitator.register_tree({ + trees = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + range = 3 +}) + +if minetest.get_modpath("nyanland") then + treecapitator.register_tree({ + trees = {"nyanland:mesetree", "nyanland:healstone"}, + leaves = {"nyanland:meseleaves"}, + range = 2, + fruits = {"default:apple"} + }) +end + +if minetest.get_modpath("farming_plus") then + treecapitator.register_tree({ + trees = {"default:tree"}, + leaves = {"farming_plus:banana_leaves"}, + range = 2, + fruits = {"farming_plus:banana"} + }) + + treecapitator.register_tree({ + trees = {"default:tree"}, + leaves = {"farming_plus:cocoa_leaves"}, + range = 2, + fruits = {"farming_plus:cocoa"} + }) +end + +if treecapitator.moretrees_support +and minetest.get_modpath("moretrees") then + treecapitator.register_tree({ + trees = {"moretrees:acacia_trunk"}, + leaves = {"moretrees:acacia_leaves"}, + range = 10, + }) + + treecapitator.register_tree({ + trees = {"moretrees:apple_tree_trunk"}, + leaves = {"moretrees:apple_tree_leaves"}, + range = 20, + fruits = {"default:apple"} + }) + + treecapitator.register_tree({ + trees = {"moretrees:beech_trunk"}, + leaves = {"moretrees:beech_leaves"}, + range = 8, + }) + treecapitator.register_tree({ + trees = {"moretrees:birch_trunk"}, + leaves = {"moretrees:birch_leaves"}, + range = 8, + }) + + treecapitator.register_tree({ + trees = {"moretrees:fir_trunk"}, + leaves = {"moretrees:fir_leaves","fir_leaves_bright"}, + range = 12, + fruits = {"moretrees:fir_cone"} + }) + + treecapitator.register_tree({ + trees = {"moretrees:jungletree_trunk"}, + leaves = {"moretrees:jungletree_leaves_green","jungletree_leaves_yellow","jungletree_leaves_red"}, + range = 8, + }) + + treecapitator.register_tree({ + trees = {"moretrees:oak_trunk"}, + leaves = {"moretrees:oak_leaves"}, + range = 8, + fruits = {"moretrees:acorn"} + }) + + treecapitator.register_tree({ + trees = {"moretrees:palm_trunk"}, + leaves = {"moretrees:palm_leaves"}, + range = 8, + fruits = {"moretrees:coconut"} + }) + + treecapitator.register_tree({ + trees = {"moretrees:pine_trunk"}, + leaves = {"moretrees:pine_leaves"}, + range = 8, + fruits = {"moretrees:pine_cone"} + }) + + treecapitator.register_tree({ + trees = {"moretrees:rubber_tree_trunk","rubber_tree_trunk_empty"}, + leaves = {"moretrees:rubber_tree_leaves"}, + range = 8, + }) + + treecapitator.register_tree({ + trees = {"moretrees:sequoia_trunk"}, + leaves = {"moretrees:sequoia_leaves"}, + range = 12, + }) + + treecapitator.register_tree({ + trees = {"moretrees:spruce_trunk"}, + leaves = {"moretrees:spruce_leaves"}, + range = 10, + fruits = {"moretrees:spruce_cone"} + }) + + treecapitator.register_tree({ + trees = {"moretrees:willow_trunk"}, + leaves = {"moretrees:willow_leaves"}, + range = 10, + }) + --[[ + treecapitator.register_tree({ + trees = {"moretrees:willow_trunk"}, + leaves = {"moretrees:willow_leaves"}, + range = 11, + height = 17, + max_nodes = 8000, + num_trunks_min = 5, + num_trunks_max = 100, + num_leaves_min = 10, + num_leaves_max = 4000, + type = "moretrees", + }) + --]] +end + +-- code from amadin and narrnika +if minetest.get_modpath("ethereal") then + treecapitator.register_tree({--jungle [Ñвкалипт] + trees = {"default:jungletree"}, + leaves = {"default:jungleleaves"}, + range = 3, + height = 20, + max_nodes = 145, + num_trunks_min = 0, + num_trunks_max = 35, + num_leaves_min = 0, + num_leaves_max = 110, + type = "moretrees", + }) + treecapitator.register_tree({--pine [кедр] + trees = {"default:pinetree"}, + leaves = {"ethereal:pineleaves"}, + range = 6, + type = "default", + }) + treecapitator.register_tree({--orange [апельÑиновое дерево] + trees = {"default:tree"}, + leaves = {"default:leaves", "ethereal:orange_leaves"}, + fruits = {"default:apple", "ethereal:orange"}, + range = 2, + type = "default", + }) + treecapitator.register_tree({--acacia [акациÑ] + trees = {"ethereal:acacia_trunk"}, + leaves = {"ethereal:acacia_leaves"}, + range = 10, + height = 10, + max_nodes = 122, + num_trunks_min = 0, + num_trunks_max = 22, + num_leaves_min = 0, + num_leaves_max = 100, + type = "moretrees", + }) + treecapitator.register_tree({--banana [банановое дерево] + trees = {"ethereal:banana_trunk"}, + leaves = {"ethereal:bananaleaves"}, + fruits = {"ethereal:banana"}, + range = 3, + height = 7, + max_nodes = 28, + num_trunks_min = 0, + num_trunks_max = 4, + num_leaves_min = 0, + num_leaves_max = 20, + type = "moretrees", + }) + treecapitator.register_tree({--coconut [кокоÑовое дерево] + trees = {"ethereal:palm_trunk"}, + leaves = {"ethereal:palmleaves"}, + fruits = {"ethereal:coconut"}, + range = 3, + height = 9, + max_nodes = 37, + num_trunks_min = 0, + num_trunks_max = 8, + num_leaves_min = 0, + num_leaves_max = 25, + type = "moretrees", + }) + treecapitator.register_tree({--willow [ива] + trees = {"ethereal:willow_trunk"}, + leaves = {"ethereal:willow_twig"}, + range = 10, + height = 13, + max_nodes = 540, + num_trunks_min = 0, + num_trunks_max = 90, + num_leaves_min = 0, + num_leaves_max = 450, + type = "moretrees", + }) + treecapitator.register_tree({--moshroom [гриб] + trees = {"ethereal:mushroom_trunk"}, + leaves = {"ethereal:mushroom", "ethereal:mushroom_porew"}, + range = 4, + height = 10, + max_nodes = 100, + num_trunks_min = 0, + num_trunks_max = 32, + num_leaves_min = 0, + num_leaves_max = 80, + type = "moretrees", + }) +end diff --git a/mods/u_skinsdb/README b/mods/u_skinsdb/README new file mode 100644 index 0000000..f3da950 --- /dev/null +++ b/mods/u_skinsdb/README @@ -0,0 +1,20 @@ +minetest-u_skins +================ + +Skins mod for minetest unified_inventory by Dean Montgomery - feel free to merge it into skinsdb or unified_inventory git. + +Requires latest unified_inventory from: +https://github.com/minetest-technic/unified_inventory + +This is the "u_skindb" branch, it is ment to download the skins from addi's skin database (http://minetest.fensta.bplaced.net). + +To re-download the latest skins you may want to run: + "./update_from_db.py" OR + "./update_from_db2.py" + script, then "./generate_previews.sh" before using the mod. + + +Credits: +MirceaKitsune (WTFPL) + bundled script by Zeg9 (WTFPL too): + skin_previews.blend +RealyBadAngel unified_inventory and Zeg9 skinsdb diff --git a/mods/u_skinsdb/generate_previews.sh b/mods/u_skinsdb/generate_previews.sh new file mode 100644 index 0000000..22c978c --- /dev/null +++ b/mods/u_skinsdb/generate_previews.sh @@ -0,0 +1,48 @@ +#!/bin/sh +# This script is used to generate the previews needed by the mod +# It requires blender with the latest python API (2.6x is tested) +# A script that works with older blenders and, maybe, without python, is available in older commits. +# This script can also use pngcrush and imagemagick to reduce output size, +# please enable them if you want to push to the git repository of the mod. +# Pngcrush output will be written to .previews/pngcrush_output +# Warning: any file in .previews/ and u_skins/textures might be deleted without asking. +PNGCRUSH=true +IMAGEMAGICK=true +cd .previews +rm ../u_skins/textures/*_preview*.png # Remove all previous previews +blender -b skin_previews.blend --python-text "Generate previews" > /dev/null +if $IMAGEMAGICK + then echo "Stripping metadata from generated files..." + else echo "Moving files..." +fi +rm -rf output # remove my output +mkdir -p output +for i in blender_out/character_*_00.png; +do + out_name=$(basename $i | sed -e 's/_00.png//g') + out_file=output/"$out_name"_preview.png + if $IMAGEMAGICK + then + convert -strip $i $out_file + else + mv $i $out_file + fi +done +for i in blender_out/character_*_01.png; +do + out_name=$(basename $i | sed -e 's/_01.png//g') + out_file=output/"$out_name"_preview_back.png + if $IMAGEMAGICK + then + convert -strip $i $out_file + else + mv $i $out_file + fi +done +if $PNGCRUSH + then + echo "Running pngcrush..." + pngcrush -d ../u_skins/textures/ output/*_preview*.png 2> pngcrush_output + else mv output/*_preview*.png ../u_skins/textures/ +fi +echo "Done !" diff --git a/mods/u_skinsdb/modpack.txt b/mods/u_skinsdb/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/u_skinsdb/set_meta.sh b/mods/u_skinsdb/set_meta.sh new file mode 100644 index 0000000..1db43cd --- /dev/null +++ b/mods/u_skinsdb/set_meta.sh @@ -0,0 +1,59 @@ +#!/bin/bash +SPRITES=$(find -regextype sed -regex '.*/player_[0-9]\{1,\}.png' | sort -V) +MODELS=$(find -regextype sed -regex '.*/character_[0-9]\{1,\}.png' | sort -V) +function ask_for_meta { + convert $2 -scale 100x200 /tmp/skins_set_meta + SNAME=$(basename $1) + SNAME=${SNAME%.*} + METAFILE=u_skins/meta/$SNAME.txt + FORCE=$3 + if $FORCE || ! [ -f $METAFILE ] + then + echo $METAFILE + YADOUT=$(yad --form --image=/tmp/skins_set_meta --field $SNAME:LBL --field=Name --field=Author --field=Description --field=Comment) + if [ -z "$YADOUT" ]; then exit; fi # canceled + OIFS="$IFS" + IFS='|' + read -a VALUES <<< "$YADOUT" + IFS="$OIFS" + NAME=${VALUES[1]} + AUTHOR=${VALUES[2]} + DESCRIPTION=${VALUES[3]} + COMMENT=${VALUES[4]} + if [ -n "$NAME" ] && [ -n "$AUTHOR" ] + then + echo -n > $METAFILE # clear it + echo 'name = "'$NAME'",' >> $METAFILE + echo 'author = "'$AUTHOR'",' >> $METAFILE + # only write description and comment if they are specified + if [ -n "$DESCRIPTION" ] + then + echo 'description = "'$DESCRIPTION'",' >> $METAFILE + fi + if [ -n "$COMMENT" ] + then + echo 'comment = "'$COMMENT'",' >> $METAFILE + fi + echo "Saved !" + fi + fi +} +if [ -z $1 ] +then + for i in $SPRITES + do + ask_for_meta $i $i false + done + for i in $MODELS + do + ask_for_meta $i ${i%.*}_preview.png false + done +else + if [ -f ${1%.*}_preview.png ] + then + ask_for_meta $1 ${1%.*}_preview.png true + else + ask_for_meta $1 $1 true + fi +fi +rm /tmp/skins_set_meta diff --git a/mods/u_skinsdb/u_skins/depends.txt b/mods/u_skinsdb/u_skins/depends.txt new file mode 100644 index 0000000..8967e5c --- /dev/null +++ b/mods/u_skinsdb/u_skins/depends.txt @@ -0,0 +1,2 @@ +unified_inventory? +default diff --git a/mods/u_skinsdb/u_skins/init.lua b/mods/u_skinsdb/u_skins/init.lua new file mode 100644 index 0000000..abc73b0 --- /dev/null +++ b/mods/u_skinsdb/u_skins/init.lua @@ -0,0 +1,151 @@ +-- Unified Skins for Minetest - based modified Bags from unfied_inventory and skins from inventory_plus + +-- Copyright (c) 2012 cornernote, Dean Montgomery +-- License: GPLv3 +u_skins = {} +u_skins.type = { SPRITE=0, MODEL=1 } +u_skins.pages = {} +u_skins.u_skins = {} + +u_skins.get_type = function(texture) + if not texture then return end + if string.sub(texture,0,string.len("character")) == "character" then + return u_skins.type.MODEL + end + if string.sub(texture,0,string.len("player")) == "player" then + return u_skins.type.SPRITE + end +end + +u_skins.modpath = minetest.get_modpath("u_skins") +dofile(u_skins.modpath.."/skinlist.lua") +dofile(u_skins.modpath.."/meta.lua") +dofile(u_skins.modpath.."/players.lua") + + +u_skins.update_player_skin = function(player) + name = player:get_player_name() + if u_skins.get_type(u_skins.u_skins[name]) == u_skins.type.SPRITE then + player:set_properties({ + visual = "upright_sprite", + textures = {u_skins.u_skins[name]..".png",u_skins.u_skins[name].."_back.png"}, + visual_size = {x=1, y=2}, + }) + elseif u_skins.get_type(u_skins.u_skins[name]) == u_skins.type.MODEL then + player:set_properties({ + visual = "mesh", + textures = {u_skins.u_skins[name]..".png"}, + visual_size = {x=1, y=1}, + }) + end + u_skins.save() +end + +-- Display Current Skin +unified_inventory.register_page("u_skins", { + get_formspec = function(player) + name = player:get_player_name() + local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]" + if u_skins.get_type(u_skins.u_skins[name]) == u_skins.type.MODEL then + formspec = formspec + .. "image[0,.75;1,2;"..u_skins.u_skins[name].."_preview.png]" + .. "image[1,.75;1,2;"..u_skins.u_skins[name].."_preview_back.png]" + .. "label[6,.5;Raw texture:]" + .. "image[6,1;2,1;"..u_skins.u_skins[name]..".png]" + + else + formspec = formspec + .. "image[0,.75;1,2;"..u_skins.u_skins[name]..".png]" + .. "image[1,.75;1,2;"..u_skins.u_skins[name].."_back.png]" + end + local meta = u_skins.meta[u_skins.u_skins[name]] + if meta then + if meta.name then + formspec = formspec .. "label[2,.5;Name: "..meta.name.."]" + end + if meta.author then + formspec = formspec .. "label[2,1;Author: "..meta.author.."]" + end + if meta.description then + formspec = formspec .. "label[2,1.5;"..meta.description.."]" + end + if meta.comment then + formspec = formspec .. 'label[2,2;"'..meta.comment..'"]' + end + end + + formspec = formspec .. "button[.75,3;6.5,.5;u_skins_page_0;Change]" + return {formspec=formspec} + end, +}) + +unified_inventory.register_button("u_skins", { + type = "image", + image = "u_skins_button.png", +}) + +-- Create all of the skin-picker pages. +for x = 0, math.floor(#u_skins.list/16+1) do + unified_inventory.register_page("u_skins_page_"..x, { + get_formspec = function(player) + page = u_skins.pages[player:get_player_name()] + if page == nil then page = 0 end + local formspec = "background[0.06,0.99;7.92,7.52;ui_misc_form.png]" + local index = 0 + local skip = 0 -- Skip u_skins, used for pages + -- skin thumbnails + for i, skin in ipairs(u_skins.list) do + if skip < page*16 then skip = skip + 1 else + if index < 16 then + formspec = formspec .. "image_button["..(index%8)..","..((math.floor(index/8))*2)..";1,2;"..skin + if u_skins.get_type(skin) == u_skins.type.MODEL then + formspec = formspec .. "_preview" + end + formspec = formspec .. ".png;u_skins_set_"..i..";]" + end + index = index +1 + end + end + -- prev next page buttons + if page > 0 then + formspec = formspec .. "button[0,4;1,.5;u_skins_page_"..(page-1)..";<<]" + else + formspec = formspec .. "button[0,4;1,.5;u_skins_page_"..page..";<<]" + end + formspec = formspec .. "button[.75,4;6.5,.5;u_skins_page_"..page..";Page "..(page+1).."/"..math.floor(#u_skins.list/16+1).."]" -- a button is used so text is centered + if index > 16 then + formspec = formspec .. "button[7,4;1,.5;u_skins_page_"..(page+1)..";>>]" + else + formspec = formspec .. "button[7,4;1,.5;u_skins_page_"..page..";>>]" + end + return {formspec=formspec} + end, + }) +end + +-- click button handlers +minetest.register_on_player_receive_fields(function(player,formname,fields) + if fields.u_skins then + unified_inventory.set_inventory_formspec(player,"craft") + end + for field, _ in pairs(fields) do + if string.sub(field,0,string.len("u_skins_set_")) == "u_skins_set_" then + u_skins.u_skins[player:get_player_name()] = u_skins.list[tonumber(string.sub(field,string.len("u_skins_set_")+1))] + u_skins.update_player_skin(player) + unified_inventory.set_inventory_formspec(player,"u_skins") + end + if string.sub(field,0,string.len("u_skins_page_")) == "u_skins_page_" then + u_skins.pages[player:get_player_name()] = tonumber(string.sub(field,string.len("u_skins_page_")+1)) + unified_inventory.set_inventory_formspec(player,"u_skins_page_"..u_skins.pages[player:get_player_name()]) + end + end +end) + +-- set defaults +minetest.register_on_joinplayer(function(player) + if not u_skins.u_skins[player:get_player_name()] then + u_skins.u_skins[player:get_player_name()] = "character_1" + end + u_skins.update_player_skin(player) +end) + diff --git a/mods/u_skinsdb/u_skins/meta.lua b/mods/u_skinsdb/u_skins/meta.lua new file mode 100644 index 0000000..350dbe8 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta.lua @@ -0,0 +1,15 @@ +u_skins.meta = {} +for _, i in ipairs(u_skins.list) do + u_skins.meta[i] = {} + local f = io.open(u_skins.modpath.."/meta/"..i..".txt") + local data = nil + if f then + data = minetest.deserialize("return {"..f:read('*all').."}") + f:close() + end + data = data or {} + u_skins.meta[i].name = data.name or "" + u_skins.meta[i].author = data.author or "" + u_skins.meta[i].description = data.description or nil + u_skins.meta[i].comment = data.comment or nil +end diff --git a/mods/u_skinsdb/u_skins/meta/character_1.txt b/mods/u_skinsdb/u_skins/meta/character_1.txt new file mode 100644 index 0000000..4ce982f --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_1.txt @@ -0,0 +1,3 @@ +name = "Sam 0", +author = "Jordach", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_10.txt b/mods/u_skinsdb/u_skins/meta/character_10.txt new file mode 100644 index 0000000..d429b87 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_10.txt @@ -0,0 +1,3 @@ +name = "Tuxedo Sam", +author = "Jordach", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_100.txt b/mods/u_skinsdb/u_skins/meta/character_100.txt new file mode 100644 index 0000000..dc91886 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_100.txt @@ -0,0 +1,3 @@ +name = "Ladyvioletkitty", +author = "lordphoenixmh", +comment = "CC BY 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_101.txt b/mods/u_skinsdb/u_skins/meta/character_101.txt new file mode 100644 index 0000000..1a43818 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_101.txt @@ -0,0 +1,3 @@ +name = "4°district", +author = "Ferdi Napoli", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_102.txt b/mods/u_skinsdb/u_skins/meta/character_102.txt new file mode 100644 index 0000000..536ab0d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_102.txt @@ -0,0 +1,3 @@ +name = "Chop", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_103.txt b/mods/u_skinsdb/u_skins/meta/character_103.txt new file mode 100644 index 0000000..2f736be --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_103.txt @@ -0,0 +1,3 @@ +name = "Franklin", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_104.txt b/mods/u_skinsdb/u_skins/meta/character_104.txt new file mode 100644 index 0000000..f27f45a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_104.txt @@ -0,0 +1,3 @@ +name = "Trevor", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_105.txt b/mods/u_skinsdb/u_skins/meta/character_105.txt new file mode 100644 index 0000000..1bf1895 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_105.txt @@ -0,0 +1,3 @@ +name = "Bart Simpson", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_106.txt b/mods/u_skinsdb/u_skins/meta/character_106.txt new file mode 100644 index 0000000..f66531b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_106.txt @@ -0,0 +1,3 @@ +name = "Creeper", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_107.txt b/mods/u_skinsdb/u_skins/meta/character_107.txt new file mode 100644 index 0000000..90011d6 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_107.txt @@ -0,0 +1,3 @@ +name = "War Machine", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_108.txt b/mods/u_skinsdb/u_skins/meta/character_108.txt new file mode 100644 index 0000000..7c95be2 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_108.txt @@ -0,0 +1,3 @@ +name = "Gangnam Style", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_109.txt b/mods/u_skinsdb/u_skins/meta/character_109.txt new file mode 100644 index 0000000..164e538 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_109.txt @@ -0,0 +1,3 @@ +name = "Sonic The Hedgehog", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_11.txt b/mods/u_skinsdb/u_skins/meta/character_11.txt new file mode 100644 index 0000000..f97f2d4 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_11.txt @@ -0,0 +1,3 @@ +name = "Semmett9", +author = "Infinatum", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_110.txt b/mods/u_skinsdb/u_skins/meta/character_110.txt new file mode 100644 index 0000000..0b3b209 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_110.txt @@ -0,0 +1,3 @@ +name = "Charizard", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_111.txt b/mods/u_skinsdb/u_skins/meta/character_111.txt new file mode 100644 index 0000000..f91b992 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_111.txt @@ -0,0 +1,3 @@ +name = "Scarlet Spider-man", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_112.txt b/mods/u_skinsdb/u_skins/meta/character_112.txt new file mode 100644 index 0000000..c9eb7af --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_112.txt @@ -0,0 +1,3 @@ +name = "Ferdi Napoli", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_113.txt b/mods/u_skinsdb/u_skins/meta/character_113.txt new file mode 100644 index 0000000..7ad611a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_113.txt @@ -0,0 +1,3 @@ +name = "Finn The Adventured", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_114.txt b/mods/u_skinsdb/u_skins/meta/character_114.txt new file mode 100644 index 0000000..a318033 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_114.txt @@ -0,0 +1,3 @@ +name = "Jake", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_115.txt b/mods/u_skinsdb/u_skins/meta/character_115.txt new file mode 100644 index 0000000..8ca2623 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_115.txt @@ -0,0 +1,3 @@ +name = "Ferdi Napoli Reserve", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_116.txt b/mods/u_skinsdb/u_skins/meta/character_116.txt new file mode 100644 index 0000000..c5a21e8 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_116.txt @@ -0,0 +1,3 @@ +name = "Joker", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_117.txt b/mods/u_skinsdb/u_skins/meta/character_117.txt new file mode 100644 index 0000000..364927e --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_117.txt @@ -0,0 +1,3 @@ +name = "Bleau Steve", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_118.txt b/mods/u_skinsdb/u_skins/meta/character_118.txt new file mode 100644 index 0000000..1c0f833 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_118.txt @@ -0,0 +1,3 @@ +name = "Deadpool Bleau", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_119.txt b/mods/u_skinsdb/u_skins/meta/character_119.txt new file mode 100644 index 0000000..f4cf8e7 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_119.txt @@ -0,0 +1,3 @@ +name = "Seth Rollins", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_12.txt b/mods/u_skinsdb/u_skins/meta/character_12.txt new file mode 100644 index 0000000..3eca590 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_12.txt @@ -0,0 +1,3 @@ +name = "John", +author = "Evergreen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_120.txt b/mods/u_skinsdb/u_skins/meta/character_120.txt new file mode 100644 index 0000000..b4022c6 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_120.txt @@ -0,0 +1,3 @@ +name = "Daffy Duck", +author = "LuxAtheris", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_121.txt b/mods/u_skinsdb/u_skins/meta/character_121.txt new file mode 100644 index 0000000..47f6532 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_121.txt @@ -0,0 +1,3 @@ +name = "DareDevil", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_122.txt b/mods/u_skinsdb/u_skins/meta/character_122.txt new file mode 100644 index 0000000..8f1c277 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_122.txt @@ -0,0 +1,3 @@ +name = "Clone", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_123.txt b/mods/u_skinsdb/u_skins/meta/character_123.txt new file mode 100644 index 0000000..b8c17a9 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_123.txt @@ -0,0 +1,3 @@ +name = "Banana Guy", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_124.txt b/mods/u_skinsdb/u_skins/meta/character_124.txt new file mode 100644 index 0000000..c1b6213 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_124.txt @@ -0,0 +1,3 @@ +name = "Rubber", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_125.txt b/mods/u_skinsdb/u_skins/meta/character_125.txt new file mode 100644 index 0000000..8c77b54 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_125.txt @@ -0,0 +1,3 @@ +name = "Gothic Sam", +author = "GingerHunter797", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_126.txt b/mods/u_skinsdb/u_skins/meta/character_126.txt new file mode 100644 index 0000000..2849a7e --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_126.txt @@ -0,0 +1,3 @@ +name = "Tails", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_127.txt b/mods/u_skinsdb/u_skins/meta/character_127.txt new file mode 100644 index 0000000..51405c6 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_127.txt @@ -0,0 +1,3 @@ +name = "Aguia Explorer", +author = "Davizinho", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_128.txt b/mods/u_skinsdb/u_skins/meta/character_128.txt new file mode 100644 index 0000000..0657843 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_128.txt @@ -0,0 +1,3 @@ +name = "Toad", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_129.txt b/mods/u_skinsdb/u_skins/meta/character_129.txt new file mode 100644 index 0000000..de88469 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_129.txt @@ -0,0 +1,3 @@ +name = "oOChainLynxOo", +author = "oOChainLynxOo", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_13.txt b/mods/u_skinsdb/u_skins/meta/character_13.txt new file mode 100644 index 0000000..027ebc7 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_13.txt @@ -0,0 +1,3 @@ +name = "rotor112", +author = "rotor112", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_130.txt b/mods/u_skinsdb/u_skins/meta/character_130.txt new file mode 100644 index 0000000..ff10ff7 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_130.txt @@ -0,0 +1,3 @@ +name = "amazing spiderman", +author = "mateus", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_131.txt b/mods/u_skinsdb/u_skins/meta/character_131.txt new file mode 100644 index 0000000..249b7e9 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_131.txt @@ -0,0 +1,3 @@ +name = "black spiderman", +author = "mateus", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_132.txt b/mods/u_skinsdb/u_skins/meta/character_132.txt new file mode 100644 index 0000000..3863e51 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_132.txt @@ -0,0 +1,3 @@ +name = "Sam Mese Tee", +author = "oOChainLynxOo", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_133.txt b/mods/u_skinsdb/u_skins/meta/character_133.txt new file mode 100644 index 0000000..092a399 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_133.txt @@ -0,0 +1,3 @@ +name = "Jesus", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_134.txt b/mods/u_skinsdb/u_skins/meta/character_134.txt new file mode 100644 index 0000000..375d897 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_134.txt @@ -0,0 +1,3 @@ +name = "Wires", +author = "Geopbyte", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_135.txt b/mods/u_skinsdb/u_skins/meta/character_135.txt new file mode 100644 index 0000000..1adf0fb --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_135.txt @@ -0,0 +1,3 @@ +name = "Vector", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_136.txt b/mods/u_skinsdb/u_skins/meta/character_136.txt new file mode 100644 index 0000000..7dea952 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_136.txt @@ -0,0 +1,3 @@ +name = "Fire Mario", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_137.txt b/mods/u_skinsdb/u_skins/meta/character_137.txt new file mode 100644 index 0000000..f5d7249 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_137.txt @@ -0,0 +1,3 @@ +name = "skin minecraft", +author = "lestouem", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_138.txt b/mods/u_skinsdb/u_skins/meta/character_138.txt new file mode 100644 index 0000000..a47cc9b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_138.txt @@ -0,0 +1,3 @@ +name = "santa", +author = "https://dl.dropbox.com/s/cs0vhq8kkzpcvre/santa.zip?dl=1", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_139.txt b/mods/u_skinsdb/u_skins/meta/character_139.txt new file mode 100644 index 0000000..c29cb95 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_139.txt @@ -0,0 +1,3 @@ +name = "PenguinDad", +author = "PenguinDad", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_14.txt b/mods/u_skinsdb/u_skins/meta/character_14.txt new file mode 100644 index 0000000..986da89 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_14.txt @@ -0,0 +1,3 @@ +name = "Older Man Sam", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_140.txt b/mods/u_skinsdb/u_skins/meta/character_140.txt new file mode 100644 index 0000000..d79dd24 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_140.txt @@ -0,0 +1,3 @@ +name = "Army", +author = "Ragnar", +comment = "CC BY-NC-SA 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_141.txt b/mods/u_skinsdb/u_skins/meta/character_141.txt new file mode 100644 index 0000000..287d97b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_141.txt @@ -0,0 +1,3 @@ +name = "New Ferdi Napoli Skin", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_142.txt b/mods/u_skinsdb/u_skins/meta/character_142.txt new file mode 100644 index 0000000..af6ed6a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_142.txt @@ -0,0 +1,3 @@ +name = "Mcc457", +author = "Ferdi Napoli", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_143.txt b/mods/u_skinsdb/u_skins/meta/character_143.txt new file mode 100644 index 0000000..60b3203 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_143.txt @@ -0,0 +1,3 @@ +name = "Jan", +author = "Jan", +comment = "CC BY 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_144.txt b/mods/u_skinsdb/u_skins/meta/character_144.txt new file mode 100644 index 0000000..5445072 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_144.txt @@ -0,0 +1,3 @@ +name = "PilzAdam", +author = "PilzAdam", +comment = "CC BY 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_145.txt b/mods/u_skinsdb/u_skins/meta/character_145.txt new file mode 100644 index 0000000..c9d2036 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_145.txt @@ -0,0 +1,3 @@ +name = "Renan123", +author = "sou o melhor", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_146.txt b/mods/u_skinsdb/u_skins/meta/character_146.txt new file mode 100644 index 0000000..6286d6f --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_146.txt @@ -0,0 +1,3 @@ +name = "PenguinDad with Cape", +author = "PenguinDad", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_147.txt b/mods/u_skinsdb/u_skins/meta/character_147.txt new file mode 100644 index 0000000..9ca7a28 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_147.txt @@ -0,0 +1,3 @@ +name = "Adarqet", +author = "Adarqet", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_148.txt b/mods/u_skinsdb/u_skins/meta/character_148.txt new file mode 100644 index 0000000..43d2bfe --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_148.txt @@ -0,0 +1,3 @@ +name = "Adarqet(Cape)", +author = "Adarqet", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_149.txt b/mods/u_skinsdb/u_skins/meta/character_149.txt new file mode 100644 index 0000000..25e5d90 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_149.txt @@ -0,0 +1,3 @@ +name = "wither", +author = "mario alberto", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_15.txt b/mods/u_skinsdb/u_skins/meta/character_15.txt new file mode 100644 index 0000000..72c9144 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_15.txt @@ -0,0 +1,3 @@ +name = "G-Robo v5000", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_150.txt b/mods/u_skinsdb/u_skins/meta/character_150.txt new file mode 100644 index 0000000..b7b80ae --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_150.txt @@ -0,0 +1,3 @@ +name = "Cywalk Sam", +author = "w_laenger", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_151.txt b/mods/u_skinsdb/u_skins/meta/character_151.txt new file mode 100644 index 0000000..37bc1b7 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_151.txt @@ -0,0 +1,3 @@ +name = "rantathe", +author = "ranta", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_152.txt b/mods/u_skinsdb/u_skins/meta/character_152.txt new file mode 100644 index 0000000..d8353e7 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_152.txt @@ -0,0 +1,3 @@ +name = "ranta mk 2", +author = "ranta", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_16.txt b/mods/u_skinsdb/u_skins/meta/character_16.txt new file mode 100644 index 0000000..97f2c52 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_16.txt @@ -0,0 +1,3 @@ +name = "jojoa1997", +author = "jojoa1997", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_17.txt b/mods/u_skinsdb/u_skins/meta/character_17.txt new file mode 100644 index 0000000..8449253 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_17.txt @@ -0,0 +1,3 @@ +name = "Zenohelds default player", +author = "sdzen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_18.txt b/mods/u_skinsdb/u_skins/meta/character_18.txt new file mode 100644 index 0000000..76b5317 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_18.txt @@ -0,0 +1,3 @@ +name = "Sdzen", +author = "sdzen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_19.txt b/mods/u_skinsdb/u_skins/meta/character_19.txt new file mode 100644 index 0000000..61d1ac1 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_19.txt @@ -0,0 +1,3 @@ +name = "horrible spring sdzen", +author = "sdzen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_2.txt b/mods/u_skinsdb/u_skins/meta/character_2.txt new file mode 100644 index 0000000..9c1fc69 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_2.txt @@ -0,0 +1,3 @@ +name = "Sam I", +author = "Jordach", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_20.txt b/mods/u_skinsdb/u_skins/meta/character_20.txt new file mode 100644 index 0000000..b40a0e3 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_20.txt @@ -0,0 +1,3 @@ +name = "B", +author = "sdzen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_21.txt b/mods/u_skinsdb/u_skins/meta/character_21.txt new file mode 100644 index 0000000..f95684d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_21.txt @@ -0,0 +1,3 @@ +name = "Demon Farmer Sam (ray8888 server)", +author = "sdzen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_22.txt b/mods/u_skinsdb/u_skins/meta/character_22.txt new file mode 100644 index 0000000..9d9bceb --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_22.txt @@ -0,0 +1,3 @@ +name = "Tree", +author = "Evergreen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_23.txt b/mods/u_skinsdb/u_skins/meta/character_23.txt new file mode 100644 index 0000000..9ff916a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_23.txt @@ -0,0 +1,3 @@ +name = "Interstella 5555 guitarist", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_24.txt b/mods/u_skinsdb/u_skins/meta/character_24.txt new file mode 100644 index 0000000..2c6c612 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_24.txt @@ -0,0 +1,3 @@ +name = "Brett Favre", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_25.txt b/mods/u_skinsdb/u_skins/meta/character_25.txt new file mode 100644 index 0000000..6a66820 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_25.txt @@ -0,0 +1,3 @@ +name = "Summer Sam", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_26.txt b/mods/u_skinsdb/u_skins/meta/character_26.txt new file mode 100644 index 0000000..1665581 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_26.txt @@ -0,0 +1,3 @@ +name = "Female Sam II", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_27.txt b/mods/u_skinsdb/u_skins/meta/character_27.txt new file mode 100644 index 0000000..50558a1 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_27.txt @@ -0,0 +1,3 @@ +name = "Space Sam", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_28.txt b/mods/u_skinsdb/u_skins/meta/character_28.txt new file mode 100644 index 0000000..9d9bceb --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_28.txt @@ -0,0 +1,3 @@ +name = "Tree", +author = "Evergreen", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_29.txt b/mods/u_skinsdb/u_skins/meta/character_29.txt new file mode 100644 index 0000000..b652f0d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_29.txt @@ -0,0 +1,3 @@ +name = "steel man", +author = "rotor112", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_3.txt b/mods/u_skinsdb/u_skins/meta/character_3.txt new file mode 100644 index 0000000..2ec3932 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_3.txt @@ -0,0 +1,3 @@ +name = "Sam II", +author = "Jordach", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_30.txt b/mods/u_skinsdb/u_skins/meta/character_30.txt new file mode 100644 index 0000000..073cfbe --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_30.txt @@ -0,0 +1,3 @@ +name = "philipbenr", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_31.txt b/mods/u_skinsdb/u_skins/meta/character_31.txt new file mode 100644 index 0000000..ffc5124 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_31.txt @@ -0,0 +1,3 @@ +name = "vf", +author = "vf", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_32.txt b/mods/u_skinsdb/u_skins/meta/character_32.txt new file mode 100644 index 0000000..6aa8740 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_32.txt @@ -0,0 +1,3 @@ +name = "Summer", +author = "lizzie", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_33.txt b/mods/u_skinsdb/u_skins/meta/character_33.txt new file mode 100644 index 0000000..a5df9d5 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_33.txt @@ -0,0 +1,3 @@ +name = "jojoa1997 2", +author = "jojoa1997", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_34.txt b/mods/u_skinsdb/u_skins/meta/character_34.txt new file mode 100644 index 0000000..b65a4cd --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_34.txt @@ -0,0 +1,3 @@ +name = "warrior", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_35.txt b/mods/u_skinsdb/u_skins/meta/character_35.txt new file mode 100644 index 0000000..c5cf588 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_35.txt @@ -0,0 +1,3 @@ +name = "NERD", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_36.txt b/mods/u_skinsdb/u_skins/meta/character_36.txt new file mode 100644 index 0000000..263f92d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_36.txt @@ -0,0 +1,3 @@ +name = "pj time", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_37.txt b/mods/u_skinsdb/u_skins/meta/character_37.txt new file mode 100644 index 0000000..9efaf0b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_37.txt @@ -0,0 +1,3 @@ +name = "adventure", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_38.txt b/mods/u_skinsdb/u_skins/meta/character_38.txt new file mode 100644 index 0000000..c3d0064 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_38.txt @@ -0,0 +1,3 @@ +name = "marthon", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_39.txt b/mods/u_skinsdb/u_skins/meta/character_39.txt new file mode 100644 index 0000000..819663d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_39.txt @@ -0,0 +1,3 @@ +name = "DASHING", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_4.txt b/mods/u_skinsdb/u_skins/meta/character_4.txt new file mode 100644 index 0000000..cd07e66 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_4.txt @@ -0,0 +1,3 @@ +name = "Zeg9", +author = "Zeg9", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_40.txt b/mods/u_skinsdb/u_skins/meta/character_40.txt new file mode 100644 index 0000000..7968e4a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_40.txt @@ -0,0 +1,3 @@ +name = "ALTNINJA", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_41.txt b/mods/u_skinsdb/u_skins/meta/character_41.txt new file mode 100644 index 0000000..da88331 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_41.txt @@ -0,0 +1,3 @@ +name = "NK", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_42.txt b/mods/u_skinsdb/u_skins/meta/character_42.txt new file mode 100644 index 0000000..7895ea9 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_42.txt @@ -0,0 +1,3 @@ +name = "BORN", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_43.txt b/mods/u_skinsdb/u_skins/meta/character_43.txt new file mode 100644 index 0000000..5bbef4c --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_43.txt @@ -0,0 +1,3 @@ +name = "DJSTEREO", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_44.txt b/mods/u_skinsdb/u_skins/meta/character_44.txt new file mode 100644 index 0000000..38056f0 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_44.txt @@ -0,0 +1,3 @@ +name = "aaaaaaaaaahh", +author = "DJOZZY", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_45.txt b/mods/u_skinsdb/u_skins/meta/character_45.txt new file mode 100644 index 0000000..c18f741 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_45.txt @@ -0,0 +1,3 @@ +name = "villiantest", +author = "marshrover", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_46.txt b/mods/u_skinsdb/u_skins/meta/character_46.txt new file mode 100644 index 0000000..6a3655e --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_46.txt @@ -0,0 +1,3 @@ +name = "villiantest II", +author = "marshrover", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_47.txt b/mods/u_skinsdb/u_skins/meta/character_47.txt new file mode 100644 index 0000000..38e3ade --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_47.txt @@ -0,0 +1,3 @@ +name = "Infantry man", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_48.txt b/mods/u_skinsdb/u_skins/meta/character_48.txt new file mode 100644 index 0000000..d820f07 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_48.txt @@ -0,0 +1,3 @@ +name = "Natsu (Fairy Tail)", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_49.txt b/mods/u_skinsdb/u_skins/meta/character_49.txt new file mode 100644 index 0000000..f1ea465 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_49.txt @@ -0,0 +1,3 @@ +name = "My younger Brother", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_5.txt b/mods/u_skinsdb/u_skins/meta/character_5.txt new file mode 100644 index 0000000..47ce5ea --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_5.txt @@ -0,0 +1,3 @@ +name = "VanessaE", +author = "Jordach", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_50.txt b/mods/u_skinsdb/u_skins/meta/character_50.txt new file mode 100644 index 0000000..706f4f2 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_50.txt @@ -0,0 +1,3 @@ +name = "Herobrine", +author = "Theggabook", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_51.txt b/mods/u_skinsdb/u_skins/meta/character_51.txt new file mode 100644 index 0000000..b86ba7a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_51.txt @@ -0,0 +1,3 @@ +name = "Mcc457", +author = "Mccc457", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_52.txt b/mods/u_skinsdb/u_skins/meta/character_52.txt new file mode 100644 index 0000000..f1b1500 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_52.txt @@ -0,0 +1,3 @@ +name = "lisa", +author = "hansuke123", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_53.txt b/mods/u_skinsdb/u_skins/meta/character_53.txt new file mode 100644 index 0000000..86770ca --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_53.txt @@ -0,0 +1,3 @@ +name = "creeper man steve", +author = "hansuke123", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_54.txt b/mods/u_skinsdb/u_skins/meta/character_54.txt new file mode 100644 index 0000000..aa8f644 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_54.txt @@ -0,0 +1,3 @@ +name = "stormchaser30000", +author = "stormchaser3000", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_55.txt b/mods/u_skinsdb/u_skins/meta/character_55.txt new file mode 100644 index 0000000..e4ec73d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_55.txt @@ -0,0 +1,3 @@ +name = "Devil", +author = "viv100", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_56.txt b/mods/u_skinsdb/u_skins/meta/character_56.txt new file mode 100644 index 0000000..1b55089 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_56.txt @@ -0,0 +1,3 @@ +name = "viv100", +author = "viv100", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_57.txt b/mods/u_skinsdb/u_skins/meta/character_57.txt new file mode 100644 index 0000000..7d0073f --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_57.txt @@ -0,0 +1,3 @@ +name = "Zombie", +author = "viv100", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_58.txt b/mods/u_skinsdb/u_skins/meta/character_58.txt new file mode 100644 index 0000000..837d8ef --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_58.txt @@ -0,0 +1,3 @@ +name = "God", +author = "viv100", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_59.txt b/mods/u_skinsdb/u_skins/meta/character_59.txt new file mode 100644 index 0000000..58fb67b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_59.txt @@ -0,0 +1,3 @@ +name = "CaligoPL", +author = "CaligoPL", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_6.txt b/mods/u_skinsdb/u_skins/meta/character_6.txt new file mode 100644 index 0000000..38bc39e --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_6.txt @@ -0,0 +1,3 @@ +name = "Iron Man MK. 7", +author = "Jordach", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_60.txt b/mods/u_skinsdb/u_skins/meta/character_60.txt new file mode 100644 index 0000000..7346263 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_60.txt @@ -0,0 +1,3 @@ +name = "Emma", +author = "Cidney7760", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_61.txt b/mods/u_skinsdb/u_skins/meta/character_61.txt new file mode 100644 index 0000000..3560350 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_61.txt @@ -0,0 +1,3 @@ +name = "Wants", +author = "Wants", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_62.txt b/mods/u_skinsdb/u_skins/meta/character_62.txt new file mode 100644 index 0000000..f08062f --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_62.txt @@ -0,0 +1,3 @@ +name = "villiantest III", +author = "marshrover", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_63.txt b/mods/u_skinsdb/u_skins/meta/character_63.txt new file mode 100644 index 0000000..b67582e --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_63.txt @@ -0,0 +1,3 @@ +name = "Geopbyte", +author = "Geopbyte", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_64.txt b/mods/u_skinsdb/u_skins/meta/character_64.txt new file mode 100644 index 0000000..648cd34 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_64.txt @@ -0,0 +1,3 @@ +name = "Diamond Armor Sam", +author = "Block_Guy", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_65.txt b/mods/u_skinsdb/u_skins/meta/character_65.txt new file mode 100644 index 0000000..01a7546 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_65.txt @@ -0,0 +1,3 @@ +name = "Hobo/Homeless person", +author = "Minetestian", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_66.txt b/mods/u_skinsdb/u_skins/meta/character_66.txt new file mode 100644 index 0000000..6499072 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_66.txt @@ -0,0 +1,3 @@ +name = "Block_Guy", +author = "Block_Guy", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_67.txt b/mods/u_skinsdb/u_skins/meta/character_67.txt new file mode 100644 index 0000000..b7c0196 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_67.txt @@ -0,0 +1,3 @@ +name = "Solid-Color Sam", +author = "Block_Guy", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_68.txt b/mods/u_skinsdb/u_skins/meta/character_68.txt new file mode 100644 index 0000000..12f199c --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_68.txt @@ -0,0 +1,3 @@ +name = "Invisbility Ninja", +author = "Minetestian", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_69.txt b/mods/u_skinsdb/u_skins/meta/character_69.txt new file mode 100644 index 0000000..c6b5d90 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_69.txt @@ -0,0 +1,3 @@ +name = "RockerLuke skin", +author = "RockerLuke", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_7.txt b/mods/u_skinsdb/u_skins/meta/character_7.txt new file mode 100644 index 0000000..c8fac67 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_7.txt @@ -0,0 +1,3 @@ +name = "C55", +author = "Jordach", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_70.txt b/mods/u_skinsdb/u_skins/meta/character_70.txt new file mode 100644 index 0000000..648cd34 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_70.txt @@ -0,0 +1,3 @@ +name = "Diamond Armor Sam", +author = "Block_Guy", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_71.txt b/mods/u_skinsdb/u_skins/meta/character_71.txt new file mode 100644 index 0000000..4c8d9cb --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_71.txt @@ -0,0 +1,3 @@ +name = "Molten Elemental", +author = "Dunedubby", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_72.txt b/mods/u_skinsdb/u_skins/meta/character_72.txt new file mode 100644 index 0000000..d17e592 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_72.txt @@ -0,0 +1,3 @@ +name = "herobrine", +author = "Zaki", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_73.txt b/mods/u_skinsdb/u_skins/meta/character_73.txt new file mode 100644 index 0000000..447dc3a --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_73.txt @@ -0,0 +1,3 @@ +name = "Link", +author = "tux_peng", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_74.txt b/mods/u_skinsdb/u_skins/meta/character_74.txt new file mode 100644 index 0000000..cbe6f7b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_74.txt @@ -0,0 +1,3 @@ +name = "Saris", +author = "Gfiti", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_75.txt b/mods/u_skinsdb/u_skins/meta/character_75.txt new file mode 100644 index 0000000..3d78cf9 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_75.txt @@ -0,0 +1,3 @@ +name = "Malon", +author = "SummerCampV", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_76.txt b/mods/u_skinsdb/u_skins/meta/character_76.txt new file mode 100644 index 0000000..350ee8c --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_76.txt @@ -0,0 +1,3 @@ +name = "Froggy", +author = "Linxx", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_77.txt b/mods/u_skinsdb/u_skins/meta/character_77.txt new file mode 100644 index 0000000..4f003e4 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_77.txt @@ -0,0 +1,3 @@ +name = "Bob", +author = "LuxAtheris", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_78.txt b/mods/u_skinsdb/u_skins/meta/character_78.txt new file mode 100644 index 0000000..ec3e3a3 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_78.txt @@ -0,0 +1,3 @@ +name = "Naruto", +author = "LuxAtheris", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_79.txt b/mods/u_skinsdb/u_skins/meta/character_79.txt new file mode 100644 index 0000000..5236104 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_79.txt @@ -0,0 +1,3 @@ +name = "LuxAtheris", +author = "LuxAtheris", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_8.txt b/mods/u_skinsdb/u_skins/meta/character_8.txt new file mode 100644 index 0000000..f46a1db --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_8.txt @@ -0,0 +1,3 @@ +name = "Female Sam", +author = "Jordach", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_80.txt b/mods/u_skinsdb/u_skins/meta/character_80.txt new file mode 100644 index 0000000..d7d12b1 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_80.txt @@ -0,0 +1,3 @@ +name = "Alien", +author = "jmf", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_81.txt b/mods/u_skinsdb/u_skins/meta/character_81.txt new file mode 100644 index 0000000..be129cb --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_81.txt @@ -0,0 +1,3 @@ +name = "manoel1500", +author = "manoel1500", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_82.txt b/mods/u_skinsdb/u_skins/meta/character_82.txt new file mode 100644 index 0000000..4068196 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_82.txt @@ -0,0 +1,3 @@ +name = "Vile Sam", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_83.txt b/mods/u_skinsdb/u_skins/meta/character_83.txt new file mode 100644 index 0000000..bfe610f --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_83.txt @@ -0,0 +1,3 @@ +name = "BlueZ Sam II", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_84.txt b/mods/u_skinsdb/u_skins/meta/character_84.txt new file mode 100644 index 0000000..427a018 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_84.txt @@ -0,0 +1,3 @@ +name = "Tetra", +author = "philipbenr", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_85.txt b/mods/u_skinsdb/u_skins/meta/character_85.txt new file mode 100644 index 0000000..bf6c9ce --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_85.txt @@ -0,0 +1,3 @@ +name = "AMMOnym", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_86.txt b/mods/u_skinsdb/u_skins/meta/character_86.txt new file mode 100644 index 0000000..e4e10cf --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_86.txt @@ -0,0 +1,3 @@ +name = "Soldier", +author = "Ragnar", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_87.txt b/mods/u_skinsdb/u_skins/meta/character_87.txt new file mode 100644 index 0000000..1e0a9a1 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_87.txt @@ -0,0 +1,3 @@ +name = "TestManiac", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_88.txt b/mods/u_skinsdb/u_skins/meta/character_88.txt new file mode 100644 index 0000000..ab1c240 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_88.txt @@ -0,0 +1,3 @@ +name = "HurtedOerkki", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_89.txt b/mods/u_skinsdb/u_skins/meta/character_89.txt new file mode 100644 index 0000000..421ba4d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_89.txt @@ -0,0 +1,3 @@ +name = "S"am"TEVE", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_9.txt b/mods/u_skinsdb/u_skins/meta/character_9.txt new file mode 100644 index 0000000..74e9f5d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_9.txt @@ -0,0 +1,3 @@ +name = "Jordach", +author = "Jordach", +comment = "CC BY-NC-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_90.txt b/mods/u_skinsdb/u_skins/meta/character_90.txt new file mode 100644 index 0000000..fc8b402 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_90.txt @@ -0,0 +1,3 @@ +name = "Samerkki", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_91.txt b/mods/u_skinsdb/u_skins/meta/character_91.txt new file mode 100644 index 0000000..b478f94 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_91.txt @@ -0,0 +1,3 @@ +name = "Calinou", +author = "Calinou", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_92.txt b/mods/u_skinsdb/u_skins/meta/character_92.txt new file mode 100644 index 0000000..7ca07c0 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_92.txt @@ -0,0 +1,3 @@ +name = "Black", +author = "Calinou", +comment = "CC BY 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_93.txt b/mods/u_skinsdb/u_skins/meta/character_93.txt new file mode 100644 index 0000000..a10fa16 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_93.txt @@ -0,0 +1,3 @@ +name = "SuperSam", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_94.txt b/mods/u_skinsdb/u_skins/meta/character_94.txt new file mode 100644 index 0000000..d57d277 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_94.txt @@ -0,0 +1,3 @@ +name = "TrollSam", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_95.txt b/mods/u_skinsdb/u_skins/meta/character_95.txt new file mode 100644 index 0000000..a4bf107 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_95.txt @@ -0,0 +1,3 @@ +name = "HungrySteve", +author = "AMMOnym", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_96.txt b/mods/u_skinsdb/u_skins/meta/character_96.txt new file mode 100644 index 0000000..a3ea501 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_96.txt @@ -0,0 +1,3 @@ +name = "ShadowNinja", +author = "ShadowNinja", +comment = "CC BY-SA 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_97.txt b/mods/u_skinsdb/u_skins/meta/character_97.txt new file mode 100644 index 0000000..0cd9db6 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_97.txt @@ -0,0 +1,3 @@ +name = "Minetestian", +author = "Minetestian", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_98.txt b/mods/u_skinsdb/u_skins/meta/character_98.txt new file mode 100644 index 0000000..b478f94 --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_98.txt @@ -0,0 +1,3 @@ +name = "Calinou", +author = "Calinou", +comment = "CC BY-SA 3.0", diff --git a/mods/u_skinsdb/u_skins/meta/character_99.txt b/mods/u_skinsdb/u_skins/meta/character_99.txt new file mode 100644 index 0000000..62fa97d --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/character_99.txt @@ -0,0 +1,3 @@ +name = "lordphoenixmh", +author = "lordphoenixmh", +comment = "CC BY 4.0", diff --git a/mods/u_skinsdb/u_skins/meta/placeholder.txt b/mods/u_skinsdb/u_skins/meta/placeholder.txt new file mode 100644 index 0000000..8b9267b --- /dev/null +++ b/mods/u_skinsdb/u_skins/meta/placeholder.txt @@ -0,0 +1,2 @@ +This file is here so the "meta" directory is created by git. +Please run the update_from_db.py script to fill this, or use the "master" branch of the mod. diff --git a/mods/u_skinsdb/u_skins/players.lua b/mods/u_skinsdb/u_skins/players.lua new file mode 100644 index 0000000..df999fb --- /dev/null +++ b/mods/u_skinsdb/u_skins/players.lua @@ -0,0 +1,28 @@ +u_skins.file = minetest.get_worldpath() .. "/u_skins.mt" +u_skins.load = function() + local input = io.open(u_skins.file, "r") + local data = nil + if input then + data = input:read('*all') + end + if data and data ~= "" then + lines = string.split(data,"\n") + for _, line in ipairs(lines) do + data = string.split(line, ' ', 2) + u_skins.u_skins[data[1]] = data[2] + end + io.close(input) + end +end +u_skins.load() + +u_skins.save = function() + local output = io.open(u_skins.file,'w') + for name, skin in pairs(u_skins.u_skins) do + if name and skin then + output:write(name .. " " .. skin .. "\n") + end + end + io.close(output) +end + diff --git a/mods/u_skinsdb/u_skins/skinlist.lua b/mods/u_skinsdb/u_skins/skinlist.lua new file mode 100644 index 0000000..5947531 --- /dev/null +++ b/mods/u_skinsdb/u_skins/skinlist.lua @@ -0,0 +1,25 @@ +u_skins.list = {} +u_skins.add = function(skin) + table.insert(u_skins.list,skin) +end + +local id + +id = 1 +while true do + local f = io.open(minetest.get_modpath("u_skins").."/textures/player_"..id..".png") + if (not f) then break end + f:close() + u_skins.add("player_"..id) + id = id +1 +end + +id = 1 +while true do + local f = io.open(minetest.get_modpath("u_skins").."/textures/character_"..id..".png") + if (not f) then break end + f:close() + u_skins.add("character_"..id) + id = id +1 +end + diff --git a/mods/u_skinsdb/u_skins/textures/character_1.png b/mods/u_skinsdb/u_skins/textures/character_1.png new file mode 100644 index 0000000..8d0dd99 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_1.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_10.png b/mods/u_skinsdb/u_skins/textures/character_10.png new file mode 100644 index 0000000..456dc58 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_10.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_100.png b/mods/u_skinsdb/u_skins/textures/character_100.png new file mode 100644 index 0000000..c9511b9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_100.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_100_preview.png b/mods/u_skinsdb/u_skins/textures/character_100_preview.png new file mode 100644 index 0000000..e0abc07 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_100_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_100_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_100_preview_back.png new file mode 100644 index 0000000..01167a7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_100_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_101.png b/mods/u_skinsdb/u_skins/textures/character_101.png new file mode 100644 index 0000000..dd98d48 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_101.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_101_preview.png b/mods/u_skinsdb/u_skins/textures/character_101_preview.png new file mode 100644 index 0000000..3aae033 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_101_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_101_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_101_preview_back.png new file mode 100644 index 0000000..59a7176 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_101_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_102.png b/mods/u_skinsdb/u_skins/textures/character_102.png new file mode 100644 index 0000000..21781be Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_102.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_102_preview.png b/mods/u_skinsdb/u_skins/textures/character_102_preview.png new file mode 100644 index 0000000..77bffcc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_102_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_102_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_102_preview_back.png new file mode 100644 index 0000000..23ed4d1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_102_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_103.png b/mods/u_skinsdb/u_skins/textures/character_103.png new file mode 100644 index 0000000..285aa40 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_103.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_103_preview.png b/mods/u_skinsdb/u_skins/textures/character_103_preview.png new file mode 100644 index 0000000..dbc1d3d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_103_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_103_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_103_preview_back.png new file mode 100644 index 0000000..b1e9c27 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_103_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_104.png b/mods/u_skinsdb/u_skins/textures/character_104.png new file mode 100644 index 0000000..5fa12c2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_104.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_104_preview.png b/mods/u_skinsdb/u_skins/textures/character_104_preview.png new file mode 100644 index 0000000..b4126b2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_104_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_104_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_104_preview_back.png new file mode 100644 index 0000000..89a0576 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_104_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_105.png b/mods/u_skinsdb/u_skins/textures/character_105.png new file mode 100644 index 0000000..8002ac5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_105.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_105_preview.png b/mods/u_skinsdb/u_skins/textures/character_105_preview.png new file mode 100644 index 0000000..11344aa Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_105_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_105_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_105_preview_back.png new file mode 100644 index 0000000..df929c0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_105_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_106.png b/mods/u_skinsdb/u_skins/textures/character_106.png new file mode 100644 index 0000000..33089a8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_106.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_106_preview.png b/mods/u_skinsdb/u_skins/textures/character_106_preview.png new file mode 100644 index 0000000..f8012fe Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_106_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_106_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_106_preview_back.png new file mode 100644 index 0000000..cdc6046 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_106_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_107.png b/mods/u_skinsdb/u_skins/textures/character_107.png new file mode 100644 index 0000000..59c91f7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_107.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_107_preview.png b/mods/u_skinsdb/u_skins/textures/character_107_preview.png new file mode 100644 index 0000000..5a91feb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_107_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_107_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_107_preview_back.png new file mode 100644 index 0000000..529825c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_107_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_108.png b/mods/u_skinsdb/u_skins/textures/character_108.png new file mode 100644 index 0000000..aa3e117 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_108.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_108_preview.png b/mods/u_skinsdb/u_skins/textures/character_108_preview.png new file mode 100644 index 0000000..6a05f4e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_108_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_108_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_108_preview_back.png new file mode 100644 index 0000000..0a796d5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_108_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_109.png b/mods/u_skinsdb/u_skins/textures/character_109.png new file mode 100644 index 0000000..2e3d46b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_109.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_109_preview.png b/mods/u_skinsdb/u_skins/textures/character_109_preview.png new file mode 100644 index 0000000..abe307b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_109_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_109_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_109_preview_back.png new file mode 100644 index 0000000..45e7167 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_109_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_10_preview.png b/mods/u_skinsdb/u_skins/textures/character_10_preview.png new file mode 100644 index 0000000..d1ae07b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_10_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_10_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_10_preview_back.png new file mode 100644 index 0000000..94ceffa Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_10_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_11.png b/mods/u_skinsdb/u_skins/textures/character_11.png new file mode 100644 index 0000000..d12421e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_11.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_110.png b/mods/u_skinsdb/u_skins/textures/character_110.png new file mode 100644 index 0000000..1bbe954 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_110.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_110_preview.png b/mods/u_skinsdb/u_skins/textures/character_110_preview.png new file mode 100644 index 0000000..28463aa Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_110_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_110_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_110_preview_back.png new file mode 100644 index 0000000..fd7c146 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_110_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_111.png b/mods/u_skinsdb/u_skins/textures/character_111.png new file mode 100644 index 0000000..2658f28 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_111.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_111_preview.png b/mods/u_skinsdb/u_skins/textures/character_111_preview.png new file mode 100644 index 0000000..94cda93 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_111_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_111_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_111_preview_back.png new file mode 100644 index 0000000..978b391 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_111_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_112.png b/mods/u_skinsdb/u_skins/textures/character_112.png new file mode 100644 index 0000000..0567ef3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_112.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_112_preview.png b/mods/u_skinsdb/u_skins/textures/character_112_preview.png new file mode 100644 index 0000000..6091ee8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_112_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_112_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_112_preview_back.png new file mode 100644 index 0000000..276753f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_112_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_113.png b/mods/u_skinsdb/u_skins/textures/character_113.png new file mode 100644 index 0000000..790e7d1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_113.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_113_preview.png b/mods/u_skinsdb/u_skins/textures/character_113_preview.png new file mode 100644 index 0000000..7e86ca4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_113_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_113_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_113_preview_back.png new file mode 100644 index 0000000..c01f409 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_113_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_114.png b/mods/u_skinsdb/u_skins/textures/character_114.png new file mode 100644 index 0000000..92edde6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_114.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_114_preview.png b/mods/u_skinsdb/u_skins/textures/character_114_preview.png new file mode 100644 index 0000000..183f4d2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_114_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_114_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_114_preview_back.png new file mode 100644 index 0000000..2be1faa Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_114_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_115.png b/mods/u_skinsdb/u_skins/textures/character_115.png new file mode 100644 index 0000000..21007fe Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_115.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_115_preview.png b/mods/u_skinsdb/u_skins/textures/character_115_preview.png new file mode 100644 index 0000000..0529764 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_115_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_115_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_115_preview_back.png new file mode 100644 index 0000000..3a1b605 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_115_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_116.png b/mods/u_skinsdb/u_skins/textures/character_116.png new file mode 100644 index 0000000..eb7a550 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_116.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_116_preview.png b/mods/u_skinsdb/u_skins/textures/character_116_preview.png new file mode 100644 index 0000000..1e7f589 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_116_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_116_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_116_preview_back.png new file mode 100644 index 0000000..30795ab Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_116_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_117.png b/mods/u_skinsdb/u_skins/textures/character_117.png new file mode 100644 index 0000000..94555fb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_117.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_117_preview.png b/mods/u_skinsdb/u_skins/textures/character_117_preview.png new file mode 100644 index 0000000..3324f4c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_117_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_117_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_117_preview_back.png new file mode 100644 index 0000000..5b03fe9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_117_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_118.png b/mods/u_skinsdb/u_skins/textures/character_118.png new file mode 100644 index 0000000..a1b39f4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_118.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_118_preview.png b/mods/u_skinsdb/u_skins/textures/character_118_preview.png new file mode 100644 index 0000000..0bdc1ab Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_118_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_118_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_118_preview_back.png new file mode 100644 index 0000000..be24c00 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_118_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_119.png b/mods/u_skinsdb/u_skins/textures/character_119.png new file mode 100644 index 0000000..2dde6d4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_119.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_119_preview.png b/mods/u_skinsdb/u_skins/textures/character_119_preview.png new file mode 100644 index 0000000..16e52e7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_119_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_119_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_119_preview_back.png new file mode 100644 index 0000000..33fdb7b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_119_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_11_preview.png b/mods/u_skinsdb/u_skins/textures/character_11_preview.png new file mode 100644 index 0000000..da9382a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_11_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_11_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_11_preview_back.png new file mode 100644 index 0000000..dc5eecd Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_11_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_12.png b/mods/u_skinsdb/u_skins/textures/character_12.png new file mode 100644 index 0000000..e6d2adc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_12.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_120.png b/mods/u_skinsdb/u_skins/textures/character_120.png new file mode 100644 index 0000000..a36a52c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_120.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_120_preview.png b/mods/u_skinsdb/u_skins/textures/character_120_preview.png new file mode 100644 index 0000000..7032af7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_120_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_120_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_120_preview_back.png new file mode 100644 index 0000000..bb770e4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_120_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_121.png b/mods/u_skinsdb/u_skins/textures/character_121.png new file mode 100644 index 0000000..9bb1cc7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_121.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_121_preview.png b/mods/u_skinsdb/u_skins/textures/character_121_preview.png new file mode 100644 index 0000000..fedce69 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_121_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_121_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_121_preview_back.png new file mode 100644 index 0000000..567c2a8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_121_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_122.png b/mods/u_skinsdb/u_skins/textures/character_122.png new file mode 100644 index 0000000..dfc4a69 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_122.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_122_preview.png b/mods/u_skinsdb/u_skins/textures/character_122_preview.png new file mode 100644 index 0000000..52ed03c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_122_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_122_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_122_preview_back.png new file mode 100644 index 0000000..ec3d7e4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_122_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_123.png b/mods/u_skinsdb/u_skins/textures/character_123.png new file mode 100644 index 0000000..1a3add8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_123.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_123_preview.png b/mods/u_skinsdb/u_skins/textures/character_123_preview.png new file mode 100644 index 0000000..bc7414c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_123_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_123_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_123_preview_back.png new file mode 100644 index 0000000..8251a34 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_123_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_124.png b/mods/u_skinsdb/u_skins/textures/character_124.png new file mode 100644 index 0000000..a1bbde5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_124.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_124_preview.png b/mods/u_skinsdb/u_skins/textures/character_124_preview.png new file mode 100644 index 0000000..bcb2141 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_124_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_124_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_124_preview_back.png new file mode 100644 index 0000000..bfef1b3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_124_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_125.png b/mods/u_skinsdb/u_skins/textures/character_125.png new file mode 100644 index 0000000..4b4cc30 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_125.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_125_preview.png b/mods/u_skinsdb/u_skins/textures/character_125_preview.png new file mode 100644 index 0000000..b9ccf5a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_125_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_125_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_125_preview_back.png new file mode 100644 index 0000000..8bd458b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_125_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_126.png b/mods/u_skinsdb/u_skins/textures/character_126.png new file mode 100644 index 0000000..e14606e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_126.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_126_preview.png b/mods/u_skinsdb/u_skins/textures/character_126_preview.png new file mode 100644 index 0000000..32ede99 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_126_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_126_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_126_preview_back.png new file mode 100644 index 0000000..01e466b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_126_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_127.png b/mods/u_skinsdb/u_skins/textures/character_127.png new file mode 100644 index 0000000..09d4100 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_127.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_127_preview.png b/mods/u_skinsdb/u_skins/textures/character_127_preview.png new file mode 100644 index 0000000..5e25e5c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_127_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_127_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_127_preview_back.png new file mode 100644 index 0000000..4887acb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_127_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_128.png b/mods/u_skinsdb/u_skins/textures/character_128.png new file mode 100644 index 0000000..b497972 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_128.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_128_preview.png b/mods/u_skinsdb/u_skins/textures/character_128_preview.png new file mode 100644 index 0000000..47a1295 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_128_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_128_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_128_preview_back.png new file mode 100644 index 0000000..f3edd23 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_128_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_129.png b/mods/u_skinsdb/u_skins/textures/character_129.png new file mode 100644 index 0000000..cd67cb2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_129.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_129_preview.png b/mods/u_skinsdb/u_skins/textures/character_129_preview.png new file mode 100644 index 0000000..d3f90cd Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_129_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_129_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_129_preview_back.png new file mode 100644 index 0000000..c24d241 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_129_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_12_preview.png b/mods/u_skinsdb/u_skins/textures/character_12_preview.png new file mode 100644 index 0000000..7713230 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_12_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_12_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_12_preview_back.png new file mode 100644 index 0000000..ea23120 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_12_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_13.png b/mods/u_skinsdb/u_skins/textures/character_13.png new file mode 100644 index 0000000..358715e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_13.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_130.png b/mods/u_skinsdb/u_skins/textures/character_130.png new file mode 100644 index 0000000..e123579 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_130.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_130_preview.png b/mods/u_skinsdb/u_skins/textures/character_130_preview.png new file mode 100644 index 0000000..48f5b49 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_130_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_130_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_130_preview_back.png new file mode 100644 index 0000000..1483f07 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_130_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_131.png b/mods/u_skinsdb/u_skins/textures/character_131.png new file mode 100644 index 0000000..e4bbb27 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_131.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_131_preview.png b/mods/u_skinsdb/u_skins/textures/character_131_preview.png new file mode 100644 index 0000000..cd5b7b9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_131_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_131_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_131_preview_back.png new file mode 100644 index 0000000..f83514e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_131_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_132.png b/mods/u_skinsdb/u_skins/textures/character_132.png new file mode 100644 index 0000000..3568bf3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_132.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_132_preview.png b/mods/u_skinsdb/u_skins/textures/character_132_preview.png new file mode 100644 index 0000000..bc7ceb9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_132_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_132_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_132_preview_back.png new file mode 100644 index 0000000..30d3b81 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_132_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_133.png b/mods/u_skinsdb/u_skins/textures/character_133.png new file mode 100644 index 0000000..d55aa6a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_133.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_133_preview.png b/mods/u_skinsdb/u_skins/textures/character_133_preview.png new file mode 100644 index 0000000..4d4529f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_133_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_133_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_133_preview_back.png new file mode 100644 index 0000000..0946522 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_133_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_134.png b/mods/u_skinsdb/u_skins/textures/character_134.png new file mode 100644 index 0000000..df547db Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_134.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_134_preview.png b/mods/u_skinsdb/u_skins/textures/character_134_preview.png new file mode 100644 index 0000000..7c8963a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_134_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_134_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_134_preview_back.png new file mode 100644 index 0000000..3270893 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_134_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_135.png b/mods/u_skinsdb/u_skins/textures/character_135.png new file mode 100644 index 0000000..b3103b9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_135.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_135_preview.png b/mods/u_skinsdb/u_skins/textures/character_135_preview.png new file mode 100644 index 0000000..e22cee8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_135_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_135_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_135_preview_back.png new file mode 100644 index 0000000..1a9d1f5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_135_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_136.png b/mods/u_skinsdb/u_skins/textures/character_136.png new file mode 100644 index 0000000..dcac92f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_136.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_136_preview.png b/mods/u_skinsdb/u_skins/textures/character_136_preview.png new file mode 100644 index 0000000..b3ab692 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_136_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_136_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_136_preview_back.png new file mode 100644 index 0000000..2d4514e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_136_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_137.png b/mods/u_skinsdb/u_skins/textures/character_137.png new file mode 100644 index 0000000..439296e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_137.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_137_preview.png b/mods/u_skinsdb/u_skins/textures/character_137_preview.png new file mode 100644 index 0000000..3341716 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_137_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_137_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_137_preview_back.png new file mode 100644 index 0000000..c5e7b0f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_137_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_138.png b/mods/u_skinsdb/u_skins/textures/character_138.png new file mode 100644 index 0000000..0ac19a2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_138.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_138_preview.png b/mods/u_skinsdb/u_skins/textures/character_138_preview.png new file mode 100644 index 0000000..6cac2dc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_138_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_138_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_138_preview_back.png new file mode 100644 index 0000000..772bf7d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_138_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_139.png b/mods/u_skinsdb/u_skins/textures/character_139.png new file mode 100644 index 0000000..6c90431 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_139.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_139_preview.png b/mods/u_skinsdb/u_skins/textures/character_139_preview.png new file mode 100644 index 0000000..18a1e6f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_139_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_139_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_139_preview_back.png new file mode 100644 index 0000000..084fd80 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_139_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_13_preview.png b/mods/u_skinsdb/u_skins/textures/character_13_preview.png new file mode 100644 index 0000000..86cc44d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_13_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_13_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_13_preview_back.png new file mode 100644 index 0000000..4b594cc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_13_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_14.png b/mods/u_skinsdb/u_skins/textures/character_14.png new file mode 100644 index 0000000..3ca5b71 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_14.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_140.png b/mods/u_skinsdb/u_skins/textures/character_140.png new file mode 100644 index 0000000..af4b11e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_140.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_140_preview.png b/mods/u_skinsdb/u_skins/textures/character_140_preview.png new file mode 100644 index 0000000..4b9ecb7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_140_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_140_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_140_preview_back.png new file mode 100644 index 0000000..b9de3d8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_140_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_141.png b/mods/u_skinsdb/u_skins/textures/character_141.png new file mode 100644 index 0000000..b907736 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_141.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_141_preview.png b/mods/u_skinsdb/u_skins/textures/character_141_preview.png new file mode 100644 index 0000000..412585c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_141_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_141_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_141_preview_back.png new file mode 100644 index 0000000..9f184c8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_141_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_142.png b/mods/u_skinsdb/u_skins/textures/character_142.png new file mode 100644 index 0000000..718f48c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_142.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_142_preview.png b/mods/u_skinsdb/u_skins/textures/character_142_preview.png new file mode 100644 index 0000000..af7d02d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_142_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_142_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_142_preview_back.png new file mode 100644 index 0000000..9980efd Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_142_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_143.png b/mods/u_skinsdb/u_skins/textures/character_143.png new file mode 100644 index 0000000..6148977 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_143.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_143_preview.png b/mods/u_skinsdb/u_skins/textures/character_143_preview.png new file mode 100644 index 0000000..ec18328 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_143_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_143_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_143_preview_back.png new file mode 100644 index 0000000..7005a43 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_143_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_144.png b/mods/u_skinsdb/u_skins/textures/character_144.png new file mode 100644 index 0000000..5a43dea Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_144.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_144_preview.png b/mods/u_skinsdb/u_skins/textures/character_144_preview.png new file mode 100644 index 0000000..06f8fd7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_144_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_144_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_144_preview_back.png new file mode 100644 index 0000000..ebd0e6c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_144_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_145.png b/mods/u_skinsdb/u_skins/textures/character_145.png new file mode 100644 index 0000000..09bc2c3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_145.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_145_preview.png b/mods/u_skinsdb/u_skins/textures/character_145_preview.png new file mode 100644 index 0000000..abb1e9a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_145_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_145_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_145_preview_back.png new file mode 100644 index 0000000..070cd09 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_145_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_146.png b/mods/u_skinsdb/u_skins/textures/character_146.png new file mode 100644 index 0000000..cf346fd Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_146.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_146_preview.png b/mods/u_skinsdb/u_skins/textures/character_146_preview.png new file mode 100644 index 0000000..224365f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_146_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_146_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_146_preview_back.png new file mode 100644 index 0000000..1aae720 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_146_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_147.png b/mods/u_skinsdb/u_skins/textures/character_147.png new file mode 100644 index 0000000..c9ccaf3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_147.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_147_preview.png b/mods/u_skinsdb/u_skins/textures/character_147_preview.png new file mode 100644 index 0000000..a5deecf Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_147_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_147_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_147_preview_back.png new file mode 100644 index 0000000..94fc7dc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_147_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_148.png b/mods/u_skinsdb/u_skins/textures/character_148.png new file mode 100644 index 0000000..1371453 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_148.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_148_preview.png b/mods/u_skinsdb/u_skins/textures/character_148_preview.png new file mode 100644 index 0000000..a5deecf Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_148_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_148_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_148_preview_back.png new file mode 100644 index 0000000..f44f063 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_148_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_149.png b/mods/u_skinsdb/u_skins/textures/character_149.png new file mode 100644 index 0000000..1995674 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_149.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_149_preview.png b/mods/u_skinsdb/u_skins/textures/character_149_preview.png new file mode 100644 index 0000000..e7c9c3b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_149_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_149_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_149_preview_back.png new file mode 100644 index 0000000..0ab55eb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_149_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_14_preview.png b/mods/u_skinsdb/u_skins/textures/character_14_preview.png new file mode 100644 index 0000000..ce2ad9e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_14_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_14_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_14_preview_back.png new file mode 100644 index 0000000..6930673 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_14_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_15.png b/mods/u_skinsdb/u_skins/textures/character_15.png new file mode 100644 index 0000000..af62d7a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_15.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_150.png b/mods/u_skinsdb/u_skins/textures/character_150.png new file mode 100644 index 0000000..0ba6bae Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_150.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_150_preview.png b/mods/u_skinsdb/u_skins/textures/character_150_preview.png new file mode 100644 index 0000000..367b20e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_150_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_150_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_150_preview_back.png new file mode 100644 index 0000000..bff2dbc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_150_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_151.png b/mods/u_skinsdb/u_skins/textures/character_151.png new file mode 100644 index 0000000..f0e4e02 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_151.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_151_preview.png b/mods/u_skinsdb/u_skins/textures/character_151_preview.png new file mode 100644 index 0000000..dc64a92 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_151_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_151_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_151_preview_back.png new file mode 100644 index 0000000..b53688e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_151_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_152.png b/mods/u_skinsdb/u_skins/textures/character_152.png new file mode 100644 index 0000000..a0396f4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_152.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_152_preview.png b/mods/u_skinsdb/u_skins/textures/character_152_preview.png new file mode 100644 index 0000000..07f98c6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_152_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_152_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_152_preview_back.png new file mode 100644 index 0000000..e280a40 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_152_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_15_preview.png b/mods/u_skinsdb/u_skins/textures/character_15_preview.png new file mode 100644 index 0000000..32b30a2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_15_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_15_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_15_preview_back.png new file mode 100644 index 0000000..46c6fe1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_15_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_16.png b/mods/u_skinsdb/u_skins/textures/character_16.png new file mode 100644 index 0000000..f1658a2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_16.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_16_preview.png b/mods/u_skinsdb/u_skins/textures/character_16_preview.png new file mode 100644 index 0000000..2658672 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_16_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_16_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_16_preview_back.png new file mode 100644 index 0000000..81bd23d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_16_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_17.png b/mods/u_skinsdb/u_skins/textures/character_17.png new file mode 100644 index 0000000..35a8126 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_17.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_17_preview.png b/mods/u_skinsdb/u_skins/textures/character_17_preview.png new file mode 100644 index 0000000..ae8de0c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_17_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_17_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_17_preview_back.png new file mode 100644 index 0000000..118aafd Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_17_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_18.png b/mods/u_skinsdb/u_skins/textures/character_18.png new file mode 100644 index 0000000..ad53a91 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_18.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_18_preview.png b/mods/u_skinsdb/u_skins/textures/character_18_preview.png new file mode 100644 index 0000000..397b359 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_18_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_18_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_18_preview_back.png new file mode 100644 index 0000000..1e7f282 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_18_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_19.png b/mods/u_skinsdb/u_skins/textures/character_19.png new file mode 100644 index 0000000..9b32851 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_19.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_19_preview.png b/mods/u_skinsdb/u_skins/textures/character_19_preview.png new file mode 100644 index 0000000..9c95d73 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_19_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_19_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_19_preview_back.png new file mode 100644 index 0000000..173cf7a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_19_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_1_preview.png b/mods/u_skinsdb/u_skins/textures/character_1_preview.png new file mode 100644 index 0000000..6957a4e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_1_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_1_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_1_preview_back.png new file mode 100644 index 0000000..c266347 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_1_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_2.png b/mods/u_skinsdb/u_skins/textures/character_2.png new file mode 100644 index 0000000..d794b87 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_2.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_20.png b/mods/u_skinsdb/u_skins/textures/character_20.png new file mode 100644 index 0000000..690171c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_20.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_20_preview.png b/mods/u_skinsdb/u_skins/textures/character_20_preview.png new file mode 100644 index 0000000..5f067db Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_20_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_20_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_20_preview_back.png new file mode 100644 index 0000000..953b777 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_20_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_21.png b/mods/u_skinsdb/u_skins/textures/character_21.png new file mode 100644 index 0000000..a3d7b59 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_21.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_21_preview.png b/mods/u_skinsdb/u_skins/textures/character_21_preview.png new file mode 100644 index 0000000..ecf5d21 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_21_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_21_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_21_preview_back.png new file mode 100644 index 0000000..5e9c770 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_21_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_22.png b/mods/u_skinsdb/u_skins/textures/character_22.png new file mode 100644 index 0000000..388d9c5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_22.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_22_preview.png b/mods/u_skinsdb/u_skins/textures/character_22_preview.png new file mode 100644 index 0000000..e8fb9c7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_22_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_22_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_22_preview_back.png new file mode 100644 index 0000000..16dae88 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_22_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_23.png b/mods/u_skinsdb/u_skins/textures/character_23.png new file mode 100644 index 0000000..7181481 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_23.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_23_preview.png b/mods/u_skinsdb/u_skins/textures/character_23_preview.png new file mode 100644 index 0000000..674a10a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_23_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_23_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_23_preview_back.png new file mode 100644 index 0000000..8f39f0b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_23_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_24.png b/mods/u_skinsdb/u_skins/textures/character_24.png new file mode 100644 index 0000000..fe58fa0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_24.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_24_preview.png b/mods/u_skinsdb/u_skins/textures/character_24_preview.png new file mode 100644 index 0000000..382bf2d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_24_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_24_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_24_preview_back.png new file mode 100644 index 0000000..f40528d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_24_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_25.png b/mods/u_skinsdb/u_skins/textures/character_25.png new file mode 100644 index 0000000..d246e6c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_25.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_25_preview.png b/mods/u_skinsdb/u_skins/textures/character_25_preview.png new file mode 100644 index 0000000..01cf635 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_25_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_25_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_25_preview_back.png new file mode 100644 index 0000000..ab75cea Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_25_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_26.png b/mods/u_skinsdb/u_skins/textures/character_26.png new file mode 100644 index 0000000..98a6d34 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_26.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_26_preview.png b/mods/u_skinsdb/u_skins/textures/character_26_preview.png new file mode 100644 index 0000000..6a12bce Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_26_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_26_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_26_preview_back.png new file mode 100644 index 0000000..1859d9b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_26_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_27.png b/mods/u_skinsdb/u_skins/textures/character_27.png new file mode 100644 index 0000000..8d056ff Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_27.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_27_preview.png b/mods/u_skinsdb/u_skins/textures/character_27_preview.png new file mode 100644 index 0000000..a511dcf Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_27_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_27_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_27_preview_back.png new file mode 100644 index 0000000..e47e8d5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_27_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_28.png b/mods/u_skinsdb/u_skins/textures/character_28.png new file mode 100644 index 0000000..39b9bee Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_28.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_28_preview.png b/mods/u_skinsdb/u_skins/textures/character_28_preview.png new file mode 100644 index 0000000..8f6d0b1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_28_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_28_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_28_preview_back.png new file mode 100644 index 0000000..8a3d11e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_28_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_29.png b/mods/u_skinsdb/u_skins/textures/character_29.png new file mode 100644 index 0000000..357ecde Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_29.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_29_preview.png b/mods/u_skinsdb/u_skins/textures/character_29_preview.png new file mode 100644 index 0000000..4ae1e2c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_29_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_29_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_29_preview_back.png new file mode 100644 index 0000000..e9cc2c8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_29_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_2_preview.png b/mods/u_skinsdb/u_skins/textures/character_2_preview.png new file mode 100644 index 0000000..f7d80c8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_2_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_2_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_2_preview_back.png new file mode 100644 index 0000000..7e68646 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_2_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_3.png b/mods/u_skinsdb/u_skins/textures/character_3.png new file mode 100644 index 0000000..2d34c13 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_3.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_30.png b/mods/u_skinsdb/u_skins/textures/character_30.png new file mode 100644 index 0000000..6287c5c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_30.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_30_preview.png b/mods/u_skinsdb/u_skins/textures/character_30_preview.png new file mode 100644 index 0000000..892bfcc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_30_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_30_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_30_preview_back.png new file mode 100644 index 0000000..558ea29 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_30_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_31.png b/mods/u_skinsdb/u_skins/textures/character_31.png new file mode 100644 index 0000000..155671e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_31.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_31_preview.png b/mods/u_skinsdb/u_skins/textures/character_31_preview.png new file mode 100644 index 0000000..1f1565c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_31_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_31_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_31_preview_back.png new file mode 100644 index 0000000..e4e6147 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_31_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_32.png b/mods/u_skinsdb/u_skins/textures/character_32.png new file mode 100644 index 0000000..bf3adc6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_32.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_32_preview.png b/mods/u_skinsdb/u_skins/textures/character_32_preview.png new file mode 100644 index 0000000..5aa4eac Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_32_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_32_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_32_preview_back.png new file mode 100644 index 0000000..f588d5f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_32_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_33.png b/mods/u_skinsdb/u_skins/textures/character_33.png new file mode 100644 index 0000000..77e6603 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_33.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_33_preview.png b/mods/u_skinsdb/u_skins/textures/character_33_preview.png new file mode 100644 index 0000000..bb4bd81 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_33_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_33_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_33_preview_back.png new file mode 100644 index 0000000..d8772ba Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_33_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_34.png b/mods/u_skinsdb/u_skins/textures/character_34.png new file mode 100644 index 0000000..9f2eb1a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_34.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_34_preview.png b/mods/u_skinsdb/u_skins/textures/character_34_preview.png new file mode 100644 index 0000000..917ab68 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_34_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_34_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_34_preview_back.png new file mode 100644 index 0000000..15d8cbc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_34_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_35.png b/mods/u_skinsdb/u_skins/textures/character_35.png new file mode 100644 index 0000000..f8dba17 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_35.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_35_preview.png b/mods/u_skinsdb/u_skins/textures/character_35_preview.png new file mode 100644 index 0000000..64c969f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_35_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_35_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_35_preview_back.png new file mode 100644 index 0000000..0d512ee Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_35_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_36.png b/mods/u_skinsdb/u_skins/textures/character_36.png new file mode 100644 index 0000000..c434f0e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_36.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_36_preview.png b/mods/u_skinsdb/u_skins/textures/character_36_preview.png new file mode 100644 index 0000000..4b138e0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_36_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_36_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_36_preview_back.png new file mode 100644 index 0000000..3dfe51c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_36_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_37.png b/mods/u_skinsdb/u_skins/textures/character_37.png new file mode 100644 index 0000000..9087fdc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_37.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_37_preview.png b/mods/u_skinsdb/u_skins/textures/character_37_preview.png new file mode 100644 index 0000000..cf374ed Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_37_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_37_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_37_preview_back.png new file mode 100644 index 0000000..9fd620d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_37_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_38.png b/mods/u_skinsdb/u_skins/textures/character_38.png new file mode 100644 index 0000000..894ffcc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_38.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_38_preview.png b/mods/u_skinsdb/u_skins/textures/character_38_preview.png new file mode 100644 index 0000000..2d4d8ef Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_38_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_38_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_38_preview_back.png new file mode 100644 index 0000000..3c7fda8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_38_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_39.png b/mods/u_skinsdb/u_skins/textures/character_39.png new file mode 100644 index 0000000..19a35d2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_39.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_39_preview.png b/mods/u_skinsdb/u_skins/textures/character_39_preview.png new file mode 100644 index 0000000..02a7a6a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_39_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_39_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_39_preview_back.png new file mode 100644 index 0000000..0b95463 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_39_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_3_preview.png b/mods/u_skinsdb/u_skins/textures/character_3_preview.png new file mode 100644 index 0000000..fb3d4f4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_3_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_3_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_3_preview_back.png new file mode 100644 index 0000000..ab23e6a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_3_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_4.png b/mods/u_skinsdb/u_skins/textures/character_4.png new file mode 100644 index 0000000..ca604be Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_4.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_40.png b/mods/u_skinsdb/u_skins/textures/character_40.png new file mode 100644 index 0000000..690cd25 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_40.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_40_preview.png b/mods/u_skinsdb/u_skins/textures/character_40_preview.png new file mode 100644 index 0000000..e84fdd0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_40_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_40_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_40_preview_back.png new file mode 100644 index 0000000..81cbe5e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_40_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_41.png b/mods/u_skinsdb/u_skins/textures/character_41.png new file mode 100644 index 0000000..5ab5128 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_41.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_41_preview.png b/mods/u_skinsdb/u_skins/textures/character_41_preview.png new file mode 100644 index 0000000..fd64f85 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_41_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_41_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_41_preview_back.png new file mode 100644 index 0000000..d18a5da Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_41_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_42.png b/mods/u_skinsdb/u_skins/textures/character_42.png new file mode 100644 index 0000000..b5b2a79 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_42.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_42_preview.png b/mods/u_skinsdb/u_skins/textures/character_42_preview.png new file mode 100644 index 0000000..54375bf Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_42_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_42_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_42_preview_back.png new file mode 100644 index 0000000..2658516 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_42_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_43.png b/mods/u_skinsdb/u_skins/textures/character_43.png new file mode 100644 index 0000000..67044f1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_43.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_43_preview.png b/mods/u_skinsdb/u_skins/textures/character_43_preview.png new file mode 100644 index 0000000..fcea1c8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_43_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_43_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_43_preview_back.png new file mode 100644 index 0000000..d568a03 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_43_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_44.png b/mods/u_skinsdb/u_skins/textures/character_44.png new file mode 100644 index 0000000..155671e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_44.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_44_preview.png b/mods/u_skinsdb/u_skins/textures/character_44_preview.png new file mode 100644 index 0000000..1f1565c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_44_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_44_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_44_preview_back.png new file mode 100644 index 0000000..e4e6147 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_44_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_45.png b/mods/u_skinsdb/u_skins/textures/character_45.png new file mode 100644 index 0000000..689653b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_45.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_45_preview.png b/mods/u_skinsdb/u_skins/textures/character_45_preview.png new file mode 100644 index 0000000..1ac9f79 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_45_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_45_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_45_preview_back.png new file mode 100644 index 0000000..96175de Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_45_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_46.png b/mods/u_skinsdb/u_skins/textures/character_46.png new file mode 100644 index 0000000..a7d417b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_46.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_46_preview.png b/mods/u_skinsdb/u_skins/textures/character_46_preview.png new file mode 100644 index 0000000..d36d387 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_46_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_46_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_46_preview_back.png new file mode 100644 index 0000000..87bf94d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_46_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_47.png b/mods/u_skinsdb/u_skins/textures/character_47.png new file mode 100644 index 0000000..0029863 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_47.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_47_preview.png b/mods/u_skinsdb/u_skins/textures/character_47_preview.png new file mode 100644 index 0000000..9d7503b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_47_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_47_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_47_preview_back.png new file mode 100644 index 0000000..180b743 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_47_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_48.png b/mods/u_skinsdb/u_skins/textures/character_48.png new file mode 100644 index 0000000..ba9160d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_48.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_48_preview.png b/mods/u_skinsdb/u_skins/textures/character_48_preview.png new file mode 100644 index 0000000..6f375cc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_48_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_48_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_48_preview_back.png new file mode 100644 index 0000000..afb88d0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_48_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_49.png b/mods/u_skinsdb/u_skins/textures/character_49.png new file mode 100644 index 0000000..46d5baf Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_49.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_49_preview.png b/mods/u_skinsdb/u_skins/textures/character_49_preview.png new file mode 100644 index 0000000..3fa27c0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_49_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_49_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_49_preview_back.png new file mode 100644 index 0000000..8e9838f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_49_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_4_preview.png b/mods/u_skinsdb/u_skins/textures/character_4_preview.png new file mode 100644 index 0000000..4015e87 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_4_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_4_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_4_preview_back.png new file mode 100644 index 0000000..7e79b2d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_4_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_5.png b/mods/u_skinsdb/u_skins/textures/character_5.png new file mode 100644 index 0000000..bccb4bb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_5.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_50.png b/mods/u_skinsdb/u_skins/textures/character_50.png new file mode 100644 index 0000000..6341b18 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_50.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_50_preview.png b/mods/u_skinsdb/u_skins/textures/character_50_preview.png new file mode 100644 index 0000000..84b4081 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_50_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_50_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_50_preview_back.png new file mode 100644 index 0000000..4ca0e48 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_50_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_51.png b/mods/u_skinsdb/u_skins/textures/character_51.png new file mode 100644 index 0000000..91df4ce Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_51.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_51_preview.png b/mods/u_skinsdb/u_skins/textures/character_51_preview.png new file mode 100644 index 0000000..af7d02d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_51_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_51_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_51_preview_back.png new file mode 100644 index 0000000..9980efd Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_51_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_52.png b/mods/u_skinsdb/u_skins/textures/character_52.png new file mode 100644 index 0000000..a1c44e1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_52.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_52_preview.png b/mods/u_skinsdb/u_skins/textures/character_52_preview.png new file mode 100644 index 0000000..61bbc1e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_52_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_52_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_52_preview_back.png new file mode 100644 index 0000000..7271d30 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_52_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_53.png b/mods/u_skinsdb/u_skins/textures/character_53.png new file mode 100644 index 0000000..fac09e7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_53.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_53_preview.png b/mods/u_skinsdb/u_skins/textures/character_53_preview.png new file mode 100644 index 0000000..739797b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_53_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_53_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_53_preview_back.png new file mode 100644 index 0000000..b8979c6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_53_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_54.png b/mods/u_skinsdb/u_skins/textures/character_54.png new file mode 100644 index 0000000..123dc19 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_54.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_54_preview.png b/mods/u_skinsdb/u_skins/textures/character_54_preview.png new file mode 100644 index 0000000..25f4d34 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_54_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_54_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_54_preview_back.png new file mode 100644 index 0000000..9b2e14b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_54_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_55.png b/mods/u_skinsdb/u_skins/textures/character_55.png new file mode 100644 index 0000000..f0e161c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_55.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_55_preview.png b/mods/u_skinsdb/u_skins/textures/character_55_preview.png new file mode 100644 index 0000000..c93f4e9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_55_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_55_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_55_preview_back.png new file mode 100644 index 0000000..265b602 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_55_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_56.png b/mods/u_skinsdb/u_skins/textures/character_56.png new file mode 100644 index 0000000..9ad319c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_56.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_56_preview.png b/mods/u_skinsdb/u_skins/textures/character_56_preview.png new file mode 100644 index 0000000..04bc09b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_56_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_56_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_56_preview_back.png new file mode 100644 index 0000000..38d1f91 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_56_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_57.png b/mods/u_skinsdb/u_skins/textures/character_57.png new file mode 100644 index 0000000..970fcc0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_57.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_57_preview.png b/mods/u_skinsdb/u_skins/textures/character_57_preview.png new file mode 100644 index 0000000..592a267 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_57_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_57_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_57_preview_back.png new file mode 100644 index 0000000..35a9a32 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_57_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_58.png b/mods/u_skinsdb/u_skins/textures/character_58.png new file mode 100644 index 0000000..bce67c5 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_58.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_58_preview.png b/mods/u_skinsdb/u_skins/textures/character_58_preview.png new file mode 100644 index 0000000..525a7f2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_58_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_58_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_58_preview_back.png new file mode 100644 index 0000000..3a7c0e4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_58_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_59.png b/mods/u_skinsdb/u_skins/textures/character_59.png new file mode 100644 index 0000000..dfff44d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_59.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_59_preview.png b/mods/u_skinsdb/u_skins/textures/character_59_preview.png new file mode 100644 index 0000000..3146c1e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_59_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_59_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_59_preview_back.png new file mode 100644 index 0000000..e6ad691 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_59_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_5_preview.png b/mods/u_skinsdb/u_skins/textures/character_5_preview.png new file mode 100644 index 0000000..c379a8f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_5_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_5_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_5_preview_back.png new file mode 100644 index 0000000..0744de8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_5_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_6.png b/mods/u_skinsdb/u_skins/textures/character_6.png new file mode 100644 index 0000000..bb2f94a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_6.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_60.png b/mods/u_skinsdb/u_skins/textures/character_60.png new file mode 100644 index 0000000..a066956 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_60.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_60_preview.png b/mods/u_skinsdb/u_skins/textures/character_60_preview.png new file mode 100644 index 0000000..3bb00e7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_60_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_60_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_60_preview_back.png new file mode 100644 index 0000000..0226430 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_60_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_61.png b/mods/u_skinsdb/u_skins/textures/character_61.png new file mode 100644 index 0000000..184b1a6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_61.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_61_preview.png b/mods/u_skinsdb/u_skins/textures/character_61_preview.png new file mode 100644 index 0000000..858c43b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_61_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_61_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_61_preview_back.png new file mode 100644 index 0000000..eaa15b2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_61_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_62.png b/mods/u_skinsdb/u_skins/textures/character_62.png new file mode 100644 index 0000000..bb21063 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_62.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_62_preview.png b/mods/u_skinsdb/u_skins/textures/character_62_preview.png new file mode 100644 index 0000000..cace83f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_62_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_62_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_62_preview_back.png new file mode 100644 index 0000000..ada52b3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_62_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_63.png b/mods/u_skinsdb/u_skins/textures/character_63.png new file mode 100644 index 0000000..7dec4b9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_63.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_63_preview.png b/mods/u_skinsdb/u_skins/textures/character_63_preview.png new file mode 100644 index 0000000..be367ee Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_63_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_63_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_63_preview_back.png new file mode 100644 index 0000000..737cadc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_63_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_64.png b/mods/u_skinsdb/u_skins/textures/character_64.png new file mode 100644 index 0000000..d810e23 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_64.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_64_preview.png b/mods/u_skinsdb/u_skins/textures/character_64_preview.png new file mode 100644 index 0000000..295dde0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_64_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_64_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_64_preview_back.png new file mode 100644 index 0000000..e4f5208 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_64_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_65.png b/mods/u_skinsdb/u_skins/textures/character_65.png new file mode 100644 index 0000000..e61d663 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_65.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_65_preview.png b/mods/u_skinsdb/u_skins/textures/character_65_preview.png new file mode 100644 index 0000000..fc2260d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_65_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_65_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_65_preview_back.png new file mode 100644 index 0000000..878ce17 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_65_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_66.png b/mods/u_skinsdb/u_skins/textures/character_66.png new file mode 100644 index 0000000..76f7821 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_66.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_66_preview.png b/mods/u_skinsdb/u_skins/textures/character_66_preview.png new file mode 100644 index 0000000..4a0d9d1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_66_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_66_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_66_preview_back.png new file mode 100644 index 0000000..a1ff9db Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_66_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_67.png b/mods/u_skinsdb/u_skins/textures/character_67.png new file mode 100644 index 0000000..f2c502f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_67.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_67_preview.png b/mods/u_skinsdb/u_skins/textures/character_67_preview.png new file mode 100644 index 0000000..58d12b6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_67_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_67_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_67_preview_back.png new file mode 100644 index 0000000..fcdd17f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_67_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_68.png b/mods/u_skinsdb/u_skins/textures/character_68.png new file mode 100644 index 0000000..5096a69 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_68.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_68_preview.png b/mods/u_skinsdb/u_skins/textures/character_68_preview.png new file mode 100644 index 0000000..5d36cb8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_68_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_68_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_68_preview_back.png new file mode 100644 index 0000000..5a0ce47 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_68_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_69.png b/mods/u_skinsdb/u_skins/textures/character_69.png new file mode 100644 index 0000000..cd78624 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_69.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_69_preview.png b/mods/u_skinsdb/u_skins/textures/character_69_preview.png new file mode 100644 index 0000000..0c55691 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_69_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_69_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_69_preview_back.png new file mode 100644 index 0000000..9ecc0e2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_69_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_6_preview.png b/mods/u_skinsdb/u_skins/textures/character_6_preview.png new file mode 100644 index 0000000..8635912 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_6_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_6_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_6_preview_back.png new file mode 100644 index 0000000..6915523 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_6_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_7.png b/mods/u_skinsdb/u_skins/textures/character_7.png new file mode 100644 index 0000000..b26cb07 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_7.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_70.png b/mods/u_skinsdb/u_skins/textures/character_70.png new file mode 100644 index 0000000..3782f04 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_70.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_70_preview.png b/mods/u_skinsdb/u_skins/textures/character_70_preview.png new file mode 100644 index 0000000..bb4236a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_70_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_70_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_70_preview_back.png new file mode 100644 index 0000000..d8c0fd8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_70_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_71.png b/mods/u_skinsdb/u_skins/textures/character_71.png new file mode 100644 index 0000000..08f19fa Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_71.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_71_preview.png b/mods/u_skinsdb/u_skins/textures/character_71_preview.png new file mode 100644 index 0000000..f14ebff Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_71_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_71_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_71_preview_back.png new file mode 100644 index 0000000..f88055a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_71_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_72.png b/mods/u_skinsdb/u_skins/textures/character_72.png new file mode 100644 index 0000000..201a717 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_72.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_72_preview.png b/mods/u_skinsdb/u_skins/textures/character_72_preview.png new file mode 100644 index 0000000..22b561c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_72_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_72_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_72_preview_back.png new file mode 100644 index 0000000..91370e1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_72_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_73.png b/mods/u_skinsdb/u_skins/textures/character_73.png new file mode 100644 index 0000000..4cf5e4e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_73.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_73_preview.png b/mods/u_skinsdb/u_skins/textures/character_73_preview.png new file mode 100644 index 0000000..f096dc2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_73_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_73_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_73_preview_back.png new file mode 100644 index 0000000..490a927 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_73_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_74.png b/mods/u_skinsdb/u_skins/textures/character_74.png new file mode 100644 index 0000000..89f9cda Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_74.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_74_preview.png b/mods/u_skinsdb/u_skins/textures/character_74_preview.png new file mode 100644 index 0000000..e57d324 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_74_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_74_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_74_preview_back.png new file mode 100644 index 0000000..28bbd6c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_74_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_75.png b/mods/u_skinsdb/u_skins/textures/character_75.png new file mode 100644 index 0000000..a34fc46 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_75.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_75_preview.png b/mods/u_skinsdb/u_skins/textures/character_75_preview.png new file mode 100644 index 0000000..77d992b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_75_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_75_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_75_preview_back.png new file mode 100644 index 0000000..2d961c1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_75_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_76.png b/mods/u_skinsdb/u_skins/textures/character_76.png new file mode 100644 index 0000000..1a8d2f8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_76.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_76_preview.png b/mods/u_skinsdb/u_skins/textures/character_76_preview.png new file mode 100644 index 0000000..aa03c78 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_76_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_76_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_76_preview_back.png new file mode 100644 index 0000000..8ef14be Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_76_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_77.png b/mods/u_skinsdb/u_skins/textures/character_77.png new file mode 100644 index 0000000..41c23dc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_77.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_77_preview.png b/mods/u_skinsdb/u_skins/textures/character_77_preview.png new file mode 100644 index 0000000..fd3c045 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_77_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_77_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_77_preview_back.png new file mode 100644 index 0000000..8816ae4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_77_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_78.png b/mods/u_skinsdb/u_skins/textures/character_78.png new file mode 100644 index 0000000..f0e492e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_78.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_78_preview.png b/mods/u_skinsdb/u_skins/textures/character_78_preview.png new file mode 100644 index 0000000..b900104 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_78_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_78_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_78_preview_back.png new file mode 100644 index 0000000..f9e9adb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_78_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_79.png b/mods/u_skinsdb/u_skins/textures/character_79.png new file mode 100644 index 0000000..f0e492e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_79.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_79_preview.png b/mods/u_skinsdb/u_skins/textures/character_79_preview.png new file mode 100644 index 0000000..b900104 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_79_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_79_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_79_preview_back.png new file mode 100644 index 0000000..f9e9adb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_79_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_7_preview.png b/mods/u_skinsdb/u_skins/textures/character_7_preview.png new file mode 100644 index 0000000..69b7ae8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_7_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_7_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_7_preview_back.png new file mode 100644 index 0000000..ed5a409 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_7_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_8.png b/mods/u_skinsdb/u_skins/textures/character_8.png new file mode 100644 index 0000000..119a2e8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_8.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_80.png b/mods/u_skinsdb/u_skins/textures/character_80.png new file mode 100644 index 0000000..966b87c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_80.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_80_preview.png b/mods/u_skinsdb/u_skins/textures/character_80_preview.png new file mode 100644 index 0000000..e3350f7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_80_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_80_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_80_preview_back.png new file mode 100644 index 0000000..9625e6d Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_80_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_81.png b/mods/u_skinsdb/u_skins/textures/character_81.png new file mode 100644 index 0000000..e9abfa6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_81.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_81_preview.png b/mods/u_skinsdb/u_skins/textures/character_81_preview.png new file mode 100644 index 0000000..ae5218b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_81_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_81_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_81_preview_back.png new file mode 100644 index 0000000..eebd617 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_81_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_82.png b/mods/u_skinsdb/u_skins/textures/character_82.png new file mode 100644 index 0000000..b76eab2 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_82.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_82_preview.png b/mods/u_skinsdb/u_skins/textures/character_82_preview.png new file mode 100644 index 0000000..7a7f505 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_82_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_82_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_82_preview_back.png new file mode 100644 index 0000000..ebd9e07 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_82_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_83.png b/mods/u_skinsdb/u_skins/textures/character_83.png new file mode 100644 index 0000000..736a3e6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_83.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_83_preview.png b/mods/u_skinsdb/u_skins/textures/character_83_preview.png new file mode 100644 index 0000000..ff1fccb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_83_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_83_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_83_preview_back.png new file mode 100644 index 0000000..7ac37dc Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_83_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_84.png b/mods/u_skinsdb/u_skins/textures/character_84.png new file mode 100644 index 0000000..5fb4b0e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_84.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_84_preview.png b/mods/u_skinsdb/u_skins/textures/character_84_preview.png new file mode 100644 index 0000000..294bf74 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_84_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_84_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_84_preview_back.png new file mode 100644 index 0000000..c6b2c3b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_84_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_85.png b/mods/u_skinsdb/u_skins/textures/character_85.png new file mode 100644 index 0000000..0a88174 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_85.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_85_preview.png b/mods/u_skinsdb/u_skins/textures/character_85_preview.png new file mode 100644 index 0000000..da39742 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_85_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_85_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_85_preview_back.png new file mode 100644 index 0000000..82fd341 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_85_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_86.png b/mods/u_skinsdb/u_skins/textures/character_86.png new file mode 100644 index 0000000..af4b11e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_86.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_86_preview.png b/mods/u_skinsdb/u_skins/textures/character_86_preview.png new file mode 100644 index 0000000..4b9ecb7 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_86_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_86_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_86_preview_back.png new file mode 100644 index 0000000..b9de3d8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_86_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_87.png b/mods/u_skinsdb/u_skins/textures/character_87.png new file mode 100644 index 0000000..46b4aeb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_87.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_87_preview.png b/mods/u_skinsdb/u_skins/textures/character_87_preview.png new file mode 100644 index 0000000..9a3de3f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_87_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_87_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_87_preview_back.png new file mode 100644 index 0000000..0297359 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_87_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_88.png b/mods/u_skinsdb/u_skins/textures/character_88.png new file mode 100644 index 0000000..d665f18 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_88.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_88_preview.png b/mods/u_skinsdb/u_skins/textures/character_88_preview.png new file mode 100644 index 0000000..73e3789 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_88_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_88_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_88_preview_back.png new file mode 100644 index 0000000..ca1ce5e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_88_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_89.png b/mods/u_skinsdb/u_skins/textures/character_89.png new file mode 100644 index 0000000..35daa35 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_89.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_89_preview.png b/mods/u_skinsdb/u_skins/textures/character_89_preview.png new file mode 100644 index 0000000..242e5f8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_89_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_89_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_89_preview_back.png new file mode 100644 index 0000000..5d2d766 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_89_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_8_preview.png b/mods/u_skinsdb/u_skins/textures/character_8_preview.png new file mode 100644 index 0000000..2e8c26c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_8_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_8_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_8_preview_back.png new file mode 100644 index 0000000..ce2b2b1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_8_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_9.png b/mods/u_skinsdb/u_skins/textures/character_9.png new file mode 100644 index 0000000..cf6e54b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_9.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_90.png b/mods/u_skinsdb/u_skins/textures/character_90.png new file mode 100644 index 0000000..e38cf06 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_90.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_90_preview.png b/mods/u_skinsdb/u_skins/textures/character_90_preview.png new file mode 100644 index 0000000..b256dd1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_90_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_90_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_90_preview_back.png new file mode 100644 index 0000000..8f68d4a Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_90_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_91.png b/mods/u_skinsdb/u_skins/textures/character_91.png new file mode 100644 index 0000000..4ccade6 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_91.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_91_preview.png b/mods/u_skinsdb/u_skins/textures/character_91_preview.png new file mode 100644 index 0000000..c3c24b4 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_91_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_91_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_91_preview_back.png new file mode 100644 index 0000000..08783ba Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_91_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_92.png b/mods/u_skinsdb/u_skins/textures/character_92.png new file mode 100644 index 0000000..c050ff9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_92.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_92_preview.png b/mods/u_skinsdb/u_skins/textures/character_92_preview.png new file mode 100644 index 0000000..9bd1bea Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_92_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_92_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_92_preview_back.png new file mode 100644 index 0000000..9bd1bea Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_92_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_93.png b/mods/u_skinsdb/u_skins/textures/character_93.png new file mode 100644 index 0000000..b6624f1 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_93.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_93_preview.png b/mods/u_skinsdb/u_skins/textures/character_93_preview.png new file mode 100644 index 0000000..5065e86 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_93_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_93_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_93_preview_back.png new file mode 100644 index 0000000..7e5ac3c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_93_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_94.png b/mods/u_skinsdb/u_skins/textures/character_94.png new file mode 100644 index 0000000..109b11f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_94.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_94_preview.png b/mods/u_skinsdb/u_skins/textures/character_94_preview.png new file mode 100644 index 0000000..f3304eb Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_94_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_94_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_94_preview_back.png new file mode 100644 index 0000000..ec676ca Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_94_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_95.png b/mods/u_skinsdb/u_skins/textures/character_95.png new file mode 100644 index 0000000..c4566c3 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_95.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_95_preview.png b/mods/u_skinsdb/u_skins/textures/character_95_preview.png new file mode 100644 index 0000000..e64c9ea Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_95_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_95_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_95_preview_back.png new file mode 100644 index 0000000..7e68646 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_95_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_96.png b/mods/u_skinsdb/u_skins/textures/character_96.png new file mode 100644 index 0000000..205d2a8 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_96.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_96_preview.png b/mods/u_skinsdb/u_skins/textures/character_96_preview.png new file mode 100644 index 0000000..fddc954 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_96_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_96_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_96_preview_back.png new file mode 100644 index 0000000..7e223bf Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_96_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_97.png b/mods/u_skinsdb/u_skins/textures/character_97.png new file mode 100644 index 0000000..fa0385c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_97.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_97_preview.png b/mods/u_skinsdb/u_skins/textures/character_97_preview.png new file mode 100644 index 0000000..248ca34 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_97_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_97_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_97_preview_back.png new file mode 100644 index 0000000..7ad7e5b Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_97_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_98.png b/mods/u_skinsdb/u_skins/textures/character_98.png new file mode 100644 index 0000000..40cf510 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_98.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_98_preview.png b/mods/u_skinsdb/u_skins/textures/character_98_preview.png new file mode 100644 index 0000000..251733e Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_98_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_98_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_98_preview_back.png new file mode 100644 index 0000000..c672be0 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_98_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_99.png b/mods/u_skinsdb/u_skins/textures/character_99.png new file mode 100644 index 0000000..817b91c Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_99.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_99_preview.png b/mods/u_skinsdb/u_skins/textures/character_99_preview.png new file mode 100644 index 0000000..39c920f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_99_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_99_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_99_preview_back.png new file mode 100644 index 0000000..0cf8ba9 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_99_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_9_preview.png b/mods/u_skinsdb/u_skins/textures/character_9_preview.png new file mode 100644 index 0000000..c431244 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_9_preview.png differ diff --git a/mods/u_skinsdb/u_skins/textures/character_9_preview_back.png b/mods/u_skinsdb/u_skins/textures/character_9_preview_back.png new file mode 100644 index 0000000..627ec96 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/character_9_preview_back.png differ diff --git a/mods/u_skinsdb/u_skins/textures/inventory_plus_skins.png b/mods/u_skinsdb/u_skins/textures/inventory_plus_skins.png new file mode 100644 index 0000000..781b42f Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/inventory_plus_skins.png differ diff --git a/mods/u_skinsdb/u_skins/textures/u_skins_button.png b/mods/u_skinsdb/u_skins/textures/u_skins_button.png new file mode 100644 index 0000000..cb49531 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/u_skins_button.png differ diff --git a/mods/u_skinsdb/u_skins/textures/ui_misc_form.png b/mods/u_skinsdb/u_skins/textures/ui_misc_form.png new file mode 100644 index 0000000..d34d326 Binary files /dev/null and b/mods/u_skinsdb/u_skins/textures/ui_misc_form.png differ diff --git a/mods/u_skinsdb/update_from_db.py b/mods/u_skinsdb/update_from_db.py new file mode 100644 index 0000000..193c87d --- /dev/null +++ b/mods/u_skinsdb/update_from_db.py @@ -0,0 +1,46 @@ +#!/usr/bin/python3 +from http.client import HTTPConnection +import json +import base64 + +server = "minetest.fensta.bplaced.net" +skinsdir = "u_skins/textures/" +metadir = "u_skins/meta/" +i = 1 +pages = 0 + +c = HTTPConnection(server) +def addpage(page): + global i, pages + print( "Page: "+str(page)) + try: + c.request("GET","/api/get.json.php?getlist&page="+str(page)+"&outformat=base64") + r = c.getresponse() + except StandardError: + c.request("GET","/api/get.json.php?getlist&page="+str(page)+"&outformat=base64") + r = c.getresponse() + if r.status != 200: + print("Error", r.status) + exit(r.status) + data = r.read().decode() + l = json.loads(data) + if not l["success"]: + print("Success != True") + exit(1) + pages = int(l["pages"]) + for s in l["skins"]: + f = open(skinsdir+"character_"+str(i)+".png",'wb') + f.write(base64.b64decode(s["img"])) + f.close() + f = open(metadir+"character_"+str(i)+".txt",'w') + f.write('name = "'+s["name"]+'",\n') + f.write('author = "'+s["author"]+'",\n') + f.write('comment = "'+s["license"]+'",\n') + f.close() + i = i + 1 +addpage(1) +if pages > 1: + for p in range(pages-1): + addpage(p+2) +print("Skins have been updated. Please run ./generate_previews.sh") + diff --git a/mods/u_skinsdb/update_from_db2.py b/mods/u_skinsdb/update_from_db2.py new file mode 100644 index 0000000..0afe1c9 --- /dev/null +++ b/mods/u_skinsdb/update_from_db2.py @@ -0,0 +1,45 @@ +#!/usr/bin/python3 +#from http.client import HTTPConnection +import json +import base64 +import requests + +server = "minetest.fensta.bplaced.net" +skinsdir = "u_skins/textures/" +metadir = "u_skins/meta/" +i = 1 +pages = 0 + +#c = HTTPConnection(server) +def addpage(page): + global i, pages + print( "Page: "+str(page)) + try: + #c.request("GET","/api/get.json.php?getlist&page="+str(page)+"&outformat=base64") + #r = c.getresponse() + r = requests.get("http://"+str(server)+"/api/get.json.php?getlist&page="+str(page)+"&outformat=base64") + except StandardError: + print("Error", r.status) + exit(r.status) + data = r.text + l = json.loads(data) + if not l["success"]: + print("Success != True") + exit(1) + pages = int(l["pages"]) + for s in l["skins"]: + f = open(skinsdir+"character_"+str(i)+".png",'wb') + f.write(base64.b64decode(s["img"])) + f.close() + f = open(metadir+"character_"+str(i)+".txt",'w') + f.write('name = "'+s["name"]+'",\n') + f.write('author = "'+s["author"]+'",\n') + f.write('comment = "'+s["license"]+'",\n') + f.close() + i = i + 1 +addpage(1) +if pages > 1: + for p in range(pages-1): + addpage(p+2) +print("Skins have been updated. Please run ./generate_previews.sh") + diff --git a/mods/unified_inventory/README.md b/mods/unified_inventory/README.md new file mode 100644 index 0000000..6f5e2d4 --- /dev/null +++ b/mods/unified_inventory/README.md @@ -0,0 +1,22 @@ +Unified inventory +================= + +Unified Inventory replaces the default survival and creative inventory. +It adds a nicer interface and a number of features, such as a crafting guide. + +License +======= + +Copyright (C) 2012-2014 Maciej Kasatkin (RealBadAngel) + +Unified inventory code is licensed under the GNU LGPLv2+. + +Licenses for textures: + +VanessaE: (WTFPL) + * ui\_group.png + +RealBadAngel: (WTFPL) + * Everything else. + + diff --git a/mods/unified_inventory/api.lua b/mods/unified_inventory/api.lua new file mode 100644 index 0000000..5f74ea7 --- /dev/null +++ b/mods/unified_inventory/api.lua @@ -0,0 +1,215 @@ +local S = unified_inventory.gettext + +-- Create detached creative inventory after loading all mods +minetest.after(0.01, function() + local rev_aliases = {} + for source, target in pairs(minetest.registered_aliases) do + if not rev_aliases[target] then rev_aliases[target] = {} end + table.insert(rev_aliases[target], source) + end + unified_inventory.items_list = {} + for name, def in pairs(minetest.registered_items) do + if (not def.groups.not_in_creative_inventory or + def.groups.not_in_creative_inventory == 0) and + def.description and def.description ~= "" then + table.insert(unified_inventory.items_list, name) + local all_names = rev_aliases[name] or {} + table.insert(all_names, name) + for _, name in ipairs(all_names) do + local recipes = minetest.get_all_craft_recipes(name) + if recipes then + for _, recipe in ipairs(recipes) do + unified_inventory.register_craft(recipe) + end + end + end + end + end + table.sort(unified_inventory.items_list) + unified_inventory.items_list_size = #unified_inventory.items_list + print("Unified Inventory. inventory size: "..unified_inventory.items_list_size) + for _, name in ipairs(unified_inventory.items_list) do + local def = minetest.registered_items[name] + if type(def.drop) == "string" then + local dstack = ItemStack(def.drop) + if not dstack:is_empty() and dstack:get_name() ~= name then + unified_inventory.register_craft({ + type = "digging", + items = {name}, + output = def.drop, + width = 0, + }) + + end + end + end + for _, recipes in pairs(unified_inventory.crafts_for.recipe) do + for _, recipe in ipairs(recipes) do + local ingredient_items = {} + for _, spec in ipairs(recipe.items) do + local matches_spec = unified_inventory.canonical_item_spec_matcher(spec) + for _, name in ipairs(unified_inventory.items_list) do + if matches_spec(name) then + ingredient_items[name] = true + end + end + end + for name, _ in pairs(ingredient_items) do + if unified_inventory.crafts_for.usage[name] == nil then + unified_inventory.crafts_for.usage[name] = {} + end + table.insert(unified_inventory.crafts_for.usage[name], recipe) + end + end + end +end) + + +-- load_home +local function load_home() + local input = io.open(unified_inventory.home_filename, "r") + if not input then + unified_inventory.home_pos = {} + return + end + while true do + local x = input:read("*n") + if not x then break end + local y = input:read("*n") + local z = input:read("*n") + local name = input:read("*l") + unified_inventory.home_pos[name:sub(2)] = {x = x, y = y, z = z} + end + io.close(input) +end +load_home() + +function unified_inventory.set_home(player, pos) + local player_name = player:get_player_name() + unified_inventory.home_pos[player_name] = vector.round(pos) + -- save the home data from the table to the file + local output = io.open(unified_inventory.home_filename, "w") + for k, v in pairs(unified_inventory.home_pos) do + output:write(v.x.." "..v.y.." "..v.z.." "..k.."\n") + end + io.close(output) +end + +function unified_inventory.go_home(player) + local pos = unified_inventory.home_pos[player:get_player_name()] + if pos then + player:setpos(pos) + end +end + +-- register_craft +function unified_inventory.register_craft(options) + if options.output == nil then + return + end + local itemstack = ItemStack(options.output) + if itemstack:is_empty() then + return + end + if options.type == "normal" and options.width == 0 then + options = { type = "shapeless", items = options.items, output = options.output, width = 0 } + end + if unified_inventory.crafts_for.recipe[itemstack:get_name()] == nil then + unified_inventory.crafts_for.recipe[itemstack:get_name()] = {} + end + table.insert(unified_inventory.crafts_for.recipe[itemstack:get_name()],options) +end + + +local craft_type_defaults = { + width = 3, + height = 3, + uses_crafting_grid = false, +} + + +function unified_inventory.craft_type_defaults(name, options) + if not options.description then + options.description = name + end + setmetatable(options, {__index = craft_type_defaults}) + return options +end + + +function unified_inventory.register_craft_type(name, options) + unified_inventory.registered_craft_types[name] = + unified_inventory.craft_type_defaults(name, options) +end + + +unified_inventory.register_craft_type("normal", { + description = "Crafting", + icon = "ui_craftgrid_icon.png", + width = 3, + height = 3, + get_shaped_craft_width = function (craft) return craft.width end, + dynamic_display_size = function (craft) + local w = craft.width + local h = math.ceil(table.maxn(craft.items) / craft.width) + local g = w < h and h or w + return { width = g, height = g } + end, + uses_crafting_grid = true, +}) + + +unified_inventory.register_craft_type("shapeless", { + description = "Mixing", + icon = "ui_craftgrid_icon.png", + width = 3, + height = 3, + dynamic_display_size = function (craft) + local maxn = table.maxn(craft.items) + local g = 1 + while g*g < maxn do g = g + 1 end + return { width = g, height = g } + end, + uses_crafting_grid = true, +}) + + +unified_inventory.register_craft_type("cooking", { + description = "Cooking", + icon = "default_furnace_front.png", + width = 1, + height = 1, +}) + + +unified_inventory.register_craft_type("digging", { + description = "Digging", + icon = "default_tool_steelpick.png", + width = 1, + height = 1, +}) + + +function unified_inventory.register_page(name, def) + unified_inventory.pages[name] = def +end + + +function unified_inventory.register_button(name, def) + if not def.action then + def.action = function(player) + unified_inventory.set_inventory_formspec(player, name) + end + end + def.name = name + table.insert(unified_inventory.buttons, def) +end + + +function unified_inventory.is_creative(playername) + if minetest.check_player_privs(playername, {creative=true}) or + minetest.setting_getbool("creative_mode") then + return true + end +end + diff --git a/mods/unified_inventory/bags.lua b/mods/unified_inventory/bags.lua new file mode 100644 index 0000000..4bc9d5c --- /dev/null +++ b/mods/unified_inventory/bags.lua @@ -0,0 +1,153 @@ +-- Bags for Minetest + +-- Copyright (c) 2012 cornernote, Brett O'Donnell +-- License: GPLv3 + +local S = unified_inventory.gettext + +unified_inventory.register_page("bags", { + get_formspec = function(player) + local player_name = player:get_player_name() + local formspec = "background[0.06,0.99;7.92,7.52;ui_bags_main_form.png]" + formspec = formspec.."label[0,0;"..S("Bags").."]" + formspec = formspec.."button[0,2;2,0.5;bag1;Bag 1]" + formspec = formspec.."button[2,2;2,0.5;bag2;Bag 2]" + formspec = formspec.."button[4,2;2,0.5;bag3;Bag 3]" + formspec = formspec.."button[6,2;2,0.5;bag4;Bag 4]" + formspec = formspec.."listcolors[#00000000;#00000000]" + formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag1;0.5,1;1,1;]" + formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag2;2.5,1;1,1;]" + formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag3;4.5,1;1,1;]" + formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."_bags;bag4;6.5,1;1,1;]" + return {formspec=formspec} + end, +}) + +unified_inventory.register_button("bags", { + type = "image", + image = "ui_bags_icon.png", + tooltip = S("Bags") +}) + +for i = 1, 4 do + unified_inventory.register_page("bag"..i, { + get_formspec = function(player) + local stack = player:get_inventory():get_stack("bag"..i, 1) + local image = stack:get_definition().inventory_image + local formspec = "image[7,0;1,1;"..image.."]" + formspec = formspec.."label[0,0;Bag "..i.."]" + formspec = formspec.."listcolors[#00000000;#00000000]" + formspec = formspec.."list[current_player;bag"..i.."contents;0,1;8,3;]" + local slots = stack:get_definition().groups.bagslots + if slots == 8 then + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_sm_form.png]" + elseif slots == 16 then + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_med_form.png]" + elseif slots == 24 then + formspec = formspec.."background[0.06,0.99;7.92,7.52;ui_bags_lg_form.png]" + end + return {formspec=formspec} + end, + }) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then + return + end + for i = 1, 4 do + if fields["bag"..i] then + local stack = player:get_inventory():get_stack("bag"..i, 1) + if not stack:get_definition().groups.bagslots then + return + end + unified_inventory.set_inventory_formspec(player, "bag"..i) + return + end + end +end) + +minetest.register_on_joinplayer(function(player) + local player_inv = player:get_inventory() + local bags_inv = minetest.create_detached_inventory(player:get_player_name().."_bags",{ + on_put = function(inv, listname, index, stack, player) + player:get_inventory():set_stack(listname, index, stack) + player:get_inventory():set_size(listname.."contents", + stack:get_definition().groups.bagslots) + end, + on_take = function(inv, listname, index, stack, player) + player:get_inventory():set_stack(listname, index, nil) + end, + allow_put = function(inv, listname, index, stack, player) + if stack:get_definition().groups.bagslots then + return 1 + else + return 0 + end + end, + allow_take = function(inv, listname, index, stack, player) + if player:get_inventory():is_empty(listname.."contents") then + return stack:get_count() + else + return 0 + end + end, + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + }) + for i=1,4 do + local bag = "bag"..i + player_inv:set_size(bag, 1) + bags_inv:set_size(bag, 1) + bags_inv:set_stack(bag, 1, player_inv:get_stack(bag, 1)) + end +end) + +-- register bag tools +minetest.register_tool("unified_inventory:bag_small", { + description = S("Small Bag"), + inventory_image = "bags_small.png", + groups = {bagslots=8}, +}) + +minetest.register_tool("unified_inventory:bag_medium", { + description = S("Medium Bag"), + inventory_image = "bags_medium.png", + groups = {bagslots=16}, +}) + +minetest.register_tool("unified_inventory:bag_large", { + description = S("Large Bag"), + inventory_image = "bags_large.png", + groups = {bagslots=24}, +}) + +-- register bag crafts +minetest.register_craft({ + output = "unified_inventory:bag_small", + recipe = { + {"", "group:stick", ""}, + {"group:wood", "group:wood", "group:wood"}, + {"group:wood", "group:wood", "group:wood"}, + }, +}) + +minetest.register_craft({ + output = "unified_inventory:bag_medium", + recipe = { + {"", "", ""}, + {"group:stick", "unified_inventory:bag_small", "group:stick"}, + {"group:stick", "unified_inventory:bag_small", "group:stick"}, + }, +}) + +minetest.register_craft({ + output = "unified_inventory:bag_large", + recipe = { + {"", "", ""}, + {"group:stick", "unified_inventory:bag_medium", "group:stick"}, + {"group:stick", "unified_inventory:bag_medium", "group:stick"}, + }, +}) + diff --git a/mods/unified_inventory/callbacks.lua b/mods/unified_inventory/callbacks.lua new file mode 100644 index 0000000..3a41c32 --- /dev/null +++ b/mods/unified_inventory/callbacks.lua @@ -0,0 +1,182 @@ +local function default_refill(stack) + stack:set_count(stack:get_stack_max()) + local itemdef = minetest.registered_items[stack:get_name()] + if itemdef and (itemdef.wear_represents or "mechanical_wear") == "mechanical_wear" and stack:get_wear() ~= 0 then + stack:set_wear(0) + end + return stack +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + unified_inventory.players[player_name] = {} + unified_inventory.current_index[player_name] = 1 + unified_inventory.filtered_items_list[player_name] = + unified_inventory.items_list + unified_inventory.activefilter[player_name] = "" + unified_inventory.active_search_direction[player_name] = "nochange" + unified_inventory.apply_filter(player, "", "nochange") + unified_inventory.current_searchbox[player_name] = "" + unified_inventory.alternate[player_name] = 1 + unified_inventory.current_item[player_name] = nil + unified_inventory.current_craft_direction[player_name] = "recipe" + unified_inventory.set_inventory_formspec(player, + unified_inventory.default) + + -- Refill slot + local refill = minetest.create_detached_inventory(player_name.."refill", { + allow_put = function(inv, listname, index, stack, player) + local player_name = player:get_player_name() + if unified_inventory.is_creative(player_name) then + return stack:get_count() + else + return 0 + end + end, + on_put = function(inv, listname, index, stack, player) + local player_name = player:get_player_name() + local handle_refill = (minetest.registered_items[stack:get_name()] or {}).on_refill or default_refill + stack = handle_refill(stack) + inv:set_stack(listname, index, stack) + minetest.sound_play("electricity", + {to_player=player_name, gain = 1.0}) + end, + }) + refill:set_size("main", 1) +end) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then + return + end + local player_name = player:get_player_name() + + -- always take new search text, even if not searching on it yet + if fields.searchbox ~= nil and fields.searchbox ~= unified_inventory.current_searchbox[player_name] then + unified_inventory.current_searchbox[player_name] = fields.searchbox + unified_inventory.set_inventory_formspec(player, unified_inventory.current_page[player_name]) + end + + for i, def in pairs(unified_inventory.buttons) do + if fields[def.name] then + def.action(player) + minetest.sound_play("click", + {to_player=player_name, gain = 0.1}) + return + end + end + + -- Inventory page controls + local start = math.floor( + unified_inventory.current_index[player_name] / unified_inventory.items_per_page + 1) + local start_i = start + local pagemax = math.floor( + (#unified_inventory.filtered_items_list[player_name] - 1) + / (unified_inventory.items_per_page) + 1) + + if fields.start_list then + start_i = 1 + end + if fields.rewind1 then + start_i = start_i - 1 + end + if fields.forward1 then + start_i = start_i + 1 + end + if fields.rewind3 then + start_i = start_i - 3 + end + if fields.forward3 then + start_i = start_i + 3 + end + if fields.end_list then + start_i = pagemax + end + if start_i < 1 then + start_i = 1 + end + if start_i > pagemax then + start_i = pagemax + end + if not (start_i == start) then + minetest.sound_play("paperflip1", + {to_player=player_name, gain = 1.0}) + unified_inventory.current_index[player_name] = (start_i - 1) * unified_inventory.items_per_page + 1 + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + + local clicked_item = nil + for name, value in pairs(fields) do + if string.sub(name, 1, 12) == "item_button_" then + local new_dir, mangled_item = string.match(name, "^item_button_([a-z]+)_(.*)$") + clicked_item = unified_inventory.demangle_for_formspec(mangled_item) + if string.sub(clicked_item, 1, 6) == "group:" then + minetest.sound_play("click", {to_player=player_name, gain = 0.1}) + unified_inventory.apply_filter(player, clicked_item, new_dir) + return + end + if new_dir == "recipe" or new_dir == "usage" then + unified_inventory.current_craft_direction[player_name] = new_dir + end + break + end + end + if clicked_item then + minetest.sound_play("click", + {to_player=player_name, gain = 0.1}) + local page = unified_inventory.current_page[player_name] + if not unified_inventory.is_creative(player_name) then + page = "craftguide" + end + if page == "craftguide" then + unified_inventory.current_item[player_name] = clicked_item + unified_inventory.alternate[player_name] = 1 + unified_inventory.set_inventory_formspec(player, + "craftguide") + else + if unified_inventory.is_creative(player_name) then + local inv = player:get_inventory() + local stack = ItemStack(clicked_item) + stack:set_count(stack:get_stack_max()) + if inv:room_for_item("main", stack) then + inv:add_item("main", stack) + end + end + end + end + + if fields.searchbutton then + unified_inventory.apply_filter(player, unified_inventory.current_searchbox[player_name], "nochange") + unified_inventory.current_searchbox[player_name] = "" + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + minetest.sound_play("paperflip2", + {to_player=player_name, gain = 1.0}) + end + + -- alternate button + if fields.alternate then + minetest.sound_play("click", + {to_player=player_name, gain = 0.1}) + local item_name = unified_inventory.current_item[player_name] + if item_name then + local alternates = 0 + local alternate = unified_inventory.alternate[player_name] + local crafts = unified_inventory.crafts_for[unified_inventory.current_craft_direction[player_name]][item_name] + if crafts ~= nil then + alternates = #crafts + end + if alternates > 1 then + alternate = alternate + 1 + if alternate > alternates then + alternate = 1 + end + unified_inventory.alternate[player_name] = alternate + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) + end + end + end +end) + diff --git a/mods/unified_inventory/depends.txt b/mods/unified_inventory/depends.txt new file mode 100644 index 0000000..a1ea556 --- /dev/null +++ b/mods/unified_inventory/depends.txt @@ -0,0 +1,4 @@ +creative? +intllib? +datastorage? + diff --git a/mods/unified_inventory/group.lua b/mods/unified_inventory/group.lua new file mode 100644 index 0000000..9bf6895 --- /dev/null +++ b/mods/unified_inventory/group.lua @@ -0,0 +1,108 @@ +function unified_inventory.canonical_item_spec_matcher(spec) + local specname = ItemStack(spec):get_name() + if specname:sub(1, 6) == "group:" then + local group_names = specname:sub(7):split(",") + return function (itemname) + local itemdef = minetest.registered_items[itemname] + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + return false + end + end + return true + end + else + return function (itemname) return itemname == specname end + end +end + +function unified_inventory.item_matches_spec(item, spec) + local itemname = ItemStack(item):get_name() + return unified_inventory.canonical_item_spec_matcher(spec)(itemname) +end + +unified_inventory.registered_group_items = { + mesecon_conductor_craftable = "mesecons:wire_00000000_off", + stone = "default:cobble", + wool = "wool:white", +} + +function unified_inventory.register_group_item(groupname, itemname) + unified_inventory.registered_group_items[groupname] = itemname +end + + +-- This is used when displaying craft recipes, where an ingredient is +-- specified by group rather than as a specific item. A single-item group +-- is represented by that item, with the single-item status signalled +-- in the "sole" field. If the group contains no items at all, the item +-- field will be nil. +-- +-- Within a multiple-item group, we prefer to use an item that has the +-- same specific name as the group, and if there are more than one of +-- those items we prefer the one registered for the group by a mod. +-- Among equally-preferred items, we just pick the one with the +-- lexicographically earliest name. +-- +-- The parameter to this function isn't just a single group name. +-- It may be a comma-separated list of group names. This is really a +-- "group:..." ingredient specification, minus the "group:" prefix. + +local function compute_group_item(group_name_list) + local group_names = group_name_list:split(",") + local candidate_items = {} + for itemname, itemdef in pairs(minetest.registered_items) do + if (itemdef.groups.not_in_creative_inventory or 0) == 0 then + local all = true + for _, group_name in ipairs(group_names) do + if (itemdef.groups[group_name] or 0) == 0 then + all = false + end + end + if all then table.insert(candidate_items, itemname) end + end + end + local num_candidates = #candidate_items + if num_candidates == 0 then + return {sole = true} + elseif num_candidates == 1 then + return {item = candidate_items[1], sole = true} + end + local is_group = {} + local registered_rep = {} + for _, group_name in ipairs(group_names) do + is_group[group_name] = true + local rep = unified_inventory.registered_group_items[group_name] + if rep then registered_rep[rep] = true end + end + local bestitem = "" + local bestpref = 0 + for _, item in ipairs(candidate_items) do + local pref + if registered_rep[item] then + pref = 4 + elseif string.sub(item, 1, 8) == "default:" and is_group[string.sub(item, 9)] then + pref = 3 + elseif is_group[item:gsub("^[^:]*:", "")] then + pref = 2 + else + pref = 1 + end + if pref > bestpref or (pref == bestpref and item < bestitem) then + bestitem = item + bestpref = pref + end + end + return {item = bestitem, sole = false} +end + + +local group_item_cache = {} + +function unified_inventory.get_group_item(group_name) + if not group_item_cache[group_name] then + group_item_cache[group_name] = compute_group_item(group_name) + end + return group_item_cache[group_name] +end + diff --git a/mods/unified_inventory/image_credits.txt b/mods/unified_inventory/image_credits.txt new file mode 100644 index 0000000..b1489e4 --- /dev/null +++ b/mods/unified_inventory/image_credits.txt @@ -0,0 +1,66 @@ +bags_small.png: + http://www.clker.com/clipart-moneybag-empty.html + +bags_medium.png: + http://www.clker.com/clipart-backpack-1.html + +bags_large.png / ui_bags_icon.png: + http://www.clker.com/clipart-backpack-green-brown.html + +ui_craftguide_icon.png / ui_craft_icon.png + http://commons.wikimedia.org/wiki/File:Advancedsettings.png + +ui_doubleleft_icon.png + http://commons.wikimedia.org/wiki/File:Media-seek-backward.svg + +ui_doubleright_icon.png + http://commons.wikimedia.org/wiki/File:Media-seek-forward.svg + +ui_left_icon.png / ui_right_icon.png + http://commons.wikimedia.org/wiki/File:Media-playback-start.svg + +ui_skip_backward_icon.png + http://commons.wikimedia.org/wiki/File:Media-skip-backward.svg + +ui_skip_forward_icon.png + http://commons.wikimedia.org/wiki/File:Media-skip-forward.svg + +ui_gohome_icon.png / ui_home_icon.png / ui_sethome_icon.png + http://commons.wikimedia.org/wiki/File:Home_256x256.png + +ui_moon_icon.png + http://commons.wikimedia.org/wiki/File:FullMoon2010.jpg + +ui_sun_icon.png + http://commons.wikimedia.org/wiki/File:2012-10-13_15-29-35-sun.jpg + +ui_trash_icon.png + http://www.clker.com/clipart-29090.html + http://www.clker.com/clipart-trash.html + +ui_search_icon.png + http://www.clker.com/clipart-24887.html + +ui_off_icon.png / ui_on_icon.png + http://www.clker.com/clipart-on-off-switches.html + +ui_waypoints_icon.png + http://www.clker.com/clipart-map-pin-red.html + +ui_circular_arrows_icon.png + http://www.clker.com/clipart-circular-arrow-pattern.html + +ui_pencil_icon.pnc + http://www.clker.com/clipart-2256.html + +ui_waypoint_set_icon.png + http://www.clker.com/clipart-larger-flag.html + +ui_xyz_off_icon.png + http://commons.wikimedia.org/wiki/File:No_sign.svg + +ui_ok_icon.png + http://commons.wikimedia.org/wiki/File:Yes_check.svg + +inventory_plus_worldedit_gui.png + http://commons.wikimedia.org/wiki/File:Erioll_world_2.svg diff --git a/mods/unified_inventory/init.lua b/mods/unified_inventory/init.lua new file mode 100644 index 0000000..4abbcc8 --- /dev/null +++ b/mods/unified_inventory/init.lua @@ -0,0 +1,86 @@ +-- Unified Inventory for Minetest 0.4.8+ + +local modpath = minetest.get_modpath(minetest.get_current_modname()) +local worldpath = minetest.get_worldpath() + +-- Data tables definitions +unified_inventory = { + activefilter = {}, + active_search_direction = {}, + alternate = {}, + current_page = {}, + current_searchbox = {}, + current_index = {}, + current_item = {}, + current_craft_direction = {}, + registered_craft_types = {}, + crafts_for = {usage = {}, recipe = {} }, + players = {}, + items_list_size = 0, + items_list = {}, + filtered_items_list_size = {}, + filtered_items_list = {}, + pages = {}, + buttons = {}, + + -- Homepos stuff + home_pos = {}, + home_filename = worldpath.."/unified_inventory_home.home", + + -- Default inventory page + default = "craft", + + -- intllib + gettext = rawget(_G, "intllib") and intllib.Getter() or function(s) return s end, + + -- "Lite" mode + lite_mode = minetest.setting_getbool("unified_inventory_lite"), + + pagecols = 8, + pagerows = 10, + page_y = 0, + formspec_y = 1, + main_button_x = 0, + main_button_y = 9, + craft_result_x = 0.3, + craft_result_y = 0.5, + form_header_y = 0 +} + +if unified_inventory.lite_mode then + unified_inventory.pagecols = 4 + unified_inventory.pagerows = 6 + unified_inventory.page_y = 0.25 + unified_inventory.formspec_y = 0.47 + unified_inventory.main_button_x = 8.2 + unified_inventory.main_button_y = 6.5 + unified_inventory.craft_result_x = 2.8 + unified_inventory.craft_result_y = 3.4 + unified_inventory.form_header_y = -0.1 +end + +unified_inventory.items_per_page = unified_inventory.pagecols * unified_inventory.pagerows + +-- Disable default creative inventory +if rawget(_G, "creative_inventory") then + function creative_inventory.set_creative_formspec(player, start_i, pagenum) + return + end +end + +dofile(modpath.."/group.lua") +dofile(modpath.."/api.lua") +dofile(modpath.."/internal.lua") +dofile(modpath.."/callbacks.lua") +dofile(modpath.."/register.lua") + +if not unified_inventory.lite_mode then + dofile(modpath.."/bags.lua") +end + +dofile(modpath.."/item_names.lua") + +if minetest.get_modpath("datastorage") and not unified_inventory.lite_mode then + dofile(modpath.."/waypoints.lua") +end + diff --git a/mods/unified_inventory/internal.lua b/mods/unified_inventory/internal.lua new file mode 100644 index 0000000..5dc3795 --- /dev/null +++ b/mods/unified_inventory/internal.lua @@ -0,0 +1,273 @@ +local S = unified_inventory.gettext + +-- This pair of encoding functions is used where variable text must go in +-- button names, where the text might contain formspec metacharacters. +-- We can escape button names for the formspec, to avoid screwing up +-- form structure overall, but they then don't get de-escaped, and so +-- the input we get back from the button contains the formspec escaping. +-- This is a game engine bug, and in the anticipation that it might be +-- fixed some day we don't want to rely on it. So for safety we apply +-- an encoding that avoids all formspec metacharacters. +function unified_inventory.mangle_for_formspec(str) + return string.gsub(str, "([^A-Za-z0-9])", function (c) return string.format("_%d_", string.byte(c)) end) +end +function unified_inventory.demangle_for_formspec(str) + return string.gsub(str, "_([0-9]+)_", function (v) return string.char(v) end) +end + +function unified_inventory.get_formspec(player, page) + if not player then + return "" + end + local player_name = player:get_player_name() + unified_inventory.current_page[player_name] = page + local pagedef = unified_inventory.pages[page] + + local formspec = "size[14,10]" + -- Background + formspec = formspec .. "background[-0.19,-0.25;14.4,10.75;ui_form_bg.png]" + + if unified_inventory.lite_mode then + formspec = "size[11,7.7]" + formspec = formspec .. "background[-0.19,-0.2;11.4,8.4;ui_form_bg.png]" + end + + local fsdata = nil + + -- Current page + if unified_inventory.pages[page] then + fsdata = pagedef.get_formspec(player) + formspec = formspec .. fsdata.formspec + else + return "" -- Invalid page name + end + + local button_row = 0 + local button_col = 0 + + -- Main buttons + for i, def in pairs(unified_inventory.buttons) do + + if unified_inventory.lite_mode and i > 4 then + button_row = 1 + button_col = 1 + end + + local tooltip = def.tooltip or "" + if def.type == "image" then + formspec = formspec.."image_button[" + ..( unified_inventory.main_button_x + 0.65 * (i - 1) - button_col * 0.65 * 4) + ..","..(unified_inventory.main_button_y + button_row * 0.7)..";0.8,0.8;" + ..minetest.formspec_escape(def.image)..";" + ..minetest.formspec_escape(def.name)..";]" + .."tooltip["..minetest.formspec_escape(def.name) + ..";"..tooltip.."]" + end + end + + if fsdata.draw_inventory ~= false then + -- Player inventory + formspec = formspec.."listcolors[#00000000;#00000000]" + formspec = formspec .. "list[current_player;main;0,"..(unified_inventory.formspec_y + 3.5)..";8,4;]" + end + + if fsdata.draw_item_list == false then + return formspec + end + + -- Controls to flip items pages + local start_x = 9.2 + + if not unified_inventory.lite_mode then + formspec = formspec + .. "image_button[" .. (start_x + 0.6 * 0) + .. ",9;.8,.8;ui_skip_backward_icon.png;start_list;]" + .. "tooltip[start_list;" .. minetest.formspec_escape(S("First page")) .. "]" + + .. "image_button[" .. (start_x + 0.6 * 1) + .. ",9;.8,.8;ui_doubleleft_icon.png;rewind3;]" + .. "tooltip[rewind3;" .. minetest.formspec_escape(S("Back three pages")) .. "]" + .. "image_button[" .. (start_x + 0.6 * 2) + .. ",9;.8,.8;ui_left_icon.png;rewind1;]" + .. "tooltip[rewind1;" .. minetest.formspec_escape(S("Back one page")) .. "]" + + .. "image_button[" .. (start_x + 0.6 * 3) + .. ",9;.8,.8;ui_right_icon.png;forward1;]" + .. "tooltip[forward1;" .. minetest.formspec_escape(S("Forward one page")) .. "]" + .. "image_button[" .. (start_x + 0.6 * 4) + .. ",9;.8,.8;ui_doubleright_icon.png;forward3;]" + .. "tooltip[forward3;" .. minetest.formspec_escape(S("Forward three pages")) .. "]" + + .. "image_button[" .. (start_x + 0.6 * 5) + .. ",9;.8,.8;ui_skip_forward_icon.png;end_list;]" + .. "tooltip[end_list;" .. minetest.formspec_escape(S("Last page")) .. "]" + else + formspec = formspec + .. "image_button[" .. (8.2 + 0.65 * 0) + .. ",5.8;.8,.8;ui_skip_backward_icon.png;start_list;]" + .. "tooltip[start_list;" .. minetest.formspec_escape(S("First page")) .. "]" + .. "image_button[" .. (8.2 + 0.65 * 1) + .. ",5.8;.8,.8;ui_left_icon.png;rewind1;]" + .. "tooltip[rewind1;" .. minetest.formspec_escape(S("Back one page")) .. "]" + .. "image_button[" .. (8.2 + 0.65 * 2) + .. ",5.8;.8,.8;ui_right_icon.png;forward1;]" + .. "tooltip[forward1;" .. minetest.formspec_escape(S("Forward one page")) .. "]" + .. "image_button[" .. (8.2 + 0.65 * 3) + .. ",5.8;.8,.8;ui_skip_forward_icon.png;end_list;]" + .. "tooltip[end_list;" .. minetest.formspec_escape(S("Last page")) .. "]" + end + + -- Search box + + if not unified_inventory.lite_mode then + formspec = formspec .. "field[9.5,8.325;3,1;searchbox;;" + .. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]" + formspec = formspec .. "image_button[12.2,8.1;.8,.8;ui_search_icon.png;searchbutton;]" + .. "tooltip[searchbutton;" ..S("Search") .. "]" + else + formspec = formspec .. "field[8.5,5.225;2.2,1;searchbox;;" + .. minetest.formspec_escape(unified_inventory.current_searchbox[player_name]) .. "]" + formspec = formspec .. "image_button[10.3,5;.8,.8;ui_search_icon.png;searchbutton;]" + .. "tooltip[searchbutton;" ..S("Search") .. "]" + end + + local no_matches = "No matching items" + if unified_inventory.lite_mode then + no_matches = "No matches." + end + + -- Items list + if #unified_inventory.filtered_items_list[player_name] == 0 then + formspec = formspec.."label[8.2,"..unified_inventory.form_header_y..";" .. S(no_matches) .. "]" + else + local dir = unified_inventory.active_search_direction[player_name] + local list_index = unified_inventory.current_index[player_name] + local page = math.floor(list_index / (unified_inventory.items_per_page) + 1) + local pagemax = math.floor( + (#unified_inventory.filtered_items_list[player_name] - 1) + / (unified_inventory.items_per_page) + 1) + local item = {} + for y = 0, unified_inventory.pagerows - 1 do + for x = 0, unified_inventory.pagecols - 1 do + local name = unified_inventory.filtered_items_list[player_name][list_index] + if minetest.registered_items[name] then + formspec = formspec.."item_image_button[" + ..(8.2 + x * 0.7).."," + ..(unified_inventory.formspec_y + unified_inventory.page_y + y * 0.7)..";.81,.81;" + ..name..";item_button_"..dir.."_" + ..unified_inventory.mangle_for_formspec(name)..";]" + list_index = list_index + 1 + end + end + end + formspec = formspec.."label[8.2,"..unified_inventory.form_header_y..";"..S("Page") .. ": " + .. S("%s of %s"):format(page,pagemax).."]" + end + if unified_inventory.activefilter[player_name] ~= "" then + formspec = formspec.."label[8.2,"..(unified_inventory.form_header_y + 0.4)..";" .. S("Filter") .. ":]" + formspec = formspec.."label[9.1,"..(unified_inventory.form_header_y + 0.4)..";"..minetest.formspec_escape(unified_inventory.activefilter[player_name]).."]" + end + return formspec +end + +function unified_inventory.set_inventory_formspec(player, page) + if player then + local formspec = unified_inventory.get_formspec(player, page) + player:set_inventory_formspec(formspec) + end +end + +--apply filter to the inventory list (create filtered copy of full one) +function unified_inventory.apply_filter(player, filter, search_dir) + if not player then return false end + local player_name = player:get_player_name() + local lfilter = string.lower(filter) + local ffilter + if lfilter:sub(1, 6) == "group:" then + local groups = lfilter:sub(7):split(",") + ffilter = function(name, def) + for _, group in ipairs(groups) do + if not ((def.groups[group] or 0) > 0) then + return false + end + end + return true + end + else + ffilter = function(name, def) + local lname = string.lower(name) + local ldesc = string.lower(def.description) + return string.find(lname, lfilter, 1, true) or string.find(ldesc, lfilter, 1, true) + end + end + unified_inventory.filtered_items_list[player_name]={} + for name, def in pairs(minetest.registered_items) do + if (def.groups.not_in_creative_inventory or 0) == 0 and (def.description or "") ~= "" and ffilter(name, def) then + table.insert(unified_inventory.filtered_items_list[player_name], name) + end + end + table.sort(unified_inventory.filtered_items_list[player_name]) + unified_inventory.filtered_items_list_size[player_name] = #unified_inventory.filtered_items_list[player_name] + unified_inventory.current_index[player_name] = 1 + unified_inventory.activefilter[player_name] = filter + unified_inventory.active_search_direction[player_name] = search_dir + unified_inventory.set_inventory_formspec(player, + unified_inventory.current_page[player_name]) +end + +function unified_inventory.items_in_group(groups) + local items = {} + for name, item in pairs(minetest.registered_items) do + for _, group in pairs(groups:split(',')) do + if item.groups[group] then + table.insert(items, name) + end + end + end + return items +end + +function unified_inventory.sort_inventory(inv) + local inlist = inv:get_list("main") + local typecnt = {} + local typekeys = {} + for _, st in ipairs(inlist) do + if not st:is_empty() then + local n = st:get_name() + local w = st:get_wear() + local m = st:get_metadata() + local k = string.format("%s %05d %s", n, w, m) + if not typecnt[k] then + typecnt[k] = { + name = n, + wear = w, + metadata = m, + stack_max = st:get_stack_max(), + count = 0, + } + table.insert(typekeys, k) + end + typecnt[k].count = typecnt[k].count + st:get_count() + end + end + table.sort(typekeys) + local outlist = {} + for _, k in ipairs(typekeys) do + local tc = typecnt[k] + while tc.count > 0 do + local c = math.min(tc.count, tc.stack_max) + table.insert(outlist, ItemStack({ + name = tc.name, + wear = tc.wear, + metadata = tc.metadata, + count = c, + })) + tc.count = tc.count - c + end + end + if #outlist > #inlist then return end + while #outlist < #inlist do + table.insert(outlist, ItemStack(nil)) + end + inv:set_list("main", outlist) +end diff --git a/mods/unified_inventory/item_names.lua b/mods/unified_inventory/item_names.lua new file mode 100644 index 0000000..2c92d65 --- /dev/null +++ b/mods/unified_inventory/item_names.lua @@ -0,0 +1,53 @@ +-- Based on 4itemnames mod by 4aiman + +local wield = {} +local huds = {} +local dtimes = {} +local dlimit = 3 -- HUD element will be hidden after this many seconds +local air_hud_mod = minetest.get_modpath("4air") +local hud_mod = minetest.get_modpath("hud") + +local function set_hud(player) + local player_name = player:get_player_name() + local off = {x=0, y=-70} + if air_hud_mod or hud_mod then + off.y = off.y - 20 + end + huds[player_name] = player:hud_add({ + hud_elem_type = "text", + position = {x=0.5, y=1}, + offset = off, + alignment = {x=0, y=0}, + number = 0xFFFFFF , + text = "", + }) +end + +minetest.register_on_joinplayer(function(player) + minetest.after(0, set_hud, player) +end) + +minetest.register_globalstep(function(dtime) + for _, player in pairs(minetest.get_connected_players()) do + local player_name = player:get_player_name() + local wstack = player:get_wielded_item():get_name() + + if dtimes[player_name] and dtimes[player_name] < dlimit then + dtimes[player_name] = dtimes[player_name] + dtime + if dtimes[player_name] > dlimit and huds[player_name] then + player:hud_change(huds[player_name], 'text', "") + end + end + + if wstack ~= wield[player_name] then + wield[player_name] = wstack + dtimes[player_name] = 0 + if huds[player_name] then + local def = minetest.registered_items[wstack] + local desc = def and def.description or "" + player:hud_change(huds[player_name], 'text', desc) + end + end + end +end) + diff --git a/mods/unified_inventory/locale/de.txt b/mods/unified_inventory/locale/de.txt new file mode 100644 index 0000000..9f12d8c --- /dev/null +++ b/mods/unified_inventory/locale/de.txt @@ -0,0 +1,71 @@ +# Translation by Xanthin + +### bags.lua ### +Bags = Rucksaecke +Bag 1 = Rucksack 1 +Bag 2 = Rucksack 2 +Bag 3 = Rucksack 3 +Bag 4 = Rucksack 4 +Small Bag = Rucksack (klein) +Medium Bag = Rucksack (mittel) +Large Bag = Rucksack (gross) + +### inernal.lua ### +First page = +Back three pages = +Back one page = +Forward one page = +Forward three pages = +Last page = +No matching items = +Page = Seite +%s of %s = %s von %s +Filter = Suche +Search = + +### register.lua ### +Can use the creative inventory = Kann das Kreativinventar nutzen +Home position set to: %s = Ausgangsposition nach: %s gesetzt +Time of day set to 6am = Tageszeit auf 6 Uhr morgens geaendert +You don't have the settime priviledge! = Du hast nicht das "settime" Privileg! +Time of day set to 9pm = Tageszeit auf 9 Uhr abends geaendert +This button has been disabled outside of creative mode to prevent accidental inventory trashing. Use the trash slot instead. = Diese Funktion ist ausserhalb des Kreativmodus deaktiviert um ein versehentliches Loeschen des ganzen Inventars zu verhindern.\nNutze stattdessen das Muellfeld. +Inventory Cleared! = Inventar geleert! +Crafting = Bauen +Trash: = Muell: +Refill: = Nachfuellen: +Crafting Guide = Bauanleitung +Method: = Methode: +Result: %s = Ergebnis: %s +crafting = Bauen +shapeless crafting = Formloses Bauen +cooking = Kochen +alloy cooking = Legierung Kochen +Copy to craft grid: = Kopiere ins Baufeld: +All = Alles +Recipe %s of %s = Rezept %s von %s +Alternate = Alternative +Crafting Grid = + +### waypoints.lua ### +White = +Yellow = +Red = +Green = +Blue = +Waypoints = +Waypoint active = +Waypoint inactive = +World position = +Name = +HUD text color = +Edit waypoint name = +Rename waypoint = +Change color of waypoint display = +Set waypoint to current location = +Make waypoint visible = +Make waypoint invisible = +Disable display of waypoint coordinates = +Enable display of waypoint coordinates = +Finish editing = +Select Waypoint #%d = diff --git a/mods/unified_inventory/locale/es.txt b/mods/unified_inventory/locale/es.txt new file mode 100644 index 0000000..9382c79 --- /dev/null +++ b/mods/unified_inventory/locale/es.txt @@ -0,0 +1,72 @@ +# Translation by Diego Martínez + +# Template +### bags.lua ### +Bags = Bolsas +Bag 1 = Bolsa 1 +Bag 2 = Bolsa 2 +Bag 3 = Bolsa 3 +Bag 4 = Bolsa 4 +Small Bag = Bolsa Pequeña +Medium Bag = Bolsa Mediana +Large Bag = Bolsa Grande + +### inernal.lua ### +First page = +Back three pages = +Back one page = +Forward one page = +Forward three pages = +Last page = +No matching items = +Page = Página +%s of %s = %s de %s +Filter = Filtro +Search = + +### register.lua ### +Can use the creative inventory = Puede usar el inventario creativo +Home position set to: %s = Posición de hogar cambiada a: %s +Time of day set to 6am = Hora del día cambiada a 6AM +You don't have the settime priviledge! = ¡No tienes el privilegio `settime'! +Time of day set to 9pm = Hora del día cambiada a 9PM +This button has been disabled outside of creative mode to prevent accidental inventory trashing. Use the trash slot instead. = Éste botón ha sido deshabilitado para prevenir la destrucción accidental del inventario.\nUsa la ranura para basura en su lugar. +Inventory Cleared! = ¡Inventario limpio! +Crafting = Elaboración +Trash: = Basura: +Refill: = Rellenar: +Crafting Guide = Guía de Elaboración +Method: = Método: +Result: %s = Resultado: %s +crafting = elaboración +shapeless crafting = elaboración sin forma +cooking = hornear +alloy cooking = horneado de aleación +Copy to craft grid: = Copiar al cuadro de elaboración +All = Todos +Recipe %s of %s = Receta %s de %s +Alternate = Alternar +Crafting Grid = + +### waypoints.lua ### +White = Blanco +Yellow = Amarillo +Red = Rojo +Green = Verde +Blue = Azul +Waypoints = Puntos de paso +Waypoint active = Punto de paso activo +Waypoint inactive = Punto de paso inactivo +World position = Posición en el mundo +Name = Nombre +HUD text color = Color del HUD +Edit waypoint name = +Rename waypoint = +Change color of waypoint display = +Set waypoint to current location = +Make waypoint visible = +Make waypoint invisible = +Disable display of waypoint coordinates = +Enable display of waypoint coordinates = +Finish editing = +Select Waypoint #%d = diff --git a/mods/unified_inventory/locale/fr.txt b/mods/unified_inventory/locale/fr.txt new file mode 100644 index 0000000..01e975e --- /dev/null +++ b/mods/unified_inventory/locale/fr.txt @@ -0,0 +1,72 @@ +# Translation by kilbith + +# Template +### bags.lua ### +Bags = Sacs +Bag 1 = Sac 1 +Bag 2 = Sac 2 +Bag 3 = Sac 3 +Bag 4 = Sac 4 +Small Bag = Petit sac +Medium Bag = Sac moyen +Large Bag = Grand sac + +### inernal.lua ### +First page = 1ère page +Back three pages = 3 pages en arrière +Back one page = Page précédente +Forward one page = Page suivante +Forward three pages = 3 pages en avant +Last page = Dernière page +No matching items = Aucun élément correspondant +Page = Page +%s of %s = %s de %s +Filter = Filtre +Search = Rechercher + +### register.lua ### +Can use the creative inventory = Vous pouvez utiliser l'inventaire créatif +Home position set to: %s = Position de votre base fixée à : %s +Time of day set to 6am = Heure fixée à 6h +You don't have the settime priviledge! = Vous n'avez pas le privilège 'settime' ! +Time of day set to 9pm = Heure fixée à 21h +This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Ce bouton a été désactivé en dehors du mode créatif pour éviter des saccages dans l'inventaire.\nUtilisez plutôt la case poubelle. +Inventory Cleared! = Inventaire vidé ! +Crafting = Création +Trash: = Poubelle : +Refill: = Remplir : +Crafting Guide = Guide de création +Method: = Méthode : +Result: %s = Résultat : %s +crafting = fabrication +shapeless crafting = fabrication sans forme +cooking = cuisson +alloy cooking = cuisson des métaux +Copy to craft grid: = Copier sur la grille de création +All = Tout +Recipe %s of %s = Recette %s de %d +Alternate = Alternative +Crafting Grid = Grille de création + +### waypoints.lua ### +White = Blanc +Yellow = Jaune +Red = Rouge +Green = Vert +Blue = Bleu +Waypoints = Point de passage +Waypoint active = Point de passage actif +Waypoint inactive = Point de passage inactif +World position = Position dans le monde +Name = Nom +HUD text color = Couleur de texte du HUD +Edit waypoint name = Editer le nom du point de passage +Rename waypoint = Renommer le point de passage +Change color of waypoint display = Changer la couleur du point de passage +Set waypoint to current location = Marquer un point de passage à la position actuelle +Make waypoint visible = Rendre visible le point de passage +Make waypoint invisible = Rendre invisible le point de passage +Disable display of waypoint coordinates = Masquer les coordonnées des points de passages +Enable display of waypoint coordinates = Montrer les coordonnées des points de passages +Finish editing = Terminer l'édition +Select Waypoint #%d = Choisir un point de passage #%d diff --git a/mods/unified_inventory/locale/pl.txt b/mods/unified_inventory/locale/pl.txt new file mode 100644 index 0000000..33003d8 --- /dev/null +++ b/mods/unified_inventory/locale/pl.txt @@ -0,0 +1,71 @@ +# Translation by RealBadAngel + +### bags.lua ### +Bags = Plecaki +Bag 1 = Plecak 1 +Bag 2 = Plecak 2 +Bag 3 = Plecak 3 +Bag 4 = Plecak 4 +Small Bag = Maly plecak +Medium Bag = Sredni plecak +Large Bag = Duzy plecak + +### inernal.lua ### +First page = Pierwsza strona +Back three pages = 3 strony w tyl +Back one page = 1 strona w tyl +Forward one page = 1 strona do przodu +Forward three pages = 3 strony do przodu +Last page = Ostatnia strona +No matching items = Brak pasujacych przedmiotow +Page = Strona +%s of %s = %s z %s +Filter = Filtr +Search = Szukaj + +### register.lua ### +Can use the creative inventory = +Home position set to: %s = Pozycja domowa ustawiona na: %s +Time of day set to 6am = Czas ustawiony na 6:00 +You don't have the settime priviledge! = Nie masz uprawnien do zmiany czasu (settime)! +Time of day set to 9pm = Czas ustawiony na 21:00 +This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = +Inventory Cleared! = +Crafting = +Trash: = Smietnik: +Refill: = Uzupelnianie: +Crafting Guide = +Method: = Metoda: +Result: %s = Wynik: %s +crafting = +shapeless crafting = +cooking = +alloy cooking = +Copy to craft grid: = +All = Wszystko +Recipe %s of %s = Recepta %s z %s +Alternate = Alternatywa +Crafting Grid = + +### waypoints.lua ### +White = Bialy +Yellow = Zolty +Red = Czerwony +Green = Zielony +Blue = Niebieski +Waypoints = Punkty orientacyjne +Waypoint active = Punkt wlaczony +Waypoint inactive = Punkt wylaczony +World position = Pozycja +Name = Nazwa +HUD text color = Kolor tekstu HUD +Edit waypoint name = Edytuj nazwe punktu +Rename waypoint = Zmien nazwe punktu +Change color of waypoint display = Zmien kolor punktu +Set waypoint to current location = Ustaw punkt orientacyjny na biezacej pozycji +Make waypoint visible = Pokaz punkt +Make waypoint invisible = Nie pokazuj punktu +Disable display of waypoint coordinates = Pokazuj koordynaty punktu +Enable display of waypoint coordinates = Nie pokazuj koordynatow punktu +Finish editing = Zakoncz edycje +Select Waypoint #%d = Wybierz punkt #%d diff --git a/mods/unified_inventory/locale/ru.txt b/mods/unified_inventory/locale/ru.txt new file mode 100644 index 0000000..1948155 --- /dev/null +++ b/mods/unified_inventory/locale/ru.txt @@ -0,0 +1,76 @@ +# Translation by eternal_sorrow + +# Template +### bags.lua ### +Bags = Сумки +Bag 1 = Сумка 1 +Bag 2 = Сумка 2 +Bag 3 = Сумка 3 +Bag 4 = Сумка 4 +Small Bag = ÐœÐ°Ð»Ð°Ñ Ñумка +Medium Bag = СреднÑÑ Ñумка +Large Bag = Ð‘Ð¾Ð»ÑŒÑˆÐ°Ñ Ñумка + +### inernal.lua ### +First page = ÐŸÐµÑ€Ð²Ð°Ñ Ñтраница +Back three pages = Ðазад на три Ñтраницы +Back one page = Ðазад на одну Ñтраницу +Forward one page = Вперед на одну Ñтраницу +Forward three pages = Вперед на три Ñтраницы +Last page = ПоÑледнÑÑ Ñтраница +No matching items = Совпадений нет +Page = Страница +%s of %s = %s из %s +Filter = Фильтр +Search = ПоиÑк + +### register.lua ### +Can use the creative inventory = Можно иÑпользовать инвентарь творчеÑкого режима +Home position set to: %s = Дом теперь раÑположен по коодинатам: %s +Time of day set to 6am = УÑтановлено Ð²Ñ€ÐµÐ¼Ñ 6 утра +You don't have the settime priviledge! = Вам не разрешено уÑтанавливать времÑ! +Time of day set to 9pm = УÑтановлено Ð²Ñ€ÐµÐ¼Ñ 9 вечера +This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Эта кнопка отключена вне творчеÑкого режима, чтобы предотвратить Ñлучайное уничтожение предметов.\nИÑпользуйте Ñлот корзины вмеÑто нее. +Inventory Cleared! = Инвентарь очищен! +Crafting = Крафт +Trash: = Корзина: +Refill: = Размножить: +Crafting Guide = Книга рецептов +Method: = СпоÑоб: +Result: %s = Результат: %s +crafting = крафт +shapeless crafting = беÑформенный крафт +cooking = жарка +alloy cooking = приготовление Ñплавов +Copy to craft grid: = Ð’ решетку крафта: +All = Ð’Ñе +Recipe %s of %s = Рецепт %s из %s +Alternate = Следующий +Crafting Grid = Решетка крафта +Go home = ОтправитьÑÑ Ð´Ð¾Ð¼Ð¾Ð¹ +Set time to day = День +Set time to night = Ðочь +Clear inventory = ОчиÑтить инвентарь + +### waypoints.lua ### +White = Белый +Yellow = Желтый +Red = КраÑный +Green = Зелёный +Blue = Синий +Waypoints = Путевые точки +Waypoint active = ÐŸÑƒÑ‚ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° активна +Waypoint inactive = ÐŸÑƒÑ‚ÐµÐ²Ð°Ñ Ñ‚Ð¾Ñ‡ÐºÐ° неактивна +World position = ÐŸÐ¾Ð·Ð¸Ñ†Ð¸Ñ +Name = Ð˜Ð¼Ñ +HUD text color = Цвет текÑта +Edit waypoint name = Редактировать Ð¸Ð¼Ñ Ð¿ÑƒÑ‚ÐµÐ²Ð¾Ð¹ точки +Rename waypoint = Переименовать путевую точку +Change color of waypoint display = Изменить цвет путевой точки +Set waypoint to current location = УÑтановить путевую точку в текущем меÑтоположении +Make waypoint visible = Сделать путевую точку видимой +Make waypoint invisible = Сделать путевую точку невидимой +Disable display of waypoint coordinates = Отключить отображение координат путевой точки +Enable display of waypoint coordinates = Включить отображение координат путевой точки +Finish editing = Завершить редактирование +Select Waypoint #%d = Выбрать путевую точку â„–%d diff --git a/mods/unified_inventory/locale/template.txt b/mods/unified_inventory/locale/template.txt new file mode 100644 index 0000000..ae382e3 --- /dev/null +++ b/mods/unified_inventory/locale/template.txt @@ -0,0 +1,72 @@ +# Translation by + +# Template +### bags.lua ### +Bags = +Bag 1 = +Bag 2 = +Bag 3 = +Bag 4 = +Small Bag = +Medium Bag = +Large Bag = + +### inernal.lua ### +First page = +Back three pages = +Back one page = +Forward one page = +Forward three pages = +Last page = +No matching items = +Page = +%s of %s = +Filter = +Search = + +### register.lua ### +Can use the creative inventory = +Home position set to: %s = +Time of day set to 6am = +You don't have the settime priviledge! = +Time of day set to 9pm = +This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = +Inventory Cleared! = +Crafting = +Trash: = +Refill: = +Crafting Guide = +Method: = +Result: %s = +crafting = +shapeless crafting = +cooking = +alloy cooking = +Copy to craft grid: = +All = +Recipe %s of %s = +Alternate = +Crafting Grid = + +### waypoints.lua ### +White = +Yellow = +Red = +Green = +Blue = +Waypoints = +Waypoint active = +Waypoint inactive = +World position = +Name = +HUD text color = +Edit waypoint name = +Rename waypoint = +Change color of waypoint display = +Set waypoint to current location = +Make waypoint visible = +Make waypoint invisible = +Disable display of waypoint coordinates = +Enable display of waypoint coordinates = +Finish editing = +Select Waypoint #%d = diff --git a/mods/unified_inventory/locale/tr.txt b/mods/unified_inventory/locale/tr.txt new file mode 100644 index 0000000..c1d3207 --- /dev/null +++ b/mods/unified_inventory/locale/tr.txt @@ -0,0 +1,72 @@ +# Translation by Mahmutelmas06@hotmail.com + +# Template +### bags.lua ### +Bags = Çantalarım +Bag 1 = 1. Çanta +Bag 2 = 2. Çanta +Bag 3 = 3. Çanta +Bag 4 = 4. Çanta +Small Bag = Küçük Çanta +Medium Bag = Çanta +Large Bag = Büyük Çanta + +### inernal.lua ### +First page = Ä°lk Sayfa +Back three pages = 3 Sayfa Gerile +Back one page = Geri +Forward one page = Ä°leri +Forward three pages = 3 Sayfa Ä°lerile +Last page = Son Sayfa +No matching items = EÅŸleÅŸme yok +Page = Sayfa +%s of %s = %s dan %s +Filter = Süzgeç +Search = Ara + +### register.lua ### +Can use the creative inventory = Yaratıcı envanteri kullanabilir +Home position set to: %s = Yeni eviniz: %s +Time of day set to 6am = Saat 06:00 olarak ayarlandı +You don't have the settime priviledge = Saati düzenleme yetkiniz yok! +Time of day set to 9pm = Saat 19:00 olarak ayarlandı +This button has been disabled outside of creative mode to prevent accidental inventory trashing.\nUse the trash slot instead. = Yaratıcı modu dışında iken bu tuÅŸ kullanılamaz. +Inventory Cleared! = Envanter temizlendi! +Crafting = Ãœretim +Trash: = Çöp +Refill: = Doldur +Crafting Guide = Kılavuz +Method: = Yöntem +Result: %s = Çıktı: %s +crafting = üretim +shapeless crafting = ÅŸekilsiz üretim +cooking = piÅŸirme +alloy cooking = karıştırma +Copy to craft grid: = Ãœretim tablosuna kopyala +All = Tümü +Recipe %s of %s = %s dan %s tarifi +Alternate = Altarnatif +Crafting Grid = Ãœretim tablosu + +### waypoints.lua ### +White = Beyaz +Yellow = Sarı +Red = Kırmızı +Green = YeÅŸil +Blue = Mavi +Waypoints = Konum Noktaları +Waypoint active = Konum Etkin +Waypoint inactive = Konum Devredışı +World position = Dünya konumu +Name = Ä°sim +HUD text color = Metin rengi +Edit waypoint name = Konum Noktasını Düzenle +Rename waypoint = Konum Noktasını Adlandır +Change color of waypoint display = Konum Gösterge Rengi +Set waypoint to current location = BulunduÄŸun noktayı iÅŸaretle +Make waypoint visible = Konumlar görünür +Make waypoint invisible = Konumlar gözükmez +Disable display of waypoint coordinates = Koordinatları gizle +Enable display of waypoint coordinates = Koordinatları göster +Finish editing = Düzenleme bitti +Select Waypoint #%d = #%d konum noktası seç diff --git a/mods/unified_inventory/register.lua b/mods/unified_inventory/register.lua new file mode 100644 index 0000000..8fb0a33 --- /dev/null +++ b/mods/unified_inventory/register.lua @@ -0,0 +1,397 @@ +local S = unified_inventory.gettext + +minetest.register_privilege("creative", { + description = "Can use the creative inventory", + give_to_singleplayer = false, +}) + +local trash = minetest.create_detached_inventory("trash", { + --allow_put = function(inv, listname, index, stack, player) + -- if unified_inventory.is_creative(player:get_player_name()) then + -- return stack:get_count() + -- else + -- return 0 + -- end + --end, + on_put = function(inv, listname, index, stack, player) + inv:set_stack(listname, index, nil) + local player_name = player:get_player_name() + minetest.sound_play("trash", {to_player=player_name, gain = 1.0}) + end, +}) +trash:set_size("main", 1) + +unified_inventory.register_button("craft", { + type = "image", + image = "ui_craft_icon.png", + tooltip = S("Crafting Grid") +}) + +unified_inventory.register_button("craftguide", { + type = "image", + image = "ui_craftguide_icon.png", + tooltip = S("Crafting Guide") +}) + +if not unified_inventory.lite_mode then + unified_inventory.register_button("home_gui_set", { + type = "image", + image = "ui_sethome_icon.png", + tooltip = S("Set home position"), + action = function(player) + local player_name = player:get_player_name() + unified_inventory.set_home(player, player:getpos()) + local home = unified_inventory.home_pos[player_name] + if home ~= nil then + minetest.sound_play("dingdong", + {to_player=player_name, gain = 1.0}) + minetest.chat_send_player(player_name, + S("Home position set to: %s"):format(minetest.pos_to_string(home))) + end + end, + }) + + unified_inventory.register_button("home_gui_go", { + type = "image", + image = "ui_gohome_icon.png", + tooltip = S("Go home"), + action = function(player) + minetest.sound_play("teleport", + {to_player=player:get_player_name(), gain = 1.0}) + unified_inventory.go_home(player) + end, + }) + + unified_inventory.register_button("misc_set_day", { + type = "image", + image = "ui_sun_icon.png", + tooltip = S("Set time to day"), + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {settime=true}) then + minetest.sound_play("birds", + {to_player=player_name, gain = 1.0}) + minetest.set_timeofday((6000 % 24000) / 24000) + minetest.chat_send_player(player_name, + S("Time of day set to 6am")) + else + minetest.chat_send_player(player_name, + S("You don't have the settime priviledge!")) + end + end, + }) + + unified_inventory.register_button("misc_set_night", { + type = "image", + image = "ui_moon_icon.png", + tooltip = S("Set time to night"), + action = function(player) + local player_name = player:get_player_name() + if minetest.check_player_privs(player_name, {settime=true}) then + minetest.sound_play("owl", + {to_player=player_name, gain = 1.0}) + minetest.set_timeofday((21000 % 24000) / 24000) + minetest.chat_send_player(player_name, + S("Time of day set to 9pm")) + else + minetest.chat_send_player(player_name, + S("You don't have the settime priviledge!")) + end + end, + }) +end + +unified_inventory.register_button("clear_inv", { + type = "image", + image = "ui_trash_icon.png", + tooltip = S("Clear inventory"), + action = function(player) + local player_name = player:get_player_name() + if not unified_inventory.is_creative(player_name) then + minetest.chat_send_player(player_name, + S("This button has been disabled outside" + .." of creative mode to prevent" + .." accidental inventory trashing." + .."\nUse the trash slot instead.")) + return + end + player:get_inventory():set_list("main", {}) + minetest.chat_send_player(player_name, 'Inventory Cleared!') + minetest.sound_play("trash_all", + {to_player=player_name, gain = 1.0}) + end, +}) + +unified_inventory.register_page("craft", { + get_formspec = function(player, formspec) + local player_name = player:get_player_name() + local formspec = "background[0,"..unified_inventory.formspec_y..";8,3;ui_crafting_form.png]" + formspec = formspec.."background[0,"..(unified_inventory.formspec_y + 3.5)..";8,4;ui_main_inventory.png]" + formspec = formspec.."label[0,"..unified_inventory.form_header_y..";Crafting]" + formspec = formspec.."listcolors[#00000000;#00000000]" + formspec = formspec.."list[current_player;craftpreview;6,"..unified_inventory.formspec_y..";1,1;]" + formspec = formspec.."list[current_player;craft;2,"..unified_inventory.formspec_y..";3,3;]" + formspec = formspec.."label[7,"..(unified_inventory.formspec_y + 1.5)..";" .. S("Trash:") .. "]" + formspec = formspec.."list[detached:trash;main;7,"..(unified_inventory.formspec_y + 2)..";1,1;]" + if unified_inventory.is_creative(player_name) then + formspec = formspec.."label[0,"..(unified_inventory.formspec_y + 1.5)..";" .. S("Refill:") .. "]" + formspec = formspec.."list[detached:"..minetest.formspec_escape(player_name).."refill;main;0,"..(unified_inventory.formspec_y +2)..";1,1;]" + end + return {formspec=formspec} + end, +}) + +-- stack_image_button(): generate a form button displaying a stack of items +-- +-- Normally a simple item_image_button[] is used. If the stack contains +-- more than one item, item_image_button[] doesn't have an option to +-- display an item count in the way that an inventory slot does, so +-- we have to fake it using the label facility. +-- +-- The specified item may be a group. In that case, the group will be +-- represented by some item in the group, along with a flag indicating +-- that it's a group. If the group contains only one item, it will be +-- treated as if that item had been specified directly. + +local function stack_image_button(x, y, w, h, buttonname_prefix, item) + local name = item:get_name() + local count = item:get_count() + local show_is_group = false + local displayitem = name + local selectitem = name + if name:sub(1, 6) == "group:" then + local group_name = name:sub(7) + local group_item = unified_inventory.get_group_item(group_name) + show_is_group = not group_item.sole + displayitem = group_item.item or "unknown" + selectitem = group_item.sole and displayitem or name + end + local label = string.format("\n\n%s%7d", show_is_group and " G\n" or " ", count):gsub(" 1$", " .") + if label == "\n\n ." then label = "" end + return string.format("item_image_button[%f,%f;%u,%u;%s;%s;%s]", + x, y, w, h, + minetest.formspec_escape(displayitem), + minetest.formspec_escape(buttonname_prefix..unified_inventory.mangle_for_formspec(selectitem)), + label) +end + +local recipe_text = { + recipe = "Recipe", + usage = "Usage", +} +local no_recipe_text = { + recipe = "No recipes", + usage = "No usages", +} +local role_text = { + recipe = "Result", + usage = "Ingredient", +} +local other_dir = { + recipe = "usage", + usage = "recipe", +} + +unified_inventory.register_page("craftguide", { + get_formspec = function(player) + local player_name = player:get_player_name() + local player_privs = minetest.get_player_privs(player_name) + local formspec = "" + formspec = formspec.."background[0,"..(unified_inventory.formspec_y + 3.5)..";8,4;ui_main_inventory.png]" + formspec = formspec.."label[0,"..unified_inventory.form_header_y..";" .. S("Crafting Guide") .. "]" + formspec = formspec.."listcolors[#00000000;#00000000]" + local item_name = unified_inventory.current_item[player_name] + if not item_name then return {formspec=formspec} end + + local dir = unified_inventory.current_craft_direction[player_name] + local rdir + if dir == "recipe" then rdir = "usage" end + if dir == "usage" then rdir = "recipe" end + local crafts = unified_inventory.crafts_for[dir][item_name] + local alternate = unified_inventory.alternate[player_name] + local alternates, craft + if crafts ~= nil and #crafts > 0 then + alternates = #crafts + craft = crafts[alternate] + end + + formspec = formspec.."background[0.5,"..(unified_inventory.formspec_y + 0.2)..";8,3;ui_craftguide_form.png]" + formspec = formspec.."textarea["..unified_inventory.craft_result_x..","..unified_inventory.craft_result_y + ..";10,1;;"..minetest.formspec_escape(role_text[dir]..": "..item_name)..";]" + formspec = formspec..stack_image_button(0, unified_inventory.formspec_y, 1.1, 1.1, "item_button_" + .. rdir .. "_", ItemStack(item_name)) + + if not craft then + formspec = formspec.."label[5.5,"..(unified_inventory.formspec_y + 2.35)..";" + ..minetest.formspec_escape(no_recipe_text[dir]).."]" + local no_pos = dir == "recipe" and 4.5 or 6.5 + local item_pos = dir == "recipe" and 6.5 or 4.5 + formspec = formspec.."image["..no_pos..","..unified_inventory.formspec_y..";1.1,1.1;ui_no.png]" + formspec = formspec..stack_image_button(item_pos, unified_inventory.formspec_y, 1.1, 1.1, "item_button_" + ..other_dir[dir].."_", ItemStack(item_name)) + if player_privs.give == true then + formspec = formspec.."label[0,"..(unified_inventory.formspec_y + 2.10)..";" .. S("Give me:") .. "]" + .."button[0, "..(unified_inventory.formspec_y + 2.7)..";0.6,0.5;craftguide_giveme_1;1]" + .."button[0.6,"..(unified_inventory.formspec_y + 2.7)..";0.7,0.5;craftguide_giveme_10;10]" + .."button[1.3,"..(unified_inventory.formspec_y + 2.7)..";0.8,0.5;craftguide_giveme_99;99]" + end + return {formspec = formspec} + end + + local craft_type = unified_inventory.registered_craft_types[craft.type] or + unified_inventory.craft_type_defaults(craft.type, {}) + if craft_type.icon then + formspec = formspec..string.format(" image[%f,%f;%f,%f;%s]",5.7,(unified_inventory.formspec_y + 0.05),0.5,0.5,craft_type.icon) + end + formspec = formspec.."label[5.5,"..(unified_inventory.formspec_y + 1)..";" .. minetest.formspec_escape(craft_type.description).."]" + formspec = formspec..stack_image_button(6.5, unified_inventory.formspec_y, 1.1, 1.1, "item_button_usage_", ItemStack(craft.output)) + local display_size = craft_type.dynamic_display_size and craft_type.dynamic_display_size(craft) or { width = craft_type.width, height = craft_type.height } + local craft_width = craft_type.get_shaped_craft_width and craft_type.get_shaped_craft_width(craft) or display_size.width + + -- This keeps recipes aligned to the right, + -- so that they're close to the arrow. + local xoffset = 1.5 + (3 - display_size.width) + for y = 1, display_size.height do + for x = 1, display_size.width do + local item + if craft and x <= craft_width then + item = craft.items[(y-1) * craft_width + x] + end + if item then + formspec = formspec..stack_image_button( + xoffset + x, unified_inventory.formspec_y - 1 + y, 1.1, 1.1, + "item_button_recipe_", + ItemStack(item)) + else + -- Fake buttons just to make grid + formspec = formspec.."image_button[" + ..tostring(xoffset + x)..","..tostring(unified_inventory.formspec_y - 1 + y) + ..";1,1;ui_blank_image.png;;]" + end + end + end + + if craft_type.uses_crafting_grid then + formspec = formspec.."label[0,"..(unified_inventory.formspec_y + 0.9)..";" .. S("To craft grid:") .. "]" + .."button[0, "..(unified_inventory.formspec_y + 1.5)..";0.6,0.5;craftguide_craft_1;1]" + .."button[0.6,"..(unified_inventory.formspec_y + 1.5)..";0.7,0.5;craftguide_craft_10;10]" + .."button[1.3,"..(unified_inventory.formspec_y + 1.5)..";0.8,0.5;craftguide_craft_max;" .. S("All") .. "]" + end + if player_privs.give then + formspec = formspec.."label[0,"..(unified_inventory.formspec_y + 2.1)..";" .. S("Give me:") .. "]" + .."button[0, "..(unified_inventory.formspec_y + 2.7)..";0.6,0.5;craftguide_giveme_1;1]" + .."button[0.6,"..(unified_inventory.formspec_y + 2.7)..";0.7,0.5;craftguide_giveme_10;10]" + .."button[1.3,"..(unified_inventory.formspec_y + 2.7)..";0.8,0.5;craftguide_giveme_99;99]" + end + + if alternates and alternates > 1 then + formspec = formspec.."label[5.5,"..(unified_inventory.formspec_y + 1.6)..";"..recipe_text[dir].." " + ..tostring(alternate).." of " + ..tostring(alternates).."]" + .."button[5.5,"..(unified_inventory.formspec_y + 2)..";2,1;alternate;" .. S("Alternate") .. "]" + end + return {formspec = formspec} + end, +}) + +local function craftguide_giveme(player, formname, fields) + local amount + for k, v in pairs(fields) do + amount = k:match("craftguide_giveme_(.*)") + if amount then break end + end + if not amount then return end + + amount = tonumber(amount) + if amount == 0 then return end + + local player_name = player:get_player_name() + + local output = unified_inventory.current_item[player_name] + if (not output) or (output == "") then return end + + local player_inv = player:get_inventory() + + player_inv:add_item("main", {name = output, count = amount}) +end + +local function craftguide_craft(player, formname, fields) + local amount + for k, v in pairs(fields) do + amount = k:match("craftguide_craft_(.*)") + if amount then break end + end + if not amount then return end + local player_name = player:get_player_name() + + local output = unified_inventory.current_item[player_name] + if (not output) or (output == "") then return end + + local player_inv = player:get_inventory() + + local crafts = unified_inventory.crafts_for[unified_inventory.current_craft_direction[player_name]][output] + if (not crafts) or (#crafts == 0) then return end + + local alternate = unified_inventory.alternate[player_name] + + local craft = crafts[alternate] + if craft.width > 3 then return end + + local needed = craft.items + + local craft_list = player_inv:get_list("craft") + + local width = craft.width + if width == 0 then + -- Shapeless recipe + width = 3 + end + + if amount == "max" then + amount = 99 -- Arbitrary; need better way to do this. + else + amount = tonumber(amount) + end + + for iter = 1, amount do + local index = 1 + for y = 1, 3 do + for x = 1, width do + local needed_item = needed[index] + if needed_item then + local craft_index = ((y - 1) * 3) + x + local craft_item = craft_list[craft_index] + if (not craft_item) or (craft_item:is_empty()) or (craft_item:get_name() == needed_item) then + itemname = craft_item and craft_item:get_name() or needed_item + local needed_stack = ItemStack(needed_item) + if player_inv:contains_item("main", needed_stack) then + local count = (craft_item and craft_item:get_count() or 0) + 1 + if count <= needed_stack:get_definition().stack_max then + local stack = ItemStack({name=needed_item, count=count}) + craft_list[craft_index] = stack + player_inv:remove_item("main", needed_stack) + end + end + end + end + index = index + 1 + end + end + end + + player_inv:set_list("craft", craft_list) + + unified_inventory.set_inventory_formspec(player, "craft") +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + for k, v in pairs(fields) do + if k:match("craftguide_craft_") then + craftguide_craft(player, formname, fields) + break + elseif k:match("craftguide_giveme_") then + craftguide_giveme(player, formname, fields) + break + end + end +end) diff --git a/mods/unified_inventory/sounds/birds.ogg b/mods/unified_inventory/sounds/birds.ogg new file mode 100644 index 0000000..4a93395 Binary files /dev/null and b/mods/unified_inventory/sounds/birds.ogg differ diff --git a/mods/unified_inventory/sounds/click.ogg b/mods/unified_inventory/sounds/click.ogg new file mode 100644 index 0000000..3db63a0 Binary files /dev/null and b/mods/unified_inventory/sounds/click.ogg differ diff --git a/mods/unified_inventory/sounds/dingdong.ogg b/mods/unified_inventory/sounds/dingdong.ogg new file mode 100644 index 0000000..2c9d7ef Binary files /dev/null and b/mods/unified_inventory/sounds/dingdong.ogg differ diff --git a/mods/unified_inventory/sounds/electricity.ogg b/mods/unified_inventory/sounds/electricity.ogg new file mode 100644 index 0000000..4cd7c84 Binary files /dev/null and b/mods/unified_inventory/sounds/electricity.ogg differ diff --git a/mods/unified_inventory/sounds/owl.ogg b/mods/unified_inventory/sounds/owl.ogg new file mode 100644 index 0000000..f30d0b3 Binary files /dev/null and b/mods/unified_inventory/sounds/owl.ogg differ diff --git a/mods/unified_inventory/sounds/paperflip1.ogg b/mods/unified_inventory/sounds/paperflip1.ogg new file mode 100644 index 0000000..eaed13f Binary files /dev/null and b/mods/unified_inventory/sounds/paperflip1.ogg differ diff --git a/mods/unified_inventory/sounds/paperflip2.ogg b/mods/unified_inventory/sounds/paperflip2.ogg new file mode 100644 index 0000000..321bc48 Binary files /dev/null and b/mods/unified_inventory/sounds/paperflip2.ogg differ diff --git a/mods/unified_inventory/sounds/teleport.ogg b/mods/unified_inventory/sounds/teleport.ogg new file mode 100644 index 0000000..ca32f74 Binary files /dev/null and b/mods/unified_inventory/sounds/teleport.ogg differ diff --git a/mods/unified_inventory/sounds/trash.ogg b/mods/unified_inventory/sounds/trash.ogg new file mode 100644 index 0000000..51e4f24 Binary files /dev/null and b/mods/unified_inventory/sounds/trash.ogg differ diff --git a/mods/unified_inventory/sounds/trash_all.ogg b/mods/unified_inventory/sounds/trash_all.ogg new file mode 100644 index 0000000..85c3f66 Binary files /dev/null and b/mods/unified_inventory/sounds/trash_all.ogg differ diff --git a/mods/unified_inventory/textures/.directory b/mods/unified_inventory/textures/.directory new file mode 100644 index 0000000..14c6054 --- /dev/null +++ b/mods/unified_inventory/textures/.directory @@ -0,0 +1,3 @@ +[Dolphin] +Timestamp=2015,7,18,20,36,35 +Version=3 diff --git a/mods/unified_inventory/textures/bags_large.png b/mods/unified_inventory/textures/bags_large.png new file mode 100644 index 0000000..38cf6bc Binary files /dev/null and b/mods/unified_inventory/textures/bags_large.png differ diff --git a/mods/unified_inventory/textures/bags_medium.png b/mods/unified_inventory/textures/bags_medium.png new file mode 100644 index 0000000..f048690 Binary files /dev/null and b/mods/unified_inventory/textures/bags_medium.png differ diff --git a/mods/unified_inventory/textures/bags_small.png b/mods/unified_inventory/textures/bags_small.png new file mode 100644 index 0000000..bf6fe6a Binary files /dev/null and b/mods/unified_inventory/textures/bags_small.png differ diff --git a/mods/unified_inventory/textures/ui_1_icon.png b/mods/unified_inventory/textures/ui_1_icon.png new file mode 100644 index 0000000..43605e0 Binary files /dev/null and b/mods/unified_inventory/textures/ui_1_icon.png differ diff --git a/mods/unified_inventory/textures/ui_2_icon.png b/mods/unified_inventory/textures/ui_2_icon.png new file mode 100644 index 0000000..dd64510 Binary files /dev/null and b/mods/unified_inventory/textures/ui_2_icon.png differ diff --git a/mods/unified_inventory/textures/ui_3_icon.png b/mods/unified_inventory/textures/ui_3_icon.png new file mode 100644 index 0000000..132dc3a Binary files /dev/null and b/mods/unified_inventory/textures/ui_3_icon.png differ diff --git a/mods/unified_inventory/textures/ui_4_icon.png b/mods/unified_inventory/textures/ui_4_icon.png new file mode 100644 index 0000000..9b7e430 Binary files /dev/null and b/mods/unified_inventory/textures/ui_4_icon.png differ diff --git a/mods/unified_inventory/textures/ui_5_icon.png b/mods/unified_inventory/textures/ui_5_icon.png new file mode 100644 index 0000000..699e08b Binary files /dev/null and b/mods/unified_inventory/textures/ui_5_icon.png differ diff --git a/mods/unified_inventory/textures/ui_bags_icon.png b/mods/unified_inventory/textures/ui_bags_icon.png new file mode 100644 index 0000000..38cf6bc Binary files /dev/null and b/mods/unified_inventory/textures/ui_bags_icon.png differ diff --git a/mods/unified_inventory/textures/ui_bags_lg_form.png b/mods/unified_inventory/textures/ui_bags_lg_form.png new file mode 100644 index 0000000..15f511d Binary files /dev/null and b/mods/unified_inventory/textures/ui_bags_lg_form.png differ diff --git a/mods/unified_inventory/textures/ui_bags_main_form.png b/mods/unified_inventory/textures/ui_bags_main_form.png new file mode 100644 index 0000000..26e6938 Binary files /dev/null and b/mods/unified_inventory/textures/ui_bags_main_form.png differ diff --git a/mods/unified_inventory/textures/ui_bags_med_form.png b/mods/unified_inventory/textures/ui_bags_med_form.png new file mode 100644 index 0000000..f786806 Binary files /dev/null and b/mods/unified_inventory/textures/ui_bags_med_form.png differ diff --git a/mods/unified_inventory/textures/ui_bags_sm_form.png b/mods/unified_inventory/textures/ui_bags_sm_form.png new file mode 100644 index 0000000..c77ff7c Binary files /dev/null and b/mods/unified_inventory/textures/ui_bags_sm_form.png differ diff --git a/mods/unified_inventory/textures/ui_blank_image.png b/mods/unified_inventory/textures/ui_blank_image.png new file mode 100644 index 0000000..f9bcda2 Binary files /dev/null and b/mods/unified_inventory/textures/ui_blank_image.png differ diff --git a/mods/unified_inventory/textures/ui_blue_icon_background.png b/mods/unified_inventory/textures/ui_blue_icon_background.png new file mode 100644 index 0000000..b4fa356 Binary files /dev/null and b/mods/unified_inventory/textures/ui_blue_icon_background.png differ diff --git a/mods/unified_inventory/textures/ui_circular_arrows_icon.png b/mods/unified_inventory/textures/ui_circular_arrows_icon.png new file mode 100644 index 0000000..968e404 Binary files /dev/null and b/mods/unified_inventory/textures/ui_circular_arrows_icon.png differ diff --git a/mods/unified_inventory/textures/ui_craft_icon.png b/mods/unified_inventory/textures/ui_craft_icon.png new file mode 100644 index 0000000..8884c61 Binary files /dev/null and b/mods/unified_inventory/textures/ui_craft_icon.png differ diff --git a/mods/unified_inventory/textures/ui_craftgrid_icon.png b/mods/unified_inventory/textures/ui_craftgrid_icon.png new file mode 100644 index 0000000..5b8025a Binary files /dev/null and b/mods/unified_inventory/textures/ui_craftgrid_icon.png differ diff --git a/mods/unified_inventory/textures/ui_craftguide_form.png b/mods/unified_inventory/textures/ui_craftguide_form.png new file mode 100644 index 0000000..72572b5 Binary files /dev/null and b/mods/unified_inventory/textures/ui_craftguide_form.png differ diff --git a/mods/unified_inventory/textures/ui_craftguide_icon.png b/mods/unified_inventory/textures/ui_craftguide_icon.png new file mode 100644 index 0000000..d5b76d2 Binary files /dev/null and b/mods/unified_inventory/textures/ui_craftguide_icon.png differ diff --git a/mods/unified_inventory/textures/ui_crafting_form.png b/mods/unified_inventory/textures/ui_crafting_form.png new file mode 100644 index 0000000..74389ed Binary files /dev/null and b/mods/unified_inventory/textures/ui_crafting_form.png differ diff --git a/mods/unified_inventory/textures/ui_doubleleft_icon.png b/mods/unified_inventory/textures/ui_doubleleft_icon.png new file mode 100644 index 0000000..ca1f66f Binary files /dev/null and b/mods/unified_inventory/textures/ui_doubleleft_icon.png differ diff --git a/mods/unified_inventory/textures/ui_doubleright_icon.png b/mods/unified_inventory/textures/ui_doubleright_icon.png new file mode 100644 index 0000000..995b565 Binary files /dev/null and b/mods/unified_inventory/textures/ui_doubleright_icon.png differ diff --git a/mods/unified_inventory/textures/ui_form_bg.png b/mods/unified_inventory/textures/ui_form_bg.png new file mode 100644 index 0000000..37683f0 Binary files /dev/null and b/mods/unified_inventory/textures/ui_form_bg.png differ diff --git a/mods/unified_inventory/textures/ui_gohome_icon.png b/mods/unified_inventory/textures/ui_gohome_icon.png new file mode 100644 index 0000000..1141055 Binary files /dev/null and b/mods/unified_inventory/textures/ui_gohome_icon.png differ diff --git a/mods/unified_inventory/textures/ui_green_icon_background.png b/mods/unified_inventory/textures/ui_green_icon_background.png new file mode 100644 index 0000000..21b4f41 Binary files /dev/null and b/mods/unified_inventory/textures/ui_green_icon_background.png differ diff --git a/mods/unified_inventory/textures/ui_group.png b/mods/unified_inventory/textures/ui_group.png new file mode 100644 index 0000000..d7f5dce Binary files /dev/null and b/mods/unified_inventory/textures/ui_group.png differ diff --git a/mods/unified_inventory/textures/ui_home_icon.png b/mods/unified_inventory/textures/ui_home_icon.png new file mode 100644 index 0000000..eeb4e04 Binary files /dev/null and b/mods/unified_inventory/textures/ui_home_icon.png differ diff --git a/mods/unified_inventory/textures/ui_left_icon.png b/mods/unified_inventory/textures/ui_left_icon.png new file mode 100644 index 0000000..14ad064 Binary files /dev/null and b/mods/unified_inventory/textures/ui_left_icon.png differ diff --git a/mods/unified_inventory/textures/ui_main_inventory.png b/mods/unified_inventory/textures/ui_main_inventory.png new file mode 100644 index 0000000..b65dabb Binary files /dev/null and b/mods/unified_inventory/textures/ui_main_inventory.png differ diff --git a/mods/unified_inventory/textures/ui_misc_form.png b/mods/unified_inventory/textures/ui_misc_form.png new file mode 100644 index 0000000..d34d326 Binary files /dev/null and b/mods/unified_inventory/textures/ui_misc_form.png differ diff --git a/mods/unified_inventory/textures/ui_moon_icon.png b/mods/unified_inventory/textures/ui_moon_icon.png new file mode 100644 index 0000000..0595a6c Binary files /dev/null and b/mods/unified_inventory/textures/ui_moon_icon.png differ diff --git a/mods/unified_inventory/textures/ui_no.png b/mods/unified_inventory/textures/ui_no.png new file mode 100644 index 0000000..ad9470b Binary files /dev/null and b/mods/unified_inventory/textures/ui_no.png differ diff --git a/mods/unified_inventory/textures/ui_off_icon.png b/mods/unified_inventory/textures/ui_off_icon.png new file mode 100644 index 0000000..1933742 Binary files /dev/null and b/mods/unified_inventory/textures/ui_off_icon.png differ diff --git a/mods/unified_inventory/textures/ui_ok_icon.png b/mods/unified_inventory/textures/ui_ok_icon.png new file mode 100644 index 0000000..e22b2bc Binary files /dev/null and b/mods/unified_inventory/textures/ui_ok_icon.png differ diff --git a/mods/unified_inventory/textures/ui_on_icon.png b/mods/unified_inventory/textures/ui_on_icon.png new file mode 100644 index 0000000..bb34ceb Binary files /dev/null and b/mods/unified_inventory/textures/ui_on_icon.png differ diff --git a/mods/unified_inventory/textures/ui_pencil_icon.png b/mods/unified_inventory/textures/ui_pencil_icon.png new file mode 100644 index 0000000..ab5ed5e Binary files /dev/null and b/mods/unified_inventory/textures/ui_pencil_icon.png differ diff --git a/mods/unified_inventory/textures/ui_red_icon_background.png b/mods/unified_inventory/textures/ui_red_icon_background.png new file mode 100644 index 0000000..c925689 Binary files /dev/null and b/mods/unified_inventory/textures/ui_red_icon_background.png differ diff --git a/mods/unified_inventory/textures/ui_right_icon.png b/mods/unified_inventory/textures/ui_right_icon.png new file mode 100644 index 0000000..ab0195c Binary files /dev/null and b/mods/unified_inventory/textures/ui_right_icon.png differ diff --git a/mods/unified_inventory/textures/ui_search_icon.png b/mods/unified_inventory/textures/ui_search_icon.png new file mode 100644 index 0000000..c64900e Binary files /dev/null and b/mods/unified_inventory/textures/ui_search_icon.png differ diff --git a/mods/unified_inventory/textures/ui_sethome_icon.png b/mods/unified_inventory/textures/ui_sethome_icon.png new file mode 100644 index 0000000..b047102 Binary files /dev/null and b/mods/unified_inventory/textures/ui_sethome_icon.png differ diff --git a/mods/unified_inventory/textures/ui_skip_backward_icon.png b/mods/unified_inventory/textures/ui_skip_backward_icon.png new file mode 100644 index 0000000..92e9e8c Binary files /dev/null and b/mods/unified_inventory/textures/ui_skip_backward_icon.png differ diff --git a/mods/unified_inventory/textures/ui_skip_forward_icon.png b/mods/unified_inventory/textures/ui_skip_forward_icon.png new file mode 100644 index 0000000..f046b4f Binary files /dev/null and b/mods/unified_inventory/textures/ui_skip_forward_icon.png differ diff --git a/mods/unified_inventory/textures/ui_sun_icon.png b/mods/unified_inventory/textures/ui_sun_icon.png new file mode 100644 index 0000000..5bd24fb Binary files /dev/null and b/mods/unified_inventory/textures/ui_sun_icon.png differ diff --git a/mods/unified_inventory/textures/ui_trash_icon.png b/mods/unified_inventory/textures/ui_trash_icon.png new file mode 100644 index 0000000..412573c Binary files /dev/null and b/mods/unified_inventory/textures/ui_trash_icon.png differ diff --git a/mods/unified_inventory/textures/ui_waypoint_set_icon.png b/mods/unified_inventory/textures/ui_waypoint_set_icon.png new file mode 100644 index 0000000..ee44c4c Binary files /dev/null and b/mods/unified_inventory/textures/ui_waypoint_set_icon.png differ diff --git a/mods/unified_inventory/textures/ui_waypoints_icon.png b/mods/unified_inventory/textures/ui_waypoints_icon.png new file mode 100644 index 0000000..e0281af Binary files /dev/null and b/mods/unified_inventory/textures/ui_waypoints_icon.png differ diff --git a/mods/unified_inventory/textures/ui_xyz_icon.png b/mods/unified_inventory/textures/ui_xyz_icon.png new file mode 100644 index 0000000..dabea81 Binary files /dev/null and b/mods/unified_inventory/textures/ui_xyz_icon.png differ diff --git a/mods/unified_inventory/textures/ui_xyz_off_icon.png b/mods/unified_inventory/textures/ui_xyz_off_icon.png new file mode 100644 index 0000000..8e45946 Binary files /dev/null and b/mods/unified_inventory/textures/ui_xyz_off_icon.png differ diff --git a/mods/unified_inventory/textures/ui_xyz_on_icon.png b/mods/unified_inventory/textures/ui_xyz_on_icon.png new file mode 100644 index 0000000..dabea81 Binary files /dev/null and b/mods/unified_inventory/textures/ui_xyz_on_icon.png differ diff --git a/mods/unified_inventory/waypoints.lua b/mods/unified_inventory/waypoints.lua new file mode 100644 index 0000000..890c3ec --- /dev/null +++ b/mods/unified_inventory/waypoints.lua @@ -0,0 +1,240 @@ +local S = unified_inventory.gettext + +local hud_colors = { + {"#FFFFFF", 0xFFFFFF, S("White")}, + {"#DBBB00", 0xf1d32c, S("Yellow")}, + {"#DD0000", 0xDD0000, S("Red")}, + {"#2cf136", 0x2cf136, S("Green")}, + {"#2c4df1", 0x2c4df1, S("Blue")}, +} + +local hud_colors_max = #hud_colors + +-- Stores temporary player data (persists until player leaves) +local waypoints_temp = {} + +unified_inventory.register_page("waypoints", { + get_formspec = function(player) + local player_name = player:get_player_name() + local waypoints = datastorage.get(player_name, "waypoints") + local formspec = "background[0,4.5;8,4;ui_main_inventory.png]" .. + "image[0,0;1,1;ui_waypoints_icon.png]" .. + "label[1,0;" .. S("Waypoints") .. "]" + + -- Tabs buttons: + for i = 1, 5, 1 do + formspec = formspec .. + "image_button[0.0," .. 0.2 + i * 0.7 .. ";.8,.8;" .. + (i == waypoints.selected and "ui_blue_icon_background.png^" or "") .. + "ui_" .. i .. "_icon.png;" .. + "select_waypoint" .. i .. ";]" .. + "tooltip[select_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Select Waypoint #%d"):format(i)).."]" + end + + local i = waypoints.selected or 1 + local waypoint = waypoints[i] or {} + local temp = waypoints_temp[player_name][i] or {} + local default_name = "Waypoint "..i + + -- Main buttons: + formspec = formspec .. + "image_button[4.5,3.7;.8,.8;".. + "ui_waypoint_set_icon.png;".. + "set_waypoint"..i..";]".. + "tooltip[set_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Set waypoint to current location")).."]" + + formspec = formspec .. + "image_button[5.2,3.7;.8,.8;".. + (waypoint.active and "ui_on_icon.png" or "ui_off_icon.png")..";".. + "toggle_waypoint"..i..";]".. + "tooltip[toggle_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Make waypoint " + ..(waypoint.active and "invisible" or "visible"))).."]" + + formspec = formspec .. + "image_button[5.9,3.7;.8,.8;".. + (waypoint.display_pos and "ui_green_icon_background.png" or "ui_red_icon_background.png").."^ui_xyz_icon.png;".. + "toggle_display_pos" .. i .. ";]".. + "tooltip[toggle_display_pos" .. i .. ";" + .. minetest.formspec_escape(S((waypoint.display_pos and "Disable" or "Enable") + .." display of waypoint coordinates")).."]" + + formspec = formspec .. + "image_button[6.6,3.7;.8,.8;".. + "ui_circular_arrows_icon.png;".. + "toggle_color"..i..";]".. + "tooltip[toggle_color" .. i .. ";" + .. minetest.formspec_escape(S("Change color of waypoint display")).."]" + + formspec = formspec .. + "image_button[7.3,3.7;.8,.8;".. + "ui_pencil_icon.png;".. + "rename_waypoint"..i..";]".. + "tooltip[rename_waypoint" .. i .. ";" + .. minetest.formspec_escape(S("Edit waypoint name")).."]" + + -- Waypoint's info: + if waypoint.active then + formspec = formspec .. "label[1,0.8;"..S("Waypoint active").."]" + else + formspec = formspec .. "label[1,0.8;"..S("Waypoint inactive").."]" + end + + if temp.edit then + formspec = formspec .. + "field[1.3,3.2;6,.8;rename_box" .. i .. ";;" + ..(waypoint.name or default_name).."]" .. + "image_button[7.3,2.9;.8,.8;".. + "ui_ok_icon.png;".. + "confirm_rename"..i.. ";]".. + "tooltip[confirm_rename" .. i .. ";" + .. minetest.formspec_escape(S("Finish editing")).."]" + end + + formspec = formspec .. "label[1,1.3;"..S("World position")..": " .. + minetest.pos_to_string(waypoint.world_pos or vector.new()) .. "]" .. + "label[1,1.8;"..S("Name")..": ".. (waypoint.name or default_name) .. "]" .. + "label[1,2.3;"..S("HUD text color")..": " .. + hud_colors[waypoint.color or 1][3] .. "]" + + return {formspec=formspec} + end, +}) + +unified_inventory.register_button("waypoints", { + type = "image", + image = "ui_waypoints_icon.png", + tooltip = S("Waypoints"), +}) + +local function update_hud(player, waypoints, temp, i) + local waypoint = waypoints[i] + if not waypoint then return end + temp[i] = temp[i] or {} + temp = temp[i] + local pos = waypoint.world_pos or vector.new() + local name + if waypoint.display_pos then + name = minetest.pos_to_string(pos) + if waypoint.name then + name = name..", "..waypoint.name + end + else + name = waypoint.name or "Waypoint "..i + end + if temp.hud then + player:hud_remove(temp.hud) + end + if waypoint.active then + temp.hud = player:hud_add({ + hud_elem_type = "waypoint", + number = hud_colors[waypoint.color or 1][2] , + name = name, + text = "m", + world_pos = pos + }) + else + temp.hud = nil + end +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if formname ~= "" then return end + + local player_name = player:get_player_name() + local update_formspec = false + local need_update_hud = false + local hit = false + + local waypoints = datastorage.get(player_name, "waypoints") + local temp = waypoints_temp[player_name] + for i = 1, 5, 1 do + if fields["select_waypoint"..i] then + hit = true + waypoints.selected = i + update_formspec = true + end + + if fields["toggle_waypoint"..i] then + hit = true + waypoints[i] = waypoints[i] or {} + waypoints[i].active = not (waypoints[i].active) + need_update_hud = true + update_formspec = true + end + + if fields["set_waypoint"..i] then + hit = true + local pos = player:getpos() + pos.x = math.floor(pos.x) + pos.y = math.floor(pos.y) + pos.z = math.floor(pos.z) + waypoints[i] = waypoints[i] or {} + waypoints[i].world_pos = pos + need_update_hud = true + update_formspec = true + end + + if fields["rename_waypoint"..i] then + hit = true + temp[i] = temp[i] or {} + temp[i].edit = true + update_formspec = true + end + + if fields["toggle_display_pos"..i] then + hit = true + waypoints[i] = waypoints[i] or {} + waypoints[i].display_pos = not waypoints[i].display_pos + need_update_hud = true + update_formspec = true + end + + if fields["toggle_color"..i] then + hit = true + waypoints[i] = waypoints[i] or {} + local color = waypoints[i].color or 1 + color = color + 1 + if color > hud_colors_max then + color = 1 + end + waypoints[i].color = color + need_update_hud = true + update_formspec = true + end + + if fields["confirm_rename"..i] then + hit = true + waypoints[i] = waypoints[i] or {} + temp[i].edit = false + waypoints[i].name = fields["rename_box"..i] + need_update_hud = true + update_formspec = true + end + if need_update_hud then + update_hud(player, waypoints, temp, i) + end + if update_formspec then + unified_inventory.set_inventory_formspec(player, "waypoints") + end + if hit then return end + end +end) + + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + local waypoints = datastorage.get(player_name, "waypoints") + local temp = {} + waypoints_temp[player_name] = temp + for i = 1, 5 do + update_hud(player, waypoints, temp, i) + end +end) + +minetest.register_on_leaveplayer(function(player) + waypoints_temp[player:get_player_name()] = nil +end) + diff --git a/mods/vessels/README.txt b/mods/vessels/README.txt new file mode 100644 index 0000000..150b501 --- /dev/null +++ b/mods/vessels/README.txt @@ -0,0 +1,45 @@ +Minetest 0.4 mod: vessels +========================== + +Crafts +------- +Glass bottle (yields 10) + + G - G + G - G + - G - + +Drinking Glass (yields 14) + + G - G + G - G + G G G + +Heavy Steel Bottle (yields 5) + + S - S + S - S + - S - + +License of source code: +----------------------- +Copyright (C) 2012 Vanessa Ezekowitz +Version 2012-09-02 +Modifications by 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.1 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) +-------------------------------------- +WTFPL + +Authors of media files +----------------------- +Unless specifically noted, +Copyright (C) 2012 Vanessa Ezekowitz + diff --git a/mods/vessels/depends.txt b/mods/vessels/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/vessels/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/vessels/init.lua b/mods/vessels/init.lua new file mode 100644 index 0000000..6389a24 --- /dev/null +++ b/mods/vessels/init.lua @@ -0,0 +1,202 @@ +-- Minetest 0.4 mod: vessels +-- See README.txt for licensing and other information. + +local vessels_shelf_formspec = + "size[8,7;]".. + default.gui_bg.. + default.gui_bg_img.. + default.gui_slots.. + "list[context;vessels;0,0.3;8,2;]".. + "list[current_player;main;0,2.85;8,1;]".. + "list[current_player;main;0,4.08;8,3;8]".. + "listring[context;vessels]".. + "listring[current_player;main]".. + default.get_hotbar_bg(0,2.85) + +minetest.register_node("vessels:shelf", { + description = "Vessels shelf", + tiles = {"default_wood.png", "default_wood.png", "default_wood.png^vessels_shelf.png"}, + is_ground_content = false, + groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, + sounds = default.node_sound_wood_defaults(), + + on_construct = function(pos) + local meta = minetest.get_meta(pos) + meta:set_string("formspec", vessels_shelf_formspec) + local inv = meta:get_inventory() + inv:set_size("vessels", 8*2) + end, + can_dig = function(pos,player) + local meta = minetest.get_meta(pos); + local inv = meta:get_inventory() + return inv:is_empty("vessels") + end, + + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local to_stack = inv:get_stack(listname, index) + if listname == "vessels" then + if minetest.get_item_group(stack:get_name(), "vessel") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local stack = inv:get_stack(from_list, from_index) + local to_stack = inv:get_stack(to_list, to_index) + if to_list == "vessels" then + if minetest.get_item_group(stack:get_name(), "vessel") ~= 0 + and to_stack:is_empty() then + return 1 + else + return 0 + end + end + end, + + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.log("action", player:get_player_name().. + " moves stuff in vessels shelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to vessels shelf at "..minetest.pos_to_string(pos)) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " takes stuff from vessels shelf at "..minetest.pos_to_string(pos)) + end, +}) + +minetest.register_craft({ + output = 'vessels:shelf', + recipe = { + {'group:wood', 'group:wood', 'group:wood'}, + {'group:vessel', 'group:vessel', 'group:vessel'}, + {'group:wood', 'group:wood', 'group:wood'}, + } +}) + +minetest.register_node("vessels:glass_bottle", { + description = "Glass Bottle (empty)", + drawtype = "plantlike", + tiles = {"vessels_glass_bottle.png"}, + inventory_image = "vessels_glass_bottle_inv.png", + wield_image = "vessels_glass_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25} + }, + groups = {vessel=1,dig_immediate=3,attached_node=1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:glass_bottle 10", + recipe = { + { "default:glass", "", "default:glass" }, + { "default:glass", "", "default:glass" }, + { "", "default:glass", "" } + } +}) + +minetest.register_node("vessels:drinking_glass", { + description = "Drinking Glass (empty)", + drawtype = "plantlike", + tiles = {"vessels_drinking_glass.png"}, + inventory_image = "vessels_drinking_glass_inv.png", + wield_image = "vessels_drinking_glass.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25} + }, + groups = {vessel=1,dig_immediate=3,attached_node=1}, + sounds = default.node_sound_glass_defaults(), +}) + +minetest.register_craft( { + output = "vessels:drinking_glass 14", + recipe = { + { "default:glass", "", "default:glass" }, + { "default:glass", "", "default:glass" }, + { "default:glass", "default:glass", "default:glass" } + } +}) + +minetest.register_node("vessels:steel_bottle", { + description = "Heavy Steel Bottle (empty)", + drawtype = "plantlike", + tiles = {"vessels_steel_bottle.png"}, + inventory_image = "vessels_steel_bottle_inv.png", + wield_image = "vessels_steel_bottle.png", + paramtype = "light", + is_ground_content = false, + walkable = false, + selection_box = { + type = "fixed", + fixed = {-0.25, -0.5, -0.25, 0.25, 0.4, 0.25} + }, + groups = {vessel=1,dig_immediate=3,attached_node=1}, + sounds = default.node_sound_defaults(), +}) + +minetest.register_craft( { + output = "vessels:steel_bottle 5", + recipe = { + { "default:steel_ingot", "", "default:steel_ingot" }, + { "default:steel_ingot", "", "default:steel_ingot" }, + { "", "default:steel_ingot", "" } + } +}) + + +-- Make sure we can recycle them + +minetest.register_craftitem("vessels:glass_fragments", { + description = "Pile of Glass Fragments", + inventory_image = "vessels_glass_fragments.png", +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:glass_bottle", + "vessels:glass_bottle", + }, +}) + +minetest.register_craft( { + type = "shapeless", + output = "vessels:glass_fragments", + recipe = { + "vessels:drinking_glass", + "vessels:drinking_glass", + }, +}) + +minetest.register_craft({ + type = "cooking", + output = "default:glass", + recipe = "vessels:glass_fragments", +}) + +minetest.register_craft( { + type = "cooking", + output = "default:steel_ingot", + recipe = "vessels:steel_bottle", +}) + diff --git a/mods/vessels/textures/vessels_drinking_glass.png b/mods/vessels/textures/vessels_drinking_glass.png new file mode 100644 index 0000000..4cff308 Binary files /dev/null and b/mods/vessels/textures/vessels_drinking_glass.png differ diff --git a/mods/vessels/textures/vessels_drinking_glass_inv.png b/mods/vessels/textures/vessels_drinking_glass_inv.png new file mode 100644 index 0000000..4cff308 Binary files /dev/null and b/mods/vessels/textures/vessels_drinking_glass_inv.png differ diff --git a/mods/vessels/textures/vessels_glass_bottle.png b/mods/vessels/textures/vessels_glass_bottle.png new file mode 100644 index 0000000..e9dc683 Binary files /dev/null and b/mods/vessels/textures/vessels_glass_bottle.png differ diff --git a/mods/vessels/textures/vessels_glass_bottle_inv.png b/mods/vessels/textures/vessels_glass_bottle_inv.png new file mode 100644 index 0000000..e9dc683 Binary files /dev/null and b/mods/vessels/textures/vessels_glass_bottle_inv.png differ diff --git a/mods/vessels/textures/vessels_glass_fragments.png b/mods/vessels/textures/vessels_glass_fragments.png new file mode 100644 index 0000000..7c6c488 Binary files /dev/null and b/mods/vessels/textures/vessels_glass_fragments.png differ diff --git a/mods/vessels/textures/vessels_shelf.png b/mods/vessels/textures/vessels_shelf.png new file mode 100644 index 0000000..87c69b2 Binary files /dev/null and b/mods/vessels/textures/vessels_shelf.png differ diff --git a/mods/vessels/textures/vessels_steel_bottle.png b/mods/vessels/textures/vessels_steel_bottle.png new file mode 100644 index 0000000..834a3d5 Binary files /dev/null and b/mods/vessels/textures/vessels_steel_bottle.png differ diff --git a/mods/vessels/textures/vessels_steel_bottle_inv.png b/mods/vessels/textures/vessels_steel_bottle_inv.png new file mode 100644 index 0000000..834a3d5 Binary files /dev/null and b/mods/vessels/textures/vessels_steel_bottle_inv.png differ diff --git a/mods/walking_light/init.lua b/mods/walking_light/init.lua new file mode 100644 index 0000000..c3a954c --- /dev/null +++ b/mods/walking_light/init.lua @@ -0,0 +1,145 @@ +local players = {} +local player_positions = {} +local last_wielded = {} + +function round(num) + return math.floor(num + 0.5) +end + +minetest.register_on_joinplayer(function(player) + local player_name = player:get_player_name() + table.insert(players, player_name) + last_wielded[player_name] = player:get_wielded_item():get_name() + local pos = player:getpos() + local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)} + local wielded_item = player:get_wielded_item():get_name() + if wielded_item ~= "default:torch" and wielded_item ~= "walking_light:pick_mese" then + -- Neuberechnung des Lichts erzwingen + minetest.env:add_node(rounded_pos,{type="node",name="default:cobble"}) + minetest.env:add_node(rounded_pos,{type="node",name="air"}) + end + player_positions[player_name] = {} + player_positions[player_name]["x"] = rounded_pos.x; + player_positions[player_name]["y"] = rounded_pos.y; + player_positions[player_name]["z"] = rounded_pos.z; +end) + +minetest.register_on_leaveplayer(function(player) + local player_name = player:get_player_name() + for i,v in ipairs(players) do + if v == player_name then + table.remove(players, i) + last_wielded[player_name] = nil + -- Neuberechnung des Lichts erzwingen + local pos = player:getpos() + local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)} + minetest.env:add_node(rounded_pos,{type="node",name="default:cobble"}) + minetest.env:add_node(rounded_pos,{type="node",name="air"}) + player_positions[player_name]["x"] = nil + player_positions[player_name]["y"] = nil + player_positions[player_name]["z"] = nil + player_positions[player_name]["m"] = nil + player_positions[player_name] = nil + end + end +end) + +minetest.register_globalstep(function(dtime) + for i,player_name in ipairs(players) do + local player = minetest.env:get_player_by_name(player_name) + local wielded_item = player:get_wielded_item():get_name() + if wielded_item == "default:torch" or wielded_item == "walking_light:pick_mese" then + -- Fackel ist in der Hand + local pos = player:getpos() + local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)} + if (last_wielded[player_name] ~= "default:torch" and last_wielded[player_name] ~= "walking_light:pick_mese") or (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then + -- Fackel gerade in die Hand genommen oder zu neuem Node bewegt + local is_air = minetest.env:get_node_or_nil(rounded_pos) + if is_air == nil or (is_air ~= nil and (is_air.name == "air" or is_air.name == "walking_light:light")) then + -- wenn an aktueller Position "air" ist, Fackellicht setzen + minetest.env:add_node(rounded_pos,{type="node",name="walking_light:light"}) + end + if (player_positions[player_name]["x"] ~= rounded_pos.x or player_positions[player_name]["y"] ~= rounded_pos.y or player_positions[player_name]["z"] ~= rounded_pos.z) then + -- wenn Position geänder, dann altes Licht löschen + local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]} + -- Neuberechnung des Lichts erzwingen + local is_light = minetest.env:get_node_or_nil(old_pos) + if is_light ~= nil and is_light.name == "walking_light:light" then +-- minetest.env:add_node(old_pos,{type="node",name="default:cobble"}) + minetest.env:add_node(old_pos,{type="node",name="air"}) + end + end + -- gemerkte Position ist nun die gerundete neue Position + player_positions[player_name]["x"] = rounded_pos.x + player_positions[player_name]["y"] = rounded_pos.y + player_positions[player_name]["z"] = rounded_pos.z + end + + last_wielded[player_name] = wielded_item; + elseif last_wielded[player_name] == "default:torch" or last_wielded[player_name] == "walking_light:pick_mese" then + -- Fackel nicht in der Hand, aber beim letzten Durchgang war die Fackel noch in der Hand + local pos = player:getpos() + local rounded_pos = {x=round(pos.x),y=round(pos.y)+1,z=round(pos.z)} + repeat + local is_light = minetest.env:get_node_or_nil(rounded_pos) + if is_light ~= nil and is_light.name == "walking_light:light" then + -- minetest.env:remove_node(rounded_pos) + -- Erzwinge Neuberechnung des Lichts +-- minetest.env:add_node(rounded_pos,{type="node",name="default:cobble"}) + minetest.env:add_node(rounded_pos,{type="node",name="air"}) + end + until minetest.env:get_node_or_nil(rounded_pos) ~= "walking_light:light" + local old_pos = {x=player_positions[player_name]["x"], y=player_positions[player_name]["y"], z=player_positions[player_name]["z"]} + repeat + is_light = minetest.env:get_node_or_nil(old_pos) + if is_light ~= nil and is_light.name == "walking_light:light" then + -- minetest.env:remove_node(old_pos) + -- Erzwinge Neuberechnung des Lichts +-- minetest.env:add_node(old_pos,{type="node",name="default:cobble"}) + minetest.env:add_node(old_pos,{type="node",name="air"}) + end + until minetest.env:get_node_or_nil(old_pos) ~= "walking_light:light" + last_wielded[player_name] = wielded_item + end + end +end) + +minetest.register_node("walking_light:light", { + drawtype = "glasslike", + tile_images = {"walking_light.png"}, + -- tile_images = {"walking_light_debug.png"}, + inventory_image = minetest.inventorycube("walking_light.png"), + paramtype = "light", + walkable = false, + is_ground_content = true, + light_propagates = true, + sunlight_propagates = true, + light_source = 13, + selection_box = { + type = "fixed", + fixed = {0, 0, 0, 0, 0, 0}, + }, +}) +minetest.register_tool("walking_light:pick_mese", { + description = "Mese Pickaxe with light", + inventory_image = "walking_light_mesepick.png", + wield_image = "default_tool_mesepick.png", + tool_capabilities = { + full_punch_interval = 0.1, + max_drop_level=3, + groupcaps={ + cracky={times={[1]=0.5, [2]=0.3, [3]=0.1}, uses=20000, maxlevel=3}, + crumbly={times={[1]=0.5, [2]=0.3, [3]=0.1}, uses=20000, maxlevel=3}, + snappy={times={[1]=0.5, [2]=0.3, [3]=0.1}, uses=20000, maxlevel=3} + }, + damage_groups = {fleshy=10}, + }, +}) + +minetest.register_craft({ + output = 'walking_light:pick_mese', + recipe = { + {'default:torch'}, + {'default:pick_mese'}, + } +}) \ No newline at end of file diff --git a/mods/walking_light/textures/walking_light.png b/mods/walking_light/textures/walking_light.png new file mode 100644 index 0000000..334cb07 Binary files /dev/null and b/mods/walking_light/textures/walking_light.png differ diff --git a/mods/walking_light/textures/walking_light_debug.png b/mods/walking_light/textures/walking_light_debug.png new file mode 100644 index 0000000..43e41bd Binary files /dev/null and b/mods/walking_light/textures/walking_light_debug.png differ diff --git a/mods/walking_light/textures/walking_light_mesepick.png b/mods/walking_light/textures/walking_light_mesepick.png new file mode 100644 index 0000000..9f98229 Binary files /dev/null and b/mods/walking_light/textures/walking_light_mesepick.png differ diff --git a/mods/wool/README.txt b/mods/wool/README.txt new file mode 100644 index 0000000..9db1332 --- /dev/null +++ b/mods/wool/README.txt @@ -0,0 +1,28 @@ +Minetest 0.4 mod: wool +====================== + +Mostly backward-compatible with jordach's 16-color wool mod. + +License of source code: +----------------------- +Copyright (C) 2012 Perttu Ahola (celeron55) + +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. + +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 +----------------------- +Cisoun: +- wool_black.png wool_brown.png wool_dark_green.png wool_green.png +- wool_magenta.png wool_pink.png wool_violet.png wool_yellow.png wool_blue.png +- wool_cyan.png wool_dark_grey.png wool_grey.png wool_orange.png wool_red.png +- wool_white.png + diff --git a/mods/wool/depends.txt b/mods/wool/depends.txt new file mode 100644 index 0000000..4ad96d5 --- /dev/null +++ b/mods/wool/depends.txt @@ -0,0 +1 @@ +default diff --git a/mods/wool/init.lua b/mods/wool/init.lua new file mode 100644 index 0000000..9c17b0c --- /dev/null +++ b/mods/wool/init.lua @@ -0,0 +1,50 @@ +-- minetest/wool/init.lua + +-- Backwards compatibility with jordach's 16-color wool mod +minetest.register_alias("wool:dark_blue", "wool:blue") +minetest.register_alias("wool:gold", "wool:yellow") + +local wool = {} +-- This uses a trick: you can first define the recipes using all of the base +-- colors, and then some recipes using more specific colors for a few non-base +-- colors available. When crafting, the last recipes will be checked first. +wool.dyes = { + {"white", "White", nil}, + {"grey", "Grey", "basecolor_grey"}, + {"black", "Black", "basecolor_black"}, + {"red", "Red", "basecolor_red"}, + {"yellow", "Yellow", "basecolor_yellow"}, + {"green", "Green", "basecolor_green"}, + {"cyan", "Cyan", "basecolor_cyan"}, + {"blue", "Blue", "basecolor_blue"}, + {"magenta", "Magenta", "basecolor_magenta"}, + {"orange", "Orange", "excolor_orange"}, + {"violet", "Violet", "excolor_violet"}, + {"brown", "Brown", "unicolor_dark_orange"}, + {"pink", "Pink", "unicolor_light_red"}, + {"dark_grey", "Dark Grey", "unicolor_darkgrey"}, + {"dark_green", "Dark Green", "unicolor_dark_green"}, +} + +for _, row in ipairs(wool.dyes) do + local name = row[1] + local desc = row[2] + local craft_color_group = row[3] + -- Node Definition + minetest.register_node("wool:"..name, { + description = desc.." Wool", + tiles = {"wool_"..name..".png"}, + is_ground_content = false, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=3,flammable=3,wool=1}, + sounds = default.node_sound_defaults(), + }) + if craft_color_group then + -- Crafting from dye and white wool + minetest.register_craft({ + type = "shapeless", + output = 'wool:'..name, + recipe = {'group:dye,'..craft_color_group, 'group:wool'}, + }) + end +end + diff --git a/mods/wool/textures/wool_black.png b/mods/wool/textures/wool_black.png new file mode 100644 index 0000000..a9e566b Binary files /dev/null and b/mods/wool/textures/wool_black.png differ diff --git a/mods/wool/textures/wool_blue.png b/mods/wool/textures/wool_blue.png new file mode 100644 index 0000000..035a8da Binary files /dev/null and b/mods/wool/textures/wool_blue.png differ diff --git a/mods/wool/textures/wool_brown.png b/mods/wool/textures/wool_brown.png new file mode 100644 index 0000000..2620dfd Binary files /dev/null and b/mods/wool/textures/wool_brown.png differ diff --git a/mods/wool/textures/wool_cyan.png b/mods/wool/textures/wool_cyan.png new file mode 100644 index 0000000..4e1e4a3 Binary files /dev/null and b/mods/wool/textures/wool_cyan.png differ diff --git a/mods/wool/textures/wool_dark_green.png b/mods/wool/textures/wool_dark_green.png new file mode 100644 index 0000000..92c5631 Binary files /dev/null and b/mods/wool/textures/wool_dark_green.png differ diff --git a/mods/wool/textures/wool_dark_grey.png b/mods/wool/textures/wool_dark_grey.png new file mode 100644 index 0000000..0624525 Binary files /dev/null and b/mods/wool/textures/wool_dark_grey.png differ diff --git a/mods/wool/textures/wool_green.png b/mods/wool/textures/wool_green.png new file mode 100644 index 0000000..554471a Binary files /dev/null and b/mods/wool/textures/wool_green.png differ diff --git a/mods/wool/textures/wool_grey.png b/mods/wool/textures/wool_grey.png new file mode 100644 index 0000000..ff38bf7 Binary files /dev/null and b/mods/wool/textures/wool_grey.png differ diff --git a/mods/wool/textures/wool_magenta.png b/mods/wool/textures/wool_magenta.png new file mode 100644 index 0000000..5b254e4 Binary files /dev/null and b/mods/wool/textures/wool_magenta.png differ diff --git a/mods/wool/textures/wool_orange.png b/mods/wool/textures/wool_orange.png new file mode 100644 index 0000000..64f34c0 Binary files /dev/null and b/mods/wool/textures/wool_orange.png differ diff --git a/mods/wool/textures/wool_pink.png b/mods/wool/textures/wool_pink.png new file mode 100644 index 0000000..0513540 Binary files /dev/null and b/mods/wool/textures/wool_pink.png differ diff --git a/mods/wool/textures/wool_red.png b/mods/wool/textures/wool_red.png new file mode 100644 index 0000000..de05af1 Binary files /dev/null and b/mods/wool/textures/wool_red.png differ diff --git a/mods/wool/textures/wool_violet.png b/mods/wool/textures/wool_violet.png new file mode 100644 index 0000000..a41a9f4 Binary files /dev/null and b/mods/wool/textures/wool_violet.png differ diff --git a/mods/wool/textures/wool_white.png b/mods/wool/textures/wool_white.png new file mode 100644 index 0000000..2bbb9cf Binary files /dev/null and b/mods/wool/textures/wool_white.png differ diff --git a/mods/wool/textures/wool_yellow.png b/mods/wool/textures/wool_yellow.png new file mode 100644 index 0000000..a95bb34 Binary files /dev/null and b/mods/wool/textures/wool_yellow.png differ diff --git a/mods/worldedit/ChatCommands.md b/mods/worldedit/ChatCommands.md new file mode 100644 index 0000000..5b6820a --- /dev/null +++ b/mods/worldedit/ChatCommands.md @@ -0,0 +1,382 @@ +Chat Commands +------------- +For more information, see the [README](README.md). + +Many commands also have shorter names that can be typed faster. For example, if we wanted to use `//move ? 5`, we could instead type `//m ? 5`. All shortened names are listed below: + +| Short Name | Original Name | +|:-----------|:-------------------| +| `//i` | `//inspect` | +| `//rst` | `//reset` | +| `//mk` | `//mark` | +| `//umk` | `//unmark` | +| `//1` | `//pos1` | +| `//2` | `//pos2` | +| `//fp` | `//fixedpos` | +| `//v` | `//volume` | +| `//s` | `//set` | +| `//r` | `//replace` | +| `//ri` | `//replaceinverse` | +| `//hspr` | `//hollowsphere` | +| `//spr` | `//sphere` | +| `//hdo` | `//hollowdome` | +| `//do` | `//dome` | +| `//hcyl` | `//hollowcylinder` | + +### `//about` + +Get information about the mod. + + //about + +### `//inspect on/off/1/0/true/false/yes/no/enable/disable/` + +Enable or disable node inspection. + + //inspect on + //inspect off + //inspect 1 + //inspect 0 + //inspect true + //inspect false + //inspect yes + //inspect no + //inspect enable + //inspect disable + //inspect + +### `//reset` + +Reset the region so that it is empty. + + //reset + +### `//mark` + +Show markers at the region positions. + + //mark + +### `//unmark` + +Hide markers if currently shown. + + //unmark + +### `//pos1` + +Set WorldEdit region position 1 to the player's location. + + //pos1 + +### `//pos2` + +Set WorldEdit region position 2 to the player's location. + + //pos2 + +### `//p set/set1/set2/get` + +Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region. + + //p set + //p set1 + //p set2 + //p get + +### `//fixedpos set1 x y z` + +Set a WorldEdit region position to the position at (``, ``, ``). + + //fixedpos set1 0 0 0 + //fixedpos set1 -30 5 28 + //fixedpos set2 1004 -200 432 + +### `//volume` + +Display the volume of the current WorldEdit region. + + //volume + +### `//deleteblocks` + +Delete the MapBlocks (16x16x16 units) that contain the selected region. This means that mapgen will be invoked for that area. As only whole MapBlocks get removed, the deleted area is usually larger than the selected one. Also, mapgen can trigger mechanisms like mud reflow or cavegen, which affects nodes (up to 112 nodes away) outside the MapBlock, so dont use this near buildings. + + //deleteblocks + +### `//set ` + +Set the current WorldEdit region to ``. + + //set air + //set cactus + //set Blue Lightstone + //set dirt with grass + +### `//mix ...` + +Fill the current WorldEdit region with a random mix of ``, `...`. + + //mix air + //mix cactus stone glass sandstone + //mix Bronze + //mix default:cobble air + +### `//replace ` + +Replace all instances of `` with `` in the current WorldEdit region. + + //replace Cobblestone air + //replace lightstone_blue glass + //replace dirt Bronze Block + //replace mesecons:wire_00000000_off flowers:flower_tulip + +### `//replaceinverse ` + +Replace all nodes other than `` with `` in the current WorldEdit region. + + //replaceinverse Cobblestone air + //replaceinverse flowers:flower_waterlily glass + //replaceinverse dirt Bronze Block + //replaceinverse mesecons:wire_00000000_off flowers:flower_tulip + +### `//hollowsphere ` + +Add hollow sphere centered at WorldEdit position 1 with radius ``, composed of ``. + + //hollowsphere 5 Diamond Block + //hollowsphere 12 glass + //hollowsphere 17 mesecons:wire_00000000_off + +### `//sphere ` + +Add sphere centered at WorldEdit position 1 with radius ``, composed of ``. + + //sphere 5 Diamond Block + //sphere 12 glass + //sphere 17 mesecons:wire_00000000_off + +### `//hollowdome ` + +Add hollow dome centered at WorldEdit position 1 with radius ``, composed of ``. + + //hollowdome 5 Diamond Block + //hollowdome -12 glass + //hollowdome 17 mesecons:wire_00000000_off + +### `//dome ` + +Add dome centered at WorldEdit position 1 with radius ``, composed of ``. + + //dome 5 Diamond Block + //dome -12 glass + //dome 17 mesecons:wire_00000000_off + +### `//hollowcylinder x/y/z/? ` + +Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length `` and radius ``, composed of ``. + + //hollowcylinder x +5 8 Bronze Block + //hollowcylinder y 28 10 glass + //hollowcylinder z -12 3 mesecons:wire_00000000_off + //hollowcylinder ? 2 4 default:stone + +### `//cylinder x/y/z/? ` + +Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length `` and radius ``, composed of ``. + + //cylinder x +5 8 Bronze Block + //cylinder y 28 10 glass + //cylinder z -12 3 mesecons:wire_00000000_off + //cylinder ? 2 4 default:stone + +### `//pyramid x/y/z? ` + +Add pyramid centered at WorldEdit position 1 along the x/y/z/? axis with height ``, composed of ``. + + //pyramid x 8 Diamond Block + //pyramid y -5 glass + //pyramid z 2 mesecons:wire_00000000_off + //pyramid ? 12 mesecons:wire_00000000_off + +### `//spiral ` + +Add spiral centered at WorldEdit position 1 with side length ``, height ``, space between walls ``, composed of ``. + + //spiral 20 5 3 Diamond Block + //spiral 5 2 1 glass + //spiral 7 1 5 mesecons:wire_00000000_off + +### `//copy x/y/z/? ` + +Copy the current WorldEdit region along the x/y/z/? axis by `` nodes. + + //copy x 15 + //copy y -7 + //copy z +4 + //copy ? 8 + +### `//move x/y/z/? ` + +Move the current WorldEdit positions and region along the x/y/z/? axis by `` nodes. + + //move x 15 + //move y -7 + //move z +4 + //move ? -1 + +### `//stack x/y/z/? ` + +Stack the current WorldEdit region along the x/y/z/? axis `` times. + + //stack x 3 + //stack y -1 + //stack z +5 + //stack ? 12 + +### `//stack2 ` + +Stack the current WorldEdit region `` times by offset ``, ``, ``. + + //stack2 5 3 8 2 + //stack2 1 -1 -1 -1 + +### `//scale ` + +Scale the current WorldEdit positions and region by a factor of positive integer `` with position 1 as the origin. + + //scale 2 + //scale 1 + //scale 10 + +### `//transpose x/y/z/? x/y/z/?` + +Transpose the current WorldEdit positions and region along the x/y/z/? and x/y/z/? axes. + + //transpose x y + //transpose x z + //transpose y z + //transpose ? y + +### `//flip x/y/z/?` + +Flip the current WorldEdit region along the x/y/z/? axis. + + //flip x + //flip y + //flip z + //flip ? + +### `//rotate x/y/z/? ` + +Rotate the current WorldEdit positions and region along the x/y/z/? axis by angle `` (90 degree increment). + + //rotate x 90 + //rotate y 180 + //rotate z 270 + //rotate ? -90 + +### `//orient ` + +Rotate oriented nodes in the current WorldEdit region around the Y axis by angle `` (90 degree increment) + + //orient 90 + //orient 180 + //orient 270 + //orient -90 + +### `//fixlight` + +Fixes the lighting in the current WorldEdit region. + + //fixlight + +### `//hide` + +Hide all nodes in the current WorldEdit region non-destructively. + + //hide + +### `//suppress ` + +Suppress all in the current WorldEdit region non-destructively. + + //suppress Diamond Block + //suppress glass + //suppress mesecons:wire_00000000_off + +### `//highlight ` + +Highlight in the current WorldEdit region by hiding everything else non-destructively. + + //highlight Diamond Block + //highlight glass + //highlight mesecons:wire_00000000_off + +### `//restore` + +Restores nodes hidden with WorldEdit in the current WorldEdit region. + + //restore + +### `//save ` + +Save the current WorldEdit region to "(world folder)/schems/``.we". + + //save some random filename + //save huge_base + +### `//allocate ` + +Set the region defined by nodes from "(world folder)/schems/``.we" as the current WorldEdit region. + + //allocate some random filename + //allocate huge_base + +### `//load ` + +Load nodes from "(world folder)/schems/``.we" with position 1 of the current WorldEdit region as the origin. + + //load some random filename + //load huge_base + +### `//lua ` + +Executes `` as a Lua chunk in the global namespace. + + //lua worldedit.pos1["singleplayer"] = {x=0, y=0, z=0} + //lua worldedit.rotate(worldedit.pos1["singleplayer"], worldedit.pos2["singleplayer"], "y", 90) + +### `//luatransform ` + +Executes `` as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region. + + //luatransform minetest.add_node(pos, {name="default:stone"}) + //luatransform if minetest.get_node(pos).name == "air" then minetest.add_node(pos, {name="default:water_source"}) + +### `//mtschemcreate ` + +Save the current WorldEdit region using the Minetest Schematic format to "(world folder)/schems/``.mts". + + //mtschemcreate some random filename + //mtschemcreate huge_base + +### `//mtschemplace ` + +Load nodes from "(world folder)/schems/``.mts" with position 1 of the current WorldEdit region as the origin. + + //mtschemplace some random filename + //mtschemplace huge_base + +### `//mtschemprob start/finish/get` + +After using `//mtschemprob start` all nodes punched will bring up a text field where a probablity can be entered. +This mode can be left with `//mtschemprob finish`. `//mtschemprob get` will display the probabilities saved for the nodes. + + //mtschemprob get + +### `//clearobjects` + +Clears all objects within the WorldEdit region. + + //clearobjects diff --git a/mods/worldedit/LICENSE.txt b/mods/worldedit/LICENSE.txt new file mode 100644 index 0000000..dba13ed --- /dev/null +++ b/mods/worldedit/LICENSE.txt @@ -0,0 +1,661 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 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 Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. diff --git a/mods/worldedit/README.md b/mods/worldedit/README.md new file mode 100644 index 0000000..22dd7c7 --- /dev/null +++ b/mods/worldedit/README.md @@ -0,0 +1,160 @@ +WorldEdit v1.1 for Minetest 0.4.8+ +================================== +The ultimate in-game world editing tool for [Minetest](http://minetest.net/)! Tons of functionality to help with building, fixing, and more. + +For more information, see the [forum topic](https://forum.minetest.net/viewtopic.php?id=572) at the Minetest forums. + +# New users should see the [tutorial](Tutorial.md). + +![Screenshot](http://i.imgur.com/lwhodrv.png) + +Installing +---------- + +If you are using Windows, consider installing this mod using [MODSTER](https://forum.minetest.net/viewtopic.php?id=6497), a super simple mod installer that will take care of everything for you. If you are using MODSTER, skip directly to step 6 in the instructions below. + +There is a nice installation guide over at the [Minetest Wiki](http://wiki.minetest.com/wiki/Installing_mods). Here is a short summary: + +1. Download the mod from the [official releases page](https://github.com/Uberi/Minetest-WorldEdit/releases). The download links are labelled "Source Code". If you are using Windows, you will probably want to download the ZIP version. +2. You should have a file named `SOMETHING.zip` or `SOMETHING.tar.gz`. +3. Extract this file using your archiver of choice. If you are using Windows, open the ZIP file and move the folder inside to a safe place outside of the ZIP file. +4. Make sure that you now have a folder with a file named README.md inside it. If you just have another folder inside this folder, use this nested folder instead. +5. Move this folder into the `MINETEST_FOLDER/mods` folder, where `MINETEST_FOLDER` is the folder Minetest is located in. +6. Open Minetest to a world selection screen. +7. Select a world you want to use WorldEdit in by left clicking on it once, and press the **Configure** button. +8. You should have a mod selection screen. Select the one named something like `Minetest-WorldEdit` by left clicking once and press the **Enable MP** button. +9. Press the **Save** button. You can now use WorldEdit in that world. Repeat steps 7 to 9 to enable WorldEdit for other worlds too. + +If you are having trouble, try asking for help in the [IRC channel](http://webchat.freenode.net/?channels=#minetest) (faster but may not always have helpers online) or ask on the [forum topic](https://forum.minetest.net/viewtopic.php?id=572) (slower but more likely to get help). + +Usage +----- +WorldEdit works primarily through the WorldEdit GUI and chat commands. Depending on your key bindings, you can invoke chat entry with the "t" key, and open the chat console with the "F10" key. + +WorldEdit has a huge potential for abuse by untrusted players. Therefore, users will not be able to use WorldEdit unless they have the `worldedit` privelege. This is available by default in single player, but in multiplayer the permission must be explicitly given by someone with the right credentials, using the follwoing chat command: `/grant worldedit`. This privelege can later be removed using the following chat command: `/revoke worldedit`. + +Certain functions/commands such as WorldEdit GUI's "Run Lua" function (equivalent to the `//lua` and `//luatransform` chat command) additionally require the `server` privilege. This is because it is extremely dangerous to give access to these commands to untrusted players, since they essentially are able to control the computer the server is running on. Give this privilege only to people you trust with your computer. + +For in-game information about these commands, type `/help ` in the chat. For example, to learn more about the `//copy` command, simply type `/help /copy` to display information relevant to copying a region. + +Interface +--------- +WorldEdit is accessed in-game in two main ways. + +The GUI adds a screen to each player's inventory that gives access to various WorldEdit functions. The [tutorial](Tutorial.md) and the [Chat Commands Reference](ChatCommands.md) may be helpful in learning to use it. + +The chat interface adds many chat commands that perform various WorldEdit powered tasks. It is documented in the [Chat Commands Reference](ChatCommands.md). + +Compatibility +------------- +This mod supports Minetest versions 0.4.8 and newer. Older versions of WorldEdit may work with older versions of Minetest, but are not recommended or supported. + +WorldEdit works quite well with other mods, and does not have any known mod conflicts. + +WorldEdit GUI works with [Unified Inventory](https://forum.minetest.net/viewtopic.php?id=3933) and [Inventory++](https://forum.minetest.net/viewtopic.php?id=6204), but these are not required to use the mod. + +If you use any other inventory manager mods, note that they may conflict with the WorldEdit GUI. If this is the case, it may be necessary to disable them. + +WorldEdit API +------------- +WorldEdit exposes all significant functionality in a simple Lua interface. Adding WorldEdit to the file "depends.txt" in your mod gives you access to all of the `worldedit` functions. The API is useful for tasks such as high-performance node manipulation, alternative interfaces, and map creation. + +If you don't add WorldEdit to your "depends.txt" file, each file in the WorldEdit mod is also independent. For example, one may import the WorldEdit primitives API using the following code: + + dofile(minetest.get_modpath("worldedit").."/primitives.lua") + +AGPLv3 compatible mods may further include WorldEdit files in their own mods. This may be useful if a modder wishes to completely avoid any dependencies on WorldEdit. Note that it is required to give credit to the authors. + +This API is documented in the [WorldEdit API Reference](WorldEdit API.md). + +Axes +---- +The coordinate system is the same as that used by Minetest; positive Y is upwards, positive X is rightwards, and positive Z is forwards, if a player is facing North (positive Z axis). + +When an axis is specified in a WorldEdit chat command, it is specified as one of the following values: `x`, `y`, `z`, or `?`. + +In the GUI, there is a dropdown menu for this purpose. The "Look direction" option has the same effect as `?` does in chat commands. + +The value `?` represents the axis the player is currently facing. If the player is facing more than one axis, the axis the player face direction is closest to will be used. + +Nodes +----- +Node names are required for many types of commands that identify or modify specific types of nodes. They can be specified in a number of ways. + +First, by description - the tooltip that appears when hovering over the item in an inventory. This is case insensitive and includes values such as "Cobblestone" and "bronze block". Note that certain commands (namely, `//replace` and `//replaceinverse`) do not support descriptions that contain spaces in the `` field. + +Second, by name - the node name that is defined by code, but without the mod name prefix. This is case sensitive and includes values such as "piston_normal_off" and "cactus". Nodes defined in the `default` mod always take precedence over other nodes when searching for the correct one, and if there are multiple possible nodes (such as "a:celery" and "b:celery"), one is chosen in no particular order. + +Finally, by full name - the unambiguous identifier of the node, prefixes and all. This is case sensitive and includes values such as "default:stone" and "mesecons:wire_00000000_off". + +The node name "air" can be used anywhere a normal node name can, and acts as a blank node. This is useful for clearing or removing nodes. For example, `//set air` would remove all the nodes in the current WorldEdit region. Similarly, `//sphere 10 air`, when WorldEdit position 1 underground, would dig a large sphere out of the ground. + +Regions +------- +Most WorldEdit commands operate on regions. Regions are a set of two positions that define a 3D cuboid. They are local to each player and chat commands affect only the region for the player giving the commands. + +Each positions together define two opposing corners of the cube. With two opposing corners it is possible to determine both the location and dimensions of the region. + +Regions are not saved between server restarts. They start off as empty regions, and cannot be used with most WorldEdit commands until they are set to valid values. + +Markers +------- +Entities are used to mark the location of the WorldEdit regions. They appear as boxes containing the number 1 or 2, and represent position 1 and 2 of the WorldEdit region, respectively. + +To remove the entities, simply punch them. This does not reset the positions themselves. + +Schematics +---------- +WorldEdit supports two different types of schematics. + +The first is the WorldEdit Schematic format, with the file extension ".we", and in some older versions, ".wem". There have been several previous versions of the WorldEdit Schematic format, but WorldEdit is capable of loading any past versions, and will always support them - there is no need to worry about schematics becoming obselete. + +As of version 5, WorldEdit schematics include a header. The header is seperated from the content by a colon (`:`). It contains fields seperated by commas (`,`). Currently only one field is used, which contains the version in ASCII decimal. + +The current version of the WorldEdit Schematic format is essentially an array of node data tables in Lua 5.1 table syntax preceded by a header. +Specifically it looks like this: + + 5:return { + { + y = , + x = , + z = , + name = , + param1 = , + param2 = , + meta = , + }, + <...> + } + + +The ordering of the values and minor aspects of the syntax, such as trailing commas or newlines, are not guaranteed to stay the same in future versions. + +The WorldEdit Schematic format is accessed via the WorldEdit API, or WorldEdit serialization chat commands such as `//serialize` and `//deserialize`. + +The second is the Minetest Schematic format (MTS). The details of this format may be found in the Minetest documentation and are out of the scope of this document. Access to this format is done via specialized MTS commands such as `//mtschemcreate` and `//mtschemplace`. + +Authors +------- +WorldEdit would not be possible without the contributions of many developers and designers. Below, they are listed alphabetically: + + cheapie + cornernote + cyisfor + electricface + kaeza + khonkhortisan + sfan5 + ShadowNinja + spillz + Uberi/Temperest + +License +------- +Copyright 2013 sfan5, Anthony Zhang (Uberi/Temperest), and Brett O'Donnell (cornernote). + +This mod is licensed under the [GNU Affero General Public License](http://www.gnu.org/licenses/agpl-3.0.html). + +Basically, this means everyone is free to use, modify, and distribute the files, as long as these modifications are also licensed the same way. + +Most importantly, the Affero variant of the GPL requires you to publish your modifications in source form, even if the mod is run only on the server, and not distributed. diff --git a/mods/worldedit/Tutorial.md b/mods/worldedit/Tutorial.md new file mode 100644 index 0000000..bcac1aa --- /dev/null +++ b/mods/worldedit/Tutorial.md @@ -0,0 +1,120 @@ +WorldEdit Tutorial +================== +This is a step-by-step tutorial outlining the basic usage of WorldEdit. For more information, see the [README](README.md). + +Let's start with a few assumptions: + +* You have a compatible version of Minetest working. + * See the [README](README.md) for compatibility information. +* You have WorldEdit installed as a mod. + * If using Windows, [MODSTER](https://forum.minetest.net/viewtopic.php?pid=101463) makes installing mods totally painless. + * Simply download the file, extract the archive, and move it to the correct mod folder for Minetest. + * See the installation instructions in [README](README.md) if you need more details. +* You are familiar with the basics of the game. + * How to walk, jump, and climb. + * How to dig, place, and punch blocks. + * One of the following: + * How to type into the chat and read text from it. + * How to open the inventory screen and press buttons on it. + +Overview +-------- +WorldEdit has a "region", which is simply a cuboid area defined by two markers, both of which the player can move around. Every player can have their own region with their own two markers. + +WorldEdit GUI buttons and chat commands generally work inside the region selected, or around the first marker. + +If you are using the chat commands, follow the steps under **Chat Commands**. If you are using the WorldEdit GUI, follow the steps under **WorldEdit GUI**. + +Step 1: Selecting a region +-------------------------- +### Chat Commands + +In the chat prompt, enter `//p set`. In the chat, you are prompted to punch two nodes to set the positions of the two markers. + +Punch a nearby node. Be careful of breakable ones such as torches. A black cube reading "1" will appear around the node. This is the marker for WorldEdit position 1. + +Walk away from the node you just punched. Now, punch another node. A black cube reading "2" will appear around the node. This is the marker for WorldEdit position 2. + +### WorldEdit GUI + +Open the main WorldEdit GUI from your inventory screen. The icon looks like a globe with a red dot in the center. + +Press the "Get/Set Positions" button. On the new screen, press the "Set Position 1" button. The inventory screen should close. + +Punch a nearby node. Be careful of breakable ones such as torches. A black cube reading "1" will appear around the node. This is the marker for WorldEdit position 1. + +Walk away from the node you just punched. Open your inventory again. It should be on the same page as it was before. + +Press the "Set Position 2" button. The inventory screen should close. + +Now, punch another node. A black cube reading "2" will appear around the node. This is the marker for WorldEdit position 2. + +Step 2: Region commands +----------------------- +### Chat Commands + +In the chat prompt, enter `//set mese`. In the chat, you will see a message showing the number of nodes set after a small delay. + +Look at the place between the two markers: it is now filled with MESE blocks! + +The `//set ` command fills the region with whatever node you want. It is a region-oriented command, which means it works inside the WorldEdit region only. + +Now, try a few different variations, such as `//set torch`, `//set cobble`, and `//set water`. + +### WorldEdit GUI + +Open the main WorldEdit GUI from your inventory screen. + +Press the "Set Nodes" button. You should see a new screen with various options for setting nodes. + +Enter "mese" in the "Name" field. Press Search if you would like to see what the node you just entered looks like. + +Press the "Set Nodes" button on this screen. In the chat, you will see a message showing the number of nodes set after a small delay. + +Look at the place between the two markers: it is now filled with MESE blocks! + +The "Set Nodes" function fills the region with whatever node you want. It is a region-oriented command, which means it works inside the WorldEdit region only. + +Now, try a few different variations on the node name, such as "torch", "cobble", and "water". + +Step 3: Position commands +------------------------- +### Chat Commands + +In the chat prompt, enter `//hollowdome 30 glass`. In the chat, you will see a message showing the number of nodes set after a small delay. + +Look around marker 1: it is now surrounded by a hollow glass dome! + +The `//hollowdome ` command creates a hollow dome centered around marker 1, made of any node you want. It is a position-oriented command, which means it works around marker 1 and can go outside the WorldEdit region. + +### WorldEdit GUI + +Open the main WorldEdit GUI from your inventory screen. + +Press the "Sphere/Dome" button. You should see a new screen with various options for making spheres or domes. + +Enter "glass" in the "Name" field. Press Search if you would like to see what the node you just entered looks like. + +Enter "30" in the "Radius" field. + +Press the "Hollow Dome" button on this screen. In the chat, you will see a message showing the number of nodes added after a small delay. + +Look around marker 1: it is now surrounded by a hollow glass dome! + +The "Hollow Dome" function creates a hollow dome centered around marker 1, made of any node you want. It is a position-oriented command, which means it works around marker 1 and can go outside the WorldEdit region. + +Step 4: Other commands +---------------------- +### Chat Commands + +There are many more commands than what is shown here. See the [Chat Commands Reference](ChatCommands.md) for a detailed list of them, along with descriptions and examples for every single one. + +If you're in-game and forgot how a command works, just use the `/help ` command, without the first forward slash. For example, to see some information about the `//set ` command mentioned earlier, simply use `/help /set`. + +A very useful command to check out is the `//save ` command, which can save everything inside the WorldEdit region to a file, stored on the computer hosting the server (the player's computer, in single player mode). You can then later use `//load ` to load the data in a file into a world, even another world on another computer. + +### WorldEdit GUI + +This only scratches the surface of what WorldEdit is capable of. Most of the functions in the WorldEdit GUI correspond to chat commands, and so the [Chat Commands Reference](ChatCommands.md) may be useful if you get stuck. + +It is helpful to explore the various buttons in the interface and check out what they do. Learning the chat command interface is also useful if you use WorldEdit intensively - an experienced chat command user can usually work faster than an experienced WorldEdit GUI user. \ No newline at end of file diff --git a/mods/worldedit/WorldEdit API.md b/mods/worldedit/WorldEdit API.md new file mode 100644 index 0000000..0b970f1 --- /dev/null +++ b/mods/worldedit/WorldEdit API.md @@ -0,0 +1,219 @@ +WorldEdit API +============= +The WorldEdit API is composed of multiple modules, each of which is independent and can be used without the other. Each module is contained within a single file. + +If needed, individual modules such as visualization.lua can be removed without affecting the rest of the program. The only file that cannot be removed is init.lua, which is necessary for the mod to run. + +For more information, see the [README](README.md). + +General +------- + +### value = worldedit.version + +Contains the current version of WorldEdit in a table of the form `{major=MAJOR_INTEGER, minor=MINOR_INTEGER}`, where `MAJOR_INTEGER` is the major version (the number before the period) as an integer, and `MINOR_INTEGER` is the minor version (the number after the period) as an integer. This is intended for version checking purposes. + +### value = worldedit.version_string + +Contains the current version of WorldEdit in the form of a string `"MAJOR_INTEGER.MINOR_INTEGER"`, where `MAJOR_INTEGER` is the major version (the number before the period) as an integer, and `MINOR_INTEGER` is the minor version (the number after the period) as an integer. This is intended for display purposes. + +Manipulations +------------- +Contained in manipulations.lua, this module allows several node operations to be applied over a region. + +### count = worldedit.set(pos1, pos2, node_name) + +Sets a region defined by positions `pos1` and `pos2` to `node_name`. To clear a region, use "air" as the value of `node_name`. + +Returns the number of nodes set. + +### count = worldedit.replace(pos1, pos2, searchnode, replacenode) + +Replaces all instances of `searchnode` with `replacenode` in a region defined by positions `pos1` and `pos2`. + +Returns the number of nodes replaced. + +### count = worldedit.replaceinverse(pos1, pos2, searchnode, replacenode) + +Replaces all nodes other than `searchnode` with `replacenode` in a region defined by positions `pos1` and `pos2`. + +Returns the number of nodes replaced. + +### count = worldedit.copy(pos1, pos2, axis, amount) + +Copies the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes. + +Returns the number of nodes copied. + +### count = worldedit.move(pos1, pos2, axis, amount) + +Moves the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") by `amount` nodes. + +Returns the number of nodes moved. + +### count = worldedit.stack(pos1, pos2, axis, count) + +Duplicates the region defined by positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z") `count` times. + +Returns the number of nodes stacked. + +### count = worldedit.stack2(pos1, pos2, direction, amount) + +Duplicates the region defined by positions `pos1` and `pos2` `amount` times with offset vector `direction`. + +Returns the number of nodes stacked. + +### count, newpos1, newpos2 = worldedit.stretch(pos1, pos2, stretchx, stretchy, stretchz) + +Stretches the region defined by positions `pos1` and `pos2` by an factor of positive integers `stretchx`, `stretchy`. and `stretchz` along the X, Y, and Z axes, respectively, with `pos1` as the origin. + +Returns the number of nodes stretched, the new scaled position 1, and the new scaled position 2. + +### count, newpos1, newpos2 = worldedit.transpose(pos1, pos2, axis1, axis2) + +Transposes a region defined by the positions `pos1` and `pos2` between the `axis1` and `axis2` axes ("x" or "y" or "z"). + +Returns the number of nodes transposed, the new transposed position 1, and the new transposed position 2. + +### count = worldedit.flip(pos1, pos2, axis) + +Flips a region defined by the positions `pos1` and `pos2` along the `axis` axis ("x" or "y" or "z"). + +Returns the number of nodes flipped. + +### count, newpos2, newpos2 = worldedit.rotate(pos1, pos2, angle) + +Rotates a region defined by the positions `pos1` and `pos2` by `angle` degrees clockwise around the y axis (supporting 90 degree increments only). + +Returns the number of nodes rotated, the new position 1, and the new position 2. + +### count = worldedit.orient(pos1, pos2, angle) + +Rotates all oriented nodes in a region defined by the positions `pos1` and `pos2` by `angle` degrees clockwise (90 degree increment) around the Y axis. + +Returns the number of nodes oriented. + +### count = worldedit.fixlight(pos1, pos2) + +Fixes the lighting in a region defined by positions `pos1` and `pos2`. + +Returns the number of nodes updated. + +### count = worldedit.clearobjects(pos1, pos2) + +Clears all objects in a region defined by the positions `pos1` and `pos2`. + +Returns the number of objects cleared. + +Primitives +---------- +Contained in primitives.lua, this module allows the creation of several geometric primitives. + +### count = worldedit.sphere(pos, radius, node_name, hollow) + +Adds a sphere centered at `pos` with radius `radius`, composed of `node_name`. + +Returns the number of nodes added. + +### count = worldedit.dome(pos, radius, node_name, hollow) + +Adds a dome centered at `pos` with radius `radius`, composed of `node_name`. + +Returns the number of nodes added. + +### count = worldedit.cylinder(pos, axis, length, radius, node_name, hollow) + +Adds a cylinder at `pos` along the `axis` axis ("x" or "y" or "z") with length `length` and radius `radius`, composed of `node_name`. + +Returns the number of nodes added. + +### count = worldedit.pyramid(pos, axis, height, node_name) + +Adds a pyramid centered at `pos` along the `axis` axis ("x" or "y" or "z") with height `height`. + +Returns the number of nodes added. + +### count = worldedit.spiral(pos, length, height, spacer, node_name) + +Adds a spiral centered at `pos` with side length `length`, height `height`, space between walls `spacer`, composed of `node_name`. + +Returns the number of nodes added. + +Visualization +------------- +Contained in visualization.lua, this module allows nodes to be visualized in different ways. + +### volume = worldedit.volume(pos1, pos2) + +Determines the volume of the region defined by positions `pos1` and `pos2`. + +Returns the volume. + +### count = worldedit.hide(pos1, pos2) + +Hides all nodes in a region defined by positions `pos1` and `pos2` by non-destructively replacing them with invisible nodes. + +Returns the number of nodes hidden. + +### count = worldedit.suppress(pos1, pos2, node_name) + +Suppresses all instances of `node_name` in a region defined by positions `pos1` and `pos2` by non-destructively replacing them with invisible nodes. + +Returns the number of nodes suppressed. + +### count = worldedit.highlight(pos1, pos2, node_name) + +Highlights all instances of `node_name` in a region defined by positions `pos1` and `pos2` by non-destructively hiding all other nodes. + +Returns the number of nodes found. + +### count = worldedit.restore(pos1, pos2) + +Restores all nodes hidden with WorldEdit functions in a region defined by positions `pos1` and `pos2`. + +Returns the number of nodes restored. + +Serialization +------------- +Contained in serialization.lua, this module allows regions of nodes to be serialized and deserialized to formats suitable for use outside MineTest. + +### version, extra_fields, content = worldedit.read_header(value) + +Reads the header from serialized data `value`. + +Returns the version as a positive integer (nil for unknown versions), +extra header fields (nil if not supported), and the content after the header. + +### data, count = worldedit.serialize(pos1, pos2) + +Converts the region defined by positions `pos1` and `pos2` into a single string. + +Returns the serialized data and the number of nodes serialized, or nil. + +### pos1, pos2, count = worldedit.allocate(origin_pos, value) + +Determines the volume the nodes represented by string `value` would occupy if deserialized at `origin_pos`. + +Returns the two corner positions and the number of nodes, or nil. + +### count = worldedit.deserialize(origin_pos, value) + +Loads the nodes represented by string `value` at position `origin_pos`. + +Returns the number of nodes deserialized or nil. + +Code +---- +Contained in code.lua, this module allows arbitrary Lua code to be used with WorldEdit. + +### error = worldedit.lua(code) + +Executes `code` as a Lua chunk in the global namespace. + +Returns an error if the code fails or nil otherwise. + +### error = worldedit.luatransform(pos1, pos2, code) + +Executes `code` as a Lua chunk in the global namespace with the variable `pos` available, for each node in a region defined by positions `pos1` and `pos2`. + +Returns an error if the code fails or nil otherwise. diff --git a/mods/worldedit/config.ld b/mods/worldedit/config.ld new file mode 100644 index 0000000..69be224 --- /dev/null +++ b/mods/worldedit/config.ld @@ -0,0 +1,12 @@ +project = "WorldEdit" +title = "WorldEdit API Documentation" +description = "Minetest mod to mass-modify nodes" +format = "markdown" +file = {"worldedit"} +topics = { + "README.md", + "Tutorial.md", + "ChatCommands.md", + "LICENSE.txt" +} + diff --git a/mods/worldedit/modpack.txt b/mods/worldedit/modpack.txt new file mode 100644 index 0000000..e69de29 diff --git a/mods/worldedit/worldedit/code.lua b/mods/worldedit/worldedit/code.lua new file mode 100644 index 0000000..48c992e --- /dev/null +++ b/mods/worldedit/worldedit/code.lua @@ -0,0 +1,52 @@ +--- Lua code execution functions. +-- @module worldedit.code + +--- Executes `code` as a Lua chunk in the global namespace. +-- @return An error message if the code fails, or nil on success. +function worldedit.lua(code) + local func, err = loadstring(code) + if not func then -- Syntax error + return err + end + local good, err = pcall(func) + if not good then -- Runtime error + return err + end + return nil +end + + +--- Executes `code` as a Lua chunk in the global namespace with the variable +-- pos available, for each node in a region defined by positions `pos1` and +-- `pos2`. +-- @return An error message if the code fails, or nil on success. +function worldedit.luatransform(pos1, pos2, code) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local factory, err = loadstring("return function(pos) " .. code .. " end") + if not factory then -- Syntax error + return err + end + local func = factory() + + worldedit.keep_loaded(pos1, pos2) + + local pos = {x=pos1.x, y=0, z=0} + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local good, err = pcall(func, pos) + if not good then -- Runtime error + return err + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return nil +end + diff --git a/mods/worldedit/worldedit/common.lua b/mods/worldedit/worldedit/common.lua new file mode 100644 index 0000000..be9a2c9 --- /dev/null +++ b/mods/worldedit/worldedit/common.lua @@ -0,0 +1,114 @@ +--- Common functions [INTERNAL]. All of these functions are internal! +-- @module worldedit.common + +--- Copies and modifies positions `pos1` and `pos2` so that each component of +-- `pos1` is less than or equal to the corresponding component of `pos2`. +-- Returns the new positions. +function worldedit.sort_pos(pos1, pos2) + pos1 = {x=pos1.x, y=pos1.y, z=pos1.z} + pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} + if pos1.x > pos2.x then + pos2.x, pos1.x = pos1.x, pos2.x + end + if pos1.y > pos2.y then + pos2.y, pos1.y = pos1.y, pos2.y + end + if pos1.z > pos2.z then + pos2.z, pos1.z = pos1.z, pos2.z + end + return pos1, pos2 +end + + +--- Determines the volume of the region defined by positions `pos1` and `pos2`. +-- @return The volume. +function worldedit.volume(pos1, pos2) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + return (pos2.x - pos1.x + 1) * + (pos2.y - pos1.y + 1) * + (pos2.z - pos1.z + 1) +end + + +--- Gets other axes given an axis. +-- @raise Axis must be x, y, or z! +function worldedit.get_axis_others(axis) + if axis == "x" then + return "y", "z" + elseif axis == "y" then + return "x", "z" + elseif axis == "z" then + return "x", "y" + else + error("Axis must be x, y, or z!") + end +end + + +function worldedit.keep_loaded(pos1, pos2) + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos1, pos2) +end + + +local mh = {} +worldedit.manip_helpers = mh + + +--- Generates an empty VoxelManip data table for an area. +-- @return The empty data table. +function mh.get_empty_data(area) + -- Fill emerged area with ignore so that blocks in the area that are + -- only partially modified aren't overwriten. + local data = {} + local c_ignore = minetest.get_content_id("ignore") + for i = 1, worldedit.volume(area.MinEdge, area.MaxEdge) do + data[i] = c_ignore + end + return data +end + + +function mh.init(pos1, pos2) + local manip = minetest.get_voxel_manip() + local emerged_pos1, emerged_pos2 = manip:read_from_map(pos1, pos2) + local area = VoxelArea:new({MinEdge=emerged_pos1, MaxEdge=emerged_pos2}) + return manip, area +end + + +function mh.init_radius(pos, radius) + local pos1 = vector.subtract(pos, radius) + local pos2 = vector.add(pos, radius) + return mh.init(pos1, pos2) +end + + +function mh.init_axis_radius(base_pos, axis, radius) + return mh.init_axis_radius_length(base_pos, axis, radius, radius) +end + + +function mh.init_axis_radius_length(base_pos, axis, radius, length) + local other1, other2 = worldedit.get_axis_others(axis) + local pos1 = { + [axis] = base_pos[axis], + [other1] = base_pos[other1] - radius, + [other2] = base_pos[other2] - radius + } + local pos2 = { + [axis] = base_pos[axis] + length, + [other1] = base_pos[other1] + radius, + [other2] = base_pos[other2] + radius + } + return mh.init(pos1, pos2) +end + + +function mh.finish(manip, data) + -- Update map + manip:set_data(data) + manip:write_to_map() + manip:update_map() +end + diff --git a/mods/worldedit/worldedit/compatibility.lua b/mods/worldedit/worldedit/compatibility.lua new file mode 100644 index 0000000..1f6e02b --- /dev/null +++ b/mods/worldedit/worldedit/compatibility.lua @@ -0,0 +1,74 @@ +--- Compatibility functions. +-- @module worldedit.compatibility + +local function deprecated(new_func) + local info = debug.getinfo(1, "n") + local msg = "worldedit." .. info.name .. "() is deprecated." + if new_func then + msg = msg .. " Use worldedit." .. new_func .. "() instead." + end + minetest.log("deprecated", msg) +end + +worldedit.allocate_old = worldedit.allocate + +worldedit.deserialize_old = worldedit.deserialize + +function worldedit.metasave(pos1, pos2, filename) + deprecated("save") + local file, err = io.open(filename, "wb") + if err then return 0 end + local data, count = worldedit.serialize(pos1, pos2) + file:write(data) + file:close() + return count +end + +function worldedit.metaload(originpos, filename) + deprecated("load") + filename = minetest.get_worldpath() .. "/schems/" .. file .. ".wem" + local file, err = io.open(filename, "wb") + if err then return 0 end + local data = file:read("*a") + return worldedit.deserialize(originpos, data) +end + +function worldedit.scale(pos1, pos2, factor) + deprecated("stretch") + return worldedit.stretch(pos1, pos2, factor, factor, factor) +end + +function worldedit.valueversion(value) + deprecated("read_header") + local version = worldedit.read_header(value) + if not version or version > worldedit.LATEST_SERIALIZATION_VERSION then + return 0 + end + return version +end + +function worldedit.replaceinverse(pos1, pos2, search_node, replace_node) + deprecated("replace") + return worldedit.replace(pos1, pos2, search_node, replace_node, true) +end + +function worldedit.clearobjects(...) + deprecated("clear_objects") + return worldedit.clear_objects(...) +end + +function worldedit.hollow_sphere(pos, radius, node_name) + deprecated("sphere") + return worldedit.sphere(pos, radius, node_name, true) +end + +function worldedit.hollow_dome(pos, radius, node_name) + deprecated("dome") + return worldedit.dome(pos, radius, node_name, true) +end + +function worldedit.hollow_cylinder(pos, axis, length, radius, node_name) + deprecated("cylinder") + return worldedit.cylinder(pos, axis, length, radius, node_name, true) +end + diff --git a/mods/worldedit/worldedit/init.lua b/mods/worldedit/worldedit/init.lua new file mode 100644 index 0000000..70a827d --- /dev/null +++ b/mods/worldedit/worldedit/init.lua @@ -0,0 +1,44 @@ +--- Worldedit. +-- @module worldedit +-- @release 1.1 +-- @copyright 2013 sfan5, Anthony Zhang (Uberi/Temperest), and Brett O'Donnell (cornernote). +-- @license GNU Affero General Public License version 3 (AGPLv3) +-- @author sfan5 +-- @author Anthony Zang (Uberi/Temperest) +-- @author Bret O'Donnel (cornernote) +-- @author ShadowNinja + +worldedit = {} +worldedit.version = {1, 1, major=1, minor=1} +worldedit.version_string = table.concat(worldedit.version, ".") + +if not minetest.get_voxel_manip then + local err_msg = "This version of WorldEdit requires Minetest 0.4.8 or later! You have an old version." + minetest.log("error", string.rep("#", 128)) + minetest.log("error", err_msg) + minetest.log("error", string.rep("#", 128)) + error(err_msg) +end + +local path = minetest.get_modpath(minetest.get_current_modname()) + +local function load_module(path) + local file = io.open(path, "r") + if not file then return end + file:close() + return dofile(path) +end + +dofile(path .. "/common.lua") +load_module(path .. "/manipulations.lua") +load_module(path .. "/primitives.lua") +load_module(path .. "/visualization.lua") +load_module(path .. "/serialization.lua") +load_module(path .. "/code.lua") +load_module(path .. "/compatibility.lua") + + +if minetest.setting_getbool("log_mods") then + print("[WorldEdit] Loaded!") +end + diff --git a/mods/worldedit/worldedit/manipulations.lua b/mods/worldedit/worldedit/manipulations.lua new file mode 100644 index 0000000..2e7d33a --- /dev/null +++ b/mods/worldedit/worldedit/manipulations.lua @@ -0,0 +1,597 @@ +--- Generic node manipulations. +-- @module worldedit.manipulations + +local mh = worldedit.manip_helpers + + +--- Sets a region to `node_names`. +-- @param pos1 +-- @param pos2 +-- @param node_names Node name or list of node names. +-- @return The number of nodes set. +function worldedit.set(pos1, pos2, node_names) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local manip, area = mh.init(pos1, pos2) + local data = mh.get_empty_data(area) + + if type(node_names) == "string" then -- Only one type of node + local id = minetest.get_content_id(node_names) + -- Fill area with node + for i in area:iterp(pos1, pos2) do + data[i] = id + end + else -- Several types of nodes specified + local node_ids = {} + for i, v in ipairs(node_names) do + node_ids[i] = minetest.get_content_id(v) + end + -- Fill area randomly with nodes + local id_count, rand = #node_ids, math.random + for i in area:iterp(pos1, pos2) do + data[i] = node_ids[rand(id_count)] + end + end + + mh.finish(manip, data) + + return worldedit.volume(pos1, pos2) +end + + +--- Replaces all instances of `search_node` with `replace_node` in a region. +-- When `inverse` is `true`, replaces all instances that are NOT `search_node`. +-- @return The number of nodes replaced. +function worldedit.replace(pos1, pos2, search_node, replace_node, inverse) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local manip, area = mh.init(pos1, pos2) + local data = manip:get_data() + + local search_id = minetest.get_content_id(search_node) + local replace_id = minetest.get_content_id(replace_node) + + local count = 0 + + --- TODO: This could be shortened by checking `inverse` in the loop, + -- but that would have a speed penalty. Is the penalty big enough + -- to matter? + if not inverse then + for i in area:iterp(pos1, pos2) do + if data[i] == search_id then + data[i] = replace_id + count = count + 1 + end + end + else + for i in area:iterp(pos1, pos2) do + if data[i] ~= search_id then + data[i] = replace_id + count = count + 1 + end + end + end + + mh.finish(manip, data) + + return count +end + + +--- Duplicates a region `amount` times with offset vector `direction`. +-- Stacking is spread across server steps, one copy per step. +-- @return The number of nodes stacked. +function worldedit.stack2(pos1, pos2, direction, amount, finished) + local i = 0 + local translated = {x=0, y=0, z=0} + local function next_one() + if i < amount then + i = i + 1 + translated.x = translated.x + direction.x + translated.y = translated.y + direction.y + translated.z = translated.z + direction.z + worldedit.copy2(pos1, pos2, translated, volume) + minetest.after(0, next_one) + else + if finished then + finished() + end + end + end + next_one() + return worldedit.volume(pos1, pos2) * amount +end + + +--- Copies a region along `axis` by `amount` nodes. +-- @param pos1 +-- @param pos2 +-- @param axis Axis ("x", "y", or "z") +-- @param amount +-- @return The number of nodes copied. +function worldedit.copy(pos1, pos2, axis, amount) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + -- Copy things backwards when negative to avoid corruption. + -- FIXME: Lots of code duplication here. + if amount < 0 then + local pos = {} + pos.x = pos1.x + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) -- Obtain current node + local meta = get_meta(pos):to_table() -- Get meta of current node + local value = pos[axis] -- Store current position + pos[axis] = value + amount -- Move along axis + set_node(pos, node) -- Copy node to new position + get_meta(pos):from_table(meta) -- Set metadata of new node + pos[axis] = value -- Restore old position + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + else + local pos = {} + pos.x = pos2.x + while pos.x >= pos1.x do + pos.y = pos2.y + while pos.y >= pos1.y do + pos.z = pos2.z + while pos.z >= pos1.z do + local node = get_node(pos) -- Obtain current node + local meta = get_meta(pos):to_table() -- Get meta of current node + local value = pos[axis] -- Store current position + pos[axis] = value + amount -- Move along axis + set_node(pos, node) -- Copy node to new position + get_meta(pos):from_table(meta) -- Set metadata of new node + pos[axis] = value -- Restore old position + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + end + return worldedit.volume(pos1, pos2) +end + + +--- Moves a region along `axis` by `amount` nodes. +-- @return The number of nodes moved. +function worldedit.move(pos1, pos2, axis, amount) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + --- TODO: Move slice by slice using schematic method in the move axis + -- and transfer metadata in separate loop (and if the amount is + -- greater than the length in the axis, copy whole thing at a time and + -- erase original after, using schematic method). + local get_node, get_meta, set_node, remove_node = minetest.get_node, + minetest.get_meta, minetest.set_node, minetest.remove_node + -- Copy things backwards when negative to avoid corruption. + --- FIXME: Lots of code duplication here. + if amount < 0 then + local pos = {} + pos.x = pos1.x + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) -- Obtain current node + local meta = get_meta(pos):to_table() -- Get metadata of current node + remove_node(pos) -- Remove current node + local value = pos[axis] -- Store current position + pos[axis] = value + amount -- Move along axis + set_node(pos, node) -- Move node to new position + get_meta(pos):from_table(meta) -- Set metadata of new node + pos[axis] = value -- Restore old position + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + else + local pos = {} + pos.x = pos2.x + while pos.x >= pos1.x do + pos.y = pos2.y + while pos.y >= pos1.y do + pos.z = pos2.z + while pos.z >= pos1.z do + local node = get_node(pos) -- Obtain current node + local meta = get_meta(pos):to_table() -- Get metadata of current node + remove_node(pos) -- Remove current node + local value = pos[axis] -- Store current position + pos[axis] = value + amount -- Move along axis + set_node(pos, node) -- Move node to new position + get_meta(pos):from_table(meta) -- Set metadata of new node + pos[axis] = value -- Restore old position + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + end + return worldedit.volume(pos1, pos2) +end + + +--- Duplicates a region along `axis` `amount` times. +-- Stacking is spread across server steps, one copy per step. +-- @param pos1 +-- @param pos2 +-- @param axis Axis direction, "x", "y", or "z". +-- @param count +-- @return The number of nodes stacked. +function worldedit.stack(pos1, pos2, axis, count) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local length = pos2[axis] - pos1[axis] + 1 + if count < 0 then + count = -count + length = -length + end + local amount = 0 + local copy = worldedit.copy + local i = 1 + function next_one() + if i <= count then + i = i + 1 + amount = amount + length + copy(pos1, pos2, axis, amount) + minetest.after(0, next_one) + end + end + next_one() + return worldedit.volume(pos1, pos2) * count +end + + +--- Stretches a region by a factor of positive integers along the X, Y, and Z +-- axes, respectively, with `pos1` as the origin. +-- @param pos1 +-- @param pos2 +-- @param stretch_x Amount to stretch along X axis. +-- @param stretch_y Amount to stretch along Y axis. +-- @param stretch_z Amount to stretch along Z axis. +-- @return The number of nodes scaled. +-- @return The new scaled position 1. +-- @return The new scaled position 2. +function worldedit.stretch(pos1, pos2, stretch_x, stretch_y, stretch_z) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + -- Prepare schematic of large node + local get_node, get_meta, place_schematic = minetest.get_node, + minetest.get_meta, minetest.place_schematic + local placeholder_node = {name="", param1=255, param2=0} + local nodes = {} + for i = 1, stretch_x * stretch_y * stretch_z do + nodes[i] = placeholder_node + end + local schematic = {size={x=stretch_x, y=stretch_y, z=stretch_z}, data=nodes} + + local size_x, size_y, size_z = stretch_x - 1, stretch_y - 1, stretch_z - 1 + + local new_pos2 = { + x = pos1.x + (pos2.x - pos1.x) * stretch_x + size_x, + y = pos1.y + (pos2.y - pos1.y) * stretch_y + size_y, + z = pos1.z + (pos2.z - pos1.z) * stretch_z + size_z, + } + worldedit.keep_loaded(pos1, new_pos2) + + local pos = {x=pos2.x, y=0, z=0} + local big_pos = {x=0, y=0, z=0} + while pos.x >= pos1.x do + pos.y = pos2.y + while pos.y >= pos1.y do + pos.z = pos2.z + while pos.z >= pos1.z do + local node = get_node(pos) -- Get current node + local meta = get_meta(pos):to_table() -- Get meta of current node + + -- Calculate far corner of the big node + local pos_x = pos1.x + (pos.x - pos1.x) * stretch_x + local pos_y = pos1.y + (pos.y - pos1.y) * stretch_y + local pos_z = pos1.z + (pos.z - pos1.z) * stretch_z + + -- Create large node + placeholder_node.name = node.name + placeholder_node.param2 = node.param2 + big_pos.x, big_pos.y, big_pos.z = pos_x, pos_y, pos_z + place_schematic(big_pos, schematic) + + -- Fill in large node meta + if next(meta.fields) ~= nil or next(meta.inventory) ~= nil then + -- Node has meta fields + for x = 0, size_x do + for y = 0, size_y do + for z = 0, size_z do + big_pos.x = pos_x + x + big_pos.y = pos_y + y + big_pos.z = pos_z + z + -- Set metadata of new node + get_meta(big_pos):from_table(meta) + end + end + end + end + pos.z = pos.z - 1 + end + pos.y = pos.y - 1 + end + pos.x = pos.x - 1 + end + return worldedit.volume(pos1, pos2) * stretch_x * stretch_y * stretch_z, pos1, new_pos2 +end + + +--- Transposes a region between two axes. +-- @return The number of nodes transposed. +-- @return The new transposed position 1. +-- @return The new transposed position 2. +function worldedit.transpose(pos1, pos2, axis1, axis2) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local compare + local extent1, extent2 = pos2[axis1] - pos1[axis1], pos2[axis2] - pos1[axis2] + + if extent1 > extent2 then + compare = function(extent1, extent2) + return extent1 > extent2 + end + else + compare = function(extent1, extent2) + return extent1 < extent2 + end + end + + -- Calculate the new position 2 after transposition + local new_pos2 = {x=pos2.x, y=pos2.y, z=pos2.z} + new_pos2[axis1] = pos1[axis1] + extent2 + new_pos2[axis2] = pos1[axis2] + extent1 + + local upper_bound = {x=pos2.x, y=pos2.y, z=pos2.z} + if upper_bound[axis1] < new_pos2[axis1] then upper_bound[axis1] = new_pos2[axis1] end + if upper_bound[axis2] < new_pos2[axis2] then upper_bound[axis2] = new_pos2[axis2] end + worldedit.keep_loaded(pos1, upper_bound) + + local pos = {x=pos1.x, y=0, z=0} + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local extent1, extent2 = pos[axis1] - pos1[axis1], pos[axis2] - pos1[axis2] + if compare(extent1, extent2) then -- Transpose only if below the diagonal + local node1 = get_node(pos) + local meta1 = get_meta(pos):to_table() + local value1, value2 = pos[axis1], pos[axis2] -- Save position values + pos[axis1], pos[axis2] = pos1[axis1] + extent2, pos1[axis2] + extent1 -- Swap axis extents + local node2 = get_node(pos) + local meta2 = get_meta(pos):to_table() + set_node(pos, node1) + get_meta(pos):from_table(meta1) + pos[axis1], pos[axis2] = value1, value2 -- Restore position values + set_node(pos, node2) + get_meta(pos):from_table(meta2) + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2), pos1, new_pos2 +end + + +--- Flips a region along `axis`. +-- @return The number of nodes flipped. +function worldedit.flip(pos1, pos2, axis) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + --- TODO: Flip the region slice by slice along the flip axis using schematic method. + local pos = {x=pos1.x, y=0, z=0} + local start = pos1[axis] + pos2[axis] + pos2[axis] = pos1[axis] + math.floor((pos2[axis] - pos1[axis]) / 2) + local get_node, get_meta, set_node = minetest.get_node, + minetest.get_meta, minetest.set_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node1 = get_node(pos) + local meta1 = get_meta(pos):to_table() + local value = pos[axis] -- Save position + pos[axis] = start - value -- Shift position + local node2 = get_node(pos) + local meta2 = get_meta(pos):to_table() + set_node(pos, node1) + get_meta(pos):from_table(meta1) + pos[axis] = value -- Restore position + set_node(pos, node2) + get_meta(pos):from_table(meta2) + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2) +end + + +--- Rotates a region clockwise around an axis. +-- @param pos1 +-- @param pos2 +-- @param axis Axis ("x", "y", or "z"). +-- @param angle Angle in degrees (90 degree increments only). +-- @return The number of nodes rotated. +-- @return The new first position. +-- @return The new second position. +function worldedit.rotate(pos1, pos2, axis, angle) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + local other1, other2 = worldedit.get_axis_others(axis) + angle = angle % 360 + + local count + if angle == 90 then + worldedit.flip(pos1, pos2, other1) + count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) + elseif angle == 180 then + worldedit.flip(pos1, pos2, other1) + count = worldedit.flip(pos1, pos2, other2) + elseif angle == 270 then + worldedit.flip(pos1, pos2, other2) + count, pos1, pos2 = worldedit.transpose(pos1, pos2, other1, other2) + else + error("Only 90 degree increments are supported!") + end + return count, pos1, pos2 +end + + +--- Rotates all oriented nodes in a region clockwise around the Y axis. +-- @param pos1 +-- @param pos2 +-- @param angle Angle in degrees (90 degree increments only). +-- @return The number of nodes oriented. +-- TODO: Support 6D facedir rotation along arbitrary axis. +function worldedit.orient(pos1, pos2, angle) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local registered_nodes = minetest.registered_nodes + + local wallmounted = { + [90] = {[0]=0, 1, 5, 4, 2, 3}, + [180] = {[0]=0, 1, 3, 2, 5, 4}, + [270] = {[0]=0, 1, 4, 5, 3, 2} + } + local facedir = { + [90] = {[0]=1, 2, 3, 0}, + [180] = {[0]=2, 3, 0, 1}, + [270] = {[0]=3, 0, 1, 2} + } + + angle = angle % 360 + if angle == 0 then + return 0 + end + if angle % 90 ~= 0 then + error("Only 90 degree increments are supported!") + end + local wallmounted_substitution = wallmounted[angle] + local facedir_substitution = facedir[angle] + + worldedit.keep_loaded(pos1, pos2) + + local count = 0 + local set_node, get_node, get_meta, swap_node = minetest.set_node, + minetest.get_node, minetest.get_meta, minetest.swap_node + local pos = {x=pos1.x, y=0, z=0} + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + local def = registered_nodes[node.name] + if def then + if def.paramtype2 == "wallmounted" then + node.param2 = wallmounted_substitution[node.param2] + local meta = get_meta(pos):to_table() + set_node(pos, node) + get_meta(pos):from_table(meta) + count = count + 1 + elseif def.paramtype2 == "facedir" then + node.param2 = facedir_substitution[node.param2] + local meta = get_meta(pos):to_table() + set_node(pos, node) + get_meta(pos):from_table(meta) + count = count + 1 + end + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return count +end + + +--- Attempts to fix the lighting in a region. +-- @return The number of nodes updated. +function worldedit.fixlight(pos1, pos2) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local nodes = minetest.find_nodes_in_area(pos1, pos2, "air") + local dig_node = minetest.dig_node + for _, pos in ipairs(nodes) do + dig_node(pos) + end + return #nodes +end + + +--- Clears all objects in a region. +-- @return The number of objects cleared. +function worldedit.clear_objects(pos1, pos2) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + -- Offset positions to include full nodes (positions are in the center of nodes) + local pos1x, pos1y, pos1z = pos1.x - 0.5, pos1.y - 0.5, pos1.z - 0.5 + local pos2x, pos2y, pos2z = pos2.x + 0.5, pos2.y + 0.5, pos2.z + 0.5 + + -- Center of region + local center = { + x = pos1x + ((pos2x - pos1x) / 2), + y = pos1y + ((pos2y - pos1y) / 2), + z = pos1z + ((pos2z - pos1z) / 2) + } + -- Bounding sphere radius + local radius = math.sqrt( + (center.x - pos1x) ^ 2 + + (center.y - pos1y) ^ 2 + + (center.z - pos1z) ^ 2) + local count = 0 + for _, obj in pairs(minetest.get_objects_inside_radius(center, radius)) do + local entity = obj:get_luaentity() + -- Avoid players and WorldEdit entities + if not obj:is_player() and (not entity or + not entity.name:find("^worldedit:")) then + local pos = obj:getpos() + if pos.x >= pos1x and pos.x <= pos2x and + pos.y >= pos1y and pos.y <= pos2y and + pos.z >= pos1z and pos.z <= pos2z then + -- Inside region + obj:remove() + count = count + 1 + end + end + end + return count +end + diff --git a/mods/worldedit/worldedit/primitives.lua b/mods/worldedit/worldedit/primitives.lua new file mode 100644 index 0000000..feeea2e --- /dev/null +++ b/mods/worldedit/worldedit/primitives.lua @@ -0,0 +1,273 @@ +--- Functions for creating primitive shapes. +-- @module worldedit.primitives + +local mh = worldedit.manip_helpers + + +--- Adds a sphere of `node_name` centered at `pos`. +-- @param pos Position to center sphere at. +-- @param radius Sphere radius. +-- @param node_name Name of node to make shere of. +-- @param hollow Whether the sphere should be hollow. +-- @return The number of nodes added. +function worldedit.sphere(pos, radius, node_name, hollow) + local manip, area = mh.init_radius(pos, radius) + + local data = mh.get_empty_data(area) + + -- Fill selected area with node + local node_id = minetest.get_content_id(node_name) + local min_radius, max_radius = radius * (radius - 1), radius * (radius + 1) + local offset_x, offset_y, offset_z = pos.x - area.MinEdge.x, pos.y - area.MinEdge.y, pos.z - area.MinEdge.z + local stride_z, stride_y = area.zstride, area.ystride + local count = 0 + for z = -radius, radius do + -- Offset contributed by z plus 1 to make it 1-indexed + local new_z = (z + offset_z) * stride_z + 1 + for y = -radius, radius do + local new_y = new_z + (y + offset_y) * stride_y + for x = -radius, radius do + local squared = x * x + y * y + z * z + if squared <= max_radius and (not hollow or squared >= min_radius) then + -- Position is on surface of sphere + local i = new_y + (x + offset_x) + data[i] = node_id + count = count + 1 + end + end + end + end + + mh.finish(manip, data) + + return count +end + + +--- Adds a dome. +-- @param pos Position to center dome at. +-- @param radius Dome radius. Negative for concave domes. +-- @param node_name Name of node to make dome of. +-- @param hollow Whether the dome should be hollow. +-- @return The number of nodes added. +-- TODO: Add axis option. +function worldedit.dome(pos, radius, node_name, hollow) + local min_y, max_y = 0, radius + if radius < 0 then + radius = -radius + min_y, max_y = -radius, 0 + end + + local manip, area = mh.init_axis_radius(pos, "y", radius) + local data = mh.get_empty_data(area) + + -- Add dome + local node_id = minetest.get_content_id(node_name) + local min_radius, max_radius = radius * (radius - 1), radius * (radius + 1) + local offset_x, offset_y, offset_z = pos.x - area.MinEdge.x, pos.y - area.MinEdge.y, pos.z - area.MinEdge.z + local stride_z, stride_y = area.zstride, area.ystride + local count = 0 + for z = -radius, radius do + local new_z = (z + offset_z) * stride_z + 1 --offset contributed by z plus 1 to make it 1-indexed + for y = min_y, max_y do + local new_y = new_z + (y + offset_y) * stride_y + for x = -radius, radius do + local squared = x * x + y * y + z * z + if squared <= max_radius and (not hollow or squared >= min_radius) then + -- Position is in dome + local i = new_y + (x + offset_x) + data[i] = node_id + count = count + 1 + end + end + end + end + + mh.finish(manip, data) + + return count +end + +--- Adds a cylinder. +-- @param pos Position to center base of cylinder at. +-- @param axis Axis ("x", "y", or "z") +-- @param length Cylinder length. +-- @param radius Cylinder radius. +-- @param node_name Name of node to make cylinder of. +-- @param hollow Whether the cylinder should be hollow. +-- @return The number of nodes added. +function worldedit.cylinder(pos, axis, length, radius, node_name, hollow) + local other1, other2 = worldedit.get_axis_others(axis) + + -- Handle negative lengths + local current_pos = {x=pos.x, y=pos.y, z=pos.z} + if length < 0 then + length = -length + current_pos[axis] = current_pos[axis] - length + end + + -- Set up voxel manipulator + local manip, area = mh.init_axis_radius_length(current_pos, axis, radius, length) + local data = mh.get_empty_data(area) + + -- Add cylinder + local node_id = minetest.get_content_id(node_name) + local min_radius, max_radius = radius * (radius - 1), radius * (radius + 1) + local stride = {x=1, y=area.ystride, z=area.zstride} + local offset = { + x = current_pos.x - area.MinEdge.x, + y = current_pos.y - area.MinEdge.y, + z = current_pos.z - area.MinEdge.z, + } + local min_slice, max_slice = offset[axis], offset[axis] + length - 1 + local count = 0 + for index2 = -radius, radius do + -- Offset contributed by other axis 1 plus 1 to make it 1-indexed + local new_index2 = (index2 + offset[other1]) * stride[other1] + 1 + for index3 = -radius, radius do + local new_index3 = new_index2 + (index3 + offset[other2]) * stride[other2] + local squared = index2 * index2 + index3 * index3 + if squared <= max_radius and (not hollow or squared >= min_radius) then + -- Position is in cylinder + -- Add column along axis + for index1 = min_slice, max_slice do + local vi = new_index3 + index1 * stride[axis] + data[vi] = node_id + end + count = count + length + end + end + end + + mh.finish(manip, data) + + return count +end + + +--- Adds a pyramid. +-- @param pos Position to center base of pyramid at. +-- @param axis Axis ("x", "y", or "z") +-- @param height Pyramid height. +-- @param node_name Name of node to make pyramid of. +-- @return The number of nodes added. +function worldedit.pyramid(pos, axis, height, node_name) + local other1, other2 = worldedit.get_axis_others(axis) + + -- Set up voxel manipulator + local manip, area = mh.init_axis_radius(pos, axis, + height >= 0 and height or -height) + local data = mh.get_empty_data() + + -- Handle inverted pyramids + local start_axis, end_axis, step + if height > 0 then + height = height - 1 + step = 1 + else + height = height + 1 + step = -1 + end + + -- Add pyramid + local node_id = minetest.get_content_id(node_name) + local stride = {x=1, y=area.ystride, z=area.zstride} + local offset = { + x = pos.x - area.MinEdge.x, + y = pos.y - area.MinEdge.y, + z = pos.z - area.MinEdge.z, + } + local size = height * step + local count = 0 + -- For each level of the pyramid + for index1 = 0, height, step do + -- Offset contributed by axis plus 1 to make it 1-indexed + local new_index1 = (index1 + offset[axis]) * stride[axis] + 1 + for index2 = -size, size do + local new_index2 = new_index1 + (index2 + offset[other1]) * stride[other1] + for index3 = -size, size do + local i = new_index2 + (index3 + offset[other2]) * stride[other2] + data[i] = node_id + end + end + count = count + (size * 2 + 1) ^ 2 + size = size - 1 + end + + mh.finish(manip, data) + + return count +end + +--- Adds a spiral. +-- @param pos Position to center spiral at. +-- @param length Spral length. +-- @param height Spiral height. +-- @param spacer Space between walls. +-- @param node_name Name of node to make spiral of. +-- @return Number of nodes added. +-- TODO: Add axis option. +function worldedit.spiral(pos, length, height, spacer, node_name) + local extent = math.ceil(length / 2) + + local manip, area = mh.init_axis_radius_length(pos, "y", extent, height) + local data = mh.get_empty_data(area) + + -- Set up variables + local node_id = minetest.get_content_id(node_name) + local stride = {x=1, y=area.ystride, z=area.zstride} + local offset_x, offset_y, offset_z = pos.x - area.MinEdge.x, pos.y - area.MinEdge.y, pos.z - area.MinEdge.z + local i = offset_z * stride.z + offset_y * stride.y + offset_x + 1 + + -- Add first column + local count = height + local column = i + for y = 1, height do + data[column] = node_id + column = column + stride.y + end + + -- Add spiral segments + local stride_axis, stride_other = stride.x, stride.z + local sign = -1 + local segment_length = 0 + spacer = spacer + 1 + -- Go through each segment except the last + for segment = 1, math.floor(length / spacer) * 2 do + -- Change sign and length every other turn starting with the first + if segment % 2 == 1 then + sign = -sign + segment_length = segment_length + spacer + end + -- Fill segment + for index = 1, segment_length do + -- Move along the direction of the segment + i = i + stride_axis * sign + local column = i + -- Add column + for y = 1, height do + data[column] = node_id + column = column + stride.y + end + end + count = count + segment_length * height + stride_axis, stride_other = stride_other, stride_axis -- Swap axes + end + + -- Add shorter final segment + sign = -sign + for index = 1, segment_length do + i = i + stride_axis * sign + local column = i + -- Add column + for y = 1, height do + data[column] = node_id + column = column + stride.y + end + end + count = count + segment_length * height + + mh.finish(manip, data) + + return count +end diff --git a/mods/worldedit/worldedit/serialization.lua b/mods/worldedit/worldedit/serialization.lua new file mode 100644 index 0000000..797a86e --- /dev/null +++ b/mods/worldedit/worldedit/serialization.lua @@ -0,0 +1,239 @@ +--- Schematic serialization and deserialiation. +-- @module worldedit.serialization + +worldedit.LATEST_SERIALIZATION_VERSION = 5 +local LATEST_SERIALIZATION_HEADER = worldedit.LATEST_SERIALIZATION_VERSION .. ":" + + +--[[ +Serialization version history: + 1: Original format. Serialized Lua table with a weird linked format... + 2: Position and node seperated into sub-tables in fields `1` and `2`. + 3: List of nodes, one per line, with fields seperated by spaces. + Format: + 4: Serialized Lua table containing a list of nodes with `x`, `y`, `z`, + `name`, `param1`, `param2`, and `meta` fields. + 5: Added header and made `param1`, `param2`, and `meta` fields optional. + Header format: ,,...: +--]] + + +--- Reads the header of serialized data. +-- @param value Serialized WorldEdit data. +-- @return The version as a positive natural number, or 0 for unknown versions. +-- @return Extra header fields as a list of strings, or nil if not supported. +-- @return Content (data after header). +function worldedit.read_header(value) + if value:find("^[0-9]+[%-:]") then + local header_end = value:find(":", 1, true) + local header = value:sub(1, header_end - 1):split(",") + local version = tonumber(header[1]) + table.remove(header, 1) + local content = value:sub(header_end + 1) + return version, header, content + end + -- Old versions that didn't include a header with a version number + if value:find("([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)") and not value:find("%{") then -- List format + return 3, nil, value + elseif value:find("^[^\"']+%{%d+%}") then + if value:find("%[\"meta\"%]") then -- Meta flat table format + return 2, nil, value + end + return 1, nil, value -- Flat table format + elseif value:find("%{") then -- Raw nested table format + return 4, nil, value + end + return nil +end + + +--- Converts the region defined by positions `pos1` and `pos2` +-- into a single string. +-- @return The serialized data. +-- @return The number of nodes serialized. +function worldedit.serialize(pos1, pos2) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local pos = {x=pos1.x, y=0, z=0} + local count = 0 + local result = {} + local get_node, get_meta = minetest.get_node, minetest.get_meta + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + if node.name ~= "air" and node.name ~= "ignore" then + count = count + 1 + local meta = get_meta(pos):to_table() + + local meta_empty = true + -- Convert metadata item stacks to item strings + for name, inventory in pairs(meta.inventory) do + for index, stack in ipairs(inventory) do + meta_empty = false + inventory[index] = stack.to_string and stack:to_string() or stack + end + end + for k in pairs(meta) do + if k ~= "inventory" then + meta_empty = false + break + end + end + + result[count] = { + x = pos.x - pos1.x, + y = pos.y - pos1.y, + z = pos.z - pos1.z, + name = node.name, + param1 = node.param1 ~= 0 and node.param1 or nil, + param2 = node.param2 ~= 0 and node.param2 or nil, + meta = not meta_empty and meta or nil, + } + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + -- Serialize entries + result = minetest.serialize(result) + return LATEST_SERIALIZATION_HEADER .. result, count +end + + +--- Loads the schematic in `value` into a node list in the latest format. +-- Contains code based on [table.save/table.load](http://lua-users.org/wiki/SaveTableToFile) +-- by ChillCode, available under the MIT license. +-- @return A node list in the latest format, or nil on failure. +local function load_schematic(value) + local version, header, content = worldedit.read_header(value) + local nodes = {} + if version == 1 or version == 2 then -- Original flat table format + local tables = minetest.deserialize(content) + if not tables then return nil end + + -- Transform the node table into an array of nodes + for i = 1, #tables do + for j, v in pairs(tables[i]) do + if type(v) == "table" then + tables[i][j] = tables[v[1]] + end + end + end + nodes = tables[1] + + if version == 1 then --original flat table format + for i, entry in ipairs(nodes) do + local pos = entry[1] + entry.x, entry.y, entry.z = pos.x, pos.y, pos.z + entry[1] = nil + local node = entry[2] + entry.name, entry.param1, entry.param2 = node.name, node.param1, node.param2 + entry[2] = nil + end + end + elseif version == 3 then -- List format + for x, y, z, name, param1, param2 in content:gmatch( + "([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)%s+" .. + "([^%s]+)%s+(%d+)%s+(%d+)[^\r\n]*[\r\n]*") do + param1, param2 = tonumber(param1), tonumber(param2) + table.insert(nodes, { + x = originx + tonumber(x), + y = originy + tonumber(y), + z = originz + tonumber(z), + name = name, + param1 = param1 ~= 0 and param1 or nil, + param2 = param2 ~= 0 and param2 or nil, + }) + end + elseif version == 4 or version == 5 then -- Nested table format + if not jit then + -- This is broken for larger tables in the current version of LuaJIT + nodes = minetest.deserialize(content) + else + -- XXX: This is a filthy hack that works surprisingly well - in LuaJIT, `minetest.deserialize` will fail due to the register limit + nodes = {} + content = content:gsub("return%s*{", "", 1):gsub("}%s*$", "", 1) -- remove the starting and ending values to leave only the node data + local escaped = content:gsub("\\\\", "@@"):gsub("\\\"", "@@"):gsub("(\"[^\"]*\")", function(s) return string.rep("@", #s) end) + local startpos, startpos1, endpos = 1, 1 + while true do -- go through each individual node entry (except the last) + startpos, endpos = escaped:find("},%s*{", startpos) + if not startpos then + break + end + local current = content:sub(startpos1, startpos) + local entry = minetest.deserialize("return " .. current) + table.insert(nodes, entry) + startpos, startpos1 = endpos, endpos + end + local entry = minetest.deserialize("return " .. content:sub(startpos1)) -- process the last entry + table.insert(nodes, entry) + end + else + return nil + end + return nodes +end + +--- Determines the volume the nodes represented by string `value` would occupy +-- if deserialized at `origin_pos`. +-- @return Low corner position. +-- @return High corner position. +-- @return The number of nodes. +function worldedit.allocate(origin_pos, value) + local nodes = load_schematic(value) + if not nodes then return nil end + return worldedit.allocate_with_nodes(origin_pos, nodes) +end + + +-- Internal +function worldedit.allocate_with_nodes(origin_pos, nodes) + local huge = math.huge + local pos1x, pos1y, pos1z = huge, huge, huge + local pos2x, pos2y, pos2z = -huge, -huge, -huge + local origin_x, origin_y, origin_z = origin_pos.x, origin_pos.y, origin_pos.z + for i, entry in ipairs(nodes) do + local x, y, z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z + if x < pos1x then pos1x = x end + if y < pos1y then pos1y = y end + if z < pos1z then pos1z = z end + if x > pos2x then pos2x = x end + if y > pos2y then pos2y = y end + if z > pos2z then pos2z = z end + end + local pos1 = {x=pos1x, y=pos1y, z=pos1z} + local pos2 = {x=pos2x, y=pos2y, z=pos2z} + return pos1, pos2, #nodes +end + + +--- Loads the nodes represented by string `value` at position `origin_pos`. +-- @return The number of nodes deserialized. +function worldedit.deserialize(origin_pos, value) + local nodes = load_schematic(value) + if not nodes then return nil end + + local pos1, pos2 = worldedit.allocate_with_nodes(origin_pos, nodes) + worldedit.keep_loaded(pos1, pos2) + + local origin_x, origin_y, origin_z = origin_pos.x, origin_pos.y, origin_pos.z + local count = 0 + local add_node, get_meta = minetest.add_node, minetest.get_meta + for i, entry in ipairs(nodes) do + entry.x, entry.y, entry.z = origin_x + entry.x, origin_y + entry.y, origin_z + entry.z + -- Entry acts as both position and node + add_node(entry, entry) + if entry.meta then + get_meta(entry):from_table(entry.meta) + end + end + return #nodes +end + diff --git a/mods/worldedit/worldedit/visualization.lua b/mods/worldedit/worldedit/visualization.lua new file mode 100644 index 0000000..dce6bfa --- /dev/null +++ b/mods/worldedit/worldedit/visualization.lua @@ -0,0 +1,131 @@ +--- Functions for visibly hiding nodes +-- @module worldedit.visualization + +minetest.register_node("worldedit:placeholder", { + drawtype = "airlike", + paramtype = "light", + sunlight_propagates = true, + diggable = false, + walkable = false, + groups = {not_in_creative_inventory=1}, +}) + +--- Hides all nodes in a region defined by positions `pos1` and `pos2` by +-- non-destructively replacing them with invisible nodes. +-- @return The number of nodes hidden. +function worldedit.hide(pos1, pos2) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local pos = {x=pos1.x, y=0, z=0} + local get_node, get_meta, swap_node = minetest.get_node, + minetest.get_meta, minetest.swap_node + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + if node.name ~= "air" and node.name ~= "worldedit:placeholder" then + -- Save the node's original name + get_meta(pos):set_string("worldedit_placeholder", node.name) + -- Swap in placeholder node + node.name = "worldedit:placeholder" + swap_node(pos, node) + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return worldedit.volume(pos1, pos2) +end + +--- Suppresses all instances of `node_name` in a region defined by positions +-- `pos1` and `pos2` by non-destructively replacing them with invisible nodes. +-- @return The number of nodes suppressed. +function worldedit.suppress(pos1, pos2, node_name) + -- Ignore placeholder supression + if node_name == "worldedit:placeholder" then + return 0 + end + + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local nodes = minetest.find_nodes_in_area(pos1, pos2, node_name) + local get_node, get_meta, swap_node = minetest.get_node, + minetest.get_meta, minetest.swap_node + for _, pos in ipairs(nodes) do + local node = get_node(pos) + -- Save the node's original name + get_meta(pos):set_string("worldedit_placeholder", node.name) + -- Swap in placeholder node + node.name = "worldedit:placeholder" + swap_node(pos, node) + end + return #nodes +end + +--- Highlights all instances of `node_name` in a region defined by positions +-- `pos1` and `pos2` by non-destructively hiding all other nodes. +-- @return The number of nodes found. +function worldedit.highlight(pos1, pos2, node_name) + pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local pos = {x=pos1.x, y=0, z=0} + local get_node, get_meta, swap_node = minetest.get_node, + minetest.get_meta, minetest.swap_node + local count = 0 + while pos.x <= pos2.x do + pos.y = pos1.y + while pos.y <= pos2.y do + pos.z = pos1.z + while pos.z <= pos2.z do + local node = get_node(pos) + if node.name == node_name then -- Node found + count = count + 1 + elseif node.name ~= "worldedit:placeholder" then -- Hide other nodes + -- Save the node's original name + get_meta(pos):set_string("worldedit_placeholder", node.name) + -- Swap in placeholder node + node.name = "worldedit:placeholder" + swap_node(pos, node) + end + pos.z = pos.z + 1 + end + pos.y = pos.y + 1 + end + pos.x = pos.x + 1 + end + return count +end + +-- Restores all nodes hidden with WorldEdit functions in a region defined +-- by positions `pos1` and `pos2`. +-- @return The number of nodes restored. +function worldedit.restore(pos1, pos2) + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + + worldedit.keep_loaded(pos1, pos2) + + local nodes = minetest.find_nodes_in_area(pos1, pos2, "worldedit:placeholder") + local get_node, get_meta, swap_node = minetest.get_node, + minetest.get_meta, minetest.swap_node + for _, pos in ipairs(nodes) do + local node = get_node(pos) + local meta = get_meta(pos) + local data = meta:to_table() + node.name = data.fields.worldedit_placeholder + data.fields.worldedit_placeholder = nil + meta:from_table(data) + swap_node(pos, node) + end + return #nodes +end + diff --git a/mods/worldedit/worldedit_commands/depends.txt b/mods/worldedit/worldedit_commands/depends.txt new file mode 100644 index 0000000..df8caff --- /dev/null +++ b/mods/worldedit/worldedit_commands/depends.txt @@ -0,0 +1 @@ +worldedit \ No newline at end of file diff --git a/mods/worldedit/worldedit_commands/init.lua b/mods/worldedit/worldedit_commands/init.lua new file mode 100644 index 0000000..9e8383c --- /dev/null +++ b/mods/worldedit/worldedit_commands/init.lua @@ -0,0 +1,1160 @@ +minetest.register_privilege("worldedit", "Can use WorldEdit commands") + +worldedit.set_pos = {} +worldedit.inspect = {} + +worldedit.pos1 = {} +worldedit.pos2 = {} +if minetest.place_schematic then + worldedit.prob_pos = {} + worldedit.prob_list = {} +end + +dofile(minetest.get_modpath("worldedit_commands") .. "/mark.lua") +local safe_region, check_region = dofile(minetest.get_modpath("worldedit_commands") .. "/safe.lua") + +local function get_position(name) --position 1 retrieval function for when not using `safe_region` + local pos1 = worldedit.pos1[name] + if pos1 == nil then + worldedit.player_notify(name, "no position 1 selected") + end + return pos1 +end + +local function get_node(name, nodename) + local node = worldedit.normalize_nodename(nodename) + if not node then + worldedit.player_notify(name, "invalid node name: " .. nodename) + return nil + end + return node +end + +function worldedit.player_notify(name, message) + minetest.chat_send_player(name, "WorldEdit -!- " .. message, false) +end + +--determines whether `nodename` is a valid node name, returning a boolean +worldedit.normalize_nodename = function(nodename) + nodename = nodename:gsub("^%s*(.-)%s*$", "%1") + if nodename == "" then return nil end + local fullname = ItemStack({name=nodename}):get_name() --resolve aliases of node names to full names + if minetest.registered_nodes[fullname] or fullname == "air" then --directly found node name or alias of nodename + return fullname + end + for key, value in pairs(minetest.registered_nodes) do + if key:find(":" .. nodename, 1, true) then --found in mod + return key + end + end + nodename = nodename:lower() --lowercase both for case insensitive comparison + for key, value in pairs(minetest.registered_nodes) do + if value.description:lower() == nodename then --found in description + return key + end + end + return nil +end + +-- Determines the axis in which a player is facing, returning an axis ("x", "y", or "z") and the sign (1 or -1) +function worldedit.player_axis(name) + local dir = minetest.get_player_by_name(name):get_look_dir() + local x, y, z = math.abs(dir.x), math.abs(dir.y), math.abs(dir.z) + if x > y then + if x > z then + return "x", dir.x > 0 and 1 or -1 + end + elseif y > z then + return "y", dir.y > 0 and 1 or -1 + end + return "z", dir.z > 0 and 1 or -1 +end + +local function mkdir(path) + if minetest.mkdir then + minetest.mkdir(path) + else + os.execute('mkdir "' .. path .. '"') + end +end + +local function check_filename(name) + return name:find("^[%w%s%^&'@{}%[%],%$=!%-#%(%)%%%.%+~_]+$") ~= nil +end + + +minetest.register_chatcommand("/about", { + params = "", + description = "Get information about the mod", + func = function(name, param) + worldedit.player_notify(name, "WorldEdit " .. worldedit.version_string .. " is available on this server. Type /help to get a list of commands, or get more information at https://github.com/Uberi/MineTest-WorldEdit/") + end, +}) + +minetest.register_chatcommand("/inspect", { + params = "on/off/1/0/true/false/yes/no/enable/disable/", + description = "Enable or disable node inspection", + privs = {worldedit=true}, + func = function(name, param) + if param == "on" or param == "1" or param == "true" or param == "yes" or param == "enable" or param == "" then + worldedit.inspect[name] = true + local axis, sign = worldedit.player_axis(name) + worldedit.player_notify(name, string.format("inspector: inspection enabled for %s, currently facing the %s axis", + name, axis .. (sign > 0 and "+" or "-"))) + elseif param == "off" or param == "0" or param == "false" or param == "no" or param == "disable" then + worldedit.inspect[name] = nil + worldedit.player_notify(name, "inspector: inspection disabled") + else + worldedit.player_notify(name, "invalid usage: " .. param) + end + end, +}) + +minetest.register_on_punchnode(function(pos, node, puncher) + local name = puncher:get_player_name() + if worldedit.inspect[name] then + if minetest.check_player_privs(name, {worldedit=true}) then + local axis, sign = worldedit.player_axis(name) + message = string.format("inspector: %s at %s (param1=%d, param2=%d) punched by %s facing the %s axis", + node.name, minetest.pos_to_string(pos), node.param1, node.param2, name, axis .. (sign > 0 and "+" or "-")) + else + message = "inspector: worldedit privileges required" + end + worldedit.player_notify(name, message) + end +end) + +minetest.register_chatcommand("/reset", { + params = "", + description = "Reset the region so that it is empty", + privs = {worldedit=true}, + func = function(name, param) + worldedit.pos1[name] = nil + worldedit.pos2[name] = nil + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + worldedit.set_pos[name] = nil + worldedit.player_notify(name, "region reset") + end, +}) + +minetest.register_chatcommand("/mark", { + params = "", + description = "Show markers at the region positions", + privs = {worldedit=true}, + func = function(name, param) + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + worldedit.player_notify(name, "region marked") + end, +}) + +minetest.register_chatcommand("/unmark", { + params = "", + description = "Hide markers if currently shown", + privs = {worldedit=true}, + func = function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + worldedit.pos1[name] = nil + worldedit.pos2[name] = nil + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.player_notify(name, "region unmarked") + end, +}) + +minetest.register_chatcommand("/pos1", { + params = "", + description = "Set WorldEdit region position 1 to the player's location", + privs = {worldedit=true}, + func = function(name, param) + local pos = minetest.get_player_by_name(name):getpos() + pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) + worldedit.pos1[name] = pos + worldedit.mark_pos1(name) + worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) + end, +}) + +minetest.register_chatcommand("/pos2", { + params = "", + description = "Set WorldEdit region position 2 to the player's location", + privs = {worldedit=true}, + func = function(name, param) + local pos = minetest.get_player_by_name(name):getpos() + pos.x, pos.y, pos.z = math.floor(pos.x + 0.5), math.floor(pos.y + 0.5), math.floor(pos.z + 0.5) + worldedit.pos2[name] = pos + worldedit.mark_pos2(name) + worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) + end, +}) + +minetest.register_chatcommand("/p", { + params = "set/set1/set2/get", + description = "Set WorldEdit region, WorldEdit position 1, or WorldEdit position 2 by punching nodes, or display the current WorldEdit region", + privs = {worldedit=true}, + func = function(name, param) + if param == "set" then --set both WorldEdit positions + worldedit.set_pos[name] = "pos1" + worldedit.player_notify(name, "select positions by punching two nodes") + elseif param == "set1" then --set WorldEdit position 1 + worldedit.set_pos[name] = "pos1only" + worldedit.player_notify(name, "select position 1 by punching a node") + elseif param == "set2" then --set WorldEdit position 2 + worldedit.set_pos[name] = "pos2" + worldedit.player_notify(name, "select position 2 by punching a node") + elseif param == "get" then --display current WorldEdit positions + if worldedit.pos1[name] ~= nil then + worldedit.player_notify(name, "position 1: " .. minetest.pos_to_string(worldedit.pos1[name])) + else + worldedit.player_notify(name, "position 1 not set") + end + if worldedit.pos2[name] ~= nil then + worldedit.player_notify(name, "position 2: " .. minetest.pos_to_string(worldedit.pos2[name])) + else + worldedit.player_notify(name, "position 2 not set") + end + else + worldedit.player_notify(name, "unknown subcommand: " .. param) + end + end, +}) + +minetest.register_chatcommand("/fixedpos", { + params = "set1/set2 x y z", + description = "Set a WorldEdit region position to the position at (, , )", + privs = {worldedit=true}, + func = function(name, param) + local found, _, flag, x, y, z = param:find("^(set[12])%s+([+-]?%d+)%s+([+-]?%d+)%s+([+-]?%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + local pos = {x=tonumber(x), y=tonumber(y), z=tonumber(z)} + if flag == "set1" then + worldedit.pos1[name] = pos + worldedit.mark_pos1(name) + worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) + else --flag == "set2" + worldedit.pos2[name] = pos + worldedit.mark_pos2(name) + worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) + end + end, +}) + +minetest.register_on_punchnode(function(pos, node, puncher) + local name = puncher:get_player_name() + if name ~= "" and worldedit.set_pos[name] ~= nil then --currently setting position + if worldedit.set_pos[name] == "pos1" then --setting position 1 + worldedit.pos1[name] = pos + worldedit.mark_pos1(name) + worldedit.set_pos[name] = "pos2" --set position 2 on the next invocation + worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) + elseif worldedit.set_pos[name] == "pos1only" then --setting position 1 only + worldedit.pos1[name] = pos + worldedit.mark_pos1(name) + worldedit.set_pos[name] = nil --finished setting positions + worldedit.player_notify(name, "position 1 set to " .. minetest.pos_to_string(pos)) + elseif worldedit.set_pos[name] == "pos2" then --setting position 2 + worldedit.pos2[name] = pos + worldedit.mark_pos2(name) + worldedit.set_pos[name] = nil --finished setting positions + worldedit.player_notify(name, "position 2 set to " .. minetest.pos_to_string(pos)) + elseif worldedit.set_pos[name] == "prob" then --setting Minetest schematic node probabilities + worldedit.prob_pos[name] = pos + minetest.show_formspec(puncher:get_player_name(), "prob_val_enter", "field[text;;]") + end + end +end) + +minetest.register_chatcommand("/volume", { + params = "", + description = "Display the volume of the current WorldEdit region", + privs = {worldedit=true}, + func = function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if pos1 == nil or pos2 == nil then + worldedit.player_notify(name, "no region selected") + return nil + end + + local volume = worldedit.volume(pos1, pos2) + local abs = math.abs + worldedit.player_notify(name, "current region has a volume of " .. volume .. " nodes (" + .. abs(pos2.x - pos1.x) + 1 .. "*" + .. abs(pos2.y - pos1.y) + 1 .. "*" + .. abs(pos2.z - pos1.z) + 1 .. ")") + end, +}) + +minetest.register_chatcommand("/deleteblocks", { + params = "", + description = "remove all MapBlocks (16x16x16) containing the selected area from the map", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local success = minetest.delete_area(pos1, pos2) + if success then + worldedit.player_notify(name, "Area deleted.") + else + worldedit.player_notify(name, "There was an error during deletion of the area.") + end + end), +}) + +minetest.register_chatcommand("/set", { + params = "", + description = "Set the current WorldEdit region to ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local node = get_node(name, param) + if not node then + worldedit.player_notify(name, "Could not identify node \"" .. param .. "\"") + return + end + + local count = worldedit.set(worldedit.pos1[name], worldedit.pos2[name], node) + worldedit.player_notify(name, count .. " nodes set") + end, check_region), +}) + +minetest.register_chatcommand("/mix", { + params = " ...", + description = "Fill the current WorldEdit region with a random mix of , ...", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local nodes = {} + for nodename in param:gmatch("[^%s]+") do + local node = get_node(name, nodename) + if not node then + worldedit.player_notify(name, "Could not identify node \"" .. name .. "\"") + return + end + nodes[#nodes + 1] = node + end + + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local count = worldedit.set(pos1, pos2, nodes) + worldedit.player_notify(name, count .. " nodes set") + end, check_region), +}) + +local check_replace = function(name, param) + local found, _, searchnode, replacenode = param:find("^([^%s]+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local newsearchnode = worldedit.normalize_nodename(searchnode) + if not newsearchnode then + worldedit.player_notify(name, "invalid search node name: " .. searchnode) + return nil + end + local newreplacenode = worldedit.normalize_nodename(replacenode) + if not newreplacenode then + worldedit.player_notify(name, "invalid replace node name: " .. replacenode) + return nil + end + return check_region(name, param) +end + +minetest.register_chatcommand("/replace", { + params = " ", + description = "Replace all instances of with in the current WorldEdit region", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, search_node, replace_node = param:find("^([^%s]+)%s+(.+)$") + local norm_search_node = worldedit.normalize_nodename(search_node) + local norm_replace_node = worldedit.normalize_nodename(replace_node) + local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], + norm_search_node, norm_replace_node) + worldedit.player_notify(name, count .. " nodes replaced") + end, check_replace), +}) + +minetest.register_chatcommand("/replaceinverse", { + params = " ", + description = "Replace all nodes other than with in the current WorldEdit region", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, search_node, replace_node = param:find("^([^%s]+)%s+(.+)$") + local norm_search_node = worldedit.normalize_nodename(search_node) + local norm_replace_node = worldedit.normalize_nodename(replace_node) + local count = worldedit.replace(worldedit.pos1[name], worldedit.pos2[name], + norm_search_node, norm_replace_node, true) + worldedit.player_notify(name, count .. " nodes replaced") + end, check_replace), +}) + +local check_sphere = function(name, param) + if worldedit.pos1[name] == nil then + worldedit.player_notify(name, "no position 1 selected") + return nil + end + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local node = get_node(name, nodename) + if not node then return nil end + return math.ceil((4 * math.pi * (tonumber(radius) ^ 3)) / 3) --volume of sphere +end + +minetest.register_chatcommand("/hollowsphere", { + params = " ", + description = "Add hollow sphere centered at WorldEdit position 1 with radius , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + local node = get_node(name, nodename) + local count = worldedit.sphere(worldedit.pos1[name], tonumber(radius), node, true) + worldedit.player_notify(name, count .. " nodes added") + end, check_sphere), +}) + +minetest.register_chatcommand("/sphere", { + params = " ", + description = "Add sphere centered at WorldEdit position 1 with radius , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + local node = get_node(name, nodename) + local count = worldedit.sphere(worldedit.pos1[name], tonumber(radius), node) + worldedit.player_notify(name, count .. " nodes added") + end, check_sphere), +}) + +local check_dome = function(name, param) + if worldedit.pos1[name] == nil then + worldedit.player_notify(name, "no position 1 selected") + return nil + end + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local node = get_node(name, nodename) + if not node then return nil end + return math.ceil((2 * math.pi * (tonumber(radius) ^ 3)) / 3) --volume of dome +end + +minetest.register_chatcommand("/hollowdome", { + params = " ", + description = "Add hollow dome centered at WorldEdit position 1 with radius , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + local node = get_node(name, nodename) + local count = worldedit.dome(worldedit.pos1[name], tonumber(radius), node, true) + worldedit.player_notify(name, count .. " nodes added") + end, check_dome), +}) + +minetest.register_chatcommand("/dome", { + params = " ", + description = "Add dome centered at WorldEdit position 1 with radius , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, radius, nodename = param:find("^(%d+)%s+(.+)$") + local node = get_node(name, nodename) + local count = worldedit.dome(worldedit.pos1[name], tonumber(radius), node) + worldedit.player_notify(name, count .. " nodes added") + end, check_dome), +}) + +local check_cylinder = function(name, param) + if worldedit.pos1[name] == nil then + worldedit.player_notify(name, "no position 1 selected") + return nil + end + local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local node = get_node(name, nodename) + if not node then return nil end + return math.ceil(math.pi * (tonumber(radius) ^ 2) * tonumber(length)) +end + +minetest.register_chatcommand("/hollowcylinder", { + params = "x/y/z/? ", + description = "Add hollow cylinder at WorldEdit position 1 along the x/y/z/? axis with length and radius , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") + length = tonumber(length) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + length = length * sign + end + local node = get_node(name, nodename) + local count = worldedit.cylinder(worldedit.pos1[name], axis, length, tonumber(radius), node, true) + worldedit.player_notify(name, count .. " nodes added") + end, check_cylinder), +}) + +minetest.register_chatcommand("/cylinder", { + params = "x/y/z/? ", + description = "Add cylinder at WorldEdit position 1 along the x/y/z/? axis with length and radius , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, axis, length, radius, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(%d+)%s+(.+)$") + length = tonumber(length) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + length = length * sign + end + local node = get_node(name, nodename) + local count = worldedit.cylinder(worldedit.pos1[name], axis, length, tonumber(radius), node) + worldedit.player_notify(name, count .. " nodes added") + end, check_cylinder), +}) + +minetest.register_chatcommand("/pyramid", { + params = "x/y/z/? ", + description = "Add pyramid centered at WorldEdit position 1 along the x/y/z/? axis with height , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") + height = tonumber(height) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + height = height * sign + end + local node = get_node(name, nodename) + local count = worldedit.pyramid(worldedit.pos1[name], axis, height, node) + worldedit.player_notify(name, count .. " nodes added") + end, + function(name, param) + if worldedit.pos1[name] == nil then + worldedit.player_notify(name, "no position 1 selected") + return nil + end + local found, _, axis, height, nodename = param:find("^([xyz%?])%s+([+-]?%d+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local node = get_node(name, nodename) + if not node then return nil end + height = tonumber(height) + return math.ceil(((height * 2 + 1) ^ 2) * height / 3) + end), +}) + +minetest.register_chatcommand("/spiral", { + params = " ", + description = "Add spiral centered at WorldEdit position 1 with side length , height , space between walls , composed of ", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, length, height, space, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + local node = get_node(name, nodename) + local count = worldedit.spiral(worldedit.pos1[name], tonumber(length), tonumber(height), tonumber(space), node) + worldedit.player_notify(name, count .. " nodes added") + end, + function(name, param) + if worldedit.pos1[name] == nil then + worldedit.player_notify(name, "no position 1 selected") + return nil + end + local found, _, length, height, space, nodename = param:find("^(%d+)%s+(%d+)%s+(%d+)%s+(.+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + local node = get_node(name, nodename) + if not node then return nil end + return check_region(name, param) + end), +}) + +minetest.register_chatcommand("/copy", { + params = "x/y/z/? ", + description = "Copy the current WorldEdit region along the x/y/z/? axis by nodes", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + amount = tonumber(amount) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + amount = amount * sign + end + + local count = worldedit.copy(worldedit.pos1[name], worldedit.pos2[name], axis, amount) + worldedit.player_notify(name, count .. " nodes copied") + end, + function(name, param) + local volume = check_region(name, param) + return volume and volume * 2 or volume + end), +}) + +minetest.register_chatcommand("/move", { + params = "x/y/z/? ", + description = "Move the current WorldEdit region along the x/y/z/? axis by nodes", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local found, _, axis, amount = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + amount = tonumber(amount) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + amount = amount * sign + end + + local count = worldedit.move(pos1, pos2, axis, amount) + + pos1[axis] = pos1[axis] + amount + pos2[axis] = pos2[axis] + amount + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + worldedit.player_notify(name, count .. " nodes moved") + end, check_region), +}) + +minetest.register_chatcommand("/stack", { + params = "x/y/z/? ", + description = "Stack the current WorldEdit region along the x/y/z/? axis times", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, axis, repetitions = param:find("^([xyz%?])%s+([+-]?%d+)$") + repetitions = tonumber(repetitions) + if axis == "?" then + axis, sign = worldedit.player_axis(name) + repetitions = repetitions * sign + end + local count = worldedit.stack(worldedit.pos1[name], worldedit.pos2[name], axis, repetitions) + worldedit.player_notify(name, count .. " nodes stacked") + end, + function(name, param) + local found, _, axis, repetitions = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + local count = check_region(name, param) + if count then return (tonumber(repetitions) + 1) * count end + return nil + end), +}) + +minetest.register_chatcommand("/stack2", { + params = " ", + description = "Stack the current WorldEdit region times by offset , , ", + privs = {worldedit=true}, + func = function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if pos1 == nil or pos2 == nil then + worldedit.player_notify(name, "Select a position first!") + return + end + local repetitions, incs = param:match("(%d+)%s*(.+)") + if repetitions == nil then + worldedit.player_notify(name, "invalid count: " .. param) + return + end + repetitions = tonumber(repetitions) + + local x, y, z = incs:match("([+-]?%d+) ([+-]?%d+) ([+-]?%d+)") + if x == nil then + worldedit.player_notify(name, "invalid increments: " .. param) + return + end + x, y, z = tonumber(x), tonumber(y), tonumber(z) + + local count = worldedit.volume(pos1, pos2) * repetitions + + return safe_region(function() + worldedit.stack2(pos1, pos2, {x=x, y=y, z=z}, repetitions, + function() worldedit.player_notify(name, count .. " nodes stacked") end) + end, function() + return count + end)(name,param) -- more hax --wip: clean this up a little bit + end +}) + + +minetest.register_chatcommand("/stretch", { + params = " ", + description = "Scale the current WorldEdit positions and region by a factor of , , along the X, Y, and Z axes, repectively, with position 1 as the origin", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local found, _, stretchx, stretchy, stretchz = param:find("^(%d+)%s+(%d+)%s+(%d+)$") + stretchx, stretchy, stretchz = tonumber(stretchx), tonumber(stretchy), tonumber(stretchz) + local count, pos1, pos2 = worldedit.stretch(pos1, pos2, stretchx, stretchy, stretchz) + + --reset markers to scaled positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + + worldedit.player_notify(name, count .. " nodes stretched") + end, + function(name, param) + local found, _, stretchx, stretchy, stretchz = param:find("^(%d+)%s+(%d+)%s+(%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + stretchx, stretchy, stretchz = tonumber(stretchx), tonumber(stretchy), tonumber(stretchz) + if stretchx == 0 or stretchy == 0 or stretchz == 0 then + worldedit.player_notify(name, "invalid scaling factors: " .. param) + end + local count = check_region(name, param) + if count then return tonumber(stretchx) * tonumber(stretchy) * tonumber(stretchz) * count end + return nil + end), +}) + +minetest.register_chatcommand("/transpose", { + params = "x/y/z/? x/y/z/?", + description = "Transpose the current WorldEdit region along the x/y/z/? and x/y/z/? axes", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") + if axis1 == "?" then axis1 = worldedit.player_axis(name) end + if axis2 == "?" then axis2 = worldedit.player_axis(name) end + local count, pos1, pos2 = worldedit.transpose(pos1, pos2, axis1, axis2) + + --reset markers to transposed positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + + worldedit.player_notify(name, count .. " nodes transposed") + end, + function(name, param) + local found, _, axis1, axis2 = param:find("^([xyz%?])%s+([xyz%?])$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + if axis1 == axis2 then + worldedit.player_notify(name, "invalid usage: axes must be different") + return nil + end + return check_region(name, param) + end), +}) + +minetest.register_chatcommand("/flip", { + params = "x/y/z/?", + description = "Flip the current WorldEdit region along the x/y/z/? axis", + privs = {worldedit=true}, + func = safe_region(function(name, param) + if param == "?" then param = worldedit.player_axis(name) end + local count = worldedit.flip(worldedit.pos1[name], worldedit.pos2[name], param) + worldedit.player_notify(name, count .. " nodes flipped") + end, + function(name, param) + if param ~= "x" and param ~= "y" and param ~= "z" and param ~= "?" then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + return check_region(name, param) + end), +}) + +minetest.register_chatcommand("/rotate", { + params = " ", + description = "Rotate the current WorldEdit region around the axis by angle (90 degree increment)", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$") + if axis == "?" then axis = worldedit.player_axis(name) end + local count, pos1, pos2 = worldedit.rotate(pos1, pos2, axis, angle) + + --reset markers to rotated positions + worldedit.pos1[name] = pos1 + worldedit.pos2[name] = pos2 + worldedit.mark_pos1(name) + worldedit.mark_pos2(name) + + worldedit.player_notify(name, count .. " nodes rotated") + end, + function(name, param) + local found, _, axis, angle = param:find("^([xyz%?])%s+([+-]?%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + if angle % 90 ~= 0 then + worldedit.player_notify(name, "invalid usage: angle must be multiple of 90") + return nil + end + return check_region(name, param) + end), +}) + +minetest.register_chatcommand("/orient", { + params = "", + description = "Rotate oriented nodes in the current WorldEdit region around the Y axis by angle (90 degree increment)", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local found, _, angle = param:find("^([+-]?%d+)$") + local count = worldedit.orient(worldedit.pos1[name], worldedit.pos2[name], angle) + worldedit.player_notify(name, count .. " nodes oriented") + end, + function(name, param) + local found, _, angle = param:find("^([+-]?%d+)$") + if found == nil then + worldedit.player_notify(name, "invalid usage: " .. param) + return nil + end + if angle % 90 ~= 0 then + worldedit.player_notify(name, "invalid usage: angle must be multiple of 90") + return nil + end + return check_region(name, param) + end), +}) + +minetest.register_chatcommand("/fixlight", { + params = "", + description = "Fix the lighting in the current WorldEdit region", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local count = worldedit.fixlight(worldedit.pos1[name], worldedit.pos2[name]) + worldedit.player_notify(name, count .. " nodes updated") + end), +}) + +minetest.register_chatcommand("/hide", { + params = "", + description = "Hide all nodes in the current WorldEdit region non-destructively", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local count = worldedit.hide(worldedit.pos1[name], worldedit.pos2[name]) + worldedit.player_notify(name, count .. " nodes hidden") + end), +}) + +minetest.register_chatcommand("/suppress", { + params = "", + description = "Suppress all in the current WorldEdit region non-destructively", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local node = get_node(name, param) + local count = worldedit.suppress(worldedit.pos1[name], worldedit.pos2[name], node) + worldedit.player_notify(name, count .. " nodes suppressed") + end, check_region), +}) + +minetest.register_chatcommand("/highlight", { + params = "", + description = "Highlight in the current WorldEdit region by hiding everything else non-destructively", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local node = get_node(name, param) + local count = worldedit.highlight(worldedit.pos1[name], worldedit.pos2[name], node) + worldedit.player_notify(name, count .. " nodes highlighted") + end, check_region), +}) + +minetest.register_chatcommand("/restore", { + params = "", + description = "Restores nodes hidden with WorldEdit in the current WorldEdit region", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local count = worldedit.restore(worldedit.pos1[name], worldedit.pos2[name]) + worldedit.player_notify(name, count .. " nodes restored") + end), +}) + +minetest.register_chatcommand("/save", { + params = "", + description = "Save the current WorldEdit region to \"(world folder)/schems/.we\"", + privs = {worldedit=true}, + func = safe_region(function(name, param) + if param == "" then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + if not check_filename(param) then + worldedit.player_notify(name, "Disallowed file name: " .. param) + return + end + local result, count = worldedit.serialize(worldedit.pos1[name], + worldedit.pos2[name]) + + local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + mkdir(path) + + local filename = path .. "/" .. param .. ".we" + local file, err = io.open(filename, "wb") + if err ~= nil then + worldedit.player_notify(name, "Could not save file to \"" .. filename .. "\"") + return + end + file:write(result) + file:flush() + file:close() + + worldedit.player_notify(name, count .. " nodes saved") + end), +}) + +minetest.register_chatcommand("/allocate", { + params = "", + description = "Set the region defined by nodes from \"(world folder)/schems/.we\" as the current WorldEdit region", + privs = {worldedit=true}, + func = function(name, param) + local pos = get_position(name) + if pos == nil then return end + + if param == "" then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + if not check_filename(param) then + worldedit.player_notify(name, "Disallowed file name: " .. param) + return + end + + local filename = minetest.get_worldpath() .. "/schems/" .. param .. ".we" + local file, err = io.open(filename, "rb") + if err ~= nil then + worldedit.player_notify(name, "could not open file \"" .. filename .. "\"") + return + end + local value = file:read("*a") + file:close() + + local version = worldedit.read_header(value) + if version == 0 then + worldedit.player_notify(name, "File is invalid!") + return + elseif version > worldedit.LATEST_SERIALIZATION_VERSION then + worldedit.player_notify(name, "File was created with newer version of WorldEdit!") + end + local nodepos1, nodepos2, count = worldedit.allocate(pos, value) + + worldedit.pos1[name] = nodepos1 + worldedit.mark_pos1(name) + worldedit.pos2[name] = nodepos2 + worldedit.mark_pos2(name) + + worldedit.player_notify(name, count .. " nodes allocated") + end, +}) + +minetest.register_chatcommand("/load", { + params = "", + description = "Load nodes from \"(world folder)/schems/[.we[m]]\" with position 1 of the current WorldEdit region as the origin", + privs = {worldedit=true}, + func = function(name, param) + local pos = get_position(name) + if pos == nil then return end + + if param == "" then + worldedit.player_notify(name, "invalid usage: " .. param) + return + end + if not string.find(param, "^[%w \t.,+-_=!@#$%%^&*()%[%]{};'\"]+$") then + worldedit.player_notify(name, "invalid file name: " .. param) + return + end + + --find the file in the world path + local testpaths = { + minetest.get_worldpath() .. "/schems/" .. param, + minetest.get_worldpath() .. "/schems/" .. param .. ".we", + minetest.get_worldpath() .. "/schems/" .. param .. ".wem", + } + local file, err + for index, path in ipairs(testpaths) do + file, err = io.open(path, "rb") + if not err then + break + end + end + if err then + worldedit.player_notify(name, "could not open file \"" .. param .. "\"") + return + end + local value = file:read("*a") + file:close() + + local version = worldedit.read_header(value) + if version == 0 then + worldedit.player_notify(name, "File is invalid!") + return + elseif version > worldedit.LATEST_SERIALIZATION_VERSION then + worldedit.player_notify(name, "File was created with newer version of WorldEdit!") + return + end + + local count = worldedit.deserialize(pos, value) + + worldedit.player_notify(name, count .. " nodes loaded") + end, +}) + +minetest.register_chatcommand("/lua", { + params = "", + description = "Executes as a Lua chunk in the global namespace", + privs = {worldedit=true, server=true}, + func = function(name, param) + local admin = minetest.setting_get("name") + if not admin or not name == admin then + worldedit.player_notify(name, "this command can only be run by the server administrator") + return + end + local err = worldedit.lua(param) + if err then + worldedit.player_notify(name, "code error: " .. err) + else + worldedit.player_notify(name, "code successfully executed", false) + end + end, +}) + +minetest.register_chatcommand("/luatransform", { + params = "", + description = "Executes as a Lua chunk in the global namespace with the variable pos available, for each node in the current WorldEdit region", + privs = {worldedit=true, server=true}, + func = safe_region(function(name, param) + local admin = minetest.setting_get("name") + if not admin or not name == admin then + worldedit.player_notify(name, "this command can only be run by the server administrator") + return + end + + local err = worldedit.luatransform(worldedit.pos1[name], worldedit.pos2[name], param) + if err then + worldedit.player_notify(name, "code error: " .. err, false) + else + worldedit.player_notify(name, "code successfully executed", false) + end + end), +}) + +minetest.register_chatcommand("/mtschemcreate", { + params = "", + description = "Save the current WorldEdit region using the Minetest ".. + "Schematic format to \"(world folder)/schems/.mts\"", + privs = {worldedit=true}, + func = safe_region(function(name, param) + if param == nil then + worldedit.player_notify(name, "No filename specified") + return + end + if not check_filename(param) then + worldedit.player_notify(name, "Disallowed file name: " .. param) + return + end + + local path = minetest.get_worldpath() .. "/schems" + -- Create directory if it does not already exist + mkdir(path) + + local filename = path .. "/" .. param .. ".mts" + local ret = minetest.create_schematic(worldedit.pos1[name], + worldedit.pos2[name], worldedit.prob_list[name], + filename) + if ret == nil then + worldedit.player_notify(name, "Failed to create Minetest schematic", false) + else + worldedit.player_notify(name, "Saved Minetest schematic to " .. param, false) + end + worldedit.prob_list[name] = {} + end), +}) + +minetest.register_chatcommand("/mtschemplace", { + params = "", + description = "Load nodes from \"(world folder)/schems/.mts\" with position 1 of the current WorldEdit region as the origin", + privs = {worldedit=true}, + func = function(name, param) + if param == "" then + worldedit.player_notify(name, "no filename specified") + return + end + if not check_filename(param) then + worldedit.player_notify(name, "Disallowed file name: " .. param) + return + end + + local pos = get_position(name) + if pos == nil then return end + + local path = minetest.get_worldpath() .. "/schems/" .. param .. ".mts" + if minetest.place_schematic(pos, path) == nil then + worldedit.player_notify(name, "failed to place Minetest schematic", false) + else + worldedit.player_notify(name, "placed Minetest schematic " .. param .. + " at " .. minetest.pos_to_string(pos), false) + end + end, +}) + +minetest.register_chatcommand("/mtschemprob", { + params = "start/finish/get", + description = "Begins node probability entry for Minetest schematics, gets the nodes that have probabilities set, or ends node probability entry", + privs = {worldedit=true}, + func = function(name, param) + if param == "start" then --start probability setting + worldedit.set_pos[name] = "prob" + worldedit.prob_list[name] = {} + worldedit.player_notify(name, "select Minetest schematic probability values by punching nodes") + elseif param == "finish" then --finish probability setting + worldedit.set_pos[name] = nil + worldedit.player_notify(name, "finished Minetest schematic probability selection") + elseif param == "get" then --get all nodes that had probabilities set on them + local text = "" + local problist = worldedit.prob_list[name] + if problist == nil then + return + end + for k,v in pairs(problist) do + local prob = math.floor(((v["prob"] / 256) * 100) * 100 + 0.5) / 100 + text = text .. minetest.pos_to_string(v["pos"]) .. ": " .. prob .. "% | " + end + worldedit.player_notify(name, "currently set node probabilities:") + worldedit.player_notify(name, text) + else + worldedit.player_notify(name, "unknown subcommand: " .. param) + end + end, +}) + +minetest.register_on_player_receive_fields( + function(player, formname, fields) + if (formname == "prob_val_enter") and (fields.text ~= "") then + local name = player:get_player_name() + local prob_entry = {pos=worldedit.prob_pos[name], prob=tonumber(fields.text)} + local index = table.getn(worldedit.prob_list[name]) + 1 + worldedit.prob_list[name][index] = prob_entry + end + end +) + +minetest.register_chatcommand("/clearobjects", { + params = "", + description = "Clears all objects within the WorldEdit region", + privs = {worldedit=true}, + func = safe_region(function(name, param) + local count = worldedit.clear_objects(worldedit.pos1[name], worldedit.pos2[name]) + worldedit.player_notify(name, count .. " objects cleared") + end), +}) diff --git a/mods/worldedit/worldedit_commands/mark.lua b/mods/worldedit/worldedit_commands/mark.lua new file mode 100644 index 0000000..ef4ed57 --- /dev/null +++ b/mods/worldedit/worldedit_commands/mark.lua @@ -0,0 +1,162 @@ +worldedit.marker1 = {} +worldedit.marker2 = {} +worldedit.marker_region = {} + +--marks worldedit region position 1 +worldedit.mark_pos1 = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + + if pos1 ~= nil then + --make area stay loaded + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos1, pos1) + end + if worldedit.marker1[name] ~= nil then --marker already exists + worldedit.marker1[name]:remove() --remove marker + worldedit.marker1[name] = nil + end + if pos1 ~= nil then + --add marker + worldedit.marker1[name] = minetest.add_entity(pos1, "worldedit:pos1") + if worldedit.marker1[name] ~= nil then + worldedit.marker1[name]:get_luaentity().player_name = name + end + end + worldedit.mark_region(name) +end + +--marks worldedit region position 2 +worldedit.mark_pos2 = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + + if pos2 ~= nil then + --make area stay loaded + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos2, pos2) + end + if worldedit.marker2[name] ~= nil then --marker already exists + worldedit.marker2[name]:remove() --remove marker + worldedit.marker2[name] = nil + end + if pos2 ~= nil then + --add marker + worldedit.marker2[name] = minetest.add_entity(pos2, "worldedit:pos2") + if worldedit.marker2[name] ~= nil then + worldedit.marker2[name]:get_luaentity().player_name = name + end + end + worldedit.mark_region(name) +end + +worldedit.mark_region = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + + if worldedit.marker_region[name] ~= nil then --marker already exists + --wip: make the area stay loaded somehow + for _, entity in ipairs(worldedit.marker_region[name]) do + entity:remove() + end + worldedit.marker_region[name] = nil + end + if pos1 ~= nil and pos2 ~= nil then + local pos1, pos2 = worldedit.sort_pos(pos1, pos2) + local thickness = 0.2 + local sizex, sizey, sizez = (1 + pos2.x - pos1.x) / 2, (1 + pos2.y - pos1.y) / 2, (1 + pos2.z - pos1.z) / 2 + + --make area stay loaded + local manip = minetest.get_voxel_manip() + manip:read_from_map(pos1, pos2) + + local markers = {} + + --XY plane markers + for _, z in ipairs({pos1.z - 0.5, pos2.z + 0.5}) do + local marker = minetest.add_entity({x=pos1.x + sizex - 0.5, y=pos1.y + sizey - 0.5, z=z}, "worldedit:region_cube") + marker:set_properties({ + visual_size={x=sizex * 2, y=sizey * 2}, + collisionbox = {-sizex, -sizey, -thickness, sizex, sizey, thickness}, + }) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end + + --YZ plane markers + for _, x in ipairs({pos1.x - 0.5, pos2.x + 0.5}) do + local marker = minetest.add_entity({x=x, y=pos1.y + sizey - 0.5, z=pos1.z + sizez - 0.5}, "worldedit:region_cube") + marker:set_properties({ + visual_size={x=sizez * 2, y=sizey * 2}, + collisionbox = {-thickness, -sizey, -sizez, thickness, sizey, sizez}, + }) + marker:setyaw(math.pi / 2) + marker:get_luaentity().player_name = name + table.insert(markers, marker) + end + + worldedit.marker_region[name] = markers + end +end + +minetest.register_entity(":worldedit:pos1", { + initial_properties = { + visual = "cube", + visual_size = {x=1.1, y=1.1}, + textures = {"worldedit_pos1.png", "worldedit_pos1.png", + "worldedit_pos1.png", "worldedit_pos1.png", + "worldedit_pos1.png", "worldedit_pos1.png"}, + collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, + physical = false, + }, + on_step = function(self, dtime) + if worldedit.marker1[self.player_name] == nil then + self.object:remove() + end + end, + on_punch = function(self, hitter) + self.object:remove() + worldedit.marker1[self.player_name] = nil + end, +}) + +minetest.register_entity(":worldedit:pos2", { + initial_properties = { + visual = "cube", + visual_size = {x=1.1, y=1.1}, + textures = {"worldedit_pos2.png", "worldedit_pos2.png", + "worldedit_pos2.png", "worldedit_pos2.png", + "worldedit_pos2.png", "worldedit_pos2.png"}, + collisionbox = {-0.55, -0.55, -0.55, 0.55, 0.55, 0.55}, + physical = false, + }, + on_step = function(self, dtime) + if worldedit.marker2[self.player_name] == nil then + self.object:remove() + end + end, + on_punch = function(self, hitter) + self.object:remove() + worldedit.marker2[self.player_name] = nil + end, +}) + +minetest.register_entity(":worldedit:region_cube", { + initial_properties = { + visual = "upright_sprite", + visual_size = {x=1.1, y=1.1}, + textures = {"worldedit_cube.png"}, + visual_size = {x=10, y=10}, + physical = false, + }, + on_step = function(self, dtime) + if worldedit.marker_region[self.player_name] == nil then + self.object:remove() + return + end + end, + on_punch = function(self, hitter) + for _, entity in ipairs(worldedit.marker_region[self.player_name]) do + entity:remove() + end + worldedit.marker_region[self.player_name] = nil + end, +}) + diff --git a/mods/worldedit/worldedit_commands/safe.lua b/mods/worldedit/worldedit_commands/safe.lua new file mode 100644 index 0000000..e52a6d2 --- /dev/null +++ b/mods/worldedit/worldedit_commands/safe.lua @@ -0,0 +1,68 @@ +local safe_region_callback = {} +local safe_region_param = {} + +local function check_region(name, param) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] --obtain positions + if pos1 == nil or pos2 == nil then + worldedit.player_notify(name, "no region selected") + return nil + end + return worldedit.volume(pos1, pos2) +end + +--`callback` is a callback to run when the user confirms +--`nodes_needed` is a function accepting `param`, `pos1`, and `pos2` to calculate the number of nodes needed +local function safe_region(callback, nodes_needed) + --default node volume calculation + nodes_needed = nodes_needed or check_region + + return function(name, param) + --check if the operation applies to a safe number of nodes + local count = nodes_needed(name, param) + if count == nil then return end --invalid command + if count < 10000 then + return callback(name, param) + end + + --save callback to call later + safe_region_callback[name], safe_region_param[name] = callback, param + worldedit.player_notify(name, "WARNING: this operation could affect up to " .. count .. " nodes; type //y to continue or //n to cancel") + end +end + +minetest.register_chatcommand("/y", { + params = "", + description = "Confirm a pending operation", + func = function(name) + local callback, param = safe_region_callback[name], safe_region_param[name] + if not callback then + worldedit.player_notify(name, "no operation pending") + return + end + + --obtain positions + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + if pos1 == nil or pos2 == nil then + worldedit.player_notify(name, "no region selected") + return + end + + safe_region_callback[name], safe_region_param[name] = nil, nil --reset pending operation + callback(name, param, pos1, pos2) + end, +}) + +minetest.register_chatcommand("/n", { + params = "", + description = "Confirm a pending operation", + func = function(name) + if not safe_region_callback[name] then + worldedit.player_notify(name, "no operation pending") + return + end + safe_region_callback[name], safe_region_param[name] = nil, nil + end, +}) + +return safe_region, check_region + diff --git a/mods/worldedit/worldedit_commands/textures/worldedit_cube.png b/mods/worldedit/worldedit_commands/textures/worldedit_cube.png new file mode 100644 index 0000000..fde36a8 Binary files /dev/null and b/mods/worldedit/worldedit_commands/textures/worldedit_cube.png differ diff --git a/mods/worldedit/worldedit_commands/textures/worldedit_pos1.png b/mods/worldedit/worldedit_commands/textures/worldedit_pos1.png new file mode 100644 index 0000000..4c304aa Binary files /dev/null and b/mods/worldedit/worldedit_commands/textures/worldedit_pos1.png differ diff --git a/mods/worldedit/worldedit_commands/textures/worldedit_pos2.png b/mods/worldedit/worldedit_commands/textures/worldedit_pos2.png new file mode 100644 index 0000000..1502f16 Binary files /dev/null and b/mods/worldedit/worldedit_commands/textures/worldedit_pos2.png differ diff --git a/mods/worldedit/worldedit_gui/depends.txt b/mods/worldedit/worldedit_gui/depends.txt new file mode 100644 index 0000000..d603ac9 --- /dev/null +++ b/mods/worldedit/worldedit_gui/depends.txt @@ -0,0 +1,5 @@ +worldedit +worldedit_commands +unified_inventory? +inventory_plus? +creative? \ No newline at end of file diff --git a/mods/worldedit/worldedit_gui/functionality.lua b/mods/worldedit/worldedit_gui/functionality.lua new file mode 100644 index 0000000..3ba7c95 --- /dev/null +++ b/mods/worldedit/worldedit_gui/functionality.lua @@ -0,0 +1,657 @@ +--saved state for each player +local gui_nodename1 = {} --mapping of player names to node names (arbitrary strings may also appear as values) +local gui_nodename2 = {} --mapping of player names to node names (arbitrary strings may also appear as values) +local gui_axis1 = {} --mapping of player names to axes (one of 1, 2, 3, or 4, representing the axes in the `axis_indices` table below) +local gui_axis2 = {} --mapping of player names to axes (one of 1, 2, 3, or 4, representing the axes in the `axis_indices` table below) +local gui_distance1 = {} --mapping of player names to a distance (arbitrary strings may also appear as values) +local gui_distance2 = {} --mapping of player names to a distance (arbitrary strings may also appear as values) +local gui_distance3 = {} --mapping of player names to a distance (arbitrary strings may also appear as values) +local gui_count1 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values) +local gui_count2 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values) +local gui_count3 = {} --mapping of player names to a quantity (arbitrary strings may also appear as values) +local gui_angle = {} --mapping of player names to an angle (one of 90, 180, 270, representing the angle in degrees clockwise) +local gui_filename = {} --mapping of player names to file names (arbitrary strings may also appear as values) +local gui_formspec = {} --mapping of player names to formspecs +local gui_code = {} --mapping of player names to formspecs + +--set default values +setmetatable(gui_nodename1, {__index = function() return "Cobblestone" end}) +setmetatable(gui_nodename2, {__index = function() return "Stone" end}) +setmetatable(gui_axis1, {__index = function() return 4 end}) +setmetatable(gui_axis2, {__index = function() return 1 end}) +setmetatable(gui_distance1, {__index = function() return "10" end}) +setmetatable(gui_distance2, {__index = function() return "5" end}) +setmetatable(gui_distance3, {__index = function() return "2" end}) +setmetatable(gui_count1, {__index = function() return "3" end}) +setmetatable(gui_count2, {__index = function() return "6" end}) +setmetatable(gui_count3, {__index = function() return "4" end}) +setmetatable(gui_angle, {__index = function() return 90 end}) +setmetatable(gui_filename, {__index = function() return "building" end}) +setmetatable(gui_formspec, {__index = function() return "size[5,5]\nlabel[0,0;Hello, world!]" end}) +setmetatable(gui_code, {__index = function() return "minetest.chat_send_player(\"singleplayer\", \"Hello, world!\")" end}) + +local axis_indices = {["X axis"]=1, ["Y axis"]=2, ["Z axis"]=3, ["Look direction"]=4} +local axis_values = {"x", "y", "z", "?"} +setmetatable(axis_indices, {__index = function () return 4 end}) +setmetatable(axis_values, {__index = function () return "?" end}) + +local angle_indices = {["90 degrees"]=1, ["180 degrees"]=2, ["270 degrees"]=3} +local angle_values = {90, 180, 270} +setmetatable(angle_indices, {__index = function () return 1 end}) +setmetatable(angle_values, {__index = function () return 90 end}) + +--given multiple sets of privileges, produces a single set of privs that would have the same effect as requiring all of them at the same time +local combine_privs = function(...) + local result = {} + for i, privs in ipairs({...}) do + for name, value in pairs(privs) do + if result[name] ~= nil and result[name] ~= value then --the priv must be both true and false, which can never happen + return {__fake_priv_that_nobody_has__=true} --priviledge table that can never be satisfied + end + result[name] = value + end + end + return result +end + +worldedit.register_gui_function("worldedit_gui_about", { + name = "About", privs = minetest.chatcommands["/about"].privs, + on_select = function(name) + minetest.chatcommands["/about"].func(name, "") + end, +}) + +worldedit.register_gui_function("worldedit_gui_inspect", { + name = "Toggle Inspect", privs = minetest.chatcommands["/inspect"].privs, + on_select = function(name) + minetest.chatcommands["/inspect"].func(name, worldedit.inspect[name] and "disable" or "enable") + end, +}) + +worldedit.register_gui_function("worldedit_gui_region", { + name = "Get/Set Region", privs = combine_privs(minetest.chatcommands["/p"].privs, minetest.chatcommands["/pos1"].privs, minetest.chatcommands["/pos2"].privs, minetest.chatcommands["/reset"].privs, minetest.chatcommands["/mark"].privs, minetest.chatcommands["/unmark"].privs, minetest.chatcommands["/volume"].privs, minetest.chatcommands["/fixedpos"].privs), + get_formspec = function(name) + local pos1, pos2 = worldedit.pos1[name], worldedit.pos2[name] + return "size[9,7]" .. worldedit.get_formspec_header("worldedit_gui_region") .. + "button_exit[0,1;3,0.8;worldedit_gui_p_get;Get Positions]" .. + "button_exit[3,1;3,0.8;worldedit_gui_p_set1;Choose Position 1]" .. + "button_exit[6,1;3,0.8;worldedit_gui_p_set2;Choose Position 2]" .. + "button_exit[0,2;3,0.8;worldedit_gui_pos1;Position 1 Here]" .. + "button_exit[3,2;3,0.8;worldedit_gui_pos2;Position 2 Here]" .. + "button_exit[6,2;3,0.8;worldedit_gui_reset;Reset Region]" .. + "button_exit[0,3;3,0.8;worldedit_gui_mark;Mark Region]" .. + "button_exit[3,3;3,0.8;worldedit_gui_unmark;Unmark Region]" .. + "button_exit[6,3;3,0.8;worldedit_gui_volume;Region Volume]" .. + "label[0,4.7;Position 1]" .. + string.format("field[2,5;1.5,0.8;worldedit_gui_fixedpos_pos1x;X ;%s]", pos1 and pos1.x or "") .. + string.format("field[3.5,5;1.5,0.8;worldedit_gui_fixedpos_pos1y;Y ;%s]", pos1 and pos1.y or "") .. + string.format("field[5,5;1.5,0.8;worldedit_gui_fixedpos_pos1z;Z ;%s]", pos1 and pos1.z or "") .. + "button_exit[6.5,4.68;2.5,0.8;worldedit_gui_fixedpos_pos1_submit;Set Position 1]" .. + "label[0,6.2;Position 2]" .. + string.format("field[2,6.5;1.5,0.8;worldedit_gui_fixedpos_pos2x;X ;%s]", pos2 and pos2.x or "") .. + string.format("field[3.5,6.5;1.5,0.8;worldedit_gui_fixedpos_pos2y;Y ;%s]", pos2 and pos2.y or "") .. + string.format("field[5,6.5;1.5,0.8;worldedit_gui_fixedpos_pos2z;Z ;%s]", pos2 and pos2.z or "") .. + "button_exit[6.5,6.18;2.5,0.8;worldedit_gui_fixedpos_pos2_submit;Set Position 2]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_region", function(name, fields) + if fields.worldedit_gui_p_get then + minetest.chatcommands["/p"].func(name, "get") + return true + elseif fields.worldedit_gui_p_set1 then + minetest.chatcommands["/p"].func(name, "set1") + return true + elseif fields.worldedit_gui_p_set2 then + minetest.chatcommands["/p"].func(name, "set2") + return true + elseif fields.worldedit_gui_pos1 then + minetest.chatcommands["/pos1"].func(name, "") + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_pos2 then + minetest.chatcommands["/pos2"].func(name, "") + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_reset then + minetest.chatcommands["/reset"].func(name, "") + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_mark then + minetest.chatcommands["/mark"].func(name, "") + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_unmark then + minetest.chatcommands["/unmark"].func(name, "") + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_volume then + minetest.chatcommands["/volume"].func(name, "") + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_fixedpos_pos1_submit then + minetest.chatcommands["/fixedpos"].func(name, string.format("set1 %s %s %s", + tostring(fields.worldedit_gui_fixedpos_pos1x), + tostring(fields.worldedit_gui_fixedpos_pos1y), + tostring(fields.worldedit_gui_fixedpos_pos1z))) + worldedit.show_page(name, "worldedit_gui_region") + return true + elseif fields.worldedit_gui_fixedpos_pos2_submit then + minetest.chatcommands["/fixedpos"].func(name, string.format("set2 %s %s %s", + tostring(fields.worldedit_gui_fixedpos_pos2x), + tostring(fields.worldedit_gui_fixedpos_pos2y), + tostring(fields.worldedit_gui_fixedpos_pos2z))) + worldedit.show_page(name, "worldedit_gui_region") + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_set", { + name = "Set Nodes", privs = minetest.chatcommands["/set"].privs, + get_formspec = function(name) + local node = gui_nodename1[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_set") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_set_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_set_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + "button_exit[0,2.5;3,0.8;worldedit_gui_set_submit;Set Nodes]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_set", function(name, fields) + if fields.worldedit_gui_set_search or fields.worldedit_gui_set_submit then + gui_nodename1[name] = tostring(fields.worldedit_gui_set_node) + worldedit.show_page(name, "worldedit_gui_set") + if fields.worldedit_gui_set_submit then + minetest.chatcommands["/set"].func(name, gui_nodename1[name]) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_replace", { + name = "Replace Nodes", privs = combine_privs(minetest.chatcommands["/replace"].privs, minetest.chatcommands["/replaceinverse"].privs), + get_formspec = function(name) + local search, replace = gui_nodename1[name], gui_nodename2[name] + local search_nodename, replace_nodename = worldedit.normalize_nodename(search), worldedit.normalize_nodename(replace) + return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_replace") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_replace_search;Name;%s]", minetest.formspec_escape(search)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_replace_search_search;Search]" .. + (search_nodename and string.format("item_image[5.5,1.1;1,1;%s]", search_nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + string.format("field[0.5,2.5;4,0.8;worldedit_gui_replace_replace;Name;%s]", minetest.formspec_escape(replace)) .. + "button[4,2.18;1.5,0.8;worldedit_gui_replace_replace_search;Search]" .. + (replace_nodename and string.format("item_image[5.5,2.1;1,1;%s]", replace_nodename) + or "image[5.5,2.1;1,1;unknown_node.png]") .. + "button_exit[0,3.5;3,0.8;worldedit_gui_replace_submit;Replace Nodes]" .. + "button_exit[3.5,3.5;3,0.8;worldedit_gui_replace_submit_inverse;Replace Inverse]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_replace", function(name, fields) + if fields.worldedit_gui_replace_search_search or fields.worldedit_gui_replace_replace_search + or fields.worldedit_gui_replace_submit or fields.worldedit_gui_replace_submit_inverse then + gui_nodename1[name] = tostring(fields.worldedit_gui_replace_search) + gui_nodename2[name] = tostring(fields.worldedit_gui_replace_replace) + worldedit.show_page(name, "worldedit_gui_replace") + if fields.worldedit_gui_replace_submit then + minetest.chatcommands["/replace"].func(name, string.format("%s %s", gui_nodename1[name], gui_nodename2[name])) + elseif fields.worldedit_gui_replace_submit_inverse then + minetest.chatcommands["/replaceinverse"].func(name, string.format("%s %s", gui_nodename1[name], gui_nodename2[name])) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_sphere_dome", { + name = "Sphere/Dome", privs = combine_privs(minetest.chatcommands["/hollowsphere"].privs, minetest.chatcommands["/sphere"].privs, minetest.chatcommands["/hollowdome"].privs, minetest.chatcommands["/dome"].privs), + get_formspec = function(name) + local node, radius = gui_nodename1[name], gui_distance2[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,5]" .. worldedit.get_formspec_header("worldedit_gui_sphere_dome") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_sphere_dome_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_sphere_dome_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + string.format("field[0.5,2.5;4,0.8;worldedit_gui_sphere_dome_radius;Radius;%s]", minetest.formspec_escape(radius)) .. + "button_exit[0,3.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow;Hollow Sphere]" .. + "button_exit[3.5,3.5;3,0.8;worldedit_gui_sphere_dome_submit_solid;Solid Sphere]" .. + "button_exit[0,4.5;3,0.8;worldedit_gui_sphere_dome_submit_hollow_dome;Hollow Dome]" .. + "button_exit[3.5,4.5;3,0.8;worldedit_gui_sphere_dome_submit_solid_dome;Solid Dome]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_sphere_dome", function(name, fields) + if fields.worldedit_gui_sphere_dome_search + or fields.worldedit_gui_sphere_dome_submit_hollow or fields.worldedit_gui_sphere_dome_submit_solid + or fields.worldedit_gui_sphere_dome_submit_hollow_dome or fields.worldedit_gui_sphere_dome_submit_solid_dome then + gui_nodename1[name] = tostring(fields.worldedit_gui_sphere_dome_node) + gui_distance2[name] = tostring(fields.worldedit_gui_sphere_dome_radius) + worldedit.show_page(name, "worldedit_gui_sphere_dome") + if fields.worldedit_gui_sphere_dome_submit_hollow then + minetest.chatcommands["/hollowsphere"].func(name, string.format("%s %s", gui_distance2[name], gui_nodename1[name])) + elseif fields.worldedit_gui_sphere_dome_submit_solid then + minetest.chatcommands["/sphere"].func(name, string.format("%s %s", gui_distance2[name], gui_nodename1[name])) + elseif fields.worldedit_gui_sphere_dome_submit_hollow_dome then + minetest.chatcommands["/hollowdome"].func(name, string.format("%s %s", gui_distance2[name], gui_nodename1[name])) + elseif fields.worldedit_gui_sphere_dome_submit_solid_dome then + minetest.chatcommands["/dome"].func(name, string.format("%s %s", gui_distance2[name], gui_nodename1[name])) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_cylinder", { + name = "Cylinder", privs = combine_privs(minetest.chatcommands["/hollowcylinder"].privs, minetest.chatcommands["/cylinder"].privs), + get_formspec = function(name) + local node, axis, length, radius = gui_nodename1[name], gui_axis1[name], gui_distance1[name], gui_distance2[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,5]" .. worldedit.get_formspec_header("worldedit_gui_cylinder") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_cylinder_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_cylinder_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + string.format("field[0.5,2.5;4,0.8;worldedit_gui_cylinder_length;Length;%s]", minetest.formspec_escape(length)) .. + string.format("dropdown[4,2.18;2.5;worldedit_gui_cylinder_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) .. + string.format("field[0.5,3.5;4,0.8;worldedit_gui_cylinder_radius;Radius;%s]", minetest.formspec_escape(radius)) .. + "button_exit[0,4.5;3,0.8;worldedit_gui_cylinder_submit_hollow;Hollow Cylinder]" .. + "button_exit[3.5,4.5;3,0.8;worldedit_gui_cylinder_submit_solid;Solid Cylinder]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_cylinder", function(name, fields) + if fields.worldedit_gui_cylinder_search + or fields.worldedit_gui_cylinder_submit_hollow or fields.worldedit_gui_cylinder_submit_solid then + gui_nodename1[name] = tostring(fields.worldedit_gui_cylinder_node) + gui_axis1[name] = axis_indices[fields.worldedit_gui_cylinder_axis] + gui_distance1[name] = tostring(fields.worldedit_gui_cylinder_length) + gui_distance2[name] = tostring(fields.worldedit_gui_cylinder_radius) + worldedit.show_page(name, "worldedit_gui_cylinder") + if fields.worldedit_gui_cylinder_submit_hollow then + minetest.chatcommands["/hollowcylinder"].func(name, string.format("%s %s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], gui_distance2[name], gui_nodename1[name])) + elseif fields.worldedit_gui_cylinder_submit_solid then + minetest.chatcommands["/cylinder"].func(name, string.format("%s %s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], gui_distance2[name], gui_nodename1[name])) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_pyramid", { + name = "Pyramid", privs = minetest.chatcommands["/pyramid"].privs, + get_formspec = function(name) + local node, axis, length = gui_nodename1[name], gui_axis1[name], gui_distance1[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,4]" .. worldedit.get_formspec_header("worldedit_gui_pyramid") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_pyramid_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_pyramid_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + string.format("field[0.5,2.5;4,0.8;worldedit_gui_pyramid_length;Length;%s]", minetest.formspec_escape(length)) .. + string.format("dropdown[4,2.18;2.5;worldedit_gui_pyramid_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) .. + "button_exit[0,3.5;3,0.8;worldedit_gui_pyramid_submit;Pyramid]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_pyramid", function(name, fields) + if fields.worldedit_gui_pyramid_search or fields.worldedit_gui_pyramid_submit then + gui_nodename1[name] = tostring(fields.worldedit_gui_pyramid_node) + gui_axis1[name] = axis_indices[fields.worldedit_gui_pyramid_axis] + gui_distance1[name] = tostring(fields.worldedit_gui_pyramid_length) + worldedit.show_page(name, "worldedit_gui_pyramid") + if fields.worldedit_gui_pyramid_submit then + minetest.chatcommands["/pyramid"].func(name, string.format("%s %s %s", axis_values[gui_axis1[name]], gui_distance1[name], gui_nodename1[name])) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_spiral", { + name = "Spiral", privs = minetest.chatcommands["/spiral"].privs, + get_formspec = function(name) + local node, length, height, space = gui_nodename1[name], gui_distance1[name], gui_distance2[name], gui_distance3[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,6]" .. worldedit.get_formspec_header("worldedit_gui_spiral") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_spiral_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_spiral_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + string.format("field[0.5,2.5;4,0.8;worldedit_gui_spiral_length;Side Length;%s]", minetest.formspec_escape(length)) .. + string.format("field[0.5,3.5;4,0.8;worldedit_gui_spiral_height;Height;%s]", minetest.formspec_escape(height)) .. + string.format("field[0.5,4.5;4,0.8;worldedit_gui_spiral_space;Wall Spacing;%s]", minetest.formspec_escape(space)) .. + "button_exit[0,5.5;3,0.8;worldedit_gui_spiral_submit;Spiral]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_spiral", function(name, fields) + if fields.worldedit_gui_spiral_search or fields.worldedit_gui_spiral_submit then + gui_nodename1[name] = fields.worldedit_gui_spiral_node + gui_distance1[name] = tostring(fields.worldedit_gui_spiral_length) + gui_distance2[name] = tostring(fields.worldedit_gui_spiral_height) + gui_distance3[name] = tostring(fields.worldedit_gui_spiral_space) + worldedit.show_page(name, "worldedit_gui_spiral") + if fields.worldedit_gui_spiral_submit then + minetest.chatcommands["/spiral"].func(name, string.format("%s %s %s %s", gui_distance1[name], gui_distance2[name], gui_distance3[name], gui_nodename1[name])) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_copy_move", { + name = "Copy/Move", privs = combine_privs(minetest.chatcommands["/copy"].privs, minetest.chatcommands["/move"].privs), + get_formspec = function(name) + local axis = gui_axis1[name] or 4 + local amount = gui_distance1[name] or "10" + return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_copy_move") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_copy_move_amount;Amount;%s]", minetest.formspec_escape(amount)) .. + string.format("dropdown[4,1.18;2.5;worldedit_gui_copy_move_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_copy_move_copy;Copy Region]" .. + "button_exit[3.5,2.5;3,0.8;worldedit_gui_copy_move_move;Move Region]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_copy_move", function(name, fields) + if fields.worldedit_gui_copy_move_copy or fields.worldedit_gui_copy_move_move then + gui_axis1[name] = axis_indices[fields.worldedit_gui_copy_move_axis] or 4 + gui_distance1[name] = tostring(fields.worldedit_gui_copy_move_amount) + worldedit.show_page(name, "worldedit_gui_copy_move") + if fields.worldedit_gui_copy_move_copy then + minetest.chatcommands["/copy"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name])) + else --fields.worldedit_gui_copy_move_move + minetest.chatcommands["/move"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_distance1[name])) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_stack", { + name = "Stack", privs = minetest.chatcommands["/stack"].privs, + get_formspec = function(name) + local axis, count = gui_axis1[name], gui_count1[name] + return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_stack") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_stack_count;Count;%s]", minetest.formspec_escape(count)) .. + string.format("dropdown[4,1.18;2.5;worldedit_gui_stack_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_stack_submit;Stack]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_stack", function(name, fields) + if fields.worldedit_gui_stack_submit then + gui_axis1[name] = axis_indices[fields.worldedit_gui_stack_axis] + gui_count1[name] = tostring(fields.worldedit_gui_stack_count) + worldedit.show_page(name, "worldedit_gui_stack") + minetest.chatcommands["/stack"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], gui_count1[name])) + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_stretch", { + name = "Stretch", privs = minetest.chatcommands["/stretch"].privs, + get_formspec = function(name) + local stretchx, stretchy, stretchz = gui_count1[name], gui_count2[name], gui_count3[name] + return "size[5,5]" .. worldedit.get_formspec_header("worldedit_gui_stretch") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_stretch_x;Stretch X;%s]", minetest.formspec_escape(stretchx)) .. + string.format("field[0.5,2.5;4,0.8;worldedit_gui_stretch_y;Stretch Y;%s]", minetest.formspec_escape(stretchy)) .. + string.format("field[0.5,3.5;4,0.8;worldedit_gui_stretch_z;Stretch Z;%s]", minetest.formspec_escape(stretchz)) .. + "button_exit[0,4.5;3,0.8;worldedit_gui_stretch_submit;Stretch]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_stretch", function(name, fields) + if fields.worldedit_gui_stretch_submit then + gui_count1[name] = tostring(fields.worldedit_gui_stretch_x) + gui_count2[name] = tostring(fields.worldedit_gui_stretch_y) + gui_count3[name] = tostring(fields.worldedit_gui_stretch_z) + worldedit.show_page(name, "worldedit_gui_stretch") + minetest.chatcommands["/stretch"].func(name, string.format("%s %s %s", gui_count1[name], gui_count2[name], gui_count3[name])) + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_transpose", { + name = "Transpose", privs = minetest.chatcommands["/transpose"].privs, + get_formspec = function(name) + local axis1, axis2 = gui_axis1[name], gui_axis2[name] + return "size[5.5,3]" .. worldedit.get_formspec_header("worldedit_gui_transpose") .. + string.format("dropdown[0,1;2.5;worldedit_gui_transpose_axis1;X axis,Y axis,Z axis,Look direction;%d]", axis1) .. + string.format("dropdown[3,1;2.5;worldedit_gui_transpose_axis2;X axis,Y axis,Z axis,Look direction;%d]", axis2) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_transpose_submit;Transpose]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_transpose", function(name, fields) + if fields.worldedit_gui_transpose_submit then + gui_axis1[name] = axis_indices[fields.worldedit_gui_transpose_axis1] + gui_axis2[name] = axis_indices[fields.worldedit_gui_transpose_axis2] + worldedit.show_page(name, "worldedit_gui_transpose") + minetest.chatcommands["/transpose"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], axis_values[gui_axis2[name]])) + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_flip", { + name = "Flip", privs = minetest.chatcommands["/flip"].privs, + get_formspec = function(name) + local axis = gui_axis2[name] + return "size[5,3]" .. worldedit.get_formspec_header("worldedit_gui_flip") .. + string.format("dropdown[0,1;2.5;worldedit_gui_flip_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_flip_submit;Flip]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_flip", function(name, fields) + if fields.worldedit_gui_flip_submit then + gui_axis2[name] = axis_indices[fields.worldedit_gui_flip_axis] + worldedit.show_page(name, "worldedit_gui_flip") + minetest.chatcommands["/flip"].func(name, axis_values[gui_axis2[name]]) + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_rotate", { + name = "Rotate", privs = minetest.chatcommands["/rotate"].privs, + get_formspec = function(name) + local axis, angle = gui_axis1[name], gui_angle[name] + return "size[5.5,3]" .. worldedit.get_formspec_header("worldedit_gui_rotate") .. + string.format("dropdown[0,1;2.5;worldedit_gui_rotate_angle;90 degrees,180 degrees,270 degrees;%s]", angle) .. + string.format("dropdown[3,1;2.5;worldedit_gui_rotate_axis;X axis,Y axis,Z axis,Look direction;%d]", axis) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_rotate_submit;Rotate]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_rotate", function(name, fields) + if fields.worldedit_gui_rotate_submit then + gui_axis1[name] = axis_indices[fields.worldedit_gui_rotate_axis] + gui_angle[name] = angle_indices[fields.worldedit_gui_rotate_angle] + worldedit.show_page(name, "worldedit_gui_rotate") + minetest.chatcommands["/rotate"].func(name, string.format("%s %s", axis_values[gui_axis1[name]], angle_values[gui_angle[name]])) + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_orient", { + name = "Orient", privs = minetest.chatcommands["/orient"].privs, + get_formspec = function(name) + local angle = gui_angle[name] + return "size[5,3]" .. worldedit.get_formspec_header("worldedit_gui_orient") .. + string.format("dropdown[0,1;2.5;worldedit_gui_orient_angle;90 degrees,180 degrees,270 degrees;%s]", angle) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_orient_submit;Orient]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_orient", function(name, fields) + if fields.worldedit_gui_orient_submit then + gui_angle[name] = angle_indices[fields.worldedit_gui_orient_angle] + worldedit.show_page(name, "worldedit_gui_orient") + minetest.chatcommands["/orient"].func(name, angle_values[gui_angle[name]]) + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_fixlight", { + name = "Fix Lighting", privs = minetest.chatcommands["/fixlight"].privs, + on_select = function(name) + minetest.chatcommands["/fixlight"].func(name, "") + end, +}) + +worldedit.register_gui_function("worldedit_gui_hide", { + name = "Hide Region", privs = minetest.chatcommands["/hide"].privs, + on_select = function(name) + minetest.chatcommands["/hide"].func(name, "") + end, +}) + +worldedit.register_gui_function("worldedit_gui_suppress", { + name = "Suppress Nodes", privs = minetest.chatcommands["/suppress"].privs, + get_formspec = function(name) + local node = gui_nodename1[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_suppress") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_suppress_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_suppress_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + "button_exit[0,2.5;3,0.8;worldedit_gui_suppress_submit;Suppress Nodes]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_suppress", function(name, fields) + if fields.worldedit_gui_suppress_search or fields.worldedit_gui_suppress_submit then + gui_nodename1[name] = tostring(fields.worldedit_gui_suppress_node) + worldedit.show_page(name, "worldedit_gui_suppress") + if fields.worldedit_gui_suppress_submit then + minetest.chatcommands["/suppress"].func(name, gui_nodename1[name]) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_highlight", { + name = "Highlight Nodes", privs = minetest.chatcommands["/highlight"].privs, + get_formspec = function(name) + local node = gui_nodename1[name] + local nodename = worldedit.normalize_nodename(node) + return "size[6.5,3]" .. worldedit.get_formspec_header("worldedit_gui_highlight") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_highlight_node;Name;%s]", minetest.formspec_escape(node)) .. + "button[4,1.18;1.5,0.8;worldedit_gui_highlight_search;Search]" .. + (nodename and string.format("item_image[5.5,1.1;1,1;%s]", nodename) + or "image[5.5,1.1;1,1;unknown_node.png]") .. + "button_exit[0,2.5;3,0.8;worldedit_gui_highlight_submit;Highlight Nodes]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_highlight", function(name, fields) + if fields.worldedit_gui_highlight_search or fields.worldedit_gui_highlight_submit then + gui_nodename1[name] = tostring(fields.worldedit_gui_highlight_node) + worldedit.show_page(name, "worldedit_gui_highlight") + if fields.worldedit_gui_highlight_submit then + minetest.chatcommands["/highlight"].func(name, gui_nodename1[name]) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_restore", { + name = "Restore Region", privs = minetest.chatcommands["/restore"].privs, + on_select = function(name) + minetest.chatcommands["/restore"].func(name, "") + end, +}) + +worldedit.register_gui_function("worldedit_gui_save_load", { + name = "Save/Load", privs = combine_privs(minetest.chatcommands["/save"].privs, minetest.chatcommands["/allocate"].privs, minetest.chatcommands["/load"].privs), + get_formspec = function(name) + local filename = gui_filename[name] + return "size[6,4]" .. worldedit.get_formspec_header("worldedit_gui_save_load") .. + string.format("field[0.5,1.5;4,0.8;worldedit_gui_save_filename;Filename;%s]", minetest.formspec_escape(filename)) .. + "button_exit[0,2.5;3,0.8;worldedit_gui_save_load_submit_save;Save]" .. + "button_exit[3,2.5;3,0.8;worldedit_gui_save_load_submit_allocate;Allocate]" .. + "button_exit[0,3.5;3,0.8;worldedit_gui_save_load_submit_load;Load]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_save", function(name, fields) + if fields.worldedit_gui_save_load_submit_save or worldedit_gui_save_load_submit_allocate or worldedit_gui_save_load_submit_load then + gui_filename[name] = tostring(fields.worldedit_gui_save_axis) + worldedit.show_page(name, "worldedit_gui_save_load") + if fields.worldedit_gui_save_load_submit_save then + minetest.chatcommands["/save"].func(name, gui_filename[name]) + elseif fields.worldedit_gui_save_load_submit_allocate then + minetest.chatcommands["/allocate"].func(name, gui_filename[name]) + else --fields.worldedit_gui_save_load_submit_load + minetest.chatcommands["/load"].func(name, gui_filename[name]) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_lua", { + name = "Run Lua", + get_formspec = function(name) + local code = gui_code[name] + return "size[8,6.5]" .. worldedit.get_formspec_header("worldedit_gui_lua") .. + string.format("textarea[0.5,1;7.5,5.5;worldedit_gui_lua_code;Lua Code;%s]", minetest.formspec_escape(code)) .. + "button_exit[0,6;3,0.8;worldedit_gui_lua_run;Run Lua]" .. + "button_exit[5,6;3,0.8;worldedit_gui_lua_transform;Lua Transform]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_lua", function(name, fields) + if fields.worldedit_gui_lua_run or fields.worldedit_gui_lua_transform then + gui_code[name] = fields.worldedit_gui_lua_value + worldedit.show_page(name, "worldedit_gui_lua") + if fields.worldedit_gui_lua_run then + minetest.chatcommands["/lua"].func(name, gui_code[name]) + else --fields.worldedit_gui_lua_transform + minetest.chatcommands["/luatransform"].func(name, gui_code[name]) + end + return true + end + return false +end) + +worldedit.register_gui_function("worldedit_gui_clearobjects", { + name = "Clear Objects", privs = minetest.chatcommands["/clearobjects"].privs, + on_select = function(name) + minetest.chatcommands["/clearobjects"].func(name, "") + end, +}) + +worldedit.register_gui_function("worldedit_gui_formspec_tester", { + name = "Formspec Tester", + get_formspec = function(name) + local value = gui_formspec[name] + return "size[8,6.5]" .. worldedit.get_formspec_header("worldedit_gui_formspec_tester") .. + string.format("textarea[0.5,1;7.5,5.5;worldedit_gui_formspec_tester_value;Formspec Code;%s]", minetest.formspec_escape(value)) .. + "button_exit[0,6;3,0.8;worldedit_gui_formspec_tester_show;Show Formspec]" + end, +}) + +worldedit.register_gui_handler("worldedit_gui_formspec_tester", function(name, fields) + if fields.worldedit_gui_formspec_tester_show then + gui_formspec[name] = fields.worldedit_gui_formspec_tester_value or "" + worldedit.show_page(name, "worldedit_gui_formspec_tester") + minetest.show_formspec(name, "worldedit:formspec_tester", gui_formspec[name]) + return true + end + return false +end) diff --git a/mods/worldedit/worldedit_gui/init.lua b/mods/worldedit/worldedit_gui/init.lua new file mode 100644 index 0000000..afd8c2c --- /dev/null +++ b/mods/worldedit/worldedit_gui/init.lua @@ -0,0 +1,249 @@ +worldedit = worldedit or {} + +--[[ +Example: + + worldedit.register_gui_function("worldedit_gui_hollow_cylinder", { + name = "Make Hollow Cylinder", + privs = {worldedit=true}, + get_formspec = function(name) return "some formspec here" end, + on_select = function(name) print(name .. " clicked the button!") end, + }) + +Use `nil` for the `options` parameter to unregister the function associated with the given identifier. + +Use `nil` for the `get_formspec` field to denote that the function does not have its own screen. + +Use `nil` for the `privs` field to denote that no special privileges are required to use the function. + +If the identifier is already registered to another function, it will be replaced by the new one. + +The `on_select` function must not call `worldedit.show_page` +]] + +worldedit.pages = {} --mapping of identifiers to options +local identifiers = {} --ordered list of identifiers +worldedit.register_gui_function = function(identifier, options) + worldedit.pages[identifier] = options + table.insert(identifiers, identifier) +end + +--[[ +Example: + + worldedit.register_gui_handler("worldedit_gui_hollow_cylinder", function(name, fields) + print(minetest.serialize(fields)) + end) +]] + +worldedit.register_gui_handler = function(identifier, handler) + local enabled = true + minetest.register_on_player_receive_fields(function(player, formname, fields) + if not enabled then return false end + enabled = false + minetest.after(0.2, function() enabled = true end) + local name = player:get_player_name() + + --ensure the player has permission to perform the action + local entry = worldedit.pages[identifier] + if entry and minetest.check_player_privs(name, entry.privs or {}) then + return handler(name, fields) + end + return false + end) +end + +worldedit.get_formspec_header = function(identifier) + local entry = worldedit.pages[identifier] or {} + return "button[0,0;2,0.5;worldedit_gui;Back]" .. + string.format("label[2,0;WorldEdit GUI > %s]", entry.name or "") +end + +local get_formspec = function(name, identifier) + if worldedit.pages[identifier] then + return worldedit.pages[identifier].get_formspec(name) + end + return worldedit.pages["worldedit_gui"].get_formspec(name) --default to showing main page if an unknown page is given +end + +--implement worldedit.show_page(name, page) in different ways depending on the available APIs +if unified_inventory then --unified inventory installed + local old_func = worldedit.register_gui_function + worldedit.register_gui_function = function(identifier, options) + old_func(identifier, options) + unified_inventory.register_page(identifier, {get_formspec=function(player) return {formspec=options.get_formspec(player:get_player_name())} end}) + end + + unified_inventory.register_button("worldedit_gui", { + type = "image", + image = "inventory_plus_worldedit_gui.png", + }) + + minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.worldedit_gui then --main page + worldedit.show_page(name, "worldedit_gui") + return true + elseif fields.worldedit_gui_exit then --return to original page + local player = minetest.get_player_by_name(name) + if player then + unified_inventory.set_inventory_formspec(player, "craft") + end + return true + end + return false + end) + + worldedit.show_page = function(name, page) + local player = minetest.get_player_by_name(name) + if player then + player:set_inventory_formspec(get_formspec(name, page)) + end + end +elseif inventory_plus then --inventory++ installed + minetest.register_on_joinplayer(function(player) + local can_worldedit = minetest.check_player_privs(player:get_player_name(), {worldedit=true}) + if can_worldedit then + inventory_plus.register_button(player, "worldedit_gui", "WorldEdit") + end + end) + + --show the form when the button is pressed and hide it when done + local gui_player_formspecs = {} + minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.worldedit_gui then --main page + gui_player_formspecs[name] = player:get_inventory_formspec() + worldedit.show_page(name, "worldedit_gui") + return true + elseif fields.worldedit_gui_exit then --return to original page + if gui_player_formspecs[name] then + inventory_plus.set_inventory_formspec(player, gui_player_formspecs[name]) + end + return true + end + return false + end) + + worldedit.show_page = function(name, page) + local player = minetest.get_player_by_name(name) + if player then + inventory_plus.set_inventory_formspec(player, get_formspec(name, page)) + end + end +else --fallback button + local player_formspecs = {} + + local update_main_formspec = function(name) + local formspec = player_formspecs[name] + if not formspec then + return + end + local player = minetest.get_player_by_name(name) + if not player then --this is in case the player signs off while the media is loading + return + end + if (minetest.check_player_privs(name, {creative=true}) or minetest.setting_getbool("creative_mode")) and creative_inventory then --creative_inventory is active, add button to modified formspec + formspec = player:get_inventory_formspec() .. "image_button[6,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]" + else + formspec = formspec .. "image_button[0,0;1,1;inventory_plus_worldedit_gui.png;worldedit_gui;]" + end + player:set_inventory_formspec(formspec) + end + + minetest.register_on_joinplayer(function(player) + local name = player:get_player_name() + minetest.after(1, function() + if minetest.get_player_by_name(name) then --ensure the player is still signed in + player_formspecs[name] = player:get_inventory_formspec() + minetest.after(0.01, function() + update_main_formspec(name) + end) + end + end) + end) + + minetest.register_on_leaveplayer(function(player) + player_formspecs[player:get_player_name()] = nil + end) + + local gui_player_formspecs = {} + minetest.register_on_player_receive_fields(function(player, formname, fields) + local name = player:get_player_name() + if fields.worldedit_gui then --main page + gui_player_formspecs[name] = player:get_inventory_formspec() + worldedit.show_page(name, "worldedit_gui") + return true + elseif fields.worldedit_gui_exit then --return to original page + if gui_player_formspecs[name] then + player:set_inventory_formspec(gui_player_formspecs[name]) + end + return true + else --deal with creative_inventory setting the formspec on every single message + minetest.after(0.01,function() + update_main_formspec(name) + end) + return false --continue processing in creative inventory + end + end) + + worldedit.show_page = function(name, page) + local player = minetest.get_player_by_name(name) + if player then + player:set_inventory_formspec(get_formspec(name, page)) + end + end +end + +worldedit.register_gui_function("worldedit_gui", { + name = "WorldEdit GUI", + get_formspec = function(name) + --create a form with all the buttons arranged in a grid + local buttons, x, y, index = {}, 0, 1, 0 + local width, height = 3, 0.8 + local columns = 5 + for i, identifier in pairs(identifiers) do + if identifier ~= "worldedit_gui" then + local entry = worldedit.pages[identifier] + table.insert(buttons, string.format((entry.get_formspec and "button" or "button_exit") .. + "[%g,%g;%g,%g;%s;%s]", x, y, width, height, identifier, minetest.formspec_escape(entry.name))) + + index, x = index + 1, x + width + if index == columns then --row is full + x, y = 0, y + height + index = 0 + end + end + end + if index == 0 then --empty row + y = y - height + end + return string.format("size[%g,%g]", math.max(columns * width, 5), math.max(y + 0.5, 3)) .. + "button[0,0;2,0.5;worldedit_gui_exit;Back]" .. + "label[2,0;WorldEdit GUI]" .. + table.concat(buttons) + end, +}) + +worldedit.register_gui_handler("worldedit_gui", function(name, fields) + for identifier, entry in pairs(worldedit.pages) do --check for WorldEdit GUI main formspec button selection + if fields[identifier] and identifier ~= "worldedit_gui" then + --ensure player has permission to perform action + local has_privs, missing_privs = minetest.check_player_privs(name, entry.privs or {}) + if not has_privs then + worldedit.player_notify(name, "you are not allowed to use this function (missing privileges: " .. table.concat(missing_privs, ", ") .. ")") + return false + end + if entry.on_select then + entry.on_select(name) + end + if entry.get_formspec then + worldedit.show_page(name, identifier) + end + return true + end + end + return false +end) + +dofile(minetest.get_modpath(minetest.get_current_modname()) .. "/functionality.lua") diff --git a/mods/worldedit/worldedit_gui/textures/inventory_plus_worldedit_gui.png b/mods/worldedit/worldedit_gui/textures/inventory_plus_worldedit_gui.png new file mode 100644 index 0000000..fbc1abc Binary files /dev/null and b/mods/worldedit/worldedit_gui/textures/inventory_plus_worldedit_gui.png differ diff --git a/mods/worldedit/worldedit_infinity/depends.txt b/mods/worldedit/worldedit_infinity/depends.txt new file mode 100644 index 0000000..c4f6871 --- /dev/null +++ b/mods/worldedit/worldedit_infinity/depends.txt @@ -0,0 +1 @@ +worldedit? diff --git a/mods/worldedit/worldedit_infinity/init.lua b/mods/worldedit/worldedit_infinity/init.lua new file mode 100644 index 0000000..a111cf5 --- /dev/null +++ b/mods/worldedit/worldedit_infinity/init.lua @@ -0,0 +1,103 @@ +worldedit = rawget(_G, "worldedit") or {} +local minetest = minetest --local copy of global + +local get_pointed = function(pos, nearest, distance) + if distance > 100 then + return false + end + + --check for collision with node + local nodename = minetest.get_node(pos).name + if nodename ~= "air" + and nodename ~= "default:water_source" + and nodename ~= "default:water_flowing" then + if nodename ~= "ignore" then + return nearest + end + return false + end +end + +local use = function(itemstack, user, pointed_thing) + if pointed_thing.type == "nothing" then --pointing at nothing + local placepos = worldedit.raytrace(user:getpos(), user:get_look_dir(), get_pointed) + if placepos then --extended reach + pointed_thing.type = "node" + pointed_thing.under = nil --wip + pointed_thing.above = nil --wip + end + end + return minetest.item_place_node(itemstack, user, pointed_thing) +end +-- + +worldedit.raytrace = function(pos, dir, callback) + local base = {x=math.floor(pos.x), y=math.floor(pos.y), z=math.floor(pos.z)} + local stepx, stepy, stepz = 0, 0, 0 + local componentx, componenty, componentz = 0, 0, 0 + local intersectx, intersecty, intersectz = 0, 0, 0 + + if dir.x == 0 then + intersectx = math.huge + elseif dir.x > 0 then + stepx = 1 + componentx = 1 / dir.x + intersectx = ((base.x - pos.x) + 1) * componentx + else + stepx = -1 + componentx = 1 / -dir.x + intersectx = (pos.x - base.x) * componentx + end + if dir.y == 0 then + intersecty = math.huge + elseif dir.y > 0 then + stepy = 1 + componenty = 1 / dir.y + intersecty = ((base.y - pos.y) + 1) * componenty + else + stepy = -1 + componenty = 1 / -dir.y + intersecty = (pos.y - base.y) * componenty + end + if dir.z == 0 then + intersectz = math.huge + elseif dir.z > 0 then + stepz = 1 + componentz = 1 / dir.z + intersectz = ((base.z - pos.z) + 1) * componentz + else + stepz = -1 + componentz = 1 / -dir.z + intersectz = (pos.z - base.z) * componentz + end + + local distance = 0 + local nearest = {x=base.x, y=base.y, z=base.z} + while true do + local values = {callback(base, nearest, distance)} + if #values > 0 then + return unpack(values) + end + + nearest.x, nearest.y, nearest.z = base.x, base.y, base.z + if intersectx < intersecty then + if intersectx < intersectz then + base.x = base.x + stepx + distance = intersectx + intersectx = intersectx + componentx + else + base.z = base.z + stepz + distance = intersectz + intersectz = intersectz + componentz + end + elseif intersecty < intersectz then + base.y = base.y + stepy + distance = intersecty + intersecty = intersecty + componenty + else + base.z = base.z + stepz + distance = intersectz + intersectz = intersectz + componentz + end + end +end diff --git a/mods/worldedit/worldedit_limited/depends.txt b/mods/worldedit/worldedit_limited/depends.txt new file mode 100644 index 0000000..74054c6 --- /dev/null +++ b/mods/worldedit/worldedit_limited/depends.txt @@ -0,0 +1 @@ +worldedit diff --git a/mods/worldedit/worldedit_limited/init.lua b/mods/worldedit/worldedit_limited/init.lua new file mode 100644 index 0000000..801e19c --- /dev/null +++ b/mods/worldedit/worldedit_limited/init.lua @@ -0,0 +1,120 @@ +do return end +do + local MAX_VOLUME = 30 * 30 * 30 + + local we = worldedit + local volume = we.volume + local safewrap = function(func) + return function(pos1, pos2, ...) + if validbox(pos1, pos2) then + return func(pos1, pos2, ...) + end + return 0, pos1, pos2 + end + end + + local validbox = function(pos1, pos2) + tpos1, tpos2 = we.sort_pos(pos1, pos2) + + if volume(tpos1, tpos2) > MAX_VOLUME then + return false + end + + --check for ownership of area if ownership mod is installed + if owner_defs then + local inside = false + for _, def in pairs(owner_defs) do + --sort positions + local tdef = {x1=def.x1, x2 = def.x2, y1=def.y1, y2=def.y2, z1=def.z1, z2=def.z2} + if tdef.x1 > tdef.x2 then + tdef.x1, tdef.x2 = tdef.x2, tdef.x1 + end + if tdef.y1 > tdef.y2 then + tdef.y1, tdef.y2 = tdef.y2, tdef.y1 + end + if tdef.z1 > tdef.z2 then + tdef.z1, tdef.z2 = tdef.z2, tdef.z1 + end + + --check ownership + if tpos1.x >= tdef.x1 and tpos1.x <= tdef.x2 + and tpos2.x >= tdef.x1 and tpos2.x <= tdef.x2 + and tpos1.y >= tdef.y1 and tpos1.y <= tdef.y2 + and tpos2.y >= tdef.y1 and tpos2.y <= tdef.y2 + and tpos1.z >= tdef.z1 and tpos1.z <= tdef.z2 + and tpos2.z >= tdef.z1 and tpos2.z <= tdef.z2 + and name == def.owner then --wip: name isn't available here + inside = true + break + end + end + if not inside then + return false + end + end + + return true + end + + worldedit = { + sort_pos = we.sort_pos, + + set = safewrap(we.set), + replace = safewrap(we.replace), + replaceinverse = safewrap(we.replaceinverse), + copy = function(pos1, pos2, axis, amount) + tpos1, tpos2 = we.sort_pos(pos1, pos2) + tpos1[axis] = tpos1[axis] + amount + tpos2[axis] = tpos2[axis] + amount + if validbox(pos1, pos2) and validbox(tpos1, tpos2) then + we.copy(pos1, pos2, axis, amount) + else + return 0 + end + end, + move = function(pos1, pos2, axis, amount) + tpos1, tpos2 = we.sort_pos(pos1, pos2) + tpos1[axis] = tpos1[axis] + amount + tpos2[axis] = tpos2[axis] + amount + if validbox(pos1, pos2) and validbox(tpos1, tpos2) then + we.move(pos1, pos2, axis, amount) + else + return 0 + end + end, + stack = function(pos1, pos2, axis, count) + tpos1, tpos2 = we.sort_pos(pos1, pos2) + local length = (tpos2[axis] - tpos1[axis] + 1) * count + if count < 0 then + tpos1[axis] = tpos1[axis] + length + else + tpos2[axis] = tpos2[axis] + length + end + if validbox(tpos1, tpos2) then + we.stack(pos1, pos2, axis, amount) + else + return 0 + end + end, + --wip: add transpose, rotate safely + flip = safewrap(we.flip), + orient = safewrap(we.orient), + fixlight = safewrap(we.fixlight), + --wip: add primitives here + volume = we.volume, + hide = safewrap(we.hide), + suppress = safewrap(we.suppress), + highlight = safewrap(we.highlight), + restore = safewrap(we.restore), + serialize = safewrap(we.serialize), + allocate = we.allocate, + deserialize = function(originpos, value) + local tpos1, tpos2 = we.allocate(originpos, value) + if validbox(tpos1, tpos2) then + we.deserialize(originpos, value) + else + return 0 + end + end, + } +end \ No newline at end of file diff --git a/mods/worldedit/worldedit_shortcommands/depends.txt b/mods/worldedit/worldedit_shortcommands/depends.txt new file mode 100644 index 0000000..a741c93 --- /dev/null +++ b/mods/worldedit/worldedit_shortcommands/depends.txt @@ -0,0 +1 @@ +worldedit_commands diff --git a/mods/worldedit/worldedit_shortcommands/init.lua b/mods/worldedit/worldedit_shortcommands/init.lua new file mode 100644 index 0000000..8ef8d58 --- /dev/null +++ b/mods/worldedit/worldedit_shortcommands/init.lua @@ -0,0 +1,50 @@ +--provides shorter names for the commands in `worldedit_commands` + +--returns true if command could not be aliased, false otherwise +worldedit.alias_chatcommand = function(alias, original_command) + if not minetest.chatcommands[original_command] then + minetest.log("error", "worldedit_shortcommands: original command " .. original_command .. " does not exist") + return true + end + if minetest.chatcommands[alias] then + minetest.log("error", "worldedit_shortcommands: alias " .. alias .. " already exists") + return true + end + minetest.register_chatcommand(alias, minetest.chatcommands[original_command]) + return false +end + +worldedit.alias_chatcommand("/i", "/inspect") +worldedit.alias_chatcommand("/rst", "/reset") +worldedit.alias_chatcommand("/mk", "/mark") +worldedit.alias_chatcommand("/umk", "/unmark") +worldedit.alias_chatcommand("/1", "/pos1") +worldedit.alias_chatcommand("/2", "/pos2") +worldedit.alias_chatcommand("/fp", "/fixedpos") +worldedit.alias_chatcommand("/v", "/volume") +worldedit.alias_chatcommand("/s", "/set") +worldedit.alias_chatcommand("/r", "/replace") +worldedit.alias_chatcommand("/ri", "/replaceinverse") +worldedit.alias_chatcommand("/hspr", "/hollowsphere") +worldedit.alias_chatcommand("/spr", "/sphere") +worldedit.alias_chatcommand("/hdo", "/hollowdome") +worldedit.alias_chatcommand("/do", "/dome") +worldedit.alias_chatcommand("/hcyl", "/hollowcylinder") +worldedit.alias_chatcommand("/cyl", "/cylinder") +worldedit.alias_chatcommand("/pyr", "/pyramid") +worldedit.alias_chatcommand("/spl", "/spiral") +worldedit.alias_chatcommand("/m", "/move") +worldedit.alias_chatcommand("/c", "/copy") +worldedit.alias_chatcommand("/stk", "/stack") +worldedit.alias_chatcommand("/sch", "/stretch") +worldedit.alias_chatcommand("/tps", "/transpose") +worldedit.alias_chatcommand("/fl", "/flip") +worldedit.alias_chatcommand("/rot", "/rotate") +worldedit.alias_chatcommand("/ort", "/orient") +worldedit.alias_chatcommand("/hi", "/hide") +worldedit.alias_chatcommand("/sup", "/suppress") +worldedit.alias_chatcommand("/hlt", "/highlight") +worldedit.alias_chatcommand("/rsr", "/restore") +worldedit.alias_chatcommand("/l", "/lua") +worldedit.alias_chatcommand("/lt", "/luatransform") +worldedit.alias_chatcommand("/clro", "/clearobjects") \ No newline at end of file diff --git a/mods/xpanes/README.txt b/mods/xpanes/README.txt new file mode 100644 index 0000000..233978c --- /dev/null +++ b/mods/xpanes/README.txt @@ -0,0 +1,16 @@ +Minetest 0.4.x mod: xpanes +========================== + +License: +-------- +Copyright (C) xyz +modified by BlockMen (iron bars) + +Gambit (WTFPL): + xpanes_bar.png + +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. diff --git a/mods/xpanes/depends.txt b/mods/xpanes/depends.txt new file mode 100644 index 0000000..331d858 --- /dev/null +++ b/mods/xpanes/depends.txt @@ -0,0 +1 @@ +default \ No newline at end of file diff --git a/mods/xpanes/init.lua b/mods/xpanes/init.lua new file mode 100644 index 0000000..84221d6 --- /dev/null +++ b/mods/xpanes/init.lua @@ -0,0 +1,195 @@ +xpanes = {} + +local function rshift(x, by) + return math.floor(x / 2 ^ by) +end + +local directions = { + {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 function update_pane(pos, name) + if not minetest.get_node(pos).name:find("^xpanes:"..name) then + return + end + local sum = 0 + for i, dir in pairs(directions) do + local node = minetest.get_node({ + x = pos.x + dir.x, + y = pos.y + dir.y, + z = pos.z + dir.z + }) + local def = minetest.registered_nodes[node.name] + local pane_num = def and def.groups.pane or 0 + if pane_num > 0 or not def or (def.walkable ~= false and + def.drawtype ~= "nodebox") then + sum = sum + 2 ^ (i - 1) + end + end + if sum == 0 then + sum = 15 + end + minetest.set_node(pos, {name = "xpanes:"..name.."_"..sum}) +end + +local function update_nearby(pos, node) + node = node or minetest.get_node(pos) + local name = node.name + if not name or node.name:sub(1, 7) ~= "xpanes:" then + return + end + local underscore_pos = string.find(name, "_[^_]*$") or 0 + local len = name:len() + local num = tonumber(name:sub(underscore_pos+1, len)) + if not num or num < 1 or num > 15 then + name = name:sub(8) + else + name = name:sub(8, underscore_pos - 1) + end + for i, dir in pairs(directions) do + update_pane({ + x = pos.x + dir.x, + y = pos.y + dir.y, + z = pos.z + dir.z + }, name) + end +end + +local half_boxes = { + {0, -0.5, -1/32, 0.5, 0.5, 1/32}, + {-1/32, -0.5, 0, 1/32, 0.5, 0.5}, + {-0.5, -0.5, -1/32, 0, 0.5, 1/32}, + {-1/32, -0.5, -0.5, 1/32, 0.5, 0} +} + +local full_boxes = { + {-0.5, -0.5, -1/32, 0.5, 0.5, 1/32}, + {-1/32, -0.5, -0.5, 1/32, 0.5, 0.5} +} + +local sb_half_boxes = { + {0, -0.5, -0.06, 0.5, 0.5, 0.06}, + {-0.06, -0.5, 0, 0.06, 0.5, 0.5}, + {-0.5, -0.5, -0.06, 0, 0.5, 0.06}, + {-0.06, -0.5, -0.5, 0.06, 0.5, 0} +} + +local sb_full_boxes = { + {-0.5, -0.5, -0.06, 0.5, 0.5, 0.06}, + {-0.06, -0.5, -0.5, 0.06, 0.5, 0.5} +} + +function xpanes.register_pane(name, def) + for i = 1, 15 do + local need = {} + local cnt = 0 + for j = 1, 4 do + if rshift(i, j - 1) % 2 == 1 then + need[j] = true + cnt = cnt + 1 + end + end + local take = {} + local take2 = {} + if need[1] == true and need[3] == true then + need[1] = nil + need[3] = nil + table.insert(take, full_boxes[1]) + table.insert(take2, sb_full_boxes[1]) + end + if need[2] == true and need[4] == true then + need[2] = nil + need[4] = nil + table.insert(take, full_boxes[2]) + table.insert(take2, sb_full_boxes[2]) + end + for k in pairs(need) do + table.insert(take, half_boxes[k]) + table.insert(take2, sb_half_boxes[k]) + end + local texture = def.textures[1] + if cnt == 1 then + texture = def.textures[1].."^"..def.textures[2] + end + minetest.register_node(":xpanes:"..name.."_"..i, { + drawtype = "nodebox", + tiles = {def.textures[3], def.textures[3], texture}, + paramtype = "light", + groups = def.groups, + drop = "xpanes:"..name, + sounds = def.sounds, + node_box = { + type = "fixed", + fixed = take + }, + selection_box = { + type = "fixed", + fixed = take2 + } + }) + end + + def.on_construct = function(pos) + update_pane(pos, name) + end + + minetest.register_node(":xpanes:"..name, def) + + minetest.register_craft({ + output = "xpanes:"..name.." 16", + recipe = def.recipe + }) +end + +minetest.register_on_placenode(update_nearby) +minetest.register_on_dignode(update_nearby) + +xpanes.register_pane("pane", { + description = "Glass Pane", + tiles = {"xpanes_space.png"}, + drawtype = "airlike", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + air_equivalent = true, + textures = {"default_glass.png","xpanes_pane_half.png","xpanes_white.png"}, + inventory_image = "default_glass.png", + wield_image = "default_glass.png", + sounds = default.node_sound_glass_defaults(), + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, + recipe = { + {'default:glass', 'default:glass', 'default:glass'}, + {'default:glass', 'default:glass', 'default:glass'} + } +}) + +xpanes.register_pane("bar", { + description = "Iron bar", + tiles = {"xpanes_space.png"}, + drawtype = "airlike", + paramtype = "light", + is_ground_content = false, + sunlight_propagates = true, + walkable = false, + pointable = false, + diggable = false, + buildable_to = true, + air_equivalent = true, + textures = {"xpanes_bar.png","xpanes_bar.png","xpanes_space.png"}, + inventory_image = "xpanes_bar.png", + wield_image = "xpanes_bar.png", + groups = {snappy=2, cracky=3, oddly_breakable_by_hand=3, pane=1}, + sounds = default.node_sound_stone_defaults(), + recipe = { + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'}, + {'default:steel_ingot', 'default:steel_ingot', 'default:steel_ingot'} + } +}) + diff --git a/mods/xpanes/textures/xpanes_bar.png b/mods/xpanes/textures/xpanes_bar.png new file mode 100644 index 0000000..4d17ceb Binary files /dev/null and b/mods/xpanes/textures/xpanes_bar.png differ diff --git a/mods/xpanes/textures/xpanes_grey.png b/mods/xpanes/textures/xpanes_grey.png new file mode 100644 index 0000000..e1c6f76 Binary files /dev/null and b/mods/xpanes/textures/xpanes_grey.png differ diff --git a/mods/xpanes/textures/xpanes_pane_half.png b/mods/xpanes/textures/xpanes_pane_half.png new file mode 100644 index 0000000..4e846df Binary files /dev/null and b/mods/xpanes/textures/xpanes_pane_half.png differ diff --git a/mods/xpanes/textures/xpanes_space.png b/mods/xpanes/textures/xpanes_space.png new file mode 100644 index 0000000..016cb35 Binary files /dev/null and b/mods/xpanes/textures/xpanes_space.png differ diff --git a/mods/xpanes/textures/xpanes_white.png b/mods/xpanes/textures/xpanes_white.png new file mode 100644 index 0000000..777bd60 Binary files /dev/null and b/mods/xpanes/textures/xpanes_white.png differ