modMinerTrade.dispensing = { loja_atual = {} } modMinerTrade.dispensing.formspec = { customer = function(pos) local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z local formspec = "size[8,10.5]" --..default.gui_bg --..default.gui_bg_img --..default.gui_slots .."bgcolor[#004400DD;false]" --.."background[-0.5,0;8.5,11;dispensador_frente.png]" --listcolors[slot_bg_normal;slot_bg_hover;slot_border;tooltip_bgcolor;tooltip_fontcolor] .."listcolors[#00000055;#008800;#FFFFFF]" .."label[2,-0.25;"..minetest.formspec_escape(modMinerTrade.translate("DISPENSING MACHINE")).."]" .."label[0,0.25;"..minetest.formspec_escape("* "..minetest.env:get_meta(pos):get_string("offer")).."]" .."label[0,1.0;"..minetest.formspec_escape(modMinerTrade.translate("Customer Offer"))..":]" .."list[current_player;customer_gives;0,1.5;3,2;]" .."label[0,3.5;"..minetest.formspec_escape(modMinerTrade.translate("Customer Receive"))..":]" .."list[current_player;customer_gets;0,4.0;3,2;]" .."button[3,2.0;2,1;exchange;"..minetest.formspec_escape(modMinerTrade.translate("ACCEPT")).."]" .."label[0,6.0;"..minetest.formspec_escape(modMinerTrade.translate("Current customer inventory"))..":]" .."list[current_player;main;0,6.5;8,4;]" .."label[5,1.0;"..minetest.formspec_escape(modMinerTrade.translate("The Machine Need"))..":]" .."list["..list_name..";owner_wants;5,1.5;3,2;]" .."label[5,3.5;"..minetest.formspec_escape(modMinerTrade.translate("The Machine Offer"))..":]" .."list["..list_name..";owner_gives;5,4.0;3,2;]" --.."listcolors[#00000000;#00000022;#00000000;#00000033;#FFFFFFFF]" --.."listcolors[#00000000;#00000033]" return formspec end, owner = function(pos) local list_name = "nodemeta:"..pos.x..','..pos.y..','..pos.z local formspec = "size[8,11]" .."bgcolor[#000000CC;false]" --listcolors[slot_bg_normal;slot_bg_hover;slot_border;tooltip_bgcolor;tooltip_fontcolor] .."listcolors[#88888844;#888888;#FFFFFF]" .."label[0,0;"..minetest.formspec_escape(modMinerTrade.translate("Items Received (Your Profit)"))..":]" .."list["..list_name..";customers_gave;0,0.5;3,2;]" .."label[0,2.5;"..minetest.formspec_escape(modMinerTrade.translate("Stock to Offer"))..":]" .."list["..list_name..";stock;0,3;3,2;]" .."label[5,0;"..minetest.formspec_escape(modMinerTrade.translate("You need"))..":]" .."list["..list_name..";owner_wants;5,0.5;3,2;]" .."label[5,2.5;"..minetest.formspec_escape(modMinerTrade.translate("You offer"))..":]" .."list["..list_name..";owner_gives;5,3;3,2;]" --.."label[0,5;Proprietario: Pressione (E) + Botao(RMB) no Mouse para a interface com o cliente]" --.."label[0,5;Vendedor: Evite o estoque baixo e guardar lucros no balcao.]" .."field[0.29,5.75;8,0.85;txtOffer;" ..minetest.formspec_escape(modMinerTrade.translate("Make an announcement about what this machine will do"))..":;" ..minetest.formspec_escape( minetest.env:get_meta(pos):get_string("offer") ).."]" .."label[0,6.25;"..minetest.formspec_escape(modMinerTrade.translate("Seller current inventory"))..":]" .."list[current_player;main;0,6.75.0;8,4;]" .."label[0,10.75;("..minetest.formspec_escape(modMinerTrade.translate("Ctrl + Right Click Mouse → Customer Interface"))..")]" return formspec end, } --[[ modMinerTrade.dispensing.getPrivilegio = function(listname,playername,meta) return true end --]] modMinerTrade.dispensing.getInventario = function(inv,list,playername) player = minetest.env:get_player_by_name(playername) if player then for k,v in ipairs(inv:get_list(list)) do player:get_inventory():add_item("main",v) inv:remove_item(list,v) end end end modMinerTrade.dispensing.cancel = function(meta) --[[modMinerTrade.dispensing.getInventario(meta:get_inventory(),"pl1",meta:get_string("pl1")) modMinerTrade.dispensing.getInventario(meta:get_inventory(),"pl2",meta:get_string("pl2")) meta:set_string("pl1","") meta:set_string("pl2","") meta:set_int("pl1step",0) meta:set_int("pl2step",0)]] end modMinerTrade.dispensing.exchange = function(meta) --[[modMinerTrade.dispensing.getInventario(meta:get_inventory(),"pl1",meta:get_string("pl2")) modMinerTrade.dispensing.getInventario(meta:get_inventory(),"pl2",meta:get_string("pl1")) meta:set_string("pl1","") meta:set_string("pl2","") meta:set_int("pl1step",0) meta:set_int("pl2step",0)]] end modMinerTrade.dispensing.canOpen = function(pos, playername) local meta = minetest.env:get_meta(pos) if meta:get_string("owner")==playername or (minetest.get_modpath("tradelands") and modTradeLands.getOwnerName(pos)~="" and modTradeLands.canInteract(pos, playername)) or (minetest.get_modpath("areas") and #areas:getNodeOwners(pos)>=1 and areas.canInteract(pos, playername)) then return true end return false end local box_format = { type = "fixed", fixed = { {-.5,-.5,-.3125, .5,.5+1/3,.3125} } } minetest.register_node("minertrade:dispensingmachine", { description = modMinerTrade.translate("DISPENSING MACHINE\n* Sells your items, even if you are not online."), --tiles = {"balcao_topo.png", "balcao2_baixo.png", "balcao2_lado.png"}, drawtype = "nodebox", paramtype = "light", --Nao sei pq, mas o blco nao aceita a luz se nao tiver esta propriedade paramtype2 = "facedir", sunlight_propagates = true, light_source = LIGHT_MAX, node_box = box_format, selection_box = box_format, tiles = { "dispensador_cima.png", "dispensador_baixo.png", "dispensador_esquerda.png", "dispensador_direita.png", "dispensador_traz.png", "dispensador_frente_grande.png"--.."^[transformfx" }, groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2}, sounds = default.node_sound_wood_defaults(), after_place_node = function(pos, placer, itemstack) local owner = placer:get_player_name() local meta = minetest.env:get_meta(pos) meta:set_string("infotext", modMinerTrade.translate("Dispensing Machine of '%s'."):format(owner)) meta:set_string("owner",owner) --[[meta:set_string("pl1","") meta:set_string("pl2","")]] local inv = meta:get_inventory() inv:set_size("customers_gave", 3*2) inv:set_size("stock", 3*2) inv:set_size("owner_wants", 3*2) inv:set_size("owner_gives", 3*2) end, on_rightclick = function(pos, node, clicker, itemstack) --print("minertrade:dispensing.on_rightclick aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa") clicker:get_inventory():set_size("customer_gives", 3*2) clicker:get_inventory():set_size("customer_gets", 3*2) modMinerTrade.dispensing.loja_atual[clicker:get_player_name()] = pos local meta = minetest.env:get_meta(pos) local clickername = clicker:get_player_name() if modMinerTrade.dispensing.canOpen(pos, clickername) and not clicker:get_player_control().aux1 then minetest.show_formspec(clickername,"modMinerTrade.balcaodeloja_formspec",modMinerTrade.dispensing.formspec.owner(pos)) else minetest.show_formspec(clickername,"modMinerTrade.balcaodeloja_formspec",modMinerTrade.dispensing.formspec.customer(pos)) end --return itemstack end, allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) local playername = player:get_player_name() local meta = minetest.env:get_meta(pos) if not modMinerTrade.dispensing.canOpen(pos, playername) then return 0 end return count end, allow_metadata_inventory_put = function(pos, listname, index, stack, player) local playername = player:get_player_name() local meta = minetest.env:get_meta(pos) if not modMinerTrade.dispensing.canOpen(pos, playername) then return 0 end return stack:get_count() end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) local playername = player:get_player_name() local meta = minetest.env:get_meta(pos) if not modMinerTrade.dispensing.canOpen(pos, playername) then return 0 end return stack:get_count() end, can_dig = function(pos, player) local playername = player:get_player_name() local meta = minetest.env:get_meta(pos) local inv = meta:get_inventory() local isCanDig = inv:is_empty("stock") and inv:is_empty("customers_gave") and inv:is_empty("owner_wants") and inv:is_empty("owner_gives") if isCanDig~=true then minetest.chat_send_player(playername, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("The Dispensing Machine can not be removed before being emptied!")) minetest.sound_play("sfx_alert", {object=player, max_hear_distance=5.0,}) end return isCanDig end }) minetest.register_on_player_receive_fields(function(sender, formname, fields) if formname == "modMinerTrade.balcaodeloja_formspec" then local name = sender:get_player_name() local pos = modMinerTrade.dispensing.loja_atual[name] local meta = minetest.env:get_meta(pos) local owner = meta:get_string("owner") --minetest.chat_send_player(name,"owner('"..owner.."') == name('"..name.."')") if modMinerTrade.dispensing.canOpen(pos, name) and sender:get_player_control().aux1 then minetest.chat_send_player(name, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("You can not change your own machine!") ) minetest.sound_play("sfx_alert", {object=sender, max_hear_distance=5.0,}) return else --minetest.chat_send_player(name,"fields="..dump(fields)) if fields.txtOffer ~= nil then if fields.txtOffer ~= "" then meta:set_string("offer", fields.txtOffer) meta:set_string("infotext", modMinerTrade.translate("Dispensing Machine of '%s'."):format(owner).."\n\n" .." * "..fields.txtOffer ) else meta:set_string("offer", "") meta:set_string("infotext", modMinerTrade.translate("Dispensing Machine of '%s'."):format(owner)) end minetest.sound_play("sfx_alert", {object=sender, max_hear_distance=5.0,}) return end local minv = meta:get_inventory() local pinv = sender:get_inventory() local invlist_tostring = function(invlist) local out = {} for i, item in pairs(invlist) do out[i] = item:to_string() end return out end local wants = minv:get_list("owner_wants") local gives = minv:get_list("owner_gives") if wants == nil or gives == nil then return end -- do not crash the server -- Check if we can exchange local can_exchange = true local error_name = "" for i, item in pairs(wants) do if not pinv:contains_item("customer_gives",item) then can_exchange = false break end if not minv:room_for_item("customers_gave",item) then -- verifica se compartimento de Recebimento de pagamento do vendedor tem espaço can_exchange = false error_name = "without_space_to_profit" break end end for i, item in pairs(gives) do if not minv:contains_item("stock",item) then can_exchange = false error_name = "owners_fault" break end if not pinv:room_for_item("customer_gets",item) then -- verifica se a caixa de entrega ao jogador tem espaço can_exchange = false error_name = "without_space_to_offer" break end end if fields.quit==nil then if can_exchange then for i, item in pairs(wants) do pinv:remove_item("customer_gives",item) --Remove do compartimento de Oferta de pagamento minv:add_item("customers_gave",item) --Adiciona do compartimento de Recebimento de pagamento end for i, item in pairs(gives) do minv:remove_item("stock",item) -- Remove do Estoque pinv:add_item("customer_gets",item) -- Entrega ao jogador. end minetest.chat_send_player(name, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("Dispending done!") ) minetest.sound_play("sfx_cash_register", {object=sender, max_hear_distance=5.0,}) else if error_name == "owners_fault" then minetest.chat_send_player(name, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("The stock of '%s' is gone. Contact him!"):format(owner) ) elseif error_name == "without_space_to_profit" then minetest.chat_send_player(name, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("Without enough space in Dispensing Machine to receive the customer item. (Please, contact the seller '%s'!)"):format(owner) ) elseif error_name == "without_space_to_offer" then minetest.chat_send_player(name, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("Without enough space in Dispensing Machine to receive the seller's item. (Please, empty the receiving box!)") ) else minetest.chat_send_player(name, core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ") ..modMinerTrade.translate("The dispending can not be done. Make sure you offer what the machine asks for!") ) end minetest.sound_play("sfx_failure", {object=sender, max_hear_distance=5.0,}) end end --if fields.quit==nil then end end end) minetest.register_craft({ output = 'minertrade:dispensingmachine', recipe = { {"dye:dark_green" ,"default:steel_ingot" ,"default:steel_ingot"}, {"default:glass" ,"" ,"default:steel_ingot"}, {"dye:dark_green" ,"default:steel_ingot" ,"default:mese"}, --COMENTaRIO: dye:dark_green = dye:blue[B2] + dye:yellow[C2] } }) minetest.register_alias( modMinerTrade.translate("dispensingmachine"), "minertrade:dispensingmachine" )