minetest-game-adventuretest/mods/vendor/vendor/mese_vendor.lua

228 lines
6.6 KiB
Lua

--[[
New change:
Implement a block, which allows to send mesecon signals
after a payment. This could be useful for exclusive access
to specific rooms only for example.
]]
-- New defined for the mesecon part
vendor.mese_formspec = function(pos, player)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
local description = minetest.registered_nodes[node.name].description;
local buysell = "sell"
local cost = meta:get_int("cost")
local limit = meta:get_int("limit")
local formspec = "size[9,7;]"
.."label[0,0;Configure " .. description .. "]"
.."field[4,0;4,1;shop;;"..shop.."]"
.."field[2,3.0;2,1;cost;Price:;" .. cost .. "]"
.."label[4,2.75;Price of a signal]"
.."field[2,4.5;2,1;limit;Sale Limit:;" .. limit .. "]"
.."label[4,4.15;Total limit of signals]"
.."label[4,4.45; (0 for no limit)]"
.."button[1.5,6;3,0.5;save;Save]"
.."button_exit[4.5.5,6;3,0.5;close;Save & Close]"
return formspec
end
vendor.mese_on_receive_fields = function(pos, formname, fields, sender)
if ( fields.quit == nil ) then
return
end
local node = minetest.get_node(pos)
local description = minetest.registered_nodes[node.name].description;
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
if sender:get_player_name() ~= owner then
minetest.chat_send_player(sender:get_player_name(), "vendor: Cannot configure machine. The " .. description .. " belongs to " .. owner ..".")
return
end
local cost = tonumber(fields.cost)
local limit = tonumber(fields.limit)
local shop = fields.shop
if ( shop == "Shop Name" ) then
shop = ""
end
if ( cost == nil or cost < 0 ) then
minetest.chat_send_player(owner, "vendor: Invalid price. You must enter a positive number for the price.")
vendor.disable(pos, "Misconfigured")
return
end
if ( limit == nil or limit < 0 ) then
minetest.chat_send_player(owner, "vendor: Invalid sales limit. You must enter a positive number (or zero) for the limit.")
vendor.disable(pos, "Misconfigured")
return
end
meta:set_int("cost", cost)
meta:set_int("limit", limit)
meta:set_int("enabled", 1)
meta:set_string("formspec", vendor.mese_formspec(pos, sender))
minetest.chat_send_player(owner, "vendor: " .. description .. " is now selling exclusive signals for " .. cost .. money.currency_name)
vendor.sound_activate(pos)
vendor.mese_refresh(pos)
end
vendor.mese_refresh = function(pos, err)
local meta = minetest.get_meta(pos)
local node = minetest.get_node_or_nil(pos)
if ( node == nil ) then
return
end
if ( meta:get_int("enabled") ~= 1 ) then
return
end
local cost = meta:get_int("cost")
local owner = meta:get_string("owner")
local limit = meta:get_int("limit")
local infotext = nil
local limit_text = ""
if ( limit > 0 ) then
limit_text = " (".. limit .. " left)"
end
if ( err == nil ) then
err = ""
else
err = err .. ": "
end
infotext = err .. owner .. ' Sells exclusive Mesecon Signals for ' .. cost .. money.currency_name .. limit_text
if ( meta:get_string("infotext") ~= infotext ) then
meta:set_string("infotext", infotext)
end
end
vendor.mese_on_punch = function(pos, node, player)
local meta = minetest.get_meta(pos)
local node = minetest.get_node_or_nil(pos)
if ( node == nil ) then
return
end
local player_name = player:get_player_name()
local cost = meta:get_int("cost")
local owner = meta:get_string("owner")
local limit = meta:get_int("limit")
local enabled = meta:get_int("enabled")
local shop = meta:get_string("shop")
if ( shop == "" ) then
shop = minetest.pos_to_string(pos)
end
if not money.has_credit(player_name) then
minetest.chat_send_player(player_name, "mese_vendor: You don't have credit ('money' privilege).")
vendor.sound_error(pos)
return
end
if not money.has_credit(owner) then
vendor.mese_refresh(pos, "Account Suspended")
vendor.sound_error(pos)
return
end
if ( enabled ~= 1 ) then
vendor.sound_error(pos)
return
end
local to_account = nil
local from_account = nil
to_account = owner
from_account = player_name
local err = money.transfer(from_account, to_account, cost)
vendor_log_queue(to_account,{date=os.date("%m/%d/%Y %H:%M"),pos=shop,from=from_account,action="Sale",qty=1,desc="Mese Signal",amount=cost})
if ( err ~= nil ) then
minetest.chat_send_player(player_name, "mese_vendor: Credit transfer failed: " .. err)
vendor.sound_error(pos)
return
end
minetest.chat_send_player(player_name, "mese_vendor: You bought an exclusive signal from " .. owner .. " for " .. cost .. money.currency_name)
vendor.sound_vend(pos)
-- Start the signal and abort after 2s (lag sensitive)
mesecon:swap_node(pos, 'vendor:signal_vendor_on')
mesecon:receptor_on(pos, mesecon.rules.buttonlike_get(node))
minetest.after(2, vendor.signal_vendor_turnoff, pos)
-- end
if ( limit > 0 ) then
limit = limit - 1
meta:set_int("limit", limit)
if ( limit == 0 ) then
vendor.disable(pos, "Sold Out")
else
vendor.mese_refresh(pos)
end
end
end
vendor.signal_vendor_turnoff = function (pos)
local node = minetest.get_node(pos)
if node.name=='vendor:signal_vendor_on' then --has not been dug
mesecon:swap_node(pos, 'vendor:signal_vendor_off')
local rules = mesecon.rules.buttonlike_get(node)
mesecon:receptor_off(pos, rules)
end
end
minetest.register_node( 'vendor:signal_vendor_off', {
description = 'Signal Vendor',
tiles = {'vendor_side.png', 'vendor_side.png', 'vendor_side.png',
'vendor_side.png', 'vendor_side.png', 'vendor_vendor_front.png'},
paramtype = 'light',
paramtype2 = 'facedir',
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
after_place_node = function( pos, placer )
--print( 'Placed a new signal vendor')
local meta = minetest.get_meta(pos)
meta:set_int("cost", 0)
meta:set_int("limit", 0)
meta:set_string("owner", placer:get_player_name() or "")
meta:set_string("formspec", vendor.mese_formspec(pos, placer))
local description = minetest.registered_nodes[minetest.get_node(pos).name].description
vendor.disable(pos, "New " .. description)
end,
can_dig = vendor.can_dig,
on_receive_fields = vendor.mese_on_receive_fields,
on_punch = vendor.mese_on_punch,
mesecons = {receptor = {
state = mesecon.state.off,
rules = mesecon.rules.buttonlike_get
}},
})
minetest.register_node( 'vendor:signal_vendor_on', {
description = 'Signal Vendor',
tiles = {'vendor_side.png', 'vendor_side.png', 'vendor_side.png',
'vendor_side.png', 'vendor_side.png', 'vendor_vendor_front.png'},
paramtype = 'light',
paramtype2 = 'facedir',
drop = 'vendor:signal_vendor_off',
groups = {snappy=2,choppy=2,oddly_breakable_by_hand=2},
mesecons = {receptor = {
state = mesecon.state.on,
rules = mesecon.rules.buttonlike_get
}},
})