mirror of
https://gitlab.com/lunovox/minertrade.git
synced 2025-03-14 21:21:22 +00:00
370 lines
15 KiB
Lua
370 lines
15 KiB
Lua
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]"
|
|
--listcolors[slot_bg_normal;slot_bg_hover;slot_border;tooltip_bgcolor;tooltip_fontcolor]
|
|
.."listcolors[#004400EE;#008800;#00FF00;#CCCC00;#FFFFFF]"
|
|
|
|
.."label[2,-0.25;"..minetest.formspec_escape(modMinerTrade.translate("DISPENSING MACHINE")).."]"
|
|
.."label[0,0.25;"..minetest.formspec_escape("* "..minetest.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")).."]"
|
|
.."button[3,3.0;2,1;btnRefill;"..minetest.formspec_escape(modMinerTrade.translate("REFILL")).."]"
|
|
|
|
.."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;]"
|
|
--.."label[0,10.75;("..minetest.formspec_escape(modMinerTrade.translate("Ctrl + RMB → Owner Interface"))..")]"
|
|
|
|
--.."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]"
|
|
--listcolors[slot_bg_normal;slot_bg_hover;slot_border;tooltip_bgcolor;tooltip_fontcolor]
|
|
.."listcolors[#004400EE;#008800;#00FF00;#CCCC00;#FFFFFF]"
|
|
.."label[0,0;"..minetest.formspec_escape(modMinerTrade.translate("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;7.25,0.85;txtOffer;"
|
|
..minetest.formspec_escape(modMinerTrade.translate("Make an announcement about what this machine will do"))..":;"
|
|
..minetest.formspec_escape(
|
|
minetest.get_meta(pos):get_string("offer")
|
|
).."]"
|
|
.."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]"
|
|
.."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 + RMB → 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.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
|
|
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},
|
|
}
|
|
}
|
|
|
|
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.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)
|
|
modMinerTrade.setMachineFlagsAlert(pos, 0)--0 = Can send new emails
|
|
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.get_meta(pos)
|
|
local clickername = clicker:get_player_name()
|
|
minetest.show_formspec(clickername,"modMinerTrade.balcaodeloja_formspec",modMinerTrade.dispensing.formspec.customer(pos))
|
|
--[[
|
|
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.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.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.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.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 sendername = sender:get_player_name()
|
|
local pos = modMinerTrade.dispensing.loja_atual[sendername]
|
|
local meta = minetest.get_meta(pos)
|
|
local ownername = meta:get_string("owner") or ""
|
|
local offer = meta:get_string("offer") or ""
|
|
|
|
--minetest.chat_send_player(sendername,"ownername('"..ownername.."') == sendername('"..sendername.."')")
|
|
|
|
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!")
|
|
)
|
|
minetest.sound_play("sfx_alert", {object=sender, max_hear_distance=5.0,})
|
|
return
|
|
else
|
|
|
|
--minetest.chat_send_player(sendername,"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(ownername).."\n\n"
|
|
.." * "..fields.txtOffer
|
|
)
|
|
else
|
|
meta:set_string("offer", "")
|
|
meta:set_string("infotext", modMinerTrade.translate("Dispensing Machine of '%s'."):format(ownername))
|
|
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(sendername,
|
|
core.colorize("#00ff00", "["..modMinerTrade.translate("DISPENSING MACHINE").."]: ")
|
|
..modMinerTrade.translate("Dispending done!")
|
|
)
|
|
minetest.sound_play("sfx_cash_register", {object=sender, max_hear_distance=5.0,})
|
|
modMinerTrade.setMachineFlagsAlert(pos, 0)--0 = Can send new emails
|
|
else
|
|
if error_name == "owners_fault" then
|
|
modMinerTrade.errorDispensing(
|
|
modMinerTrade.translate(
|
|
--"The stock of '%s' is gone."
|
|
"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(
|
|
"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
|
|
)
|
|
else
|
|
modMinerTrade.errorDispensing(
|
|
modMinerTrade.translate("The dispending can not be done. Make sure you offer what the machine asks for!")
|
|
,sender
|
|
)
|
|
end
|
|
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"
|
|
)
|