3c30082dc9
Version 1.3 adds more of a "bank note" style credit thus allowing physical credits to take on unlimited value so long as one does impliment a check for their real value. (shop mods don't properly check this, thus they won't handle it correctly, thus our own shop mod is badly needed)
120 lines
4.6 KiB
Lua
120 lines
4.6 KiB
Lua
|
|
-- This is just the physical interface
|
|
-- See digital.lua for the digital interface
|
|
|
|
-- I need to improve the mk2 and mk3 so dump can use them too, since 1000 credits could be represented as about 111 credits_mk2
|
|
|
|
-- The physical item
|
|
minetest.register_craftitem("credits:credits", {
|
|
short_description = credits.S("Credit"),
|
|
description = credits.S("Credit\nValue: 1"),
|
|
inventory_image = "credits_credits_blue.png",
|
|
stack_max = 50000,
|
|
value = 1, -- How much it actually is worth (this allows me to do withdraw into a single item then handle loading it back in)
|
|
on_secondary_use = function (stack, user, pointed)
|
|
if user ~= nil then
|
|
local _, rc = credits.load(user:get_player_name())
|
|
if rc ~= nil then
|
|
minetest.chat_send_player(user:get_player_name(), rc)
|
|
end
|
|
end
|
|
-- Doesn't matter what I return the stack should be kept unless modifed by credits load
|
|
end
|
|
})
|
|
|
|
-- An alias of the physical item
|
|
minetest.register_alias("credits", "credits:credits")
|
|
|
|
-- Add Crafts
|
|
minetest.register_craft({
|
|
type = "fuel",
|
|
recipe = "credits:credits",
|
|
burntime = 1 -- For those who just litteraly want to burn money (This will actually only burn for 1 regardless the value, thus not quite good)
|
|
})
|
|
|
|
-- Checks the player's physical inventory for credits (Given by /credits dump ##)
|
|
credits.get_balance_physical_all = function(pname)
|
|
local p = minetest.get_player_by_name(pname)
|
|
local bal = 0
|
|
if p ~= nil then
|
|
local inv = minetest.get_inventory({type="player", name=pname})
|
|
for i, stack in ipairs(inv:get_list("main")) do
|
|
if stack:get_name() == "credits:credits" then
|
|
local meta = stack:get_meta()
|
|
local value = 1
|
|
if meta:get_int("value") ~= nil then
|
|
value = meta:get_int("value")
|
|
end
|
|
bal = bal + (stack:get_count() * value)
|
|
end
|
|
end
|
|
end
|
|
return bal
|
|
end
|
|
|
|
-- Checks the player's physical hand for credits
|
|
credits.get_balance_physical = function(pname)
|
|
local p = minetest.get_player_by_name(pname)
|
|
local bal = 0
|
|
if p ~= nil then
|
|
local stack = p:get_wielded_item()
|
|
if stack:get_name() == "credits:credits" then
|
|
local meta = stack:get_meta()
|
|
local value = 1
|
|
if meta:get_int("value") ~= nil then
|
|
value = meta:get_int("value")
|
|
end
|
|
bal = bal + (stack:get_count() * value)
|
|
end
|
|
end
|
|
return bal
|
|
end
|
|
|
|
-- These are commands used in calls that perform various tasks. (once in cmds.lua)
|
|
|
|
-- Dump from digital into physical
|
|
credits.dump = function (name, amount)
|
|
local amt = tonumber(amount) or 0
|
|
local bal = credits.get_balance_digital(name)
|
|
local inv = minetest.get_inventory({type="player", name=name})
|
|
if amt ~= 0 and amt > 0 then
|
|
if bal >= amt then
|
|
local stack = ItemStack("credits:credits 1") -- We spawn one of these in
|
|
local meta = stack:get_meta()
|
|
-- Poof, no more limit! \o/ Yay!
|
|
meta:set_int("value", amt) -- Set it's value, and update it's description
|
|
meta:set_string("description", credits.S("Credit\nValue: "..tostring(amt)))
|
|
if inv:room_for_item("main", stack) then
|
|
inv:add_item("main", stack)
|
|
credits.add_coin(name, -amt)
|
|
return true, credits.S("Converted @1 credits", amt)
|
|
else
|
|
return false, credits.S("You don't have enough space to store @1 credits", amt)
|
|
end
|
|
else
|
|
return false, credits.S("You don't have @1 credits to convert", amt)
|
|
end
|
|
else
|
|
return true, "Aborted dump"
|
|
end
|
|
end
|
|
|
|
-- Load physical into digital
|
|
credits.load = function (name)
|
|
local bal = credits.get_balance_physical(name) -- The quick and dirty way to know how many there are (Only get's the hands)
|
|
local player = minetest.get_player_by_name(name) -- Obtain player
|
|
local stack = player:get_wielded_item() -- Obtain the hand's item
|
|
-- Actually remove them if processed
|
|
if stack:get_name() == "credits:credits" then
|
|
player:set_wielded_item("")
|
|
-- These are actually to invalidate them (they are worth 0 thanks to this update)
|
|
elseif stack:get_name() == "credits:credits_mkii" then
|
|
player:set_wielded_item("")
|
|
elseif stack:get_name() == "credits:credits_mkiii" then
|
|
player:set_wielded_item("")
|
|
end
|
|
-- Ha, now we add the digital based on the first dirty and quick check
|
|
credits.add_coin(name, bal)
|
|
return true, credits.S("Converted @1 credits", bal)
|
|
end
|