213 lines
7.2 KiB
Lua
213 lines
7.2 KiB
Lua
local S = kiosk.intllib
|
|
local F = minetest.formspec_escape
|
|
|
|
minetest.register_on_player_receive_fields(function(player, formname, fields)
|
|
-- check received fields for items handled by kiosk function
|
|
-- print(dump2(fields))
|
|
local ui_current_page=unified_inventory.current_page[player:get_player_name()]
|
|
if ui_current_page ~= nil then
|
|
if ui_current_page == kiosk.prefix then
|
|
for i,v in pairs(fields) do
|
|
if i == "kiosk_button_sell" then
|
|
-- Sell button is pressed and items in sell field are converted into account
|
|
kiosk.player_sell(player)
|
|
unified_inventory.set_inventory_formspec(player, "kiosk")
|
|
end
|
|
if string.sub(i, 1, 21) == "item_button_nochange_" then
|
|
-- Item in preview is pressed. One item is placed into buy field and price is shown
|
|
local buy_item=kiosk.demangle_for_formspec(i:sub(22))
|
|
-- print(dump2(buy_item))
|
|
local buy_price=kiosk.get_buy(buy_item)
|
|
print(buy_item.." @ "..buy_price)
|
|
local playername=player:get_player_name()
|
|
-- place one item
|
|
local player_inv=minetest.get_inventory({type="detached",name=playername.."_buy"})
|
|
player_inv:set_stack("main",1,{name=buy_item,count=1})
|
|
-- update formspec
|
|
unified_inventory.set_inventory_formspec(player, "kiosk")
|
|
return player,formname,{}
|
|
end
|
|
end
|
|
end
|
|
end
|
|
end)
|
|
|
|
minetest.register_on_joinplayer(function(player)
|
|
-- create detached inventories for selling and bying
|
|
local playername=player:get_player_name()
|
|
if playername == nil then return end
|
|
if playername == "" then return end
|
|
|
|
-- sell inventory with on_put function. If item is placed here the price is printed into formspec
|
|
local sell = minetest.create_detached_inventory(playername.."_sell",{
|
|
on_put = function(inv, listname, index, stack, player)
|
|
local item_stack=inv:get_stack(listname,index)
|
|
if item_stack == nil then return end
|
|
local item_name=item_stack:get_name()
|
|
if item_name == nil then return end
|
|
local item_count=item_stack:get_count()
|
|
if item_count <1 then return end
|
|
local price = kiosk.get_sell(item_name)
|
|
print("Would buy "..item_name.." @ "..price..". For "..item_count.." you get "..(item_count*price)..".")
|
|
local player_name = player:get_player_name()
|
|
unified_inventory.set_inventory_formspec(player, "kiosk")
|
|
end,
|
|
})
|
|
sell:set_size("main", 1)
|
|
|
|
-- buy inventory
|
|
local buy = minetest.create_detached_inventory(playername.."_buy", {
|
|
on_put = function(inv, listname, index, stack, player)
|
|
local player_name = player:get_player_name()
|
|
end,
|
|
allow_put = function(inv, listname, index, stack, player)
|
|
-- not allowing putting items in this field. Doesn't make sense
|
|
return 0
|
|
end,
|
|
allow_take = function(inv, listname, index, stack, player)
|
|
-- check, if account has enough money for taking itemstack
|
|
local item_stack=inv:get_stack(listname,index)
|
|
if item_stack == nil then return 0 end
|
|
local item_name=item_stack:get_name()
|
|
if item_name == nil then return 0 end
|
|
local item_count=item_stack:get_count()
|
|
if item_count <1 then return 0 end
|
|
local price = kiosk.get_buy(item_name)
|
|
local player_balance=xpfw.player_get_attribute(player,kiosk.account)
|
|
local max_allowed= (-1)
|
|
if player_balance <= price then
|
|
max_allowed= 0
|
|
end
|
|
return max_allowed
|
|
end,
|
|
on_take = function(inv, listname, index, stack, player)
|
|
-- take items from detached inventory
|
|
local item_stack=inv:get_stack(listname,index)
|
|
if item_stack == nil then return end
|
|
local item_name=item_stack:get_name()
|
|
if item_name == nil then return end
|
|
local item_count=item_stack:get_count()
|
|
if item_count <1 then return end
|
|
local price = kiosk.get_buy(item_name) * item_count
|
|
-- calc price and substract from account
|
|
xpfw.player_sub_attribute(player,kiosk.account,price)
|
|
xpfw.player_add_attribute(player,"kiosk_bought",item_count)
|
|
-- reset detached inventory
|
|
local player_inv=minetest.get_inventory({type="detached",name=player:get_player_name().."_buy"})
|
|
player_inv:set_stack("main",1,{name=item_name,count=1})
|
|
|
|
|
|
local kinv=kiosk.inventar[item_name]
|
|
kinv.stock=kinv.stock-item_count
|
|
unified_inventory.set_inventory_formspec(player, "kiosk")
|
|
end,
|
|
})
|
|
buy:set_size("main", 1)
|
|
local pdef={name=playername,
|
|
sell=sell,
|
|
buy=buy,}
|
|
kiosk.player[playername]=pdef
|
|
end)
|
|
|
|
-- register xpfw attribute
|
|
xpfw.register_attribute(kiosk.account,{min=0,max=math.huge,default=0,
|
|
hud=1,})
|
|
xpfw.register_attribute("kiosk_sold",{min=0,max=math.huge,default=0,
|
|
hud=1,})
|
|
xpfw.register_attribute("kiosk_bought",{min=0,max=math.huge,default=0,
|
|
hud=1,})
|
|
|
|
|
|
-- ui button for formspec
|
|
unified_inventory.register_button("kiosk", {
|
|
type = "image",
|
|
image = "kiosk_button_128.png",
|
|
tooltip = S("Kiosk")
|
|
})
|
|
|
|
|
|
-- ui formspec definition
|
|
unified_inventory.register_page(kiosk.prefix, {
|
|
get_formspec = function(player, perplayer_formspec)
|
|
local fy = perplayer_formspec.formspec_y
|
|
local name = player:get_player_name()
|
|
local player_inv=minetest.get_inventory({type="detached",name=name.."_sell"})
|
|
local sellprice=""
|
|
-- check sell field
|
|
if player_inv ~= nil then
|
|
local sell_stack=player_inv:get_stack("main",1)
|
|
if sell_stack ~= nil then
|
|
local sell_count = sell_stack:get_count()
|
|
if sell_count >= 1 then
|
|
sellprice=sellprice.." "..sell_count.."x"
|
|
end
|
|
local sell_item=sell_stack:get_name()
|
|
if sell_item ~= nil then
|
|
if sell_item ~= "" then
|
|
sellprice=sellprice.." "..sell_item
|
|
end
|
|
end
|
|
local price_single = kiosk.get_sell(sell_item)
|
|
local price=price_single * sell_count
|
|
sellprice=sellprice.." @ "..price
|
|
end
|
|
end
|
|
-- check buy field
|
|
local player_buy=minetest.get_inventory({type="detached",name=name.."_buy"})
|
|
local buyprice=""
|
|
if player_buy ~= nil then
|
|
local buy_stack=player_buy:get_stack("main",1)
|
|
if buy_stack ~= nil then
|
|
local buy_count = 1
|
|
if buy_count >= 1 then
|
|
buyprice=buyprice.." "..buy_count.."x"
|
|
end
|
|
local buy_item=buy_stack:get_name()
|
|
if buy_item ~= nil then
|
|
if buy_item ~= "" then
|
|
buyprice=buyprice.." "..buy_item
|
|
end
|
|
end
|
|
local price_single = kiosk.get_buy(buy_item)
|
|
local price=price_single * buy_count
|
|
buyprice=buyprice.." @ "..price
|
|
end
|
|
end
|
|
-- check account balance
|
|
local kiosk_balance=math.ceil(xpfw.player_get_attribute(player,kiosk.account)*100)/100
|
|
-- generate formspec
|
|
local formspec = "label[0,0;"..F(S("Kiosk")).."]"..
|
|
"list[detached:"..name.."_sell;main;1,1;1,1;]"..
|
|
"list[detached:"..name.."_buy;main;1,2;1,1;]"..
|
|
"button[2,1;2,1;kiosk_button_sell;"..S("Sell").."]"..
|
|
"button[2,2;2,1;kiosk_button_buy;"..S("Buy").."]"..
|
|
"label[4.0,1;"..F(sellprice).."]"..
|
|
"label[4.0,2;"..F(buyprice).."]"..
|
|
"label[2.0,3;"..F(S("Balance")..": "..kiosk_balance).."]"..
|
|
"listring[current_player;main]"..
|
|
"listring[detached:"..name.."_kiosk;kiosk]"
|
|
return {formspec=formspec}
|
|
end,
|
|
})
|
|
|
|
minetest.after(1,function()
|
|
end)
|
|
|
|
|
|
local mn_compare=function(a,b)
|
|
return kiosk.map_stat[a]>kiosk.map_stat[b]
|
|
end
|
|
|
|
minetest.register_on_generated(function(minp,maxp,seed)
|
|
local gen_vol=1
|
|
for _,i in ipairs({"x","y","z"}) do
|
|
kiosk.map_extend.emin[i]=math.min(kiosk.map_extend.emin[i],minp[i])
|
|
kiosk.map_extend.emax[i]=math.max(kiosk.map_extend.emax[i],maxp[i])
|
|
gen_vol=gen_vol*(maxp[i]-minp[i]+1)
|
|
end
|
|
kiosk.map_extend.volume=kiosk.map_extend.volume+gen_vol
|
|
print(dump2(kiosk.map_extend))
|
|
|
|
end)
|
|
|