Add shop creation and dummy admin formspec
parent
d9af1a0ce1
commit
5987b85bfb
|
@ -6,4 +6,6 @@ company.permissions = {
|
|||
BUY_LAND = "Can buy land. Requires TRANSFER_MONEY",
|
||||
INTERACT_AREA = "Can build/dig/etc on company land",
|
||||
OWNS_AREA = "Can perform general area admin actions",
|
||||
SHOP_CREATE = "Can create a shop on commercial areas",
|
||||
SHOP_ADMIN = "Can change the settings of a shop, including prices",
|
||||
}
|
||||
|
|
|
@ -1,22 +1,25 @@
|
|||
_.extend(shop, {
|
||||
_shops = {},
|
||||
_shops_by_name = {},
|
||||
_shops_by_area = {},
|
||||
_context = {}
|
||||
})
|
||||
|
||||
function shop.get_by_name(name)
|
||||
return name and shop._shops_by_name[name:lower()]
|
||||
function shop.get_by_area(aid)
|
||||
assert(type(aid) == "number")
|
||||
return shop._shops_by_area[aid]
|
||||
end
|
||||
|
||||
function shop.register_shop(name, def)
|
||||
name = name:lower()
|
||||
if shop._shops[name] then
|
||||
return false
|
||||
end
|
||||
function shop.get_by_pos(pos)
|
||||
assert(type(pos) == "table")
|
||||
local area = land.get_by_pos(pos)
|
||||
return area and shop.get_by_area(area.id)
|
||||
end
|
||||
|
||||
def.name = name
|
||||
shop._shops[#shop._shops + 1] = def
|
||||
shop._shops_by_name[name] = def
|
||||
function shop.add_shop(s)
|
||||
assert(not shop._shops_by_area[s.a_id])
|
||||
|
||||
shop._shops[#shop._shops + 1] = s
|
||||
shop._shops_by_area[s.a_id] = s
|
||||
return true
|
||||
end
|
||||
|
||||
|
@ -39,94 +42,38 @@ function shop.get_inventory_or_create(name)
|
|||
}) or shop.init_inventory(name)
|
||||
end
|
||||
|
||||
function shop.show_shop_form(player, pos)
|
||||
local playername = player:get_player_name()
|
||||
function shop.can_admin(pname, pos)
|
||||
local area = land.get_by_pos(pos)
|
||||
local comp = company.get_by_name(area.owner)
|
||||
|
||||
local meta = minetest.get_meta(pos)
|
||||
local shop_name = meta:get_string("shop_name")
|
||||
if shop_name == "" then
|
||||
shop.show_shop_config_form(playername, pos, meta)
|
||||
else
|
||||
shop.show_shop_checkout_form(playername, pos, meta)
|
||||
end
|
||||
return comp and
|
||||
company.check_perm(pname, comp.name, "SHOP_ADMIN", { pos = pos })
|
||||
end
|
||||
|
||||
local function getListnameFromPos(pos)
|
||||
local x = pos.x
|
||||
local y = pos.y
|
||||
local z = pos.y
|
||||
if x < 0 then
|
||||
x = "n" .. -x
|
||||
function shop.create_shop(pname, pos)
|
||||
local area = land.get_by_pos(pos)
|
||||
local comp = company.get_by_name(area.owner)
|
||||
|
||||
if not comp then
|
||||
return false, "You need to select a company to operate as"
|
||||
end
|
||||
if y < 0 then
|
||||
y = "n" .. -y
|
||||
|
||||
if not company.check_perm(pname, comp.name, "SHOP_CREATE", { pos = pos }) then
|
||||
return false, "Missing permission: SHOP_CREATE"
|
||||
end
|
||||
if z < 0 then
|
||||
z = "n" .. -z
|
||||
end
|
||||
return x .. "_" .. y .. "_" .. z
|
||||
|
||||
local s = shop.Shop:new()
|
||||
s.a_id = area.id
|
||||
s.name = area.name
|
||||
shop.add_shop(s)
|
||||
|
||||
shop.dirty = true
|
||||
return true
|
||||
end
|
||||
|
||||
shop.show_shop_checkout_form = lib_quickfs.register("shop:counter", function(self, playername, pos, meta)
|
||||
local owner_company = meta:get_string("owner_company")
|
||||
local comp = company.get_active(playername)
|
||||
self.pos = pos
|
||||
self.is_admin = comp and comp.name == owner_company or false
|
||||
|
||||
|
||||
local shop_name = meta:get_string("shop_name")
|
||||
local inv = shop.get_inventory_or_create(shop_name)
|
||||
local listname = getListnameFromPos(pos)
|
||||
inv:set_list(listname, {})
|
||||
inv:add_item(listname, ItemStack("default:dirt 99"))
|
||||
inv:add_item(listname, ItemStack("default:stone 99"))
|
||||
inv:add_item(listname, ItemStack("default:mese 99"))
|
||||
|
||||
return "size[10,6]list[detached:shop_inv_" .. shop_name .. ";" .. listname .. ";8,0;2,6]"
|
||||
end,
|
||||
function(self, player, formname, fields)
|
||||
|
||||
end)
|
||||
|
||||
|
||||
shop.show_shop_config_form = lib_quickfs.register("shop:counter_setup", function(self, playername, pos, meta)
|
||||
local owner_company = meta:get_string("owner_company")
|
||||
local comp = company.get_active(playername)
|
||||
if comp and comp.name == owner_company then
|
||||
self.pos = pos
|
||||
return [[
|
||||
size[5,3]
|
||||
label[0,0;Please connect this counter to a shop]
|
||||
field[0.5,1.3;4,1;shop_name;Shop Name;]
|
||||
button_exit[1,2;2,1;save;Connect]
|
||||
]]
|
||||
else
|
||||
return "size[5,2]label[0,0;" ..
|
||||
minetest.formspec_escape("You don't have the rights to " .. owner_company) ..
|
||||
"]button_exit[1,1;2,1;close;exit]"
|
||||
end
|
||||
end,
|
||||
function(self, player, formname, fields)
|
||||
local playername = player:get_player_name()
|
||||
if fields.save and self.pos then
|
||||
local meta = minetest.get_meta(self.pos)
|
||||
|
||||
-- Get Shop by name, and connect if it exists
|
||||
local shop_name = fields.shop_name
|
||||
local obj = shop.get_by_name(shop_name)
|
||||
if obj then
|
||||
meta:set_string("shop_name", obj.name)
|
||||
minetest.chat_send_player(playername, "Connected counter to shop " .. obj.name)
|
||||
else
|
||||
minetest.chat_send_player(playername, "No such shop " .. shop_name)
|
||||
end
|
||||
|
||||
-- Show form again
|
||||
shop.show_shop_form(player, self.pos)
|
||||
end
|
||||
end)
|
||||
|
||||
local storage = minetest.get_mod_storage()
|
||||
lib_utils.make_saveload(shop, storage, "_shops", "register_shop", shop.Shop)
|
||||
|
||||
shop.load()
|
||||
-- Minetest won't be available in tests
|
||||
if minetest then
|
||||
local storage = minetest.get_mod_storage()
|
||||
lib_utils.make_saveload(shop, storage, "_shops", "add_shop", shop.Shop)
|
||||
shop.load()
|
||||
end
|
||||
|
|
|
@ -9,26 +9,6 @@ ChatCmdBuilder.new("shop", function(cmd)
|
|||
end
|
||||
end)
|
||||
|
||||
cmd:sub("register :cname", function(name, sname)
|
||||
local obj = shop.Shop:new()
|
||||
obj.name = sname
|
||||
|
||||
if #sname < 3 then
|
||||
return false, "Shop names must be at least 3 characters"
|
||||
end
|
||||
|
||||
if sname:match("%W") then
|
||||
return false, "Shop names can only consist of letters and numbers"
|
||||
end
|
||||
|
||||
if shop.register_shop(sname, obj) then
|
||||
shop.dirty = true
|
||||
return true, "Registered shop"
|
||||
else
|
||||
return false, "Unable to register shop, a shop of that name already exists"
|
||||
end
|
||||
end)
|
||||
|
||||
cmd:sub("show :cname", function(name, cname)
|
||||
local obj = shop.get_by_name(cname)
|
||||
if not obj then
|
||||
|
|
|
@ -0,0 +1,43 @@
|
|||
function shop.show_shop_form(pname, pos)
|
||||
if shop.can_admin(pname, pos) then
|
||||
shop.show_admin_form(pname, pos)
|
||||
else
|
||||
minetest.chat_send_player(pname, "Shop checkout unimplemented")
|
||||
-- shop.show_shop_checkout_form(playername, pos)
|
||||
end
|
||||
end
|
||||
|
||||
shop.show_admin_form = lib_quickfs.register("shop:counter_admin", function(context, pname, pos)
|
||||
assert(shop.can_admin(pname, pos))
|
||||
|
||||
local fs = {
|
||||
"size[4,6]",
|
||||
"tablecolumns[color;text;text;text;text]",
|
||||
-- "tableoptions[background=#00000000;border=false]",
|
||||
"table[0,0;4,6;list_items;",
|
||||
"#999,Description,Stock,Price,Sales",
|
||||
}
|
||||
|
||||
-- Description Stock PricePI Sold
|
||||
|
||||
local s = shop.get_by_pos(pos)
|
||||
assert(s)
|
||||
|
||||
for _, item in pairs(s:get_items()) do
|
||||
fs[#fs + 1] = ",,"
|
||||
fs[#fs + 1] = item.description
|
||||
fs[#fs + 1] = ","
|
||||
fs[#fs + 1] = item.stock
|
||||
fs[#fs + 1] = ","
|
||||
fs[#fs + 1] = item.price
|
||||
fs[#fs + 1] = ","
|
||||
fs[#fs + 1] = item.sold
|
||||
end
|
||||
|
||||
fs[#fs + 1] = "]"
|
||||
|
||||
return table.concat(fs, "")
|
||||
end,
|
||||
function(context, player, formname, fields)
|
||||
|
||||
end)
|
|
@ -4,23 +4,23 @@ print("[shop] loading...")
|
|||
|
||||
dofile(minetest.get_modpath("shop") .. "/shop.lua")
|
||||
dofile(minetest.get_modpath("shop") .. "/api.lua")
|
||||
dofile(minetest.get_modpath("shop") .. "/gui.lua")
|
||||
dofile(minetest.get_modpath("shop") .. "/chatcmds.lua")
|
||||
|
||||
minetest.register_node("shop:counter", {
|
||||
description = "Counter",
|
||||
|
||||
on_rightclick = function(pos, node, player)
|
||||
shop.show_shop_form(player, pos)
|
||||
shop.show_shop_form(player:get_player_name(), pos)
|
||||
end,
|
||||
|
||||
after_place_node = function(pos, player)
|
||||
local playername = player:get_player_name()
|
||||
local comp = company.get_active_or_msg(playername)
|
||||
if comp then
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("infotest", "Unconfigured shop")
|
||||
meta:set_string("owner_company", comp.name)
|
||||
local pname = player:get_player_name()
|
||||
local suc, msg = shop.create_shop(pname, pos)
|
||||
if suc then
|
||||
shop.show_shop_form(pname, pos)
|
||||
else
|
||||
minetest.chat_send_player(pname, msg)
|
||||
minetest.remove_node(pos)
|
||||
return true
|
||||
end
|
||||
|
|
|
@ -1,2 +1,2 @@
|
|||
name = shop
|
||||
depends = company, lib_utils, lib_underscore, lib_quickfs
|
||||
depends = company, banking, land, lib_utils, lib_underscore, lib_quickfs
|
||||
|
|
|
@ -6,16 +6,28 @@ function Shop:new(obj)
|
|||
setmetatable(obj, self)
|
||||
self.__index = self
|
||||
obj.name = nil
|
||||
obj.a_id = nil
|
||||
return obj
|
||||
end
|
||||
|
||||
function Shop:to_table()
|
||||
return {
|
||||
name = self.name
|
||||
name = self.name,
|
||||
a_id = self.a_id
|
||||
}
|
||||
end
|
||||
|
||||
function Shop:from_table(tab)
|
||||
self.name = tab.name
|
||||
return true
|
||||
self.a_id = tab.a_id
|
||||
return self.a_id ~= nil
|
||||
end
|
||||
|
||||
function Shop:get_items()
|
||||
-- TODO: Implement this
|
||||
return {
|
||||
{ description = "Chips", stock = 1000, price = 10, sold = 100 },
|
||||
{ description = "Phones", stock = 10, price = 10000, sold = 2 },
|
||||
{ description = "Silicon", stock = 100, price = 2, sold = 0 },
|
||||
}
|
||||
end
|
||||
|
|
|
@ -16,7 +16,7 @@ function lib_quickfs.register(name, func, cb, privs)
|
|||
local context = player_contexts[playername]
|
||||
|
||||
if context and cb(context, player, formname, fields) then
|
||||
local formspec = func(context, playername)
|
||||
local formspec = func(context, playername, unpack(context.args))
|
||||
minetest.show_formspec(playername, name, formspec)
|
||||
end
|
||||
end)
|
||||
|
|
Loading…
Reference in New Issue