From dd9b33db6743812f33bcfe97910d9a110fb0b4f9 Mon Sep 17 00:00:00 2001 From: darkrose Date: Sun, 3 Jun 2012 00:27:48 +1000 Subject: [PATCH] Use new node metadata API for chests and furnaces; use cisoun's textures --- mods/default/init.lua | 299 +++++++++++++++++- .../textures/default_furnace_bottom.png | Bin 0 -> 731 bytes .../textures/default_furnace_front.png | Bin 246 -> 651 bytes .../textures/default_furnace_front_active.png | Bin 0 -> 826 bytes .../default/textures/default_furnace_side.png | Bin 236 -> 731 bytes mods/default/textures/default_furnace_top.png | Bin 0 -> 731 bytes 6 files changed, 292 insertions(+), 7 deletions(-) create mode 100644 mods/default/textures/default_furnace_bottom.png create mode 100644 mods/default/textures/default_furnace_front_active.png create mode 100644 mods/default/textures/default_furnace_top.png diff --git a/mods/default/init.lua b/mods/default/init.lua index 3d7dd310..ff82e3af 100644 --- a/mods/default/init.lua +++ b/mods/default/init.lua @@ -1122,9 +1122,24 @@ minetest.register_node("default:sign_wall", { --wall_bottom = --wall_side = }, - groups = {choppy=2,dig_immediate=2,flammable=2}, + groups = {choppy=2,dig_immediate=2}, legacy_wallmounted = true, sounds = default.node_sound_defaults(), + on_construct = function(pos) + --local n = minetest.env:get_node(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", "hack:sign_text_input") + meta:set_string("infotext", "\"\"") + end, + on_receive_fields = function(pos, formname, fields, sender) + --print("Sign at "..minetest.pos_to_string(pos).." got "..dump(fields)) + local meta = minetest.env:get_meta(pos) + fields.text = fields.text or "" + print((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:chest", { @@ -1132,32 +1147,302 @@ minetest.register_node("default:chest", { tile_images = {"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", - metadata_name = "chest", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, sounds = default.node_sound_wood_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", + "invsize[8,9;]".. + "list[current_name;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) + end, + can_dig = function(pos,player) + local meta = minetest.env: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)) + return minetest.node_metadata_inventory_move_allow_all( + pos, from_list, from_index, to_list, to_index, count, player) + end, + on_metadata_inventory_offer = function(pos, listname, index, stack, player) + minetest.log("action", player:get_player_name().. + " moves stuff to chest at "..minetest.pos_to_string(pos)) + return minetest.node_metadata_inventory_offer_allow_all( + pos, listname, index, stack, player) + end, + on_metadata_inventory_take = function(pos, listname, index, count, player) + minetest.log("action", player:get_player_name().. + " takes stuff from chest at "..minetest.pos_to_string(pos)) + return minetest.node_metadata_inventory_take_allow_all( + pos, listname, index, count, player) + 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_locked", { description = "Locked Chest", tile_images = {"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", - metadata_name = "locked_chest", - groups = {snappy=1,choppy=2,oddly_breakable_by_hand=2}, + groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, sounds = default.node_sound_wood_defaults(), + after_place_node = function(pos, placer) + local meta = minetest.env: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.env:get_meta(pos) + meta:set_string("formspec", + "invsize[8,9;]".. + "list[current_name;main;0,0;8,4;]".. + "list[current_player;main;0,5;8,4;]") + 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.env: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) + local meta = minetest.env:get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return + end + minetest.log("action", player:get_player_name().. + " moves stuff in locked chest at "..minetest.pos_to_string(pos)) + return minetest.node_metadata_inventory_move_allow_all( + pos, from_list, from_index, to_list, to_index, count, player) + end, + on_metadata_inventory_offer = function(pos, listname, index, stack, player) + local meta = minetest.env:get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return stack + end + minetest.log("action", player:get_player_name().. + " moves stuff to locked chest at "..minetest.pos_to_string(pos)) + return minetest.node_metadata_inventory_offer_allow_all( + pos, listname, index, stack, player) + end, + on_metadata_inventory_take = function(pos, listname, index, count, player) + local meta = minetest.env:get_meta(pos) + if not has_locked_chest_privilege(meta, player) then + minetest.log("action", player:get_player_name().. + " tried to access a locked chest belonging to ".. + meta:get_string("owner").." at ".. + minetest.pos_to_string(pos)) + return + end + minetest.log("action", player:get_player_name().. + " takes stuff from locked chest at "..minetest.pos_to_string(pos)) + return minetest.node_metadata_inventory_take_allow_all( + pos, listname, index, count, player) + end, }) minetest.register_node("default:furnace", { description = "Furnace", - tile_images = {"default_furnace_side.png", "default_furnace_side.png", "default_furnace_side.png", + tile_images = {"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", - metadata_name = "furnace", groups = {cracky=2}, legacy_facedir_simple = true, sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", + "invsize[8,9;]".. + "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;]") + meta:set_string("infotext", "Furnace") + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 1) + inv:set_size("dst", 4) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + if not inv:is_empty("fuel") then + return false + elseif not inv:is_empty("dst") then + return false + elseif not inv:is_empty("src") then + return false + end + return true + end, +}) + +minetest.register_node("default:furnace_active", { + description = "Furnace", + tile_images = {"default_furnace_top.png", "default_furnace_bottom.png", "default_furnace_side.png", + "default_furnace_side.png", "default_furnace_side.png", "default_furnace_front_active.png"}, + paramtype2 = "facedir", + light_source = 8, + drop = "default:furnace", + groups = {cracky=2}, + legacy_facedir_simple = true, + sounds = default.node_sound_stone_defaults(), + on_construct = function(pos) + local meta = minetest.env:get_meta(pos) + meta:set_string("formspec", + "invsize[8,9;]".. + "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;]") + meta:set_string("infotext", "Furnace"); + local inv = meta:get_inventory() + inv:set_size("fuel", 1) + inv:set_size("src", 1) + inv:set_size("dst", 4) + end, + can_dig = function(pos,player) + local meta = minetest.env:get_meta(pos); + local inv = meta:get_inventory() + if not inv:is_empty("fuel") then + return false + elseif not inv:is_empty("dst") then + return false + elseif not inv:is_empty("src") then + return false + end + return true + end, +}) + +function hacky_swap_node(pos,name) + local node = minetest.env:get_node(pos) + local meta = minetest.env:get_meta(pos) + local meta0 = meta:to_table() + if node.name == name then + return + end + node.name = name + local meta0 = meta:to_table() + minetest.env:set_node(pos,node) + meta = minetest.env:get_meta(pos) + meta:from_table(meta0) +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) + local meta = minetest.env:get_meta(pos) + for i, name in ipairs({ + "fuel_totaltime", + "fuel_time", + "src_totaltime", + "src_time" + }) do + if meta:get_string(name) == "" then + meta:set_float(name, 0.0) + end + end + + local inv = meta:get_inventory() + + local srclist = inv:get_list("src") + local cooked = nil + + if srclist then + cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + end + + local was_active = false + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + was_active = true + meta:set_float("fuel_time", meta:get_float("fuel_time") + 1) + meta:set_float("src_time", meta:get_float("src_time") + 1) + if cooked and cooked.item and meta:get_float("src_time") >= cooked.time then + -- check if there's room for output in "dst" list + if inv:room_for_item("dst",cooked.item) then + -- Put result in "dst" list + inv:add_item("dst", cooked.item) + -- take stuff from "src" list + srcstack = inv:get_stack("src", 1) + srcstack:take_item() + inv:set_stack("src", 1, srcstack) + else + print("Could not insert '"..cooked.item.."'") + end + meta:set_string("src_time", 0) + end + end + + if meta:get_float("fuel_time") < meta:get_float("fuel_totaltime") then + meta:set_string("infotext","Furnace active: "..(meta:get_float("fuel_time")/meta:get_float("fuel_totaltime")*100).."%") + hacky_swap_node(pos,"default:furnace_active") + return + end + + local fuel = nil + local cooked = nil + local fuellist = inv:get_list("fuel") + local srclist = inv:get_list("src") + + if srclist then + cooked = minetest.get_craft_result({method = "cooking", width = 1, items = srclist}) + end + if fuellist then + fuel = minetest.get_craft_result({method = "fuel", width = 1, items = fuellist}) + end + + if fuel.time <= 0 then + meta:set_string("infotext","Furnace out of fuel") + hacky_swap_node(pos,"default:furnace") + return + end + + if cooked.item:is_empty() then + if was_active then + meta:set_string("infotext","Furnace is empty") + hacky_swap_node(pos,"default:furnace") + end + return + end + + meta:set_string("fuel_totaltime", fuel.time) + meta:set_string("fuel_time", 0) + + local stack = inv:get_stack("fuel", 1) + stack:take_item() + inv:set_stack("fuel", 1, stack) + end, }) minetest.register_node("default:cobble", { diff --git a/mods/default/textures/default_furnace_bottom.png b/mods/default/textures/default_furnace_bottom.png new file mode 100644 index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de GIT binary patch literal 731 zcmV<10wn#3P)vTw>QaA;8<*}~=t3f>5qc&B=A);& zYPzOw-MaU^E_#^7yL&lso^y`+@%wMfVzD5LV2wd3#jx7}kh5Tn##jeMh;b(8L|xYa zhzR!W$vJaMc<<2KFvp09FwZm3o_x%2zyHN@xr9=%-ZO=OwH5&9J$Bo5IOm8l(liab zVIZf(YPF)>Tv1gOec$7}N5&CKL1~Tmo-BecrI2$5V7J?0twm|g#pNZ-)smDmi@Iix zk)y*E1+dm4B3x}Y*bo8$);a2G!P(gvRaNoj^Jo0|_nH@>$t15Qp)S*@0P0b__^B7{J*Z1xP^o%fW|(e*t>Yn-)| zQdrbAZ~i&u@h1=X@7)E)SmHEctU+r-IPdV@VTWPh`uchgB_%=#%=3)Dx#8&O2xBdh zg}!fZqssO!i@5wo(wB#&o zw_6TYtGmL*I8)a(&N=KCPaomELn)2Y3hx|BDO3^GC#QST#xTW5yglzdAq2*8#IE0O z0Pt0Xi16_KF;!Ku*<7HsX4vgGJUpc9dx{8ERWVHyeb?=`5T=Pz3S$W5oLOtlgAecV zH3bV+lqek`Z<5Rc}ppU;pXNpwm3~V=MWLLZHx7u{{cAUfRWPZZyo>u N002ovPDHLkV1f`gW61yj literal 0 HcmV?d00001 diff --git a/mods/default/textures/default_furnace_front.png b/mods/default/textures/default_furnace_front.png index 1620a27c33f54a34d92789d9757050b0cd5a4235..8f01e993c1f6b6563eb7da52e250e0e7caee0a44 100644 GIT binary patch delta 637 zcmV-@0)qYa0gDBY8Gi-<001BJ|6u?C00DDSM?wIu&K&6g000JJOGiWi{{a60|De66 zlK=n!32;bRa{vGf6951U69E94oEQKA00(qQO+^RX1_KZdCS-Ldxc~qH3rR#lR5;6( zkxfffVHk$5=RNP4bZTf5Vi75oW~q@-6y&NO5Cl;W5kXLkB7bPpM%uK9AShb3>uHjv^wH&@M^b#3ATlIY5cU^K@GRV-lmD*=yt(vC*pYW^!Wz<%0ICsx3vrFK)-xj!1o;6x^|*Hh1SCGKo5oD9M%ffI*fH3 z8rsj~n|YM-aH#)x-Hc;4`5Ees3Zg&(2M_F~6vQ~^@buq#ja5`CD=6(_j3sS3bSA?e XRPOsmrfZG+00000NkvXXu0mjf=bIvr delta 229 zcmV`1@-}u8Gix*005AYXf^-<00VPENmK|32;1RL-~a#s32;bRa{vGi!~g&e z!~vBn4jTXf0GUZdK~yM_m6Fj71R)4S?+hJGLJzh@Pu8X%R)C?0`*353ySg4Am>&l6Ulv2zrj9#T1+S?1>@oQa{0H~^n zoXijaGh^n~+A1HfhZD$mX+SyWiFgc}JpCFgfH0)fSohGl#Mu(U_G0*?))JJn% z`n`f5YXF>%sGVnZ_UY!Bk0APF(8Z!_Vfc-X% z&GGfrDR|^E;*+jG>X1bFL@LFoZdZvq9+p(-S!kSvZ+x&G9fk)FLG28q4KB0LW~+2ulx6GkB&WgzQKhuiuDR@R1<87M6< zmCQi?9w@v7*}EXsAi2f!J)bjqU;@`SkwGVhRG|&KTk!7&9)_M_NMo=DAq5`q@{Y3j z@#i(#A&AdDeotFg!gt@FB`Z7h_Xv7(2`cW8YKbW!V+x$MB8*HFSsYKWYv^7g1@ipL zI+m%~HME;MZnrUX%zcGk${X7VA;{Z#f{xF#6C*4wuOUR1ekGAI2cbgxK|t2Z;I?vTw>QaA;8<*}~=t3f>5qc&B=A);&YPzOw-MaU^E_#^7yL&lso^y`+@%wMfVzD5L zV2wd3#jx7}kh5Tn##jeMh;b(8L|xYahzR!W$vJaMc<<2KFn`C0h%nDH&z^kDZ@>S= za=C<3u--F;fVCC?=RJ1YbvWmUG14>*yI~-w#A>yo-CR*s6@B01yhp|nNh+!*`{wYeaS9;wjth7V8{E%D!C2 z(lj-;?|X92q?9nmV6ElrSD*9m$vLI8vTw>QaA;8<*}~=t3f>5qc&B=A);& zYPzOw-MaU^E_#^7yL&lso^y`+@%wMfVzD5LV2wd3#jx7}kh5Tn##jeMh;b(8L|xYa zhzR!W$vJaMc<<2KFvp09FwZm3o_x%2zyHN@xr9=%-ZO=OwH5&9J$Bo5IOm8l(liab zVIZf(YPF)>Tv1gOec$7}N5&CKL1~Tmo-BecrI2$5V7J?0twm|g#pNZ-)smDmi@Iix zk)y*E1+dm4B3x}Y*bo8$);a2G!P(gvRaNoj^Jo0|_nH@>$t15Qp)S*@0P0b__^B7{J*Z1xP^o%fW|(e*t>Yn-)| zQdrbAZ~i&u@h1=X@7)E)SmHEctU+r-IPdV@VTWPh`uchgB_%=#%=3)Dx#8&O2xBdh zg}!fZqssO!i@5wo(wB#&o zw_6TYtGmL*I8)a(&N=KCPaomELn)2Y3hx|BDO3^GC#QST#xTW5yglzdAq2*8#IE0O z0Pt0Xi16_KF;!Ku*<7HsX4vgGJUpc9dx{8ERWVHyeb?=`5T=Pz3S$W5oLOtlgAecV zH3bV+lqek`Z<5Rc}ppU;pXNpwm3~V=MWLLZHx7u{{cAUfRWPZZyo>u N002ovPDHLkV1f`gW61yj literal 0 HcmV?d00001