credits-cd2025/physical.lua
Apollo 3c30082dc9 Release of V1.3
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)
2022-05-16 19:23:57 -04:00

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