minetest_easyvend/easyvend.lua

295 lines
12 KiB
Lua
Raw Normal View History

2012-09-12 14:58:46 -07:00
---
--vendor
--Copyright (C) 2012 Bad_Command
2014-11-22 15:19:44 -08:00
--Rewrited by Andrej
2012-09-12 14:58:46 -07:00
--
--This library is free software; you can redistribute it and/or
--modify it under the terms of the GNU Lesser General Public
--License as published by the Free Software Foundation; either
--version 2.1 of the License, or (at your option) any later version.
--
--This program is distributed in the hope that it will be useful,
--but WITHOUT ANY WARRANTY; without even the implied warranty of
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
--GNU General Public License for more details.
--
--You should have received a copy of the GNU Lesser General Public
--License along with this library; if not, write to the Free Software
--Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
---
2012-09-12 14:55:10 -07:00
2016-09-01 12:56:09 -07:00
easyvend.set_formspec = function(pos, player)
local meta = minetest.get_meta(pos)
local node = minetest.get_node(pos)
2012-09-12 14:55:10 -07:00
local description = minetest.registered_nodes[node.name].description;
2012-09-12 14:55:10 -07:00
local number = meta:get_int("number")
local cost = meta:get_int("cost")
meta:set_string("formspec", "size[8,7;]"
.."label[0,0;" .. description .. "]"
2012-09-12 14:55:10 -07:00
.."list[current_name;item;0,1;1,1;]"
.."field[1.3,1.3;1,1;number;Count:;" .. number .. "]"
2012-09-12 14:55:10 -07:00
.."list[current_name;gold;0,2;1,1;]"
.."field[1.3,2.3;1,1;cost;Price:;" .. cost .. "]"
2012-09-12 14:55:10 -07:00
.."button[3,2;2,0.5;save;OK]"
.."list[current_player;main;0,3;8,4;]")
2012-09-12 14:55:10 -07:00
end
2016-09-01 12:56:09 -07:00
easyvend.on_receive_fields_owner = function(pos, formname, fields, sender)
if not fields.save then
return
end
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
2012-09-12 14:55:10 -07:00
local number = tonumber(fields.number)
local cost = tonumber(fields.cost)
local inv_self = meta:get_inventory()
2012-09-12 14:55:10 -07:00
local itemstack = inv_self:get_stack("item",1)
local itemname=""
local oldnumber = meta:get_int("number")
local oldcost = meta:get_int("cost")
2012-09-12 14:55:10 -07:00
if ( number == nil or number < 1 or number > 99) then
minetest.chat_send_player(sender:get_player_name(), "Invalid item count; must be between 1 and 99!")
easyvend.sound_error(sender:get_player_name())
meta:set_int("number", oldnumber)
easyvend.set_formspec(pos, sender)
return
elseif ( cost == nil or cost < 1 or cost > 99) then
minetest.chat_send_player(sender:get_player_name(), "Invalid price; must be between 1 and 99!")
easyvend.sound_error(sender:get_player_name())
meta:set_int("cost", oldcost)
easyvend.set_formspec(pos, sender)
return
elseif ( itemstack == nil or itemstack:is_empty() ) then
minetest.chat_send_player(sender:get_player_name(), "You must specify an item!")
easyvend.sound_error(sender:get_player_name())
return
end
meta:set_int("number", number)
meta:set_int("cost", cost)
itemname=itemstack:get_name()
meta:set_string("itemname", itemname)
easyvend.sound_setup(pos)
easyvend.set_formspec(pos, sender)
end
2016-09-01 12:56:09 -07:00
easyvend.on_receive_fields_customer = function(pos, formname, fields, sender)
if not fields.save then
return
end
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
local number = meta:get_int("number")
local cost = meta:get_int("cost")
local itemname=meta:get_string("itemname")
local buysell = "sell"
2016-09-01 12:56:09 -07:00
if ( node.name == "easyvend:depositor" ) then
buysell = "buy"
2012-09-12 14:55:10 -07:00
end
2016-09-01 13:52:30 -07:00
if ( number == nil or number < 1 or number > 99) or
( cost == nil or cost < 1 or cost > 99) or
( itemname == nil or itemname=="") then
minetest.chat_send_player(sender:get_player_name(), "Machine has not been configured properly!")
easyvend.sound_error(sender:get_player_name())
return
2012-09-12 14:55:10 -07:00
end
2016-09-01 13:52:30 -07:00
local chest = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z})
if chest.name=="default:chest_locked" and sender and sender:is_player() then
local chest_meta = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z})
local chest_inv = chest_meta:get_inventory()
local player_inv = sender:get_inventory()
if ( chest_meta:get_string("owner") == meta:get_string("owner") and chest_inv ~= nil and player_inv ~= nil ) then
local stack = {name=itemname, count=number, wear=0, metadata=""}
local price = {name="default:gold_ingot", count=cost, wear=0, metadata=""}
2016-09-01 13:52:30 -07:00
local chest_has, player_has, chest_free, player_free
if buysell == "sell" then
2016-09-01 13:52:30 -07:00
chest_has = chest_inv:contains_item("main", stack)
player_has = player_inv:contains_item("main", price)
chest_free = chest_inv:room_for_item("main", stack)
player_free = chest_inv:room_for_item("main", price)
if chest_has and player_has and chest_free and player_free then
player_inv:remove_item("main", price)
2014-11-22 15:19:44 -08:00
stack = chest_inv:remove_item("main", stack)
chest_inv:add_item("main", price)
player_inv:add_item("main", stack)
minetest.chat_send_player(sender:get_player_name(), "You bought item.")
2016-09-01 12:56:09 -07:00
easyvend.sound_vend(pos)
2016-09-01 13:52:30 -07:00
elseif chest_has and player_has then
local msg
if not player_free and not chest_free then
msg = "No room in neither your nor the chest's inventory!"
elseif not player_free then
msg = "No room in your inventory!"
elseif not chest_free then
msg = "No room in the chest's inventory!"
end
minetest.chat_send_player(sender:get_player_name(), msg)
2016-09-01 13:01:39 -07:00
easyvend.sound_error(sender:get_player_name())
else
2016-09-01 13:52:30 -07:00
if not chest_has and not player_has then
msg = "You can't afford this item, and the vending machine has insufficient materials!"
elseif not chest_has then
msg = "The vending machine has insufficient materials!"
elseif not player_has then
msg = "You can't afford this item!"
end
minetest.chat_send_player(sender:get_player_name(), msg)
2016-09-01 13:01:39 -07:00
easyvend.sound_error(sender:get_player_name())
end
else
2016-09-01 13:52:30 -07:00
chest_has = chest_inv:contains_item("main", price)
player_has = player_inv:contains_item("main", stack)
chest_free = chest_inv:room_for_item("main", price)
player_free = chest_inv:room_for_item("main", stack)
if chest_has and player_has and chest_free and player_free then
2014-11-22 15:19:44 -08:00
stack = player_inv:remove_item("main", stack)
chest_inv:remove_item("main", price)
chest_inv:add_item("main", stack)
player_inv:add_item("main", price)
minetest.chat_send_player(sender:get_player_name(), "You sold item.")
2016-09-01 12:56:09 -07:00
easyvend.sound_deposit(pos)
2016-09-01 13:52:30 -07:00
elseif chest_has and player_has then
local msg
if not player_free and not chest_free then
msg = "No room in neither your nor the chest's inventory!"
elseif not player_free then
msg = "No room in your inventory!"
elseif not chest_free then
msg = "No room in the chest's inventory!"
end
minetest.chat_send_player(sender:get_player_name(), msg)
2016-09-01 13:01:39 -07:00
easyvend.sound_error(sender:get_player_name())
else
2016-09-01 13:52:30 -07:00
if not chest_has and not player_has then
msg = "You have insufficient materials, and the depositing machine can't afford to pay you!"
elseif not chest_has then
msg = "The depositing machine can't afford to pay you!"
elseif not player_has then
msg = "You have insufficient materials!"
end
minetest.chat_send_player(sender:get_player_name(), msg)
2016-09-01 13:01:39 -07:00
easyvend.sound_error(sender:get_player_name())
end
end
else
2016-09-01 13:52:30 -07:00
minetest.chat_send_player(sender:get_player_name(), "The machine's storage can't be accessed because it is owned by a different person!")
2016-09-01 13:01:39 -07:00
easyvend.sound_error(sender:get_player_name())
end
else
if sender and sender:is_player() then
2016-09-01 13:52:30 -07:00
minetest.chat_send_player(sender:get_player_name(), "Machine has no storage; it requires a locked chest below it to function.")
2016-09-01 13:01:39 -07:00
easyvend.sound_error(sender:get_player_name())
end
end
--do transaction here
2012-09-12 14:55:10 -07:00
end
2016-09-01 12:56:09 -07:00
easyvend.after_place_node = function(pos, placer)
local node = minetest.get_node(pos)
local meta = minetest.get_meta(pos)
local inv = meta:get_inventory()
local description = minetest.registered_nodes[node.name].description;
2014-11-22 15:19:44 -08:00
local player_name = placer:get_player_name()
inv:set_size("item", 1)
inv:set_size("gold", 1)
inv:set_stack( "gold", 1, "default:gold_ingot" )
2014-11-22 15:19:44 -08:00
meta:set_string("infotext", player_name.." - "..description)
meta:set_int("number", 1)
meta:set_int("cost", 1)
meta:set_string("itemname", "")
2012-09-12 14:55:10 -07:00
meta:set_string("owner", placer:get_player_name() or "")
2016-09-01 12:56:09 -07:00
easyvend.set_formspec(pos, placer)
2012-09-12 14:55:10 -07:00
end
2016-09-01 12:56:09 -07:00
easyvend.can_dig = function(pos, player)
2014-11-22 15:19:44 -08:00
local chest = minetest.get_node({x=pos.x,y=pos.y-1,z=pos.z})
local meta_chest = minetest.get_meta({x=pos.x,y=pos.y-1,z=pos.z});
if chest.name=="default:chest_locked" then
if player and player:is_player() then
local owner_chest = meta_chest:get_string("owner")
local name = player:get_player_name()
if name == owner_chest then
return true --chest owner can dig shop
end
end
return false
else
return true --if no chest, enyone can dig this shop
end
2012-09-12 14:55:10 -07:00
end
2016-09-01 12:56:09 -07:00
easyvend.on_receive_fields = function(pos, formname, fields, sender)
local meta = minetest.get_meta(pos)
local owner = meta:get_string("owner")
if sender:get_player_name() == owner then
2016-09-01 12:56:09 -07:00
easyvend.on_receive_fields_owner(pos, formname, fields, sender)
else
2016-09-01 12:56:09 -07:00
easyvend.on_receive_fields_customer(pos, formname, fields, sender)
2012-09-12 14:55:10 -07:00
end
end
2016-09-01 13:01:39 -07:00
easyvend.sound_error = function(playername)
minetest.sound_play("easyvend_error", {to_player = playername, gain = 1.0})
end
easyvend.sound_setup= function(pos)
minetest.sound_play("easyvend_activate", {pos = pos, gain = 1.0, max_hear_distance = 10,})
end
2016-09-01 12:56:09 -07:00
easyvend.sound_vend = function(pos)
minetest.sound_play("easyvend_vend", {pos = pos, gain = 1.0, max_hear_distance = 5,})
2012-09-12 14:55:10 -07:00
end
2016-09-01 12:56:09 -07:00
easyvend.sound_deposit = function(pos)
minetest.sound_play("easyvend_deposit", {pos = pos, gain = 1.0, max_hear_distance = 5,})
2016-09-01 12:35:50 -07:00
end
2012-09-12 14:55:10 -07:00
2016-09-01 12:56:09 -07:00
easyvend.allow_metadata_inventory_put = function(pos, listname, index, stack, player)
if listname=="item" then
local meta = minetest.get_meta(pos);
local owner = meta:get_string("owner")
local name = player:get_player_name()
if name == owner then
local inv = meta:get_inventory()
if stack==nil then
inv:set_stack( "item", 1, nil )
else
inv:set_stack( "item", 1, stack:get_name() )
end
end
end
return 0
end
2012-09-12 14:55:10 -07:00
2016-09-01 12:56:09 -07:00
easyvend.allow_metadata_inventory_take = function(pos, listname, index, stack, player)
return 0
2012-09-12 14:55:10 -07:00
end
2016-09-01 12:56:09 -07:00
easyvend.allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player)
return 0
2014-11-22 15:19:44 -08:00
end