diff --git a/README.txt b/README.txt index 1bf5788..8dd4f9a 100644 --- a/README.txt +++ b/README.txt @@ -1,6 +1,6 @@ Minetest+ - a game for the Minetest game engine [based on minetest_game] ========= -Version 0.5 +Version 0.6 About this game --------------- @@ -60,6 +60,18 @@ Version 0.5: - removed rat, cooked rat and sorched stuff from inventory - drowning damages player more (is drowning faster) +Version 0.6: +- Rework of inventorys, add new creative inventory +- Slow down fire a bit +- Tweak digging times of some tools +- Improved textures for jungletree, -wood, torch(inventory) +- Dropped items also rotate and 3D +- Tweaked menu image a bit +- Add abms for trees, grass, etc +- Update stairs mod +- Remove hardened clay +- and a few more smaller tweaks + So hope you enjoy this game and like the changes i made to default game. diff --git a/menu/overlay.png b/menu/overlay.png index c7540df..b67309f 100644 Binary files a/menu/overlay.png and b/menu/overlay.png differ diff --git a/minetest.conf b/minetest.conf index 5060378..57a0fb9 100644 --- a/minetest.conf +++ b/minetest.conf @@ -16,4 +16,6 @@ num_emerge_threads = liquid_update = 0.5 -selectionbox_color = (8,8,8) \ No newline at end of file +selectionbox_color = (8,8,8) + +mgv6_freq_desert = 0.65 \ No newline at end of file diff --git a/mods/builtin_item/init.lua b/mods/builtin_item/init.lua index f8aa338..d501047 100644 --- a/mods/builtin_item/init.lua +++ b/mods/builtin_item/init.lua @@ -30,19 +30,14 @@ minetest.register_entity(":__builtin:item", { item_type = minetest.registered_items[itemname].type end prop = { - is_visible = true, - visual = "sprite", - textures = {"unknown_item.png"} - } - if item_texture and item_texture ~= "" then - prop.visual = "sprite" - prop.textures = {item_texture} - prop.visual_size = {x=0.50, y=0.50} - else - prop.visual = "wielditem" - prop.textures = {itemname} - prop.visual_size = {x=0.20, y=0.20} - prop.automatic_rotate = math.pi * 0.25 + is_visible = true, + visual = "wielditem", + textures = {itemname}, + visual_size = {x=0.20, y=0.20}, + automatic_rotate = math.pi * 0.35, + } + if itemname == "default:apple" then + prop.visual_size = {x=0.5,y=0.5} end self.object:set_properties(prop) end, diff --git a/mods/creative/README.txt b/mods/creative/README.txt index 7d49b98..cafbbc6 100644 --- a/mods/creative/README.txt +++ b/mods/creative/README.txt @@ -1,5 +1,8 @@ Minetest 0.4 mod: creative ========================== +Version 1.0 +This mod is based on the original creative mod by celeron55 +------------------------ Implements creative mode. @@ -10,9 +13,10 @@ Registered items that - 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) +License (WTFPL): +---------------- +Copyright (C) 2013 by BlockMen + This program is free software. It comes without any warranty, to the extent permitted by applicable law. You can redistribute it diff --git a/mods/creative/init.lua b/mods/creative/init.lua index 45b7a22..a06c410 100644 --- a/mods/creative/init.lua +++ b/mods/creative/init.lua @@ -1,11 +1,8 @@ --- minetest/creative/init.lua +creative = {} +creative.creative_inventory_size = 0 -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", { +function init() + 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 @@ -14,6 +11,15 @@ minetest.after(0, function() end end, allow_put = function(inv, listname, index, stack, player) + print(stack:get_name()) + local slot = inv:get_stack(listname, index) + print(slot:get_name()) + if stack and slot then + if stack:get_name() == slot:get_name() then + inv:set_stack(listname,index,{name=stack:get_name(), count = 2}) + return 2 + end + end return 0 end, allow_take = function(inv, listname, index, stack, player) @@ -34,11 +40,44 @@ minetest.after(0, function() end end, }) + set_inv("all") +end + +function set_inv(filter, player) + local inv = minetest.get_inventory({type="detached", name="creative"}) + inv:set_size("main", 0) 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) + if (not def.groups.not_in_creative_inventory or def.groups.not_in_creative_inventory == 0) and def.description and def.description ~= "" then + if filter ~= "" then + if filter == "#blocks" then + if def.walkable == true then + table.insert(creative_list, name) + end + elseif filter == "#deco" then + if (def.walkable == false or def.drawtype == "plantlike" or def.drawtype == "allfaces_optional" or string.find(string.lower(def.description), "torch") or string.find(string.lower(def.description), "door")) and not string.find(string.lower(def.description), "apple") then--def.groups. == true then + table.insert(creative_list, name) + end + elseif filter == "#misc" then + if def.drawtype == nil and def.type ~= "tool" and not string.find(string.lower(def.description), "torch") and not string.find(string.lower(def.description), "bread") and not string.find(string.lower(def.description), "door") then + table.insert(creative_list, name) + end + elseif filter == "#food" then + if def.groups.food ~= nil or string.find(string.lower(def.description), "apple") or string.find(string.lower(def.description), "bread") then + table.insert(creative_list, name) + end + elseif filter == "#tools" then + if def.type == "tool" then + table.insert(creative_list, name) + end + elseif filter == "all" then + table.insert(creative_list, name) + else --for all other + if string.find(string.lower(def.name), filter) or string.find(string.lower(def.description), filter) then + table.insert(creative_list, name) + end + end + end end end table.sort(creative_list) @@ -46,14 +85,12 @@ minetest.after(0, function() 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) + creative.creative_inventory_size = #creative_list + --print("creative inventory size: "..dump(creative.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() @@ -68,61 +105,140 @@ local trash = minetest.create_detached_inventory("creative_trash", { 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]".. - "list[current_player;main;5,3.5;8,4;]".. - "list[current_player;craft;8,0;3,3;]".. - "list[current_player;craftpreview;12,1;1,1;]".. - "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;>>]".. - "label[5,1.5;Trash:]".. - "list[detached:creative_trash;main;5,2;1,1;]") +-- Create detached creative inventory after loading all mods +minetest.after(0, init) + +local offset = {} +local bg = {} +offset["nix"] = "-0.29,-0.27" +offset["build"] = "0.979,-0.27" +offset["other"] = "2.24,-0.27" +offset["tools"] = "3.5,-0.27" +offset["misc"] = "4.79,-0.27" +offset["food"] = "6.05,-0.27" +offset["inv"] = "8,-0.27" + +local function reset_menu_item_bg() + bg["nix"] = "creative_bg_dark.png" + bg["build"] = "creative_bg_dark.png" + bg["other"] = "creative_bg_dark.png" + bg["tools"] = "creative_bg_dark.png" + bg["misc"] = "creative_bg_dark.png" + bg["food"] = "creative_bg_dark.png" + bg["inv"] = "creative_bg_dark.png" end -minetest.register_on_joinplayer(function(player) - -- If in creative mode, modify player's inventory forms + +creative.set_creative_formspec = function(player, start_i, pagenum, show, page) + reset_menu_item_bg() + pagenum = math.floor(pagenum) + local pagemax = math.floor((creative.creative_inventory_size-1) / (8*5) + 1) + local slider_height = 4/pagemax + local slider_pos = slider_height*(pagenum-1)+2.24 + local name = "nix" + local formspec = "" + local main_list = "list[detached:creative;main;0,1.75;8,5;"..tostring(start_i).."]"--"list[current_player;main;0,3.75;9,3;8]"--.. + if page ~= nil then name = page end + bg[name] = "creative_bg.png" + if name == "inv" then + main_list = "image[-0.2,1.7;10.1,2.33;creative_bg.png]".. + "list[current_player;main;0,3.75;8,3;8]" + end + formspec = "size[9,8.3]".. + "label[-5,-5;"..name.."]".. + "image[" .. offset[name] .. ";1.5,1.44;creative_active.png]".. + "image_button[-0.1,-0.05;1,1;"..bg["nix"].."^creative_all.png;default;]".. --nix+search + "image_button[1.154,-0.05;1,1;"..bg["build"].."^creative_build.png;build;]".. --decoration blocks + "image_button[2.419,-0.05;1,1;"..bg["other"].."^creative_other.png;other;]".. --redstone + "image_button[3.7,-0.05;1,1;"..bg["tools"].."^creative_tool.png;tools;]".. --transportation + "image_button[4.95,-0.05;1,1;"..bg["misc"].."^creative_misc.png;misc;]".. --miscellaneous + "image_button[6.25,-0.05;1,1;"..bg["food"].."^creative_food.png;food;]".. --food + "image_button[8.19,-0.05;1,1;"..bg["inv"].."^creative_inv.png;inv;]".. --inv + "image[0,1;5,0.75;fnt_"..name..".png]".. + main_list.. + "list[current_player;main;0,7;8,1;]".. + "background[-0.19,-0.25;9.53,8.54;creative_inventory.png]".. + "image_button[8.03,1.74;0.85,0.6;creative_up.png;creative_prev;]".. + "image[8.04," .. tostring(slider_pos) .. ";0.75,"..tostring(slider_height) .. ";creative_slider.png]".. + "image_button[8.03,6.15;0.85,0.6;creative_down.png;creative_next;]".. + "list[detached:creative_trash;main;8,7;1,1;]".. + "image[8,7;1,1;creative_trash.png]".. + "bgcolor[#000A;true]".. + "listcolors[#9990;#FFF7;#FFF0;#160816;#9E9D9E]" + if page == nil then formspec = formspec .. "field[5.3,1.3;3,0.75;suche;;]" end + player:set_inventory_formspec(formspec) +end + +minetest.register_on_player_receive_fields(function(player, formname, fields) + local page = nil 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 + + if fields.suche ~= nil and fields.suche ~= "" then + set_inv(string.lower(fields.suche)) + minetest.after(0.5, function() + minetest.show_formspec(player:get_player_name(), "detached:creative", player:get_inventory_formspec()) + end) + end + + if fields.build then + set_inv("#blocks",player) + page = "build" + end + if fields.other then + set_inv("#deco",player) + page = "other" + end + if fields.misc then + set_inv("#misc",player) + page = "misc" + end + if fields.default then + set_inv("all") + page = nil + end + if fields.food then + set_inv("#food") + page = "food" + end + if fields.tools then + set_inv("#tools") + page = "tools" + end + if fields.inv then + page = "inv" 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 + local start_i = string.match(formspec, "list%[detached:creative;main;[%d.]+,[%d.]+;[%d.]+,[%d.]+;(%d+)%]") + local bis = string.find (formspec, "image") or 2 + local tmp_page = string.sub(formspec, 24, bis-2) + if tmp_page == "nix" then tmp_page = nil end + start_i = tonumber(start_i) or 0 if fields.creative_prev then - start_i = start_i - 4*6 + start_i = start_i - 8*5 + page = tmp_page end if fields.creative_next then - start_i = start_i + 4*6 + start_i = start_i + 8*5 + page = tmp_page end - if start_i < 0 then - start_i = start_i + 4*6 + start_i = start_i + 8*5 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 + if start_i >= creative.creative_inventory_size then + start_i = start_i - 8*5 + end + if start_i < 0 or start_i >= creative.creative_inventory_size then start_i = 0 end - - creative_inventory.set_creative_formspec(player, start_i, start_i / (6*4) + 1) + creative.set_creative_formspec(player, start_i, start_i / (8*5) + 1, false, page) end) + if minetest.setting_getbool("creative_mode") then - minetest.register_item(":", { type = "none", wield_image = "wieldhand.png", @@ -131,13 +247,12 @@ if minetest.setting_getbool("creative_mode") then full_punch_interval = 0.5, max_drop_level = 3, groupcaps = { - crumbly = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3}, - cracky = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3}, - snappy = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3}, - choppy = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3}, - oddly_breakable_by_hand = {times={[1]=0.5, [2]=0.5, [3]=0.5}, uses=0, maxlevel=3}, - }, - damage_groups = {fleshy = 10}, + crumbly = {times={[1]=0.3, [2]=0.3, [3]=0.3}, uses=0, maxlevel=3}, + cracky = {times={[1]=0.3, [2]=0.3, [3]=0.3}, uses=0, maxlevel=3}, + snappy = {times={[1]=0.3, [2]=0.3, [3]=0.3}, uses=0, maxlevel=3}, + choppy = {times={[1]=0.3, [2]=0.3, [3]=0.3}, uses=0, maxlevel=3}, + oddly_breakable_by_hand = {times={[1]=0.3, [2]=0.3, [3]=0.3}, uses=0, maxlevel=3}, + } } }) diff --git a/mods/creative/textures/creative_active.png b/mods/creative/textures/creative_active.png new file mode 100644 index 0000000..46b5e82 Binary files /dev/null and b/mods/creative/textures/creative_active.png differ diff --git a/mods/creative/textures/creative_all.png b/mods/creative/textures/creative_all.png new file mode 100644 index 0000000..0898d9a Binary files /dev/null and b/mods/creative/textures/creative_all.png differ diff --git a/mods/creative/textures/creative_bg.png b/mods/creative/textures/creative_bg.png new file mode 100644 index 0000000..e12bb5e Binary files /dev/null and b/mods/creative/textures/creative_bg.png differ diff --git a/mods/creative/textures/creative_bg_dark.png b/mods/creative/textures/creative_bg_dark.png new file mode 100644 index 0000000..9177c36 Binary files /dev/null and b/mods/creative/textures/creative_bg_dark.png differ diff --git a/mods/creative/textures/creative_build.png b/mods/creative/textures/creative_build.png new file mode 100644 index 0000000..fb33336 Binary files /dev/null and b/mods/creative/textures/creative_build.png differ diff --git a/mods/creative/textures/creative_down.png b/mods/creative/textures/creative_down.png new file mode 100644 index 0000000..789b438 Binary files /dev/null and b/mods/creative/textures/creative_down.png differ diff --git a/mods/creative/textures/creative_food.png b/mods/creative/textures/creative_food.png new file mode 100644 index 0000000..9b4b609 Binary files /dev/null and b/mods/creative/textures/creative_food.png differ diff --git a/mods/creative/textures/creative_inv.png b/mods/creative/textures/creative_inv.png new file mode 100644 index 0000000..d2d6a91 Binary files /dev/null and b/mods/creative/textures/creative_inv.png differ diff --git a/mods/creative/textures/creative_inventory.png b/mods/creative/textures/creative_inventory.png new file mode 100644 index 0000000..3c9afe9 Binary files /dev/null and b/mods/creative/textures/creative_inventory.png differ diff --git a/mods/creative/textures/creative_misc.png b/mods/creative/textures/creative_misc.png new file mode 100644 index 0000000..f2683c4 Binary files /dev/null and b/mods/creative/textures/creative_misc.png differ diff --git a/mods/creative/textures/creative_other.png b/mods/creative/textures/creative_other.png new file mode 100644 index 0000000..ee2de99 Binary files /dev/null and b/mods/creative/textures/creative_other.png differ diff --git a/mods/creative/textures/creative_slider.png b/mods/creative/textures/creative_slider.png new file mode 100644 index 0000000..400dcae Binary files /dev/null and b/mods/creative/textures/creative_slider.png differ diff --git a/mods/creative/textures/creative_tool.png b/mods/creative/textures/creative_tool.png new file mode 100644 index 0000000..0353a19 Binary files /dev/null and b/mods/creative/textures/creative_tool.png differ diff --git a/mods/creative/textures/creative_trash.png b/mods/creative/textures/creative_trash.png new file mode 100644 index 0000000..58acc4f Binary files /dev/null and b/mods/creative/textures/creative_trash.png differ diff --git a/mods/creative/textures/creative_up.png b/mods/creative/textures/creative_up.png new file mode 100644 index 0000000..437369b Binary files /dev/null and b/mods/creative/textures/creative_up.png differ diff --git a/mods/creative/textures/fnt_build.png b/mods/creative/textures/fnt_build.png new file mode 100644 index 0000000..6774f4b Binary files /dev/null and b/mods/creative/textures/fnt_build.png differ diff --git a/mods/creative/textures/fnt_food.png b/mods/creative/textures/fnt_food.png new file mode 100644 index 0000000..98966f7 Binary files /dev/null and b/mods/creative/textures/fnt_food.png differ diff --git a/mods/creative/textures/fnt_inv.png b/mods/creative/textures/fnt_inv.png new file mode 100644 index 0000000..46694be Binary files /dev/null and b/mods/creative/textures/fnt_inv.png differ diff --git a/mods/creative/textures/fnt_misc.png b/mods/creative/textures/fnt_misc.png new file mode 100644 index 0000000..a7b4146 Binary files /dev/null and b/mods/creative/textures/fnt_misc.png differ diff --git a/mods/creative/textures/fnt_nix.png b/mods/creative/textures/fnt_nix.png new file mode 100644 index 0000000..b968592 Binary files /dev/null and b/mods/creative/textures/fnt_nix.png differ diff --git a/mods/creative/textures/fnt_other.png b/mods/creative/textures/fnt_other.png new file mode 100644 index 0000000..c5799f3 Binary files /dev/null and b/mods/creative/textures/fnt_other.png differ diff --git a/mods/creative/textures/fnt_tools.png b/mods/creative/textures/fnt_tools.png new file mode 100644 index 0000000..0733c39 Binary files /dev/null and b/mods/creative/textures/fnt_tools.png differ diff --git a/mods/default/crafting.lua b/mods/default/crafting.lua index b7f59bb..b2b30df 100644 --- a/mods/default/crafting.lua +++ b/mods/default/crafting.lua @@ -605,12 +605,6 @@ minetest.register_craft({ recipe = "default:gold_lump", }) -minetest.register_craft({ - type = "cooking", - output = "default:hardened_clay", - recipe = "default:clay", -}) - minetest.register_craft({ type = "cooking", output = "default:clay_brick", diff --git a/mods/default/craftitems.lua b/mods/default/craftitems.lua index 46ddc19..f475851 100644 --- a/mods/default/craftitems.lua +++ b/mods/default/craftitems.lua @@ -90,7 +90,7 @@ minetest.register_craftitem("default:clay_brick", { minetest.register_craftitem("default:scorched_stuff", { description = "Scorched Stuff", inventory_image = "default_scorched_stuff.png", - groups = {not_in_creative = 1}, + groups = {not_in_creative_inventory=1}, }) minetest.register_craftitem("default:obsidian_shard", { diff --git a/mods/default/functions.lua b/mods/default/functions.lua index 9f63446..a3f7afd 100644 --- a/mods/default/functions.lua +++ b/mods/default/functions.lua @@ -118,6 +118,88 @@ function on_punchnode(p, node) end minetest.register_on_punchnode(on_punchnode) +-- +-- Default grass+dirt abms +-- + +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 +}) + +-- +-- Grow trees +-- + +minetest.register_abm({ + nodenames = {"default:sapling"}, + interval = 10, + chance = 50, + action = function(pos, node) + local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil + if is_soil == nil or is_soil == 0 then return end + print("A sapling grows into a tree at "..minetest.pos_to_string(pos)) + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16}) + local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp} + local data = vm:get_data() + default.grow_tree(data, a, pos, math.random(1, 4) == 1, math.random(1,100000)) + vm:set_data(data) + vm:write_to_map(data) + vm:update_map() + end +}) + +minetest.register_abm({ + nodenames = {"default:junglesapling"}, + interval = 10, + chance = 50, + action = function(pos, node) + local is_soil = minetest.registered_nodes[minetest.get_node({x=pos.x, y=pos.y-1, z=pos.z}).name].groups.soil + if is_soil == nil or is_soil == 0 then return end + print("A jungle sapling grows into a tree at "..minetest.pos_to_string(pos)) + local vm = minetest.get_voxel_manip() + local minp, maxp = vm:read_from_map({x=pos.x-16, y=pos.y-1, z=pos.z-16}, {x=pos.x+16, y=pos.y+16, z=pos.z+16}) + local a = VoxelArea:new{MinEdge=minp, MaxEdge=maxp} + local data = vm:get_data() + default.grow_jungletree(data, a, pos, math.random(1,100000)) + vm:set_data(data) + vm:write_to_map(data) + vm:update_map() + end +}) + -- -- Lavacooling -- diff --git a/mods/default/init.lua b/mods/default/init.lua index 74f40d7..747f7d9 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -21,3 +21,5 @@ 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").."/torches.lua") +dofile(minetest.get_modpath("default").."/trees.lua") + diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 05409fa..cc5a070 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -4,7 +4,7 @@ minetest.register_node("default:stone", { description = "Stone", tiles = {"default_stone.png"}, is_ground_content = true, - groups = {cracky=3, stone=1}, + groups = {cracky=3, stone=1,oddly_breakable_by_hand=4}, drop = 'default:cobble', legacy_mineral = true, sounds = default.node_sound_stone_defaults(), @@ -183,16 +183,6 @@ minetest.register_node("default:clay", { }), }) -minetest.register_node("default:hardened_clay", { - description = "Hardened Clay", - tiles = {"default_hardened_clay.png"}, - is_ground_content = true, - groups = {crumbly=2}, - sounds = default.node_sound_dirt_defaults({ - footstep = "", - }), -}) - minetest.register_node("default:brick", { description = "Brick Block", tiles = {"default_brick.png"}, @@ -635,15 +625,23 @@ minetest.register_node("default:sign_wall", { default.chest_formspec = "size[8,9]".. - "list[current_name;main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]" + "bgcolor[#000A;true]".. + "background[-0.19,-0.25;8.41,9.8;default_formspec_chest.png]".. + "list[current_name;main;0,0.43;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listcolors[#AAA0;#FFF5]" function default.get_locked_chest_formspec(pos) local spos = pos.x .. "," .. pos.y .. "," ..pos.z local formspec = "size[8,9]".. - "list[nodemeta:".. spos .. ";main;0,0;8,4;]".. - "list[current_player;main;0,5;8,4;]" + "bgcolor[#000A;true]".. + "background[-0.19,-0.25;8.41,9.8;default_formspec_chest.png]".. + "list[nodemeta:".. spos .. ";main;0,0.43;8,4;]".. + "list[current_player;main;0,4.85;8,1;]".. + "list[current_player;main;0,6.08;8,3;8]".. + "listcolors[#AAA0;#FFF5]" return formspec end @@ -780,25 +778,34 @@ minetest.register_node("default:chest_locked", { function default.get_furnace_active_formspec(pos, percent, item_percent) local formspec = - "size[8,8]".. - "image[2,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. + "size[8,8.5]".. + "bgcolor[#000A;true]".. + "background[-0.19,-0.25;8.41,9.25;default_formspec_bg.png^default_formspec_furnace.png]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png^[lowpart:".. (100-percent)..":default_furnace_fire_fg.png]".. - "image[3.5,1.5;1,1;default_furnace_arrow_bg.png^[lowpart:".. + "image[3.75,1.5;1,1;default_furnace_arrow_bg.png^[lowpart:".. (item_percent*100)..":default_furnace_arrow_fg.png^[transformR270]".. - "list[current_name;fuel;2,2.5;1,1;]".. - "list[current_name;src;2,0.5;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,4;8,4;]" + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "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]".. + "listcolors[#AAA0;#FFF5]" return formspec end default.furnace_inactive_formspec = - "size[8,8]".. - "image[2,1.5;1,1;default_furnace_fire_bg.png]".. - "list[current_name;fuel;2,2.5;1,1;]".. - "list[current_name;src;2,0.5;1,1;]".. - "list[current_name;dst;5,1;2,2;]".. - "list[current_player;main;0,4;8,4;]" + "size[8,8.5]".. + "bgcolor[#000A;true]".. + "background[-0.19,-0.25;8.41,9.25;default_formspec_bg.png^default_formspec_furnace.png]".. + "image[2.75,1.5;1,1;default_furnace_fire_bg.png]".. + "image[3.75,1.5;1,1;default_furnace_arrow_bg.png^[transformR270]".. + "list[current_name;src;2.75,0.5;1,1;]".. + "list[current_name;fuel;2.75,2.5;1,1;]".. + "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]".. + "listcolors[#AAA0;#FFF5]" minetest.register_node("default:furnace", { description = "Furnace", @@ -1178,7 +1185,7 @@ minetest.register_node("default:sapling", { minetest.register_node("default:apple", { description = "Apple", drawtype = "plantlike", - visual_scale = 1.0, + visual_scale = 0.8, tiles = {"default_apple.png"}, inventory_image = "default_apple.png", paramtype = "light", @@ -1186,7 +1193,7 @@ minetest.register_node("default:apple", { walkable = false, selection_box = { type = "fixed", - fixed = {-0.2, -0.5, -0.2, 0.2, 0, 0.2} + fixed = {-0.2, -0.5, -0.2, 0.2, -0.1, 0.2} }, groups = {fleshy=3,dig_immediate=3,flammable=2,leafdecay=3,leafdecay_drop=1}, on_use = minetest.item_eat(1), diff --git a/mods/default/player.lua b/mods/default/player.lua index bf08149..269b869 100644 --- a/mods/default/player.lua +++ b/mods/default/player.lua @@ -67,8 +67,28 @@ function player_update_visuals(pl) pl:set_properties(prop) end --- Update appearance when the player joins -minetest.register_on_joinplayer(player_update_visuals) +function default.set_player_inventory(player) + player:set_inventory_formspec( + "size[8,8.5]".. + "bgcolor[#000A;true]".. + "background[-0.19,-0.25;8.41,9.25;default_formspec_bg.png^default_formspec_player.png]".. + "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;]".. + "listcolors[#AAA0;#FFF5]" + ) +end + +-- Update appearance and formspec when the player joins +minetest.register_on_joinplayer(function(player) + player_update_visuals(player) + if minetest.setting_getbool("creative_mode") then + creative.set_creative_formspec(player, 0, 1) + else + default.set_player_inventory(player) + end +end) -- Check each player and apply animations function player_step(dtime) diff --git a/mods/default/textures/default_apple.png b/mods/default/textures/default_apple.png index 97792e1..ca293cc 100644 Binary files a/mods/default/textures/default_apple.png and b/mods/default/textures/default_apple.png differ diff --git a/mods/default/textures/default_formspec_bg.png b/mods/default/textures/default_formspec_bg.png new file mode 100644 index 0000000..1095627 Binary files /dev/null and b/mods/default/textures/default_formspec_bg.png differ diff --git a/mods/default/textures/default_formspec_chest.png b/mods/default/textures/default_formspec_chest.png new file mode 100644 index 0000000..5d738a5 Binary files /dev/null and b/mods/default/textures/default_formspec_chest.png differ diff --git a/mods/default/textures/default_formspec_furnace.png b/mods/default/textures/default_formspec_furnace.png new file mode 100644 index 0000000..fe62879 Binary files /dev/null and b/mods/default/textures/default_formspec_furnace.png differ diff --git a/mods/default/textures/default_formspec_player.png b/mods/default/textures/default_formspec_player.png new file mode 100644 index 0000000..aa773b9 Binary files /dev/null and b/mods/default/textures/default_formspec_player.png differ diff --git a/mods/default/textures/default_furnace_arrow_bg.png b/mods/default/textures/default_furnace_arrow_bg.png index db00b80..ffec9f9 100644 Binary files a/mods/default/textures/default_furnace_arrow_bg.png and b/mods/default/textures/default_furnace_arrow_bg.png differ diff --git a/mods/default/textures/default_furnace_arrow_fg.png b/mods/default/textures/default_furnace_arrow_fg.png index d1cc277..0940f44 100644 Binary files a/mods/default/textures/default_furnace_arrow_fg.png and b/mods/default/textures/default_furnace_arrow_fg.png differ diff --git a/mods/default/textures/default_furnace_fire_bg.png b/mods/default/textures/default_furnace_fire_bg.png index e98a4f6..04fe88d 100644 Binary files a/mods/default/textures/default_furnace_fire_bg.png and b/mods/default/textures/default_furnace_fire_bg.png differ diff --git a/mods/default/textures/default_hardened_clay.png b/mods/default/textures/default_hardened_clay.png deleted file mode 100644 index e92d361..0000000 Binary files a/mods/default/textures/default_hardened_clay.png and /dev/null differ diff --git a/mods/default/textures/default_jungleleaves.png b/mods/default/textures/default_jungleleaves.png index 1b1b102..0fa1776 100644 Binary files a/mods/default/textures/default_jungleleaves.png and b/mods/default/textures/default_jungleleaves.png differ diff --git a/mods/default/textures/default_jungletree.png b/mods/default/textures/default_jungletree.png index 60fdd7c..3d35b1e 100644 Binary files a/mods/default/textures/default_jungletree.png 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 index dffac22..e3a3ccc 100644 Binary files a/mods/default/textures/default_jungletree_top.png 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 index 9e9aad7..d7d20ab 100644 Binary files a/mods/default/textures/default_junglewood.png and b/mods/default/textures/default_junglewood.png differ diff --git a/mods/default/textures/default_torch_inv.png b/mods/default/textures/default_torch_inv.png new file mode 100644 index 0000000..56ffdb3 Binary files /dev/null and b/mods/default/textures/default_torch_inv.png differ diff --git a/mods/default/textures/wieldhand.png b/mods/default/textures/wieldhand.png index 2ea7567..5f7f490 100644 Binary files a/mods/default/textures/wieldhand.png and b/mods/default/textures/wieldhand.png differ diff --git a/mods/default/tools.lua b/mods/default/tools.lua index 480eed2..3a0ab67 100644 --- a/mods/default/tools.lua +++ b/mods/default/tools.lua @@ -11,7 +11,7 @@ minetest.register_item(":", { 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]=7.00,[2]=4.00,[3]=1.40}, uses=0, maxlevel=3} + oddly_breakable_by_hand = {times={[1]=6.70,[2]=4.00,[3]=1.40,[4]=30.00}, uses=0, maxlevel=3} }, damage_groups = {fleshy=1}, } @@ -28,7 +28,7 @@ minetest.register_tool("default:pick_wood", { full_punch_interval = 1.2, max_drop_level=0, groupcaps={ - cracky = {times={[3]=1.60}, uses=10, maxlevel=1}, + cracky = {times={[3]=1.40}, uses=10/3, maxlevel=1}, }, damage_groups = {fleshy=2}, }, @@ -37,10 +37,10 @@ minetest.register_tool("default:pick_stone", { description = "Stone Pickaxe", inventory_image = "default_tool_stonepick.png", tool_capabilities = { - full_punch_interval = 1.3, + full_punch_interval = 1.1, max_drop_level=0, groupcaps={ - cracky = {times={[2]=2.0, [3]=1.20}, uses=20, maxlevel=1}, + cracky = {times={[2]=1.80, [3]=1.15}, uses=20/3, maxlevel=1}, }, damage_groups = {fleshy=3}, }, @@ -52,7 +52,7 @@ minetest.register_tool("default:pick_steel", { 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}, + cracky = {times={[1]=3.50, [2]=1.50, [3]=0.80}, uses=20/3, maxlevel=2}, }, damage_groups = {fleshy=4}, }, @@ -64,7 +64,7 @@ minetest.register_tool("default:pick_bronze", { 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}, + cracky = {times={[1]=4.00, [2]=1.60, [3]=0.80}, uses=30/3, maxlevel=2}, }, damage_groups = {fleshy=4}, }, @@ -73,10 +73,10 @@ minetest.register_tool("default:pick_mese", { description = "Mese Pickaxe", inventory_image = "default_tool_mesepick.png", tool_capabilities = { - full_punch_interval = 0.9, + full_punch_interval = 0.7, max_drop_level=3, groupcaps={ - cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20, maxlevel=3}, + cracky = {times={[1]=2.4, [2]=1.2, [3]=0.60}, uses=20/3, maxlevel=3}, }, damage_groups = {fleshy=5}, }, @@ -88,7 +88,7 @@ minetest.register_tool("default:pick_diamond", { 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}, + cracky = {times={[1]=2.0, [2]=1.0, [3]=0.50}, uses=30/3, maxlevel=3}, }, damage_groups = {fleshy=5}, }, @@ -106,7 +106,7 @@ minetest.register_tool("default:shovel_wood", { 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}, + crumbly = {times={[1]=2.80, [2]=1.50, [3]=0.60}, uses=10/3, maxlevel=1}, }, damage_groups = {fleshy=2}, }, @@ -116,10 +116,10 @@ minetest.register_tool("default:shovel_stone", { inventory_image = "default_tool_stoneshovel.png", wield_image = "default_tool_stoneshovel.png^[transformR90", tool_capabilities = { - full_punch_interval = 1.4, + full_punch_interval = 1.1, max_drop_level=0, groupcaps={ - crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20, maxlevel=1}, + crumbly = {times={[1]=1.80, [2]=1.20, [3]=0.50}, uses=20/3, maxlevel=1}, }, damage_groups = {fleshy=2}, }, @@ -129,10 +129,10 @@ minetest.register_tool("default:shovel_steel", { inventory_image = "default_tool_steelshovel.png", wield_image = "default_tool_steelshovel.png^[transformR90", tool_capabilities = { - full_punch_interval = 1.1, + full_punch_interval = 0.9, max_drop_level=1, groupcaps={ - crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30, maxlevel=2}, + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=30/3, maxlevel=2}, }, damage_groups = {fleshy=3}, }, @@ -145,7 +145,7 @@ minetest.register_tool("default:shovel_bronze", { 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}, + crumbly = {times={[1]=1.50, [2]=0.90, [3]=0.40}, uses=40/3, maxlevel=2}, }, damage_groups = {fleshy=3}, }, @@ -158,7 +158,7 @@ minetest.register_tool("default:shovel_mese", { 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}, + crumbly = {times={[1]=1.20, [2]=0.60, [3]=0.30}, uses=20/3, maxlevel=3}, }, damage_groups = {fleshy=4}, }, @@ -171,7 +171,7 @@ minetest.register_tool("default:shovel_diamond", { 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}, + crumbly = {times={[1]=1.10, [2]=0.50, [3]=0.30}, uses=30/3, maxlevel=3}, }, damage_groups = {fleshy=4}, }, @@ -188,7 +188,7 @@ minetest.register_tool("default:axe_wood", { full_punch_interval = 1.0, max_drop_level=0, groupcaps={ - choppy = {times={[2]=3.00, [3]=2.00}, uses=10, maxlevel=1}, + choppy = {times={[2]=2.60, [3]=1.80}, uses=10/3, maxlevel=1}, }, damage_groups = {fleshy=2}, }, @@ -200,7 +200,7 @@ minetest.register_tool("default:axe_stone", { full_punch_interval = 1.2, max_drop_level=0, groupcaps={ - choppy={times={[1]=3.00, [2]=2.00, [3]=1.50}, uses=20, maxlevel=1}, + choppy={times={[1]=3.00, [2]=2.00, [3]=1.50}, uses=20/3, maxlevel=1}, }, damage_groups = {fleshy=3}, }, @@ -212,7 +212,7 @@ minetest.register_tool("default:axe_steel", { 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}, + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=20/3, maxlevel=2}, }, damage_groups = {fleshy=4}, }, @@ -224,7 +224,7 @@ minetest.register_tool("default:axe_bronze", { 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}, + choppy={times={[1]=2.50, [2]=1.40, [3]=1.00}, uses=30/3, maxlevel=2}, }, damage_groups = {fleshy=4}, }, @@ -236,7 +236,7 @@ minetest.register_tool("default:axe_mese", { 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}, + choppy={times={[1]=2.20, [2]=1.00, [3]=0.60}, uses=20/3, maxlevel=3}, }, damage_groups = {fleshy=6}, }, @@ -248,7 +248,7 @@ minetest.register_tool("default:axe_diamond", { 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}, + choppy={times={[1]=2.10, [2]=0.90, [3]=0.50}, uses=30/3, maxlevel=2}, }, damage_groups = {fleshy=7}, }, @@ -277,7 +277,7 @@ minetest.register_tool("default:sword_stone", { full_punch_interval = 1.2, max_drop_level=0, groupcaps={ - snappy={times={[2]=1.4, [3]=0.40}, uses=20, maxlevel=1}, + snappy={times={[2]=1.4, [3]=0.40}, uses=20/3, maxlevel=1}, }, damage_groups = {fleshy=4}, } @@ -289,7 +289,7 @@ minetest.register_tool("default:sword_steel", { 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}, + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=30/3, maxlevel=2}, }, damage_groups = {fleshy=6}, } @@ -301,7 +301,7 @@ minetest.register_tool("default:sword_bronze", { 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}, + snappy={times={[1]=2.5, [2]=1.20, [3]=0.35}, uses=40/3, maxlevel=2}, }, damage_groups = {fleshy=6}, } @@ -313,7 +313,7 @@ minetest.register_tool("default:sword_mese", { full_punch_interval = 0.7, max_drop_level=1, groupcaps={ - snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30, maxlevel=3}, + snappy={times={[1]=2.0, [2]=1.00, [3]=0.35}, uses=30/3, maxlevel=3}, }, damage_groups = {fleshy=7}, } @@ -325,7 +325,7 @@ minetest.register_tool("default:sword_diamond", { full_punch_interval = 0.7, max_drop_level=1, groupcaps={ - snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40, maxlevel=3}, + snappy={times={[1]=1.90, [2]=0.90, [3]=0.30}, uses=40/3, maxlevel=3}, }, damage_groups = {fleshy=8}, } diff --git a/mods/default/torches.lua b/mods/default/torches.lua index b40a13f..af8ef53 100644 --- a/mods/default/torches.lua +++ b/mods/default/torches.lua @@ -71,7 +71,7 @@ end --node_boxes minetest.register_craftitem(":default:torch", { description = "Torch", - inventory_image = "default_torch.png", + inventory_image = "default_torch_inv.png", wield_image = "default_torch.png", wield_scale = {x=1,y=1,z=1+1/16}, liquids_pointable = false, @@ -102,7 +102,7 @@ minetest.register_craftitem(":default:torch", { minetest.register_node("default:torch_floor", { --description = "Fakel", - inventory_image = "default_torch.png", + inventory_image = "default_torch_inv.png", wield_image = "default_torch.png", wield_scale = {x=1,y=1,z=1+2/16}, drawtype = "nodebox", @@ -142,7 +142,7 @@ local wall_ndbx = { minetest.register_node("default:torch_wand", { --description = "Fakel", - inventory_image = "default_torch.png", + inventory_image = "default_torch_inv.png", wield_image = "default_torch.png", wield_scale = {x=1,y=1,z=1+1/16}, drawtype = "nodebox", diff --git a/mods/default/trees.lua b/mods/default/trees.lua new file mode 100644 index 0000000..64d7b12 --- /dev/null +++ b/mods/default/trees.lua @@ -0,0 +1,150 @@ +local c_air = minetest.get_content_id("air") +local c_ignore = minetest.get_content_id("ignore") +local c_tree = minetest.get_content_id("default:tree") +local c_leaves = minetest.get_content_id("default:leaves") +local c_apple = minetest.get_content_id("default:apple") + +function default.grow_tree(data, a, pos, is_apple_tree, seed) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + ]]-- + local pr = PseudoRandom(seed) + local th = pr:next(4, 5) + local x, y, z = pos.x, pos.y, pos.z + for yy = y, y+th-1 do + local vi = a:index(x, yy, z) + if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then + data[vi] = c_tree + end + end + y = y+th-1 -- (x, y, z) is now last piece of trunk + local leaves_a = VoxelArea:new{MinEdge={x=-2, y=-1, z=-2}, MaxEdge={x=2, y=2, z=2}} + local leaves_buffer = {} + + -- Force leaves near the trunk + local d = 1 + for xi = -d, d do + for yi = -d, d do + for zi = -d, d do + leaves_buffer[leaves_a:index(xi, yi, zi)] = true + end + end + end + + -- Add leaves randomly + for iii = 1, 8 do + local d = 1 + local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d) + local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d) + local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d) + + for xi = 0, d do + for yi = 0, d do + for zi = 0, d do + leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true + end + end + end + end + + -- Add the leaves + for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do + for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do + for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do + if a:contains(x+xi, y+yi, z+zi) then + local vi = a:index(x+xi, y+yi, z+zi) + if data[vi] == c_air or data[vi] == c_ignore then + if leaves_buffer[leaves_a:index(xi, yi, zi)] then + if is_apple_tree and pr:next(1, 100) <= 10 then + data[vi] = c_apple + else + data[vi] = c_leaves + end + end + end + end + end + end + end +end + +local c_jungletree = minetest.get_content_id("default:jungletree") +local c_jungleleaves = minetest.get_content_id("default:jungleleaves") + +function default.grow_jungletree(data, a, pos, seed) + --[[ + NOTE: Tree-placing code is currently duplicated in the engine + and in games that have saplings; both are deprecated but not + replaced yet + ]]-- + local pr = PseudoRandom(seed) + local x, y, z = pos.x, pos.y, pos.z + for xi = -1, 1 do + for zi = -1, 1 do + if pr:next(1, 3) >= 2 then + local vi1 = a:index(x+xi, y, z+zi) + local vi2 = a:index(x+xi, y-1, z+zi) + if a:contains(x+xi, y-1, z+zi) and data[vi2] == c_air then + data[vi2] = c_jungletree + elseif a:contains(x+xi, y, z+zi) and data[vi1] == c_air then + data[vi1] = c_jungletree + end + end + end + end + + local th = pr:next(8, 12) + for yy = y, y+th-1 do + local vi = a:index(x, yy, z) + if a:contains(x, yy, z) and (data[vi] == c_air or yy == y) then + data[vi] = c_jungletree + end + end + y = y+th-1 -- (x, y, z) is now last piece of trunk + local leaves_a = VoxelArea:new{MinEdge={x=-3, y=-2, z=-3}, MaxEdge={x=3, y=2, z=3}} + local leaves_buffer = {} + + -- Force leaves near the trunk + local d = 1 + for xi = -d, d do + for yi = -d, d do + for zi = -d, d do + leaves_buffer[leaves_a:index(xi, yi, zi)] = true + end + end + end + + -- Add leaves randomly + for iii = 1, 30 do + local d = 1 + local xx = pr:next(leaves_a.MinEdge.x, leaves_a.MaxEdge.x - d) + local yy = pr:next(leaves_a.MinEdge.y, leaves_a.MaxEdge.y - d) + local zz = pr:next(leaves_a.MinEdge.z, leaves_a.MaxEdge.z - d) + + for xi = 0, d do + for yi = 0, d do + for zi = 0, d do + leaves_buffer[leaves_a:index(xx+xi, yy+yi, zz+zi)] = true + end + end + end + end + + -- Add the leaves + for xi = leaves_a.MinEdge.x, leaves_a.MaxEdge.x do + for yi = leaves_a.MinEdge.y, leaves_a.MaxEdge.y do + for zi = leaves_a.MinEdge.z, leaves_a.MaxEdge.z do + if a:contains(x+xi, y+yi, z+zi) then + local vi = a:index(x+xi, y+yi, z+zi) + if data[vi] == c_air or data[vi] == c_ignore then + if leaves_buffer[leaves_a:index(xi, yi, zi)] then + data[vi] = c_jungleleaves + end + end + end + end + end + end +end \ No newline at end of file diff --git a/mods/fire/init.lua b/mods/fire/init.lua index d6aee4a..4906178 100644 --- a/mods/fire/init.lua +++ b/mods/fire/init.lua @@ -62,7 +62,7 @@ function fire.update_sounds_around(pos) if not sound then if should_have_sound then fire.sounds[p0_hash] = { - handle = minetest.sound_play(wanted_sound, {pos=cp, loop=true}), + handle = minetest.sound_play(wanted_sound, {pos=cp, max_hear_distance = 20, loop=true}), name = wanted_sound.name, } end @@ -73,7 +73,7 @@ function fire.update_sounds_around(pos) elseif sound.name ~= wanted_sound.name then minetest.sound_stop(sound.handle) fire.sounds[p0_hash] = { - handle = minetest.sound_play(wanted_sound, {pos=cp, loop=true}), + handle = minetest.sound_play(wanted_sound, {pos=cp, max_hear_distance = 30, loop=true}), name = wanted_sound.name, } end @@ -107,7 +107,7 @@ end minetest.register_abm({ nodenames = {"group:flammable"}, neighbors = {"group:igniter"}, - interval = 1, + interval = 2, chance = 2, action = function(p0, node, _, _) -- If there is water or stuff like that around flame, don't ignite @@ -126,8 +126,8 @@ minetest.register_abm({ minetest.register_abm({ nodenames = {"group:igniter"}, neighbors = {"air"}, - interval = 2, - chance = 10, + interval = 8, + chance = 8, 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 diff --git a/mods/hud/textures/wieldhand.png b/mods/hud/textures/wieldhand.png deleted file mode 100644 index 5f7f490..0000000 Binary files a/mods/hud/textures/wieldhand.png and /dev/null differ diff --git a/mods/stairs/init.lua b/mods/stairs/init.lua index 0dbc40c..179cf15 100644 --- a/mods/stairs/init.lua +++ b/mods/stairs/init.lua @@ -25,39 +25,38 @@ function stairs.register_stair(subname, recipeitem, groups, images, description, 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 - local fakestack = ItemStack("stairs:stair_" .. subname.."upside_down") - local ret = minetest.item_place(fakestack, placer, pointed_thing) - if ret:is_empty() then - itemstack:take_item() - return itemstack + param2 = param2 + 20 + if param2 == 21 then + param2 = 23 + elseif param2 == 23 then + param2 = 21 end end - - -- Otherwise place regularly - return minetest.item_place(itemstack, placer, pointed_thing) + + return minetest.item_place(itemstack, placer, pointed_thing, param2) end, }) - + + -- for replace ABM minetest.register_node(":stairs:stair_" .. subname.."upside_down", { - drop = "stairs:stair_" .. subname, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - paramtype2 = "facedir", - is_ground_content = true, - groups = groups, - sounds = sounds, - node_box = { - type = "fixed", - fixed = { - {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, - {-0.5, -0.5, 0, 0.5, 0, 0.5}, - }, - }, + replace_name = "stairs:stair_" .. subname, + groups = {slabs_replace=1}, }) minetest.register_craft({ @@ -87,6 +86,7 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, drawtype = "nodebox", tiles = images, paramtype = "light", + paramtype2 = "facedir", is_ground_content = true, groups = groups, sounds = sounds, @@ -106,21 +106,32 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, local p0 = pointed_thing.under local p1 = pointed_thing.above local n0 = minetest.get_node(p0) - if n0.name == "stairs:slab_" .. subname and - p0.y+1 == p1.y then + 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 - fakestack = minetest.item_place(fakestack, placer, pointed_thing) + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, decrement original - if not fakestack or fakestack:is_empty() then - itemstack:take_item(1) + if success then + itemstack:set_count(fakestack:get_count()) -- Else put old node back else minetest.set_node(slabpos, slabnode) @@ -131,61 +142,43 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, -- Upside down slabs if p0.y-1 == p1.y then -- Turn into full block if pointing at a existing slab - if n0.name == "stairs:slab_" .. subname.."upside_down" then + 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 - fakestack = minetest.item_place(fakestack, placer, pointed_thing) + local success + fakestack, success = minetest.item_place(fakestack, placer, pointed_thing) -- If the item was taken from the fake stack, decrement original - if not fakestack or fakestack:is_empty() then - itemstack:take_item(1) + 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 - local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down") - local ret = minetest.item_place(fakestack, placer, pointed_thing) - if ret:is_empty() then - itemstack:take_item() - return itemstack - end + param2 = 20 end - + -- If pointing at the side of a upside down slab - if n0.name == "stairs:slab_" .. subname.."upside_down" and - p0.y+1 ~= p1.y then - -- Place upside down slab - local fakestack = ItemStack("stairs:slab_" .. subname.."upside_down") - local ret = minetest.item_place(fakestack, placer, pointed_thing) - if ret:is_empty() then - itemstack:take_item() - return itemstack - end + if n0_is_upside_down and p0.y+1 ~= p1.y then + param2 = 20 end - - -- Otherwise place regularly - return minetest.item_place(itemstack, placer, pointed_thing) + + return minetest.item_place(itemstack, placer, pointed_thing, param2) end, }) - + + -- for replace ABM minetest.register_node(":stairs:slab_" .. subname.."upside_down", { - drop = "stairs:slab_"..subname, - drawtype = "nodebox", - tiles = images, - paramtype = "light", - is_ground_content = true, - groups = groups, - sounds = sounds, - node_box = { - type = "fixed", - fixed = {-0.5, 0, -0.5, 0.5, 0.5, 0.5}, - }, + replace_name = "stairs:slab_"..subname, + groups = {slabs_replace=1}, }) minetest.register_craft({ @@ -196,6 +189,23 @@ function stairs.register_slab(subname, recipeitem, groups, images, description, }) 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)