minertrade/item_dispensing_machine.lua

371 lines
15 KiB
Lua
Raw Permalink Normal View History

2017-03-13 18:26:38 -03:00
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.25]"
--.."bgcolor[#00880033;false]"
.."background[-0.25,-0.25;8.50,11.00;dispensador_traz.png]"
2017-03-13 18:26:38 -03:00
--listcolors[slot_bg_normal;slot_bg_hover;slot_border;tooltip_bgcolor;tooltip_fontcolor]
.."listcolors[#004400EE;#008800;#00FF00;#CCCC00;#FFFFFF]"
2017-03-13 18:26:38 -03:00
2017-03-13 23:49:12 -03:00
.."label[2,-0.25;"..minetest.formspec_escape(modMinerTrade.translate("DISPENSING MACHINE")).."]"
2022-05-15 14:28:26 -03:00
.."label[0,0.25;"..minetest.formspec_escape("* "..minetest.get_meta(pos):get_string("offer")).."]"
2017-03-13 18:26:38 -03:00
2017-03-13 23:49:12 -03:00
.."label[0,1.0;"..minetest.formspec_escape(modMinerTrade.translate("Customer Offer"))..":]"
2017-03-13 18:26:38 -03:00
.."list[current_player;customer_gives;0,1.5;3,2;]"
2017-03-13 23:49:12 -03:00
.."label[0,3.5;"..minetest.formspec_escape(modMinerTrade.translate("Customer Receive"))..":]"
2017-03-13 18:26:38 -03:00
.."list[current_player;customer_gets;0,4.0;3,2;]"
2017-03-13 23:49:12 -03:00
.."button[3,2.0;2,1;exchange;"..minetest.formspec_escape(modMinerTrade.translate("ACCEPT")).."]"
.."button[3,3.0;2,1;btnRefill;"..minetest.formspec_escape(modMinerTrade.translate("REFILL")).."]"
2017-03-13 18:26:38 -03:00
2017-03-13 23:49:12 -03:00
.."label[0,6.0;"..minetest.formspec_escape(modMinerTrade.translate("Current customer inventory"))..":]"
2017-03-13 18:26:38 -03:00
.."list[current_player;main;0,6.5;8,4;]"
2017-03-13 23:49:12 -03:00
.."label[5,1.0;"..minetest.formspec_escape(modMinerTrade.translate("The Machine Need"))..":]"
2017-03-13 18:26:38 -03:00
.."list["..list_name..";owner_wants;5,1.5;3,2;]"
2017-03-13 23:49:12 -03:00
.."label[5,3.5;"..minetest.formspec_escape(modMinerTrade.translate("The Machine Offer"))..":]"
2017-03-13 18:26:38 -03:00
.."list["..list_name..";owner_gives;5,4.0;3,2;]"
--.."label[0,10.75;("..minetest.formspec_escape(modMinerTrade.translate("Ctrl + RMB → Owner Interface"))..")]"
2017-03-13 18:26:38 -03:00
--.."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,10.50]"
--.."bgcolor[#00880033;false]"
.."background[-0.25,-0.25;8.50,11.25;dispensador_traz.png]"
2017-03-13 18:26:38 -03:00
--listcolors[slot_bg_normal;slot_bg_hover;slot_border;tooltip_bgcolor;tooltip_fontcolor]
.."listcolors[#004400EE;#008800;#00FF00;#CCCC00;#FFFFFF]"
2020-04-15 20:39:25 -03:00
.."label[0,0;"..minetest.formspec_escape(modMinerTrade.translate("Received (Your Profit)"))..":]"
2017-03-13 18:26:38 -03:00
.."list["..list_name..";customers_gave;0,0.5;3,2;]"
2017-03-13 23:49:12 -03:00
.."label[0,2.5;"..minetest.formspec_escape(modMinerTrade.translate("Stock to Offer"))..":]"
2017-03-13 18:26:38 -03:00
.."list["..list_name..";stock;0,3;3,2;]"
2017-03-13 23:49:12 -03:00
.."label[5,0;"..minetest.formspec_escape(modMinerTrade.translate("You need"))..":]"
2017-03-13 18:26:38 -03:00
.."list["..list_name..";owner_wants;5,0.5;3,2;]"
2017-03-13 23:49:12 -03:00
.."label[5,2.5;"..minetest.formspec_escape(modMinerTrade.translate("You offer"))..":]"
2017-03-13 18:26:38 -03:00
.."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;7.25,0.85;txtOffer;"
2017-03-13 23:49:12 -03:00
..minetest.formspec_escape(modMinerTrade.translate("Make an announcement about what this machine will do"))..":;"
2017-03-13 18:26:38 -03:00
..minetest.formspec_escape(
2022-05-15 14:28:26 -03:00
minetest.get_meta(pos):get_string("offer")
2017-03-13 18:26:38 -03:00
).."]"
.."image_button_exit[7.25,5.4;0.8,0.8;sbl_disket.png;btnSaveText;]"
.."tooltip[btnSaveText;"..minetest.formspec_escape(modMinerTrade.translate("Save The Announcement"))..";#CCCC00;#000000]"
2017-03-13 23:49:12 -03:00
.."label[0,6.25;"..minetest.formspec_escape(modMinerTrade.translate("Seller current inventory"))..":]"
2017-03-13 18:26:38 -03:00
.."list[current_player;main;0,6.75.0;8,4;]"
--.."label[0,10.75;("..minetest.formspec_escape(modMinerTrade.translate("Ctrl + RMB → Customer Interface"))..")]"
2017-03-13 18:26:38 -03:00
return formspec
end,
}
2017-03-13 23:49:12 -03:00
--[[
2017-03-13 18:26:38 -03:00
modMinerTrade.dispensing.getPrivilegio = function(listname,playername,meta)
return true
end
2017-03-13 23:49:12 -03:00
--]]
2017-03-13 18:26:38 -03:00
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)
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
if
meta:get_string("owner")==playername
or minetest.get_player_privs(playername).protection_bypass
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
2017-03-13 18:26:38 -03:00
end
local box_format = {
type = "fixed",
fixed = {
--{-.5,-.5,-.3125, .5,.5+1/3,.3125},
{-.5,-.1875,-.3250, .5, .5000,.3000},
{-.5,-.5000,-.3000, .5,-.1875,.3000},
}
2017-03-13 18:26:38 -03:00
}
minetest.register_node("minertrade:dispensingmachine", {
2017-03-15 16:02:43 -03:00
description = modMinerTrade.translate("DISPENSING MACHINE\n* Sells your items, even if you are not online."),
2017-03-13 18:26:38 -03:00
--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()
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2017-03-13 23:49:12 -03:00
meta:set_string("infotext", modMinerTrade.translate("Dispensing Machine of '%s'."):format(owner))
2017-03-13 18:26:38 -03:00
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)
2020-04-15 20:46:19 -03:00
modMinerTrade.setMachineFlagsAlert(pos, 0)--0 = Can send new emails
2017-03-13 18:26:38 -03:00
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
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2017-03-13 18:26:38 -03:00
local clickername = clicker:get_player_name()
minetest.show_formspec(clickername,"modMinerTrade.balcaodeloja_formspec",modMinerTrade.dispensing.formspec.customer(pos))
--[[
2017-03-13 18:26:38 -03:00
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))
2017-03-13 18:26:38 -03:00
end
--]]
2017-03-13 18:26:38 -03:00
--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()
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2017-03-13 18:26:38 -03:00
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()
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2017-03-13 18:26:38 -03:00
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()
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2017-03-13 18:26:38 -03:00
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()
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2017-03-13 18:26:38 -03:00
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!"))
2017-03-13 18:26:38 -03:00
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 sendername = sender:get_player_name()
local pos = modMinerTrade.dispensing.loja_atual[sendername]
2022-05-15 14:28:26 -03:00
local meta = minetest.get_meta(pos)
2020-04-15 20:39:25 -03:00
local ownername = meta:get_string("owner") or ""
local offer = meta:get_string("offer") or ""
--minetest.chat_send_player(sendername,"ownername('"..ownername.."') == sendername('"..sendername.."')")
2017-03-13 18:26:38 -03:00
if fields.btnRefill then
if modMinerTrade.dispensing.canOpen(pos, sendername) then
minetest.show_formspec(sendername,"modMinerTrade.balcaodeloja_formspec",modMinerTrade.dispensing.formspec.owner(pos))
else
minetest.chat_send_player(sendername,
core.colorize("#ff0000", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ")
..modMinerTrade.translate("You cannot fill the dispensing machine if you are not the owner!")
)
minetest.sound_play("sfx_alert", {object=sender, max_hear_distance=5.0,})
end
return
end
if modMinerTrade.dispensing.canOpen(pos, sendername) and sender:get_player_control().aux1 then
minetest.chat_send_player(sendername,
core.colorize("#ff0000", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ")
..modMinerTrade.translate("You can not change your own machine!")
)
2017-03-13 18:26:38 -03:00
minetest.sound_play("sfx_alert", {object=sender, max_hear_distance=5.0,})
return
else
--minetest.chat_send_player(sendername,"fields="..dump(fields))
2017-03-13 18:26:38 -03:00
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(ownername).."\n\n"
2017-03-13 18:26:38 -03:00
.." * "..fields.txtOffer
)
else
meta:set_string("offer", "")
meta:set_string("infotext", modMinerTrade.translate("Dispensing Machine of '%s'."):format(ownername))
2017-03-13 18:26:38 -03:00
end
2017-03-15 16:45:28 -03:00
minetest.sound_play("sfx_alert", {object=sender, max_hear_distance=5.0,})
2017-03-15 16:02:43 -03:00
return
2017-03-13 18:26:38 -03:00
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 = ""
2017-03-13 18:26:38 -03:00
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
2017-03-13 18:26:38 -03:00
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
2017-03-13 18:26:38 -03:00
end
end
2017-03-15 16:02:43 -03:00
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
2017-03-15 16:02:43 -03:00
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.
2017-03-15 16:02:43 -03:00
end
minetest.chat_send_player(sendername,
core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ")
..modMinerTrade.translate("Dispending done!")
)
2017-03-15 16:02:43 -03:00
minetest.sound_play("sfx_cash_register", {object=sender, max_hear_distance=5.0,})
2020-04-15 20:46:19 -03:00
modMinerTrade.setMachineFlagsAlert(pos, 0)--0 = Can send new emails
2017-03-13 18:26:38 -03:00
else
if error_name == "owners_fault" then
modMinerTrade.errorDispensing(
modMinerTrade.translate(
--"The stock of '%s' is gone."
2020-04-15 20:39:25 -03:00
"The Dispensing Machine with offer '%s' cannot deliver more items to '%s' because stock of '%s' is empty!"
):format(offer, sendername, ownername)
,sender ,pos ,ownername
)
elseif error_name == "without_space_to_profit" then
modMinerTrade.errorDispensing(
modMinerTrade.translate(
2020-04-15 20:39:25 -03:00
"The Dispensing Machine with offer '%s' is out of space to receive customer item '%s'."
):format(offer, sendername)
,sender ,pos ,ownername
)
elseif error_name == "without_space_to_offer" then
modMinerTrade.errorDispensing(
modMinerTrade.translate("Without enough space in Dispensing Machine to receive the seller's item. (Please, empty the receiving box!)")
,sender
)
2017-03-15 16:02:43 -03:00
else
modMinerTrade.errorDispensing(
modMinerTrade.translate("The dispending can not be done. Make sure you offer what the machine asks for!")
,sender
)
2017-03-15 16:02:43 -03:00
end
2017-03-13 18:26:38 -03:00
end
2017-03-15 16:02:43 -03:00
end --if fields.quit==nil then
2017-03-13 18:26:38 -03:00
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]
}
})
2017-03-13 23:49:12 -03:00
minetest.register_alias(
modMinerTrade.translate("dispensingmachine"),
"minertrade:dispensingmachine"
)