Add shop creation and dummy admin formspec

master
rubenwardy 2018-11-23 03:01:22 +00:00
parent d9af1a0ce1
commit 5987b85bfb
8 changed files with 110 additions and 126 deletions

View File

@ -6,4 +6,6 @@ company.permissions = {
BUY_LAND = "Can buy land. Requires TRANSFER_MONEY", BUY_LAND = "Can buy land. Requires TRANSFER_MONEY",
INTERACT_AREA = "Can build/dig/etc on company land", INTERACT_AREA = "Can build/dig/etc on company land",
OWNS_AREA = "Can perform general area admin actions", 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",
} }

View File

@ -1,22 +1,25 @@
_.extend(shop, { _.extend(shop, {
_shops = {}, _shops = {},
_shops_by_name = {}, _shops_by_area = {},
_context = {} _context = {}
}) })
function shop.get_by_name(name) function shop.get_by_area(aid)
return name and shop._shops_by_name[name:lower()] assert(type(aid) == "number")
return shop._shops_by_area[aid]
end end
function shop.register_shop(name, def) function shop.get_by_pos(pos)
name = name:lower() assert(type(pos) == "table")
if shop._shops[name] then local area = land.get_by_pos(pos)
return false return area and shop.get_by_area(area.id)
end end
def.name = name function shop.add_shop(s)
shop._shops[#shop._shops + 1] = def assert(not shop._shops_by_area[s.a_id])
shop._shops_by_name[name] = def
shop._shops[#shop._shops + 1] = s
shop._shops_by_area[s.a_id] = s
return true return true
end end
@ -39,94 +42,38 @@ function shop.get_inventory_or_create(name)
}) or shop.init_inventory(name) }) or shop.init_inventory(name)
end end
function shop.show_shop_form(player, pos) function shop.can_admin(pname, pos)
local playername = player:get_player_name() local area = land.get_by_pos(pos)
local comp = company.get_by_name(area.owner)
local meta = minetest.get_meta(pos) return comp and
local shop_name = meta:get_string("shop_name") company.check_perm(pname, comp.name, "SHOP_ADMIN", { pos = pos })
if shop_name == "" then
shop.show_shop_config_form(playername, pos, meta)
else
shop.show_shop_checkout_form(playername, pos, meta)
end
end end
local function getListnameFromPos(pos) function shop.create_shop(pname, pos)
local x = pos.x local area = land.get_by_pos(pos)
local y = pos.y local comp = company.get_by_name(area.owner)
local z = pos.y
if x < 0 then if not comp then
x = "n" .. -x return false, "You need to select a company to operate as"
end 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 end
if z < 0 then
z = "n" .. -z local s = shop.Shop:new()
end s.a_id = area.id
return x .. "_" .. y .. "_" .. z s.name = area.name
shop.add_shop(s)
shop.dirty = true
return true
end end
shop.show_shop_checkout_form = lib_quickfs.register("shop:counter", function(self, playername, pos, meta) -- Minetest won't be available in tests
local owner_company = meta:get_string("owner_company") if minetest then
local comp = company.get_active(playername) local storage = minetest.get_mod_storage()
self.pos = pos lib_utils.make_saveload(shop, storage, "_shops", "add_shop", shop.Shop)
self.is_admin = comp and comp.name == owner_company or false shop.load()
end
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()

View File

@ -9,26 +9,6 @@ ChatCmdBuilder.new("shop", function(cmd)
end end
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) cmd:sub("show :cname", function(name, cname)
local obj = shop.get_by_name(cname) local obj = shop.get_by_name(cname)
if not obj then if not obj then

View File

@ -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)

View File

@ -4,23 +4,23 @@ print("[shop] loading...")
dofile(minetest.get_modpath("shop") .. "/shop.lua") dofile(minetest.get_modpath("shop") .. "/shop.lua")
dofile(minetest.get_modpath("shop") .. "/api.lua") dofile(minetest.get_modpath("shop") .. "/api.lua")
dofile(minetest.get_modpath("shop") .. "/gui.lua")
dofile(minetest.get_modpath("shop") .. "/chatcmds.lua") dofile(minetest.get_modpath("shop") .. "/chatcmds.lua")
minetest.register_node("shop:counter", { minetest.register_node("shop:counter", {
description = "Counter", description = "Counter",
on_rightclick = function(pos, node, player) on_rightclick = function(pos, node, player)
shop.show_shop_form(player, pos) shop.show_shop_form(player:get_player_name(), pos)
end, end,
after_place_node = function(pos, player) after_place_node = function(pos, player)
local playername = player:get_player_name() local pname = player:get_player_name()
local comp = company.get_active_or_msg(playername) local suc, msg = shop.create_shop(pname, pos)
if comp then if suc then
local meta = minetest.get_meta(pos) shop.show_shop_form(pname, pos)
meta:set_string("infotest", "Unconfigured shop")
meta:set_string("owner_company", comp.name)
else else
minetest.chat_send_player(pname, msg)
minetest.remove_node(pos) minetest.remove_node(pos)
return true return true
end end

View File

@ -1,2 +1,2 @@
name = shop name = shop
depends = company, lib_utils, lib_underscore, lib_quickfs depends = company, banking, land, lib_utils, lib_underscore, lib_quickfs

View File

@ -6,16 +6,28 @@ function Shop:new(obj)
setmetatable(obj, self) setmetatable(obj, self)
self.__index = self self.__index = self
obj.name = nil obj.name = nil
obj.a_id = nil
return obj return obj
end end
function Shop:to_table() function Shop:to_table()
return { return {
name = self.name name = self.name,
a_id = self.a_id
} }
end end
function Shop:from_table(tab) function Shop:from_table(tab)
self.name = tab.name 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 end

View File

@ -16,7 +16,7 @@ function lib_quickfs.register(name, func, cb, privs)
local context = player_contexts[playername] local context = player_contexts[playername]
if context and cb(context, player, formname, fields) then 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) minetest.show_formspec(playername, name, formspec)
end end
end) end)