Compare commits
5 Commits
c71f256857
...
e2a76de50f
Author | SHA1 | Date |
---|---|---|
ac-minetest | e2a76de50f | |
ac-minetest | 7ae6aa0368 | |
rnd | 74bc6ff679 | |
rnd | 5bca45d63f | |
rnd | 16e0c7b1ba |
250
init.lua
250
init.lua
|
@ -1,14 +1,16 @@
|
||||||
--[[
|
--[[
|
||||||
basic_shop by rnd, gui design by Jozet, 2018
|
basic_shop by rnd, gui design by Jozet, 2018
|
||||||
|
|
||||||
TODO:
|
INSTRUCTIONS:
|
||||||
buying: /shop opens gui OK
|
use /sell command to sell items (make shop).
|
||||||
gui basics OK
|
admin can set up shops using negative price to make shop buy item from players - this way players can get money, but only up to 100.
|
||||||
filter OK
|
|
||||||
buy button action OK
|
|
||||||
sorting
|
|
||||||
selling: /sell price adds items in hand to shop OK
|
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- ability to reverse money - item in admin shop OK
|
||||||
|
meaning: shop owner(admin) buys item and gives money to players. admin shop has infinite money
|
||||||
|
TODO: other players can do this too. problem: need additional storage for items if player not online
|
||||||
|
rating of shops: more money player gives for item more his rating is worth
|
||||||
--]]
|
--]]
|
||||||
|
|
||||||
modname = "basic_shop";
|
modname = "basic_shop";
|
||||||
|
@ -16,18 +18,41 @@ basic_shop = {};
|
||||||
basic_shop.data = {}; -- {"item name", quantity, price, time_left, seller, minimal sell quantity}
|
basic_shop.data = {}; -- {"item name", quantity, price, time_left, seller, minimal sell quantity}
|
||||||
basic_shop.guidata = {}; -- [name] = {idx = idx, filter = filter, sort = sort } (start index on cur. page, filter item name, sort_coloumn)
|
basic_shop.guidata = {}; -- [name] = {idx = idx, filter = filter, sort = sort } (start index on cur. page, filter item name, sort_coloumn)
|
||||||
basic_shop.bank = {}; -- bank for offline players, [name] = {balance, deposit_time},
|
basic_shop.bank = {}; -- bank for offline players, [name] = {balance, deposit_time},
|
||||||
|
basic_shop.version = "20201129a"
|
||||||
basic_shop.version = "20190929a"
|
|
||||||
|
|
||||||
|
|
||||||
|
-------------------------
|
||||||
|
-- CONFIGURATION SETTINGS
|
||||||
|
-------------------------
|
||||||
|
|
||||||
|
basic_shop.items_on_page = 8 -- gui setting
|
||||||
|
basic_shop.maxprice = 1000000 -- maximum price players can set for 1 item
|
||||||
|
basic_shop.max_noob_money = 100 -- after this player no longer allowed to sell his goods to admin shop to prevent inflation
|
||||||
|
|
||||||
|
basic_shop.time_left = 60*60*24*7*2; -- 2 week before shop removed/bank account reset
|
||||||
|
|
||||||
|
basic_shop.allowances = { -- how much money players need to make more shops and levels
|
||||||
|
{5, 1}, -- noob: 5$ allows to make 1 shop
|
||||||
|
{100,5}, -- medium
|
||||||
|
{3000,25} -- pro
|
||||||
|
}
|
||||||
|
|
||||||
|
-- 2 initial admin shops to get items
|
||||||
|
basic_shop.admin_shops = { --{"item name", quantity, price, time_left, seller, minimal sell quantity}
|
||||||
|
[1] = {"default:dirt",1,-1,10^15,"*server*",1}, -- for skyblock
|
||||||
|
[2] = {"default:tree",1,-0.1,10^15,"*server*",1},
|
||||||
|
}
|
||||||
|
|
||||||
|
---------------------
|
||||||
|
-- END OF SETTINGS
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
|
||||||
basic_shop.items_on_page = 8
|
|
||||||
basic_shop.maxprice = 1000000
|
|
||||||
basic_shop.time_left = 60*60*24*7; -- 1 week before shop removed/bank account reset
|
|
||||||
|
|
||||||
local filepath = minetest.get_worldpath()..'/' .. modname;
|
local filepath = minetest.get_worldpath()..'/' .. modname;
|
||||||
minetest.mkdir(filepath) -- create if non existent
|
minetest.mkdir(filepath) -- create if non existent
|
||||||
|
|
||||||
|
|
||||||
save_shops = function()
|
save_shops = function()
|
||||||
local file,err = io.open(filepath..'/shops', 'wb');
|
local file,err = io.open(filepath..'/shops', 'wb');
|
||||||
if err then minetest.log("#basic_shop: error cant save data") return end
|
if err then minetest.log("#basic_shop: error cant save data") return end
|
||||||
|
@ -36,14 +61,27 @@ end
|
||||||
|
|
||||||
local player_shops = {}; --[name] = count
|
local player_shops = {}; --[name] = count
|
||||||
load_shops = function()
|
load_shops = function()
|
||||||
local file,err = io.open(filepath..'/shops', 'rb')
|
|
||||||
if err then minetest.log("#basic_shop: error cant load data") return end
|
|
||||||
|
|
||||||
local told = minetest.get_gametime() - basic_shop.time_left; -- time of oldest shop before timeout
|
local told = minetest.get_gametime() - basic_shop.time_left; -- time of oldest shop before timeout
|
||||||
local data = minetest.deserialize(file:read("*a")) or {};file:close()
|
local data = {}
|
||||||
|
|
||||||
|
local file,err = io.open(filepath..'/shops', 'rb')
|
||||||
|
|
||||||
|
if err then
|
||||||
|
minetest.log("#basic_shop: error cant load data. creating new shops.")
|
||||||
|
else
|
||||||
|
data = minetest.deserialize(file:read("*a")) or {};file:close()
|
||||||
|
end
|
||||||
|
|
||||||
local out = {}
|
local out = {}
|
||||||
|
if not data[1] then -- no shops yet in file
|
||||||
|
for i = 1,#basic_shop.admin_shops do -- add admin shops first
|
||||||
|
out[#out+1]= basic_shop.admin_shops[i]
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
for i = 1,#data do
|
for i = 1,#data do
|
||||||
if data[i][4]>told then -- shop is recent, not too old
|
if data[i][4]>told then -- shop is recent, not too old, otherwise (skip) remove it
|
||||||
out[#out+1] = data[i]
|
out[#out+1] = data[i]
|
||||||
player_shops[data[i][5]] = (player_shops[data[i][5]] or 0) + 1 -- how many shops player has
|
player_shops[data[i][5]] = (player_shops[data[i][5]] or 0) + 1 -- how many shops player has
|
||||||
end
|
end
|
||||||
|
@ -86,7 +124,7 @@ local check_toplist = function(name,balance) -- too small to be on toplist -- at
|
||||||
toplist[name] = balance
|
toplist[name] = balance
|
||||||
|
|
||||||
if n+1>10 then toplist[mink] = nil end --remove minimal
|
if n+1>10 then toplist[mink] = nil end --remove minimal
|
||||||
--more than 10, have to throw out smallest one
|
--more than 10 entries, have to throw out smallest one
|
||||||
|
|
||||||
|
|
||||||
minb = 10^9; mink = "" -- find new minimal element
|
minb = 10^9; mink = "" -- find new minimal element
|
||||||
|
@ -96,7 +134,7 @@ local check_toplist = function(name,balance) -- too small to be on toplist -- at
|
||||||
toplist["_min"] = mink
|
toplist["_min"] = mink
|
||||||
end
|
end
|
||||||
|
|
||||||
local display_toplist = function()
|
local display_toplist = function(name)
|
||||||
local out = {};
|
local out = {};
|
||||||
for k,v in pairs(toplist) do
|
for k,v in pairs(toplist) do
|
||||||
if k ~= "_min" then
|
if k ~= "_min" then
|
||||||
|
@ -104,11 +142,14 @@ local display_toplist = function()
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
table.sort(out, function(a,b) return a[2]>b[2] end)
|
table.sort(out, function(a,b) return a[2]>b[2] end)
|
||||||
local ret = {"TOP RICHEST"};
|
local ret = {};
|
||||||
for i = 1,#out do
|
for i = 1,#out do
|
||||||
ret[#ret+1] = i .. ". " .. out[i][1] .. " " .. out[i][2]
|
ret[#ret+1] = i .. ". " .. out[i][1] .. " " .. out[i][2]
|
||||||
end
|
end
|
||||||
minetest.chat_send_all(table.concat(ret,"\n"))
|
local form = "size [6,7] textarea[0,0.1;6.6,8.5;TOP SHOPS;TOP RICHEST;".. table.concat(ret,"\n").."]"
|
||||||
|
minetest.show_formspec(name, "basic_shop:toplist", form)
|
||||||
|
|
||||||
|
--minetest.chat_send_all(table.concat(ret,"\n"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,7 +159,7 @@ save_bank = function()
|
||||||
file:write(minetest.serialize(basic_shop.bank)); file:close()
|
file:write(minetest.serialize(basic_shop.bank)); file:close()
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.after(0, function() -- problem: before minetest.get_gametime() is nil
|
minetest.after(0, function() -- problem: before this minetest.get_gametime() is nil
|
||||||
load_shops()
|
load_shops()
|
||||||
load_bank()
|
load_bank()
|
||||||
end)
|
end)
|
||||||
|
@ -157,18 +198,21 @@ basic_shop.show_shop_gui = function(name)
|
||||||
local idx = guidata.idx;
|
local idx = guidata.idx;
|
||||||
local sort = guidata.sort;
|
local sort = guidata.sort;
|
||||||
local filter = guidata.filter;
|
local filter = guidata.filter;
|
||||||
|
if string.find(filter,"%%") then filter = "" end
|
||||||
|
|
||||||
local data = basic_shop.data; -- whole list of items for sale
|
local data = basic_shop.data; -- whole list of items for sale
|
||||||
local idxdata = {}; -- list of idx of items for sale
|
local idxdata = {}; -- list of idx of items for sale
|
||||||
|
|
||||||
if filter == "" then
|
if filter == "" then
|
||||||
for i = 1,#data do idxdata[i] = i end
|
for i = 1,#data do idxdata[i] = i end
|
||||||
|
guidata.count = #data
|
||||||
else
|
else
|
||||||
for i = 1,#data do
|
for i = 1,#data do
|
||||||
if string.find(data[i][1],filter) then
|
if string.find(data[i][1],filter) then
|
||||||
idxdata[#idxdata+1] = i
|
idxdata[#idxdata+1] = i
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
guidata.count = #idxdata
|
||||||
end
|
end
|
||||||
|
|
||||||
if guidata.sort>0 then
|
if guidata.sort>0 then
|
||||||
|
@ -183,6 +227,8 @@ basic_shop.show_shop_gui = function(name)
|
||||||
|
|
||||||
local m = basic_shop.items_on_page; -- default 8 items per page
|
local m = basic_shop.items_on_page; -- default 8 items per page
|
||||||
local n = #idxdata; -- how many items in current selection
|
local n = #idxdata; -- how many items in current selection
|
||||||
|
local pricesort = "";
|
||||||
|
if guidata.sort == 1 then pricesort = "+" elseif guidata.sort == 2 then pricesort = "-" end
|
||||||
|
|
||||||
local form = "size[10,8]".. -- width, height
|
local form = "size[10,8]".. -- width, height
|
||||||
"bgcolor[#222222cc; true]" ..
|
"bgcolor[#222222cc; true]" ..
|
||||||
|
@ -193,7 +239,7 @@ basic_shop.show_shop_gui = function(name)
|
||||||
|
|
||||||
"label[0.4,0.7;" .. minetest.colorize("#aaa", "item") .. "]" ..
|
"label[0.4,0.7;" .. minetest.colorize("#aaa", "item") .. "]" ..
|
||||||
--"label[3,0.7;" .. minetest.colorize("#aaa", "price") .. "]" ..
|
--"label[3,0.7;" .. minetest.colorize("#aaa", "price") .. "]" ..
|
||||||
"button[3,0.7;1,0.5;price;" .. minetest.colorize("#aaa", "price") .. "]" ..
|
"button[3,0.7;1.2,0.5;price;" .. minetest.colorize("#aaa", "price"..pricesort) .. "]" ..
|
||||||
"label[5,0.7;" .. minetest.colorize("#aaa", "time left") .. "]" ..
|
"label[5,0.7;" .. minetest.colorize("#aaa", "time left") .. "]" ..
|
||||||
"label[6.5,0.7;" .. minetest.colorize("#aaa", "seller") .. "]" ..
|
"label[6.5,0.7;" .. minetest.colorize("#aaa", "seller") .. "]" ..
|
||||||
|
|
||||||
|
@ -202,7 +248,7 @@ basic_shop.show_shop_gui = function(name)
|
||||||
"field[0.65,7.9;2,0.5;search;;".. guidata.filter .."] button[2.5,7.6;1.5,0.5;filter;refresh]"..
|
"field[0.65,7.9;2,0.5;search;;".. guidata.filter .."] button[2.5,7.6;1.5,0.5;filter;refresh]"..
|
||||||
"button[4,7.6;1,0.5;help;help]"..
|
"button[4,7.6;1,0.5;help;help]"..
|
||||||
"button[6.6,7.6;1,0.5;left;<] button[8.6,7.6;1,0.5;right;>]" ..
|
"button[6.6,7.6;1,0.5;left;<] button[8.6,7.6;1,0.5;right;>]" ..
|
||||||
"label[7.6,7.6; " .. math.floor(idx/m)+1 .." / " .. math.floor(n/m)+1 .."]";
|
"label[7.6,7.6; " .. math.ceil(idx/(m+1)) .." / " .. math.ceil(n/(m+1)) .."]";
|
||||||
|
|
||||||
|
|
||||||
local tabdata = {};
|
local tabdata = {};
|
||||||
|
@ -211,7 +257,7 @@ basic_shop.show_shop_gui = function(name)
|
||||||
local t = basic_shop.time_left-minetest.get_gametime();
|
local t = basic_shop.time_left-minetest.get_gametime();
|
||||||
|
|
||||||
for i = idx, idxhigh do
|
for i = idx, idxhigh do
|
||||||
local id = idxdata[i];
|
local id = idxdata[i] or 1;
|
||||||
local y = 1.3+(i-idx)*0.65
|
local y = 1.3+(i-idx)*0.65
|
||||||
local ti = tonumber(data[id][4]) or 0;
|
local ti = tonumber(data[id][4]) or 0;
|
||||||
local time_left = ""
|
local time_left = ""
|
||||||
|
@ -231,14 +277,26 @@ basic_shop.show_shop_gui = function(name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
tabdata[i-idx+1] =
|
local price = data[id][3]
|
||||||
"item_image[0.4,".. y-0.1 .. ";0.7,0.7;".. data[id][1] .. "]" .. -- image
|
if price>=0 then -- shop buys money and sells item
|
||||||
"label[1.1,".. y .. ";x ".. data[id][2] .. "/" .. data[id][6] .. "]" .. -- total_quantity
|
tabdata[i-idx+1] =
|
||||||
"label[3,".. y .. ";" .. minetest.colorize("#00ff36", data[id][3].." $") .."]" .. -- price
|
"item_image[0.4,".. y-0.1 .. ";0.7,0.7;".. data[id][1] .. "]" .. -- image
|
||||||
"label[5,".. y ..";" .. time_left .."]" .. -- time left
|
"label[1.1,".. y .. ";x ".. data[id][2] .. "/" .. data[id][6] .. "]" .. -- total_quantity
|
||||||
"label[6.5," .. y .. ";" .. minetest.colorize("#EE0", data[id][5]) .."]" .. -- seller
|
"label[3,".. y .. ";" .. minetest.colorize("#00ff36", data[id][3].." $") .."]" .. -- price
|
||||||
"image_button[8.5," .. y .. ";1.25,0.7;wool_black.png;buy".. id ..";buy ".. id .."]" -- buy button
|
"label[5,".. y ..";" .. time_left .."]" .. -- time left
|
||||||
.."tooltip[buy".. id ..";".. data[id][1] .. "]"
|
"label[6.5," .. y .. ";" .. minetest.colorize("#EE0", data[id][5]) .."]" .. -- seller
|
||||||
|
"image_button[8.5," .. y .. ";1.25,0.7;wool_black.png;buy".. id ..";buy ".. id .."]" -- buy button
|
||||||
|
.."tooltip[buy".. id ..";".. data[id][1] .. "]"
|
||||||
|
else -- shop buys item and sells money
|
||||||
|
tabdata[i-idx+1] =
|
||||||
|
"item_image[3.0,".. y-0.1 .. ";0.7,0.7;".. data[id][1] .. "]" .. -- image
|
||||||
|
"label[3.7,".. y .. ";x ".. data[id][2] .. "]" .. -- total_quantity
|
||||||
|
"label[0.4,".. y .. ";" .. minetest.colorize("#00ff36", -data[id][3].." $") .."]" .. -- price
|
||||||
|
"label[5,".. y ..";" .. time_left .."]" .. -- time left
|
||||||
|
"label[6.5," .. y .. ";" .. minetest.colorize("#EE0", data[id][5]) .."]" .. -- seller
|
||||||
|
"image_button[8.5," .. y .. ";1.25,0.7;wool_black.png;buy".. id ..";buy ".. id .."]" -- buy button
|
||||||
|
.."tooltip[buy".. id ..";".. data[id][1] .. "]"
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
minetest.show_formspec(name, "basic_shop", form .. table.concat(tabdata,""))
|
minetest.show_formspec(name, "basic_shop", form .. table.concat(tabdata,""))
|
||||||
|
@ -246,12 +304,21 @@ end
|
||||||
|
|
||||||
local dout = minetest.chat_send_all;
|
local dout = minetest.chat_send_all;
|
||||||
|
|
||||||
|
|
||||||
local make_table_copy = function(tab)
|
local make_table_copy = function(tab)
|
||||||
local out = {};
|
local out = {};
|
||||||
for i = 1,#tab do out[i] = tab[i] end
|
for i = 1,#tab do out[i] = tab[i] end
|
||||||
return out
|
return out
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local remove_shop = function(idx)
|
||||||
|
local data = {};
|
||||||
|
for i = 1,idx-1 do data[i] = make_table_copy(basic_shop.data[i]) end -- expensive, but ok for 'small'<1000 number of shops
|
||||||
|
for i = idx+1,#basic_shop.data do data[i-1] = make_table_copy(basic_shop.data[i]) end
|
||||||
|
basic_shop.data = data;
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
minetest.register_on_player_receive_fields(
|
minetest.register_on_player_receive_fields(
|
||||||
function(player, formname, fields)
|
function(player, formname, fields)
|
||||||
if formname~="basic_shop" then return end
|
if formname~="basic_shop" then return end
|
||||||
|
@ -278,14 +345,15 @@ minetest.register_on_player_receive_fields(
|
||||||
if fields.help then
|
if fields.help then
|
||||||
local name = player:get_player_name();
|
local name = player:get_player_name();
|
||||||
local text = "Make a shop using /sell command while holding item to sell in hands. "..
|
local text = "Make a shop using /sell command while holding item to sell in hands. "..
|
||||||
"As your basic income you get 1 money for each 12 minutes of play, but only up to 100.\n\n"..
|
"Players get money by selling goods into admin made shops, but only up to ".. basic_shop.allowances[2][1] .. "$.\n\n"..
|
||||||
"Depending on how much money you have (/shop_money command) you get ability to create " ..
|
"Depending on how much money you have (/shop_money command) you get ability to create " ..
|
||||||
"more shops with variable life span:\n\n"..
|
"more shops with variable life span:\n\n"..
|
||||||
" balance 0-4 : new player, can't create shops yet\n"..
|
" balance 0-" .. basic_shop.allowances[1][1]-1 .. " : new player, can't create shops yet\n"..
|
||||||
" balance 0-99 : new trader, 1 shop\n"..
|
" balance ".. basic_shop.allowances[1][1] .."-".. basic_shop.allowances[2][1]-1 .. " : new trader, " .. basic_shop.allowances[1][2] .. " shop\n"..
|
||||||
" balance 100-999 : medium trader, 5 shops\n"..
|
" balance " .. basic_shop.allowances[2][1] .. "-" .. basic_shop.allowances[3][1]-1 .. ": medium trader, " .. basic_shop.allowances[2][2] .. " shops\n"..
|
||||||
" balance 1000+ : pro trader, 25 shops\n\n"..
|
" balance " .. basic_shop.allowances[3][1] .. "+ : pro trader, " .. basic_shop.allowances[3][2] .. " shops\n\n"..
|
||||||
"All trader shop lifetime is one week ( after that shop closes down), for pro traders unlimited lifetime."
|
"All trader shop lifetime is one week ( after that shop closes down), for pro traders unlimited lifetime.\n\n"..
|
||||||
|
"Admin can set up shop that buys items and gives money by setting negative price when using /sell."
|
||||||
local form = "size [6,7] textarea[0,0;6.5,8.5;help;SHOP HELP;".. text.."]"
|
local form = "size [6,7] textarea[0,0;6.5,8.5;help;SHOP HELP;".. text.."]"
|
||||||
minetest.show_formspec(name, "basic_shop:help", form)
|
minetest.show_formspec(name, "basic_shop:help", form)
|
||||||
return
|
return
|
||||||
|
@ -297,7 +365,8 @@ minetest.register_on_player_receive_fields(
|
||||||
local n = guidata.count;
|
local n = guidata.count;
|
||||||
local m = basic_shop.items_on_page;
|
local m = basic_shop.items_on_page;
|
||||||
idx = idx - m-1;
|
idx = idx - m-1;
|
||||||
if idx<0 then idx = math.max(n - m,0)+1 end
|
if idx<0 then idx = math.max(n - n%(m+1),0)+1 end
|
||||||
|
if idx>n then idx = math.max(n-m,1) end
|
||||||
guidata.idx = idx;
|
guidata.idx = idx;
|
||||||
basic_shop.show_shop_gui(name)
|
basic_shop.show_shop_gui(name)
|
||||||
return
|
return
|
||||||
|
@ -334,39 +403,60 @@ minetest.register_on_player_receive_fields(
|
||||||
local price = shop_item[3];
|
local price = shop_item[3];
|
||||||
local seller = shop_item[5]
|
local seller = shop_item[5]
|
||||||
|
|
||||||
if seller ~= name then -- owner buys for free
|
if price >=0 then -- normal mode, sell items, buy money
|
||||||
if balance<price then
|
|
||||||
minetest.chat_send_player(name,"#basic_shop : you need " .. price .. " money to buy item " .. sel .. ", you only have " .. balance)
|
if seller ~= name then -- owner buys for free
|
||||||
|
if balance<price then
|
||||||
|
minetest.chat_send_player(name,"#basic_shop : you need " .. price .. " money to buy item " .. sel .. ", you only have " .. balance)
|
||||||
|
return
|
||||||
|
end
|
||||||
|
balance = balance - price;set_money(player,balance) -- change balance for buyer
|
||||||
|
local splayer = minetest.get_player_by_name(seller);
|
||||||
|
if splayer then
|
||||||
|
set_money(splayer, get_money(splayer) + price)
|
||||||
|
else
|
||||||
|
-- player offline, add to bank instead
|
||||||
|
local bank_account = basic_shop.bank[seller] or {}; -- {deposit time, value}
|
||||||
|
local bank_balance = bank_account[1] or 0;
|
||||||
|
basic_shop.bank[seller] = {bank_balance + price, minetest.get_gametime()} -- balance, time of deposit.
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
local inv = player:get_inventory();
|
||||||
|
inv:add_item("main",shop_item[1] .. " " .. shop_item[2]);
|
||||||
|
-- remove item from shop
|
||||||
|
|
||||||
|
shop_item[6] = shop_item[6] - shop_item[2];
|
||||||
|
shop_item[4] = minetest.get_gametime() -- time refresh
|
||||||
|
if shop_item[6]<=0 then --remove shop
|
||||||
|
player_shops[seller] = (player_shops[seller] or 1) - 1;
|
||||||
|
remove_shop(sel)
|
||||||
|
end
|
||||||
|
minetest.chat_send_player(name,"#basic_shop : you bought " .. shop_item[1] .." x " .. shop_item[2] .. ", price " .. price .." $")
|
||||||
|
|
||||||
|
else -- price<0 -> admin shop buys item, gives money to player
|
||||||
|
|
||||||
|
-- TODO: if shop owner not admin only allow sell if he online so that he can receive items.
|
||||||
|
local balance = get_money(player);
|
||||||
|
if balance>=basic_shop.max_noob_money then
|
||||||
|
minetest.chat_send_player(name,"#basic_shop: you can no longer get more money by selling goods to admin shop (to prevent inflation) but you can still get money by selling to other players.")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
balance = balance - price;set_money(player,balance) -- change balance for buyer
|
|
||||||
local splayer = minetest.get_player_by_name(seller);
|
local inv = player:get_inventory(); -- buyer, his name = name
|
||||||
if splayer then
|
if inv:contains_item("main",ItemStack(shop_item[1] .. " " .. shop_item[2])) then
|
||||||
set_money(splayer, get_money(splayer) + price)
|
inv:remove_item("main",ItemStack(shop_item[1] .. " " .. shop_item[2]));
|
||||||
else
|
balance = math.min(basic_shop.max_noob_money, balance-price)
|
||||||
-- player offline, add to bank instead
|
set_money(player,balance)
|
||||||
local bank_account = basic_shop.bank[seller] or {}; -- {deposit time, value}
|
minetest.chat_send_player(name,"#basic_shop : you sold " .. shop_item[1] .." x " .. shop_item[2] .. " for price " .. -price .." $")
|
||||||
local bank_balance = bank_account[1] or 0;
|
if balance>=basic_shop.max_noob_money then
|
||||||
basic_shop.bank[seller] = {bank_balance + price, minetest.get_gametime()} -- balance, time of deposit.
|
minetest.chat_send_player(name,"#basic_shop : CONGRATULATIONS! you are no longer noob merchant. now you can make more shops - look in help in /shop screen.")
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
local inv = player:get_inventory();
|
|
||||||
inv:add_item("main",shop_item[1] .. " " .. shop_item[2]);
|
|
||||||
-- remove item from shop
|
|
||||||
|
|
||||||
shop_item[6] = shop_item[6] - shop_item[2];
|
|
||||||
shop_item[4] = minetest.get_gametime() -- time refresh
|
|
||||||
if shop_item[6]<=0 then --remove shop
|
|
||||||
player_shops[seller] = (player_shops[seller] or 1) - 1;
|
|
||||||
local data = {};
|
|
||||||
-- expensive, but ok for 'small'<1000 number of shops
|
|
||||||
for i = 1,sel-1 do data[i] = make_table_copy(basic_shop.data[i]) end
|
|
||||||
for i = sel+1,#basic_shop.data do data[i-1] = make_table_copy(basic_shop.data[i]) end
|
|
||||||
basic_shop.data = data;
|
|
||||||
end
|
|
||||||
minetest.chat_send_player(name,"#basic_shop : you bought " .. shop_item[1] .." x " .. shop_item[2] .. ", price " .. price .." $")
|
|
||||||
|
|
||||||
basic_shop.show_shop_gui(name)
|
basic_shop.show_shop_gui(name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -387,6 +477,7 @@ minetest.register_on_joinplayer( -- if player has money from bank, give him the
|
||||||
end
|
end
|
||||||
)
|
)
|
||||||
|
|
||||||
|
--[[
|
||||||
local ts = 0
|
local ts = 0
|
||||||
minetest.register_globalstep(function(dtime) -- time based income
|
minetest.register_globalstep(function(dtime) -- time based income
|
||||||
ts = ts + dtime
|
ts = ts + dtime
|
||||||
|
@ -401,7 +492,7 @@ minetest.register_globalstep(function(dtime) -- time based income
|
||||||
end
|
end
|
||||||
|
|
||||||
end)
|
end)
|
||||||
|
--]]
|
||||||
|
|
||||||
-- CHATCOMMANDS
|
-- CHATCOMMANDS
|
||||||
|
|
||||||
|
@ -421,7 +512,7 @@ minetest.register_chatcommand("shop_top", {
|
||||||
privs = interact
|
privs = interact
|
||||||
},
|
},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
display_toplist()
|
display_toplist(name)
|
||||||
end
|
end
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -437,13 +528,13 @@ minetest.register_chatcommand("sell", {
|
||||||
for word in param:gmatch("%S+") do words[#words+1]=word end
|
for word in param:gmatch("%S+") do words[#words+1]=word end
|
||||||
local price, count, total_count
|
local price, count, total_count
|
||||||
if #words == 0 then
|
if #words == 0 then
|
||||||
minetest.chat_send_player(name,"#basic_shop " .. basic_shop.version .. " : /sell price, where price must be between 0 and " .. basic_shop.maxprice .."\nadvanced: /sell price count total_sell_count")
|
minetest.chat_send_player(name,"#basic_shop " .. basic_shop.version .. " : /sell price, where price must be between 0 and " .. basic_shop.maxprice .."\nadvanced: /sell price count total_sell_count.")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
price = tonumber(words[1]) or 0
|
price = tonumber(words[1]) or 0; price = (price>=0) and math.floor(price+0.5) or -math.floor(-price+0.5);
|
||||||
if price<0 or price>basic_shop.maxprice then
|
if price>basic_shop.maxprice then
|
||||||
minetest.chat_send_player(name,"#basic_shop: /sell price, where price must be between 0 and " .. basic_shop.maxprice .."\nadvanced: /sell price count total_sell_count")
|
minetest.chat_send_player(name,"#basic_shop: /sell price, where price must be less than " .. basic_shop.maxprice .."\nadvanced: /sell price count total_sell_count .")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
count = tonumber(words[2])
|
count = tonumber(words[2])
|
||||||
|
@ -451,6 +542,8 @@ minetest.register_chatcommand("sell", {
|
||||||
|
|
||||||
|
|
||||||
local player = minetest.get_player_by_name(name); if not player then return end
|
local player = minetest.get_player_by_name(name); if not player then return end
|
||||||
|
if price<0 and not minetest.get_player_privs(name).kick then price = - price end -- non admin players can not make shops that give money for items
|
||||||
|
|
||||||
local stack = player:get_wielded_item()
|
local stack = player:get_wielded_item()
|
||||||
local itemname = stack:get_name();
|
local itemname = stack:get_name();
|
||||||
|
|
||||||
|
@ -470,13 +563,13 @@ minetest.register_chatcommand("sell", {
|
||||||
return
|
return
|
||||||
elseif balance<100 then -- noob
|
elseif balance<100 then -- noob
|
||||||
if shop_count>1 then allow = false end -- 1 shop for noob
|
if shop_count>1 then allow = false end -- 1 shop for noob
|
||||||
elseif balance<1000 then -- medium
|
elseif balance<3000 then -- medium
|
||||||
if shop_count>5 then allow = false end -- 5 shop for medium
|
if shop_count>5 then allow = false end -- 5 shop for medium
|
||||||
else -- pro
|
else -- pro
|
||||||
if shop_count>25 then allow = false end -- 25 shop for pro
|
if shop_count>25 then allow = false end -- 25 shop for pro
|
||||||
end
|
end
|
||||||
if not allow then
|
if not allow then
|
||||||
minetest.chat_send_player(name,"#basic_shop: you need more money if you want more shops (100 for 5, 1000+ for 25).")
|
minetest.chat_send_player(name,"#basic_shop: you need more money if you want more shops (100 for 5, 3000+ for 25). Currently " .. shop_count .. " shops and " .. balance .. " money.")
|
||||||
return
|
return
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -503,11 +596,10 @@ minetest.register_chatcommand("sell", {
|
||||||
--{"item name", quantity, price, time_left, seller}
|
--{"item name", quantity, price, time_left, seller}
|
||||||
data[#data+1 ] = { itemname, count, price, minetest.get_gametime(), name, total_count};
|
data[#data+1 ] = { itemname, count, price, minetest.get_gametime(), name, total_count};
|
||||||
|
|
||||||
if balance>= 1000 then data[#data][4] = 10^15; end -- if player is 'pro' then remove time limit, shop will never be too old
|
if balance>= basic_shop.allowances[3][1] then data[#data][4] = 10^15; end -- if player is 'pro' then remove time limit, shop will never be too old
|
||||||
|
|
||||||
minetest.chat_send_player(name,"#basic_shop : " .. itemname .. " x " .. count .."/"..total_count .." put on sale for the price " .. price .. ". To remove item simply go /shop and buy it (for free).")
|
minetest.chat_send_player(name,"#basic_shop : " .. itemname .. " x " .. count .."/"..total_count .." put on sale for the price " .. price .. ". To remove item simply go /shop and buy it (for free).")
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
})
|
})
|
||||||
|
|
||||||
|
@ -531,7 +623,7 @@ minetest.register_chatcommand("shop_set_money", {
|
||||||
},
|
},
|
||||||
func = function(name, param)
|
func = function(name, param)
|
||||||
local pname, amount
|
local pname, amount
|
||||||
pname,amount = string.match(param,"(%a+) (%d+)");
|
pname,amount = string.match(param,"^([%w_]+)%s+(.+)");
|
||||||
if not pname or not amount then minetest.chat_send_player(name,"usage: shop_set_money NAME AMOUNT") return end
|
if not pname or not amount then minetest.chat_send_player(name,"usage: shop_set_money NAME AMOUNT") return end
|
||||||
amount = tonumber(amount) or 0;
|
amount = tonumber(amount) or 0;
|
||||||
local player = minetest.get_player_by_name(pname); if not player then return end
|
local player = minetest.get_player_by_name(pname); if not player then return end
|
||||||
|
|
Loading…
Reference in New Issue