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 3d7dd31..ff82e3a 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 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to7J0fjhFF}oo$T8!6DrX< z|952URa@h3L+Q;Nkt+l|6a=TL2=H?J(~f-=RNpN<{ax$}C#4mFRcb8H7BAnGwQE`4 z-Cf`J>Q&7+y1Ux4U|w3C8d~Lvl{|T4A(4QWgWbEQ!+I44 zXQXY*txk9R`{i)?(skJ`E&rm#EVte9)U%#sORaKoh z&V26Kzw_aX7aYmDlUn!X=Py1hk<8$s`IdFdwGNJ@B42bLZp+QQJ+1wF|IL`K74Ie5 z9`ac<1aW2eIJyLQO$B?bFxc^FO~oX}NUE6P=vx(R^X6cON=x5q#bBoaGyFfBA=doi%$ealM!E(hL#2 zroO!T(lLXh9(!!x+bXggD?GC9em=v8(AJI*AO0DJhHktWvtUcwjkgvyHcMVtcX5P< z8u|*?UVpn?U|DAnS2D+wIg#0CoB7{=d~(sfJYeqkBe(5e%Vf?wnaO|o*_=QxMJ1Uv zd>f8!+WjtK|9+L!g)5~GiD)bpNIqi8ejsV1!m*CMlI~j1U;gS_eY>mf^DoQ#J(b>? ttq-3))7xg@Yw=t_a9eKo*LnXLEuJ(?y!0Ypj)8%J!PC{xWt~$(695o5W61yj 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 zcmeyy*v&dYvYw5BfkFQB|3n4`2FBtbcPEB*=VV?oFfgzsdAqwX{0G4WdzVjUU|`@Z z@Q5sCVBi)8VMc~ob0ioT7}!fZeO=k_urUkpsil;v?_^+L;`VfL46!&pb)v6#NTNjB z`scRqXO?7T2qy_@PEA`mF+k+WDtQ5xKmkF=fNrJwjLUAfwsa_HL~VVYzvD%7*rJQ= zH;-ooCpY@a<<6ODT>R|D%+LGsyBAGuD%PEU^y?k-?J;|cZu0Vfxis^v(dUoak2nJt zJJ#o$Z$2vIrMcx=56`>ASEX{vJacdA)b71|M$~&nnvC(^l^zmdE3alvX>PDsHCb)- z1D>g$i~=Q;&Lz}uP|0+P_cw2S�RmkU49T%4(5)e^b7^P&n)6v3ZwMSah1bPjH;p z#Wm9-e{S^%SzVBlp&u_MmZ{1amHp(;P2+Q)ZEO5rTfW;Z=! zn+!wZ+P*n^G`z-^%^kVSi2Zf$uW6ca<%& zZM}Brg9Cr-BbjSl*Q|OW^7MD4JA$h+Te%d&faGcYhPc)I$ztaD0e0s!ZmB98z7 delta 229 zcmeBX{l+*!vYv^7fnmbL3^N7>2IgWX&kzm{j@u9YA22X5a29w(7BevL9RXp+soH$f z3=9l2JzX3_G$u}+bdi@uk;COZkF1Xq|29|uYs=)r8Wy(yE=ca!y-O}Wt>Q$=m)SwT z{sdo%nyq3iozC$2K*s7>*j2S-lM!i1O*)b*Pj80G7Qt4Z_x$k|hn|c74;{b$ jhTq|PLD*I2-;7gBqZj>4eBQ^vz`)??>gTe~DWM4fd*EPE 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 0000000000000000000000000000000000000000..10ffd1fa2973e0570fff53369687e45d17246d55 GIT binary patch literal 826 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to89iMbLo80`_W5SWq%yS4 z&wn=i?%cEM>(6#wTVuG^Nx1Z*dXsKOOIJtS7Ow?U9xP;gvs5lip+Zp0>BIXJJwZte<+y0w=$&PKIF)` z=R3FjQa>b8@z$)mn|0k3ZHczVDU&YkWB-x)(|nT3!E?`V2J37HTbJ;|@xam3sWQtw zS6^Kew^pb^Pm9Y@{mqr_A7$7V3JV1(iEd2aap2cht-?tO8cRDCP58Qc_M7=P+V7Wr zn9cji=;^8T;w!If{m7ep?5ysdYkdAay`PRB6Dt%^TVS+<)++af0NBr&}7**(^%xTT9 z*&rv|#?J5fmS@N8IX3K7Vqb(jjE`L~^m3J$>_5HY-2sc4YZ|6EUSe7=$Kv*mWiv-_ zszud|oy`Xvrl;%r>Z!kc|K4@o|I+3;qC&^Gytp?Q9S&b@Q2O0y$MwYb)*rqr+3?%k zeCpIE?4~H2s_@#k{q`@Guxo8oB{g&nrk-*5C#SK8<>qdMs|q`hezu)&T$#Xh-F%{> zdRxds-rdn3-m}TI%}ex1-oU2FD);_V-=-fQpPSxN>^N^%=N}z*sQmtXRc-4p-#My^ zIknzR$m-NoOy-)iO{vF6BvQtIL-va}CDu=WPFYP`dDC>uZ0o%3h9zfeTjNei-{w#} zal5jq@BC(AWgXr1iZ0XYR3{p-FLe6l=y2`SgKgz2u9h1#Jo>;P9ew>`RPrf~hKWgi nYol5+GpBe37IM!#`GKETGw!9%UXFj- zv9E&ayQQbUi+$mwv_h~-jpf-%24su@RjS6dd$EAIRC@pt~|q>T#Q z3B8V*M>pJNoUl2e=U4>0Ye%8lbC=lb3>_Tb-k!89_NsV);g&)D@s19I^Ty}r)tt%S z|Nm&w&X%AJ_l#Q`wu&)4w=KI}YVo|o@RAAd?nH&E ztb;diN`{7heEK>4&(H6(#OK%BK6@Tt=c>7N`;4@0xz*{8f4>|qU%D>arR86hd#pY~ zhhfqCAIyG!{*h~^RWl}cBr3HyY|i<{b8qhVDVHvOwROv$vvo>P#1+&0f0j=_s`LMN zf0y-G#3Pf$HICWN7VkgYOKeYk@atC>fv#0I!KbNiyy(E!Xw! zmu605sQLOx^Y&Y@*D|iB_Qf2#WMaDQeRa{fB~uKJC9Hk=I(+`;_a`lvZh4}Uvpt$G zZ1wI#M=gS{o1U|LBknK%aIdpw?+VSDTKf}<_jW=T!Y)QNE*22bS$?NJaj?hp;U*X#8Z?_99>kQ&b=6EtEGW%>Z z|ND91kw*70F%y}m>`7b}46X>O=B(sKZ!?8`f-$m@-uadfOrSu^Yjimy~ zM=aS7ByCi%J=U>T(p~HM%U^w~Z+F#w{$*Ler_x)q_2IK;dfO~~EuISqZp-cdI`2QD Z#gm4KmtN${F)%PNc)I$ztaD0e0szLVV}t+z delta 209 zcmcc3`i60Waye6+QEKzbyEg=-IuKVcL-|hYgQeyk%s#FXef=*4+5Dn8PRMfF+jq zt{jbIIiU2Ta6yw^h~Uy@9>dn3caja1Q$NP@Y3+$!5jEATl=Z+XhsgDpUhaOl@`TEJ zktwP3S?{Mi<%YlI+Qeq<)bgfjezNZs2i<kk!P>}5L;yx8*n_~f5*ZqLk0#0 N22WQ%mvv4FO#uF7Rc8PI diff --git a/mods/default/textures/default_furnace_top.png b/mods/default/textures/default_furnace_top.png new file mode 100644 index 0000000000000000000000000000000000000000..c86782a2147130bb2b12644fb767e33ad5f4b1de GIT binary patch literal 731 zcmeAS@N?(olHy`uVBq!ia0y~yU=RRd4mJh`2Kmqb6B!to7J0fjhFF}oo$T8!6DrX< z|952URa@h3L+Q;Nkt+l|6a=TL2=H?J(~f-=RNpN<{ax$}C#4mFRcb8H7BAnGwQE`4 z-Cf`J>Q&7+y1Ux4U|w3C8d~Lvl{|T4A(4QWgWbEQ!+I44 zXQXY*txk9R`{i)?(skJ`E&rm#EVte9)U%#sORaKoh z&V26Kzw_aX7aYmDlUn!X=Py1hk<8$s`IdFdwGNJ@B42bLZp+QQJ+1wF|IL`K74Ie5 z9`ac<1aW2eIJyLQO$B?bFxc^FO~oX}NUE6P=vx(R^X6cON=x5q#bBoaGyFfBA=doi%$ealM!E(hL#2 zroO!T(lLXh9(!!x+bXggD?GC9em=v8(AJI*AO0DJhHktWvtUcwjkgvyHcMVtcX5P< z8u|*?UVpn?U|DAnS2D+wIg#0CoB7{=d~(sfJYeqkBe(5e%Vf?wnaO|o*_=QxMJ1Uv zd>f8!+WjtK|9+L!g)5~GiD)bpNIqi8ejsV1!m*CMlI~j1U;gS_eY>mf^DoQ#J(b>? ttq-3))7xg@Yw=t_a9eKo*LnXLEuJ(?y!0Ypj)8%J!PC{xWt~$(695o5W61yj literal 0 HcmV?d00001