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",
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",
}

View File

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

View File

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

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") .. "/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

View File

@ -1,2 +1,2 @@
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)
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

View File

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