Repixture/mods/rp_gold/init.lua

405 lines
13 KiB
Lua
Raw Normal View History

2015-09-01 08:15:24 -07:00
--
-- Gold and NPC Trading
-- By Kaadmy, for Pixture
--
2022-04-22 15:21:00 -07:00
local S = minetest.get_translator("rp_gold")
2015-09-01 08:15:24 -07:00
gold = {}
local mapseed = minetest.get_mapgen_setting("seed")
gold.pr = PseudoRandom(mapseed+8732)
2015-09-01 08:15:24 -07:00
gold.trades = {}
gold.trade_names = {}
if minetest.get_modpath("mobs") ~= nil then
gold.trades["farmer"] = {
-- plants
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "", "rp_farming:wheat_1 6"},
{"rp_gold:ingot_gold 3", "", "rp_farming:cotton_1 4"},
{"rp_gold:ingot_gold 5", "", "rp_farming:cotton_1 8"},
{"rp_gold:ingot_gold", "", "rp_default:papyrus 4"},
{"rp_gold:ingot_gold 2", "", "rp_default:cactus"},
-- crafts
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 7", "", "rp_farming:cotton_bale 3"},
-- tool repair
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 6", "rp_default:shovel_stone", "rp_default:shovel_stone"},
{"rp_gold:ingot_gold 8", "rp_default:shovel_steel", "rp_default:shovel_steel"},
{"rp_gold:ingot_gold 10", "rp_default:shovel_carbon_steel", "rp_default:shovel_carbon_steel"},
-- filling buckets
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "rp_default:bucket", "rp_default:bucket_water"},
}
gold.trades["carpenter"] = {
-- materials
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "", "rp_default:planks 6"},
{"rp_gold:ingot_gold", "", "rp_default:planks_birch 4"},
{"rp_gold:ingot_gold 3", "", "rp_default:planks_oak 10"},
{"rp_gold:ingot_gold", "", "rp_default:frame 2"},
{"rp_gold:ingot_gold", "", "rp_default:reinforced_frame"},
-- useables
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 9", "", "rp_bed:bed"},
{"rp_gold:ingot_gold 2", "", "rp_default:chest"},
{"rp_gold:ingot_gold 5", "mobs:wool 3", "rp_bed:bed"},
}
gold.trades["tavernkeeper"] = {
-- edibles
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "", "rp_default:apple 3"},
{"rp_gold:ingot_gold", "", "rp_farming:bread"},
{"rp_gold:ingot_gold 2", "", "mobs:meat"},
{"rp_gold:ingot_gold 3", "", "mobs:pork"},
-- filling buckets
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "rp_default:bucket", "rp_default:bucket_water"},
}
gold.trades["blacksmith"] = {
-- smeltables
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "", "rp_default:lump_coal"},
{"rp_gold:ingot_gold 3", "", "rp_default:lump_iron"},
-- materials
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "", "rp_default:cobble 5"},
{"rp_gold:ingot_gold 3", "", "rp_default:stone 10"},
{"rp_gold:ingot_gold", "", "rp_default:reinforced_cobble 2"},
{"rp_gold:ingot_gold 25", "", "rp_default:block_steel"},
{"rp_gold:ingot_gold 6", "", "rp_default:glass 5"},
-- usebles
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 7", "", "rp_default:furnace"},
-- ingots
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 5", "", "rp_default:ingot_steel"},
{"rp_gold:ingot_gold 8", "", "rp_default:ingot_carbon_steel"},
-- auto smelting
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 2", "rp_default:lump_iron", "rp_default:ingot_steel"},
-- tool repair
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 8", "rp_default:pick_stone", "rp_default:pick_stone"},
{"rp_gold:ingot_gold 12", "rp_default:pick_steel", "rp_default:pick_steel"},
{"rp_gold:ingot_gold 16", "rp_default:pick_carbon_steel", "rp_default:pick_carbon_steel"},
}
gold.trades["butcher"] = {
-- raw edibles
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold", "", "mobs:meat_raw"},
{"rp_gold:ingot_gold 3", "", "mobs:pork_raw 2"},
-- cooking edibles
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 1", "mobs:meat_raw", "mobs:meat"},
{"rp_gold:ingot_gold 2", "mobs:pork_raw", "mobs:pork"},
-- tool repair
2022-04-22 15:21:00 -07:00
{"rp_gold:ingot_gold 5", "rp_default:spear_stone", "rp_default:spear_stone"},
{"rp_gold:ingot_gold 7", "rp_default:spear_steel", "rp_default:spear_steel"},
{"rp_gold:ingot_gold 11", "rp_default:spear_carbon_steel", "rp_default:spear_carbon_steel"},
}
-- trading currency
if minetest.get_modpath("rp_jewels") ~= nil then -- jewels/gold
--farmer
2022-04-22 17:41:39 -07:00
table.insert(gold.trades["farmer"], {"rp_gold:ingot_gold 16", "", "rp_jewels:jewel"})
table.insert(gold.trades["farmer"], {"rp_gold:ingot_gold 22", "", "rp_jewels:jewel 2"})
table.insert(gold.trades["farmer"], {"rp_gold:ingot_gold 34", "", "rp_jewels:jewel 4"})
2022-04-22 17:41:39 -07:00
table.insert(gold.trades["farmer"], {"rp_jewels:jewel", "", "rp_gold:ingot_gold 14"})
table.insert(gold.trades["farmer"], {"rp_jewels:jewel 2", "", "rp_gold:ingot_gold 20"})
table.insert(gold.trades["farmer"], {"rp_jewels:jewel 4", "", "rp_gold:ingot_gold 32"})
-- tavern keeper
2022-04-22 17:41:39 -07:00
table.insert(gold.trades["tavernkeeper"], {"rp_gold:ingot_gold 14", "", "rp_jewels:jewel"})
table.insert(gold.trades["tavernkeeper"], {"rp_gold:ingot_gold 20", "", "rp_jewels:jewel 2"})
table.insert(gold.trades["tavernkeeper"], {"rp_gold:ingot_gold 32", "", "rp_jewels:jewel 4"})
-- blacksmith
2022-04-22 17:41:39 -07:00
table.insert(gold.trades["blacksmith"], {"rp_default:ingot_steel 14", "", "rp_jewels:jewel"})
table.insert(gold.trades["blacksmith"], {"rp_default:ingot_steel 20", "", "rp_jewels:jewel 2"})
table.insert(gold.trades["blacksmith"], {"rp_default:ingot_steel 32", "", "rp_jewels:jewel 4"})
end
-- carpenter (no mod check)
table.insert(gold.trades["carpenter"], {"rp_default:tree 2", "", "rp_gold:ingot_gold"})
-- butcher (no mod check)
2022-04-22 15:21:00 -07:00
table.insert(gold.trades["butcher"], {"mobs:meat_raw 3", "", "rp_gold:ingot_gold"})
table.insert(gold.trades["butcher"], {"mobs:meat_raw 4", "", "rp_gold:ingot_gold 2"})
table.insert(gold.trades["butcher"], {"mobs:meat_raw 5", "", "rp_gold:ingot_gold 4"})
2019-08-28 08:31:41 -07:00
gold.trade_names["farmer"] = S("Farmer")
gold.trade_names["tavernkeeper"] = S("Tavern Keeper")
gold.trade_names["carpenter"] = S("Carpenter")
2019-08-28 08:31:41 -07:00
gold.trade_names["blacksmith"] = S("Blacksmith")
gold.trade_names["butcher"] = S("Butcher")
end
2015-09-01 08:15:24 -07:00
local form_trading = ""
form_trading = form_trading .. rp_formspec.get_page("rp_default:2part")
2015-09-01 08:15:24 -07:00
2019-09-22 06:22:21 -07:00
form_trading = form_trading .. "list[current_player;gold_trade_out;4.75,2.25;1,1;]"
2015-09-01 08:15:24 -07:00
form_trading = form_trading .. rp_formspec.get_hotbar_itemslot_bg(4.75, 2.25, 1, 1)
2015-09-01 08:15:24 -07:00
form_trading = form_trading .. "list[current_player;main;0.25,4.75;8,4;]"
form_trading = form_trading .. rp_formspec.get_hotbar_itemslot_bg(0.25, 4.75, 8, 1)
form_trading = form_trading .. rp_formspec.get_itemslot_bg(0.25, 5.75, 8, 3)
2015-09-01 08:15:24 -07:00
2019-09-22 06:22:21 -07:00
form_trading = form_trading .. "list[current_player;gold_trade_in;1.25,2.25;2,1;]"
form_trading = form_trading .. rp_formspec.get_itemslot_bg(1.25, 2.25, 2, 1)
2015-09-01 08:15:24 -07:00
2019-08-28 20:58:20 -07:00
form_trading = form_trading .. "listring[current_player;main]"
form_trading = form_trading .. "listring[current_player;gold_trade_in]"
form_trading = form_trading .. "listring[current_player;main]"
form_trading = form_trading .. "listring[current_player;gold_trade_out]"
2019-09-22 06:22:21 -07:00
form_trading = form_trading .. "image[3.5,1.25;1,1;ui_arrow_bg.png^[transformR270]"
form_trading = form_trading .. "image[3.5,2.25;1,1;ui_arrow.png^[transformR270]"
2015-09-01 08:15:24 -07:00
form_trading = form_trading .. rp_formspec.button(1.25, 3.25, 2, 1, "trade", S("Trade"))
form_trading = form_trading .. rp_formspec.button_exit(5.25, 3.25, 2, 1, "cancel", S("Cancel"))
2015-09-01 08:15:24 -07:00
rp_formspec.register_page("rp_gold_trading_book", form_trading)
2015-09-01 08:15:24 -07:00
function gold.trade(trade, trade_type, player)
local name = player:get_player_name()
local item = player:get_wielded_item()
2022-04-22 15:21:00 -07:00
local itemname = item:get_name()
local item_alias = minetest.registered_aliases[itemname]
if itemname ~= "rp_gold:trading_book" and item_alias ~= "rp_gold:trading_book" then return end
2015-09-01 08:15:24 -07:00
local inv = player:get_inventory()
2015-09-01 08:15:24 -07:00
if inv:get_size("gold_trade_wanted") ~= 2 then
inv:set_size("gold_trade_wanted", 2)
end
2015-09-01 08:15:24 -07:00
if inv:get_size("gold_trade_out") ~= 1 then
inv:set_size("gold_trade_out", 1)
end
if inv:get_size("gold_trade_in") ~= 2 then
inv:set_size("gold_trade_in", 2)
end
2015-09-01 08:15:24 -07:00
inv:set_stack("gold_trade_wanted", 1, trade[1])
inv:set_stack("gold_trade_wanted", 2, trade[2])
local meta = minetest.deserialize(item:get_metadata())
2015-09-01 08:15:24 -07:00
if not meta then meta = {} end
meta.trade = trade
local trade_name = gold.trade_names[trade_type]
local trade_wanted1 = inv:get_stack("gold_trade_wanted", 1)
local trade_wanted2 = inv:get_stack("gold_trade_wanted", 2)
local form = rp_formspec.get_page("rp_gold_trading_book")
form = form .. "label[0.25,0.25;"..minetest.formspec_escape(trade_name).."]"
2015-09-01 08:15:24 -07:00
form = form .. rp_formspec.fake_itemstack(1.25, 1.25, trade_wanted1)
form = form .. rp_formspec.fake_itemstack(2.25, 1.25, trade_wanted2)
form = form .. rp_formspec.fake_itemstack(4.75, 1.25, ItemStack(trade[3]))
2015-09-01 08:15:24 -07:00
2022-04-22 15:21:00 -07:00
minetest.show_formspec(name, "rp_gold:trading_book", form)
2015-09-01 08:15:24 -07:00
meta.trade_type = trade_type
item:set_metadata(minetest.serialize(meta))
2015-09-01 08:15:24 -07:00
player:set_wielded_item(item)
return true
2015-09-01 08:15:24 -07:00
end
minetest.register_on_player_receive_fields(
2015-09-01 08:15:24 -07:00
function(player, form_name, fields)
2022-04-22 15:21:00 -07:00
if form_name ~= "rp_gold:trading_book" or fields.cancel then return end
2015-09-01 08:15:24 -07:00
local inv = player:get_inventory()
if fields.trade then
local item = player:get_wielded_item()
2019-08-28 21:18:23 -07:00
local trade_wanted1 = inv:get_stack("gold_trade_wanted", 1)
local trade_wanted2 = inv:get_stack("gold_trade_wanted", 2)
local trade_wanted1_n = trade_wanted1:get_name()
local trade_wanted2_n = trade_wanted2:get_name()
local trade_in1 = inv:get_stack("gold_trade_in", 1)
local trade_in2 = inv:get_stack("gold_trade_in", 2)
local trade_in1_n = trade_in1:get_name()
local trade_in2_n = trade_in2:get_name()
local matches = false
if trade_wanted1_n == "" or trade_wanted2_n == "" then
-- Wants 1 item
local wanted, wanted_n, wanted_c
if trade_wanted1_n ~= "" then
wanted = trade_wanted1
else
wanted = trade_wanted2
end
if inv:contains_item("gold_trade_in", wanted) then
matches = true
end
else
-- Wants 2 items (this assumes both items are different)
if inv:contains_item("gold_trade_in", trade_wanted1) and inv:contains_item("gold_trade_in", trade_wanted2) then
matches = true
end
end
2015-09-01 08:15:24 -07:00
local meta = minetest.deserialize(item:get_metadata())
2022-04-22 15:21:00 -07:00
local trade = {"rp_gold:ingot_gold", "rp_gold:ingot_gold", "rp_default:stick"}
2015-09-01 08:15:24 -07:00
local trade_type = ""
2015-09-01 08:15:24 -07:00
if meta then
trade = meta.trade
trade_type = meta.trade_type
end
if matches then
if inv:room_for_item("gold_trade_out", trade[3]) then
inv:add_item("gold_trade_out", trade[3])
2019-08-28 21:18:23 -07:00
inv:remove_item("gold_trade_in", trade[1])
inv:remove_item("gold_trade_in", trade[2])
achievements.trigger_achievement(player, "trader")
2015-09-01 08:15:24 -07:00
end
end
end
end)
2015-09-01 08:15:24 -07:00
-- Items
minetest.register_craftitem(
2022-04-22 15:21:00 -07:00
"rp_gold:trading_book",
2015-09-01 08:15:24 -07:00
{
2019-08-28 08:31:41 -07:00
description = S("Trading Book"),
2019-12-05 05:39:05 -08:00
_tt_help = S("Show this to a villager to trade"),
2015-09-01 08:15:24 -07:00
inventory_image = "default_book.png^gold_bookribbon.png",
stack_max = 1,
})
2015-09-01 08:15:24 -07:00
minetest.register_craftitem(
2022-04-22 15:21:00 -07:00
"rp_gold:lump_gold",
{
2019-08-28 08:31:41 -07:00
description = S("Gold Lump"),
inventory_image = "gold_lump_gold.png",
})
minetest.register_craftitem(
2022-04-22 15:21:00 -07:00
"rp_gold:ingot_gold",
2015-09-01 08:15:24 -07:00
{
2019-08-28 08:31:41 -07:00
description = S("Gold Ingot"),
inventory_image = "gold_ingot_gold.png",
})
2015-09-01 08:15:24 -07:00
-- Nodes
minetest.register_node(
2022-04-22 15:21:00 -07:00
"rp_gold:stone_with_gold",
{
2019-08-28 08:31:41 -07:00
description = S("Stone with Gold"),
tiles ={"default_stone.png^gold_mineral_gold.png"},
groups = {cracky=1, stone=1},
2022-04-22 15:21:00 -07:00
drop = "rp_gold:lump_gold",
is_ground_content = true,
2022-04-25 13:07:28 -07:00
sounds = rp_sounds.node_sound_stone_defaults(),
})
2022-05-03 06:02:03 -07:00
minetest.register_node(
"rp_gold:block_gold",
{
description = S("Gold Block"),
tiles = {"gold_block.png"},
groups = {cracky = 2},
sounds = rp_sounds.node_sound_stone_defaults(),
is_ground_content = false,
})
-- Ores
minetest.register_ore(
{
ore_type = "scatter",
2022-04-22 15:21:00 -07:00
ore = "rp_gold:stone_with_gold",
2022-04-22 11:31:10 -07:00
wherein = "rp_default:stone",
clust_scarcity = 9*9*9,
clust_num_ores = 12,
clust_size = 6,
y_min = -60,
y_max = -45,
})
-- Crafting
crafting.register_craft(
{
2022-04-22 15:21:00 -07:00
output = "rp_gold:trading_book",
items = {
2022-04-22 11:31:10 -07:00
"rp_default:book",
2022-04-22 15:21:00 -07:00
"rp_gold:ingot_gold",
}
})
2022-05-03 06:02:03 -07:00
crafting.register_craft(
{
output = "rp_gold:block_gold",
items = {
"rp_gold:ingot_gold 9",
}
})
minetest.register_craft(
{
type = "cooking",
2022-04-22 15:21:00 -07:00
output = "rp_gold:ingot_gold",
recipe = "rp_gold:lump_gold",
cooktime = 7,
})
-- Achievements
achievements.register_achievement(
"trader",
{
2019-08-28 08:31:41 -07:00
title = S("Trader"),
description = S("Trade with a villager."),
times = 1,
})
achievements.register_achievement(
"gold_rush",
{
2019-08-28 08:31:41 -07:00
title = S("Gold Rush"),
description = S("Dig a gold ore."),
times = 1,
2022-04-22 15:21:00 -07:00
dignode = "rp_gold:stone_with_gold",
})
if minetest.settings:get_bool("pixture_debug", false) == true then
-- Check if all specified items are valid
minetest.register_on_mods_loaded(function()
for trader_name, trader in pairs(gold.trades) do
for trade_id, trade in pairs(trader) do
for i=1,3 do
local item = ItemStack(trade[i]):get_name()
2022-04-22 15:21:00 -07:00
assert(item ~= nil and (item == "" or minetest.registered_items[item]), "[rp_gold] Invalid trade item: trader="..trader_name..", index="..trade_id..", item="..item)
end
end
end
end)
end
2022-04-22 15:21:00 -07:00
-- Aliases
minetest.register_alias("gold:ingot_gold", "rp_gold:ingot_gold")
minetest.register_alias("gold:lump_gold", "rp_gold:lump_gold")
minetest.register_alias("gold:stone_with_gold", "rp_gold:stone_with_gold")
minetest.register_alias("gold:trading_book", "rp_gold:trading_book")
default.log("mod:rp_gold", "loaded")