From c04fe531df41ba226e8a2590eba51d4a8488c7b7 Mon Sep 17 00:00:00 2001 From: Isidor Zeuner Date: Mon, 13 Jul 2020 22:34:16 +0200 Subject: [PATCH] visibly mark shops that cannot work because the owner did not fill enough stock --- shop.lua | 166 +++++++++++++++++++++++++++++++++- textures/shop_front_empty.png | Bin 0 -> 925 bytes textures/shop_side_empty.png | Bin 0 -> 929 bytes 3 files changed, 165 insertions(+), 1 deletion(-) create mode 100644 textures/shop_front_empty.png create mode 100644 textures/shop_side_empty.png diff --git a/shop.lua b/shop.lua index 0935a82..b085934 100644 --- a/shop.lua +++ b/shop.lua @@ -84,6 +84,76 @@ default.shop.exchange = function(meta) meta:set_int("pl2step",0)]] end +local check_stock = function( + pos +) + local meta = minetest.get_meta( + pos + ) + local minv = meta:get_inventory( + ) + local gives = minv:get_list( + "owner_gives" + ) + local can_exchange = true + for i, item in pairs( + gives + ) do + if not minv:contains_item( + "stock", + item + ) then + can_exchange = false + end + end + local owner = meta:get_string( + "owner" + ) + if can_exchange then + meta:set_string( + "infotext", + S( + "Exchange shop (owned by @1)", + owner + ) + ) + local applicable = "currency:shop" + local node = minetest.get_node( + pos + ) + if node.name == applicable then + return + end + node.name = applicable + minetest.swap_node( + pos, + node + ) + else + meta:set_string( + "infotext", + S( + "Exchange shop (owned by @1)", + owner + ) .. ", " .. S( + "out of stock!" + ) + ) + local applicable = "currency:shop_empty" + local node = minetest.get_node( + pos + ) + if node.name == applicable then + return + end + node.name = applicable + minetest.swap_node( + pos, + node + ) + end +end + minetest.register_node("currency:shop", { description = S("Shop"), paramtype2 = "facedir", @@ -109,13 +179,20 @@ minetest.register_node("currency:shop", { inv:set_size("owner_wants", 3*2) inv:set_size("owner_gives", 3*2) if have_pipeworks then pipeworks.after_place(pos) end + check_stock( + pos + ) end, after_dig_node = (have_pipeworks and pipeworks and pipeworks.after_dig), tube = { insert_object = function(pos, node, stack, direction) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() - return inv:add_item("stock",stack) + local result = inv:add_item("stock",stack) + check_stock( + pos + ) + return result end, can_insert = function(pos,node,stack,direction) local meta = minetest.get_meta(pos) @@ -151,6 +228,9 @@ minetest.register_node("currency:shop", { if player:get_player_name() ~= meta:get_string("owner") then return 0 end return stack:get_count() end, + on_metadata_inventory_move = check_stock, + on_metadata_inventory_put = check_stock, + on_metadata_inventory_take = check_stock, can_dig = function(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() @@ -158,6 +238,87 @@ minetest.register_node("currency:shop", { end }) +minetest.register_node("currency:shop_empty", { + description = S("Shop") .. " (" .. S("out of stock") .. ")", + paramtype2 = "facedir", + tiles = {"shop_top.png", + "shop_top.png", + "shop_side_empty.png", + "shop_side_empty.png", + "shop_side_empty.png", + "shop_front_empty.png"}, + drop = "currency:shop", + groups = {choppy=2,oddly_breakable_by_hand=2,tubedevice=1,tubedevice_receiver=1,not_in_creative_inventory=1}, + sounds = default.node_sound_wood_defaults(), + after_dig_node = (have_pipeworks and pipeworks and pipeworks.after_dig), + tube = { + insert_object = function(pos, node, stack, direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + local result = inv:add_item("stock",stack) + check_stock( + pos + ) + return result + end, + can_insert = function(pos,node,stack,direction) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:room_for_item("stock", stack) + end, + input_inventory = "customers_gave", + connect_sides = {left = 1, right = 1, back = 1, front = 1, bottom = 1, top = 1} + }, + on_rightclick = function(pos, node, clicker, itemstack) + clicker:get_inventory():set_size("customer_gives", 3*2) + clicker:get_inventory():set_size("customer_gets", 3*2) + default.shop.current_shop[clicker:get_player_name()] = pos + local meta = minetest.get_meta(pos) + if clicker:get_player_name() == meta:get_string("owner") and not clicker:get_player_control().aux1 then + minetest.show_formspec(clicker:get_player_name(),"currency:shop_formspec",default.shop.formspec.owner(pos)) + else + minetest.show_formspec(clicker:get_player_name(),"currency:shop_formspec",default.shop.formspec.customer(pos)) + end + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") then return 0 end + return count + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + local meta = minetest.get_meta(pos) + if player:get_player_name() ~= meta:get_string("owner") 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 player:get_player_name() ~= meta:get_string("owner") then return 0 end + return stack:get_count() + end, + on_metadata_inventory_move = check_stock, + on_metadata_inventory_put = check_stock, + on_metadata_inventory_take = check_stock, + can_dig = function(pos, player) + local meta = minetest.get_meta(pos) + local inv = meta:get_inventory() + return inv:is_empty("stock") and inv:is_empty("customers_gave") and inv:is_empty("owner_wants") and inv:is_empty("owner_gives") + end +}) + +minetest.register_abm( + { + label = "shop stock check", + nodenames = { + "currency:shop", + "currency:shop_empty", + }, + interval = 1, + chance = 256, + catch_up = false, + action = check_stock, + } +) + minetest.register_on_player_receive_fields(function(sender, formname, fields) if formname == "currency:shop_formspec" and fields.exchange ~= nil and fields.exchange ~= "" then local name = sender:get_player_name() @@ -202,6 +363,9 @@ minetest.register_on_player_receive_fields(function(sender, formname, fields) pinv:add_item("customer_gets",item) end minetest.chat_send_player(name, S("Exchanged!")) + check_stock( + pos + ) else if owners_fault then minetest.chat_send_player(name, S("Exchange can not be done, contact the shop owner.")) diff --git a/textures/shop_front_empty.png b/textures/shop_front_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..1939d90e013cbcc70642894fe1247a84e7aa604b GIT binary patch literal 925 zcmV;O17iG%P)84=d%xO0@t011d>G zK~y-)JP7el96BZZNBLKcTcM@;p7+uv0QY2(af{5xX zIth1?PJt{{h)xD)W(oH9Y0k|dmzF4Azs}zDG}h&JL1$!1gi{(I&r-yl#W!_xYl}ix z5uN4OzDMJ0&AIt`a?`}fGGgE7_r*n`t&fRXAx_{SEsJvB0J1tV$v4YuC{-u7JcLtX zV&-LTEiCZp;UNI?>D9V>;~?B8l;AiPjn^gh~Ccb%Z6+NkpC{JeYfhCvR^2AC%_i_-VR?bX^L5 zfOZ1>?p}1BBMsB!+SL`bG)dBoN}BQ3A8i2EW@j0_a)r|BD#z0@*8-C$$thGS6nvKp z&pwT`gCdiUpCL&S44rcE#u{CDn~lL5muqd#K6Zkcr8~TIKjQXN51|Z$V&LKh0ePMx zQ*}gms5ojLa(ZKjM>h9R0^YA!?A-X7AL5jUJ)6-eX6CmCd@|Zko@#U^(0Pm@Oante zzw7YE=05;@KGw@_*~ju-D&0jsn;Ze)nfnbU3k8M-`{}8cKx+)NCQ~h5_*(w(c0Z6QZZSi z7&|+~&fQhQ!-(3@F{0K1ouebXQW?;651-&)F)nNVr_$pq00000NkvXXu0mjfhTx)? literal 0 HcmV?d00001 diff --git a/textures/shop_side_empty.png b/textures/shop_side_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..7bb59c6754850f3771b10e2f20e7363c4a81eb77 GIT binary patch literal 929 zcmV;S177@zP)8D;?XHK8gSU11?EK zK~y-)1;I~f9900o;oqBi^Jiyfv)RNXZrik4Eb(9qYGR|bf<>rkdQj^{FIp%)6+Mbq z#e*Pt5YdY$q7{Tz5vh_Of;C910Z|LBwXKP1Q@3rB-I<*?GjHDW`^2S%H>?+i_)&{8 zPjOrq*9&l54(d0Wy#jxxy1*T|=P+ z5=|>|C@PnvVQ3~HPS7IDQl5M97}Aj*YGWNMCC`4h#=jw)o@$~iiysI~4SDMG``~UX!U3T^l-?VedZ!PR-m&?KZJ) zjB#UBx{f2g0M`r{3N5Lu`E0Al@yi*JEWr`@jer+^-(X>8f?#rj(eW{cN83nIQCAfr z@1C_)b^{qC)LP+4pWyk|sP|7(9-YH`|0K>&OOz+xqE;!`n!3sfhB}y9BmOvb+^%1{ zMl#&Q)&@Un5cW#8zjA^rM`pSE!=E|#@;;(_C(&g|-p>f)2Ga9rO>~f>J9aa_cmbul z7_Wf{hEPSpgAeRv?wud_`mrgNHZ;yJ%Y;HA1BsLxU22ZZ9zs?squJR-tOulNL6-Fq zfa^F|fXa|&H4R_j%96Uu@#2t%?_;e+3gOaSzKHN7w#qSeMfhLFql*{#WNr`7%%A7i z5sz}bg>nOuD8>dc(a1Q~7^LI6e0%yVR=QNW1}tx{WPCc}^X2Ladd%nWkAL&#eQmO| zB(DrfyG;^>JpI(;NI!0}`=M#7s=~3FN0x8WxxL0WhYzsV6|9sc2fsMOA>C$vON2F+ zW*pLpV~o*Atp;R0#USlrx*I(4=PIx69HG0o1j0pCHMb_3yngN?XC9v7w(DZF#nu9A zN~CZd90AF2!qMNZvM|{u-#&&=B~toCjvx<1zE4YzUFq`i{yl_&PapwnkyuNu`t;Kt z@7_O2Wi544AdN<68Jl@Q6egU!YZ%9ov{aA4P4J=wAp@lDUFM~O9Y(fI<2M@gZ(Ju= zC3UX2XJ(eQOXtaYId^Q^Lf+q`7z}6(wE#