emeraldbank/functions.lua
2023-08-30 02:58:29 +02:00

173 lines
5.9 KiB
Lua

-- Copyright (C) 2021, 2023 Ale
-- This file is part of Emeraldbank Minetest Mod.
-- Emeraldbank is free software: you can redistribute it and/or modify
-- it under the terms of the GNU Affero General Public License as
-- published by the Free Software Foundation, either version 3 of the
-- License, or (at your option) any later version.
-- Emeraldbank is distributed in the hope that it will be useful,
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-- GNU Affero General Public License for more details.
-- You should have received a copy of the GNU Affero General Public License
-- along with Emeraldbank. If not, see <https://www.gnu.org/licenses/>.
local S = core.get_translator(core.get_current_modname())
function emeraldbank.add_emeralds(player, num)
if not player then return false end
local meta = player:get_meta()
local name = player:get_player_name()
atm.read_account(name)
if num then
if atm.balance[name] then
atm.balance[name] = math.floor(atm.balance[name] + num)
else
atm.balance[name] = num
end
mcl_title.set(player, "actionbar", {text=S("Emeralds in Bank: @1", atm.balance[name]), color="yellow"})
atm.save_account(name)
return true
end
return false
end
function emeraldbank.update_accounts()
for _, player in ipairs(minetest.get_connected_players()) do
if not player or player.is_fake_player then return end
local meta = player:get_meta()
local bankemeralds = meta:get_int("emeraldbank:emerald")
emeraldbank.add_emeralds(player, bankemeralds)
meta:set_int("emeraldbank:emerald", 0)
end
end
function emeraldbank.inv_emeralds_to_stonks(pos)
local meta = core.get_meta(pos)
local inv = meta:get_inventory()
local stonks = meta:get_int("stonks")
local fancy_inv = inv:get_list("main")
if not fancy_inv then return end
local has_emerald = inv:contains_item("main", "mcl_core:emerald 1", true)
if has_emerald then
meta:set_int("stonks", stonks+1)
inv:remove_item("main", "mcl_core:emerald 1")
emeraldbank.inv_emeralds_to_stonks(pos)
return true
else
return false
end
end
function emeraldbank.get_stonks(pos)
local meta = core.get_meta(pos)
local owner = meta:get_string("owner")
local player = core.get_player_by_name(owner)
local is_online = core.player_exists(owner)
emeraldbank.inv_emeralds_to_stonks(pos)
local stonks = meta:get_int("stonks")
if not player or player.is_fake_player then return end
if is_online and stonks > 0 then
core.sound_play("cash", {
to_player = owner,
gain = 1.0,
fade = 0.0,
pitch = 1.0,
})
emeraldbank.add_emeralds(player, stonks)
meta:set_int("stonks", 0)
core.chat_send_player(owner, S("You've earned @1 Emeralds with your shops.", stonks))
end
end
function emeraldbank.transfer_emeralds(player1, player2, num)
local name = player1:get_player_name()
local name2 = player2:get_player_name()
atm.readaccount(name)
local bankemeralds1 = atm.balance[name]
if num > 0 then
if bankemeralds1 and bankemeralds1 >= num then
core.chat_send_player(name, S("Pay Successfully! You have transferred @1 Emeralds." , num))
core.chat_send_player(name2, S("Pay Successfully! You've gotten @1 Emeralds.", num))
if core.get_modpath("irc") then
irc.say(name.." has transferred "..num.." emeralds to "..name2)
end
if core.get_modpath("yl_matterbridge") then
yl_matterbridge.send_to_bridge("", name.." has transferred "..num.." emeralds to "..name2)
end
emeraldbank.add_emeralds(player1, -num)
emeraldbank.add_emeralds(player2, num)
core.sound_play("cash", {
to_player = name2,
gain = 1.0,
fade = 0.0,
pitch = 1.0,
})
else
core.chat_send_player(name, S("Not enough Emeralds in your account"))
end
else
core.chat_send_player(name, S("Invalid pay"))
end
end
function emeraldbank.upgrade_shop(pos)
local oldnode = core.get_node(pos)
local old_meta = core.get_meta(pos)
local old_meta_table = core.get_meta(pos):to_table()
local nodename = core.get_node(pos).name
-- set the new shop node
core.swap_node(pos, {name = "fancy_vend:player_vendor"})
-- setup the new shop node
-- Set variables for access later (for various checks, etc.)
local owner = old_meta:get_string("owner") or ""
pos.y = pos.y + 1
local above_node = minetest.get_node(pos).name
-- If node above is air or the display node, and it is not protected, attempt to place the vendor. If vendor sucessfully places, place display node above, otherwise alert the user
if (minetest.registered_nodes[above_node].buildable_to or above_node == "fancy_vend:display_node") and not minetest.is_protected(pos, owner) then
if above_node ~= "fancy_vend:display_node" then
minetest.set_node(pos, minetest.registered_nodes["fancy_vend:display_node"])
end
-- Set owner
local meta = minetest.get_meta(pos)
meta:set_string("owner", owner or "")
-- Set default meta
meta:set_string("log", minetest.serialize({"Vendor placed by "..owner,}))
emeraldbank.reset_vendor_settings(pos)
emeraldbank.refresh_vendor(pos)
else
minetest.chat_send_player(owner, S("Vendors require 2 nodes of space."))
end
if minetest.get_modpath("pipeworks") then
pipeworks.after_place(pos)
end
-- copy old metadata in new node
core.get_meta(pos):from_table(old_meta_table)
-- new node
local node = core.get_node(pos)
local meta = core.get_meta(pos)
local count = meta:get_int("count")
local price = meta:get_int("price")
local shop_item = meta:get_string("shop_item")
local minv = meta:get_inventory()
local settings = emeraldbank.get_vendor_settings(pos)
settings.input_item = "mcl_core:emerald"
settings.input_item_qty = price
settings.output_item = shop_item
settings.output_item_qty = count
emeraldbank.refresh_vendor(pos)
end