diff --git a/mods/default/nodes.lua b/mods/default/nodes.lua index 2781752..4ebb657 100644 --- a/mods/default/nodes.lua +++ b/mods/default/nodes.lua @@ -17,6 +17,7 @@ minetest.register_node("default:desert_stone", { groups = {cracky=3, stone=1}, drop = 'default:desert_stone', legacy_mineral = true, + worthiness = 10, sounds = default.node_sound_stone_defaults(), }) @@ -25,6 +26,7 @@ minetest.register_node("default:stone_with_coal", { tiles = {"default_stone.png^default_mineral_coal.png"}, is_ground_content = true, groups = {cracky=3}, + worthiness = 10, drop = 'default:coal_lump', sounds = default.node_sound_stone_defaults(), }) @@ -34,6 +36,7 @@ minetest.register_node("default:stone_with_iron", { tiles = {"default_stone.png^default_mineral_iron.png"}, is_ground_content = true, groups = {cracky=2}, + worthiness = 10, drop = 'default:iron_lump', sounds = default.node_sound_stone_defaults(), }) @@ -43,6 +46,7 @@ minetest.register_node("default:stone_with_copper", { tiles = {"default_stone.png^default_mineral_copper.png"}, is_ground_content = true, groups = {cracky=2}, + worthiness = 10, drop = 'default:copper_lump', sounds = default.node_sound_stone_defaults(), }) @@ -52,6 +56,7 @@ minetest.register_node("default:stone_with_mese", { tiles = {"default_stone.png^default_mineral_mese.png"}, is_ground_content = true, groups = {cracky=1}, + worthiness = 10, drop = "default:mese_crystal", sounds = default.node_sound_stone_defaults(), }) @@ -61,6 +66,7 @@ minetest.register_node("default:stone_with_gold", { tiles = {"default_stone.png^default_mineral_gold.png"}, is_ground_content = true, groups = {cracky=2}, + worthiness = 10, drop = "default:gold_lump", sounds = default.node_sound_stone_defaults(), }) @@ -70,6 +76,7 @@ minetest.register_node("default:stone_with_diamond", { tiles = {"default_stone.png^default_mineral_diamond.png"}, is_ground_content = true, groups = {cracky=1}, + worthiness = 10, drop = "default:diamond", sounds = default.node_sound_stone_defaults(), }) @@ -78,6 +85,7 @@ minetest.register_node("default:stonebrick", { description = "Stone Brick", tiles = {"default_stone_brick.png"}, groups = {cracky=2, stone=1}, + worthiness = 10, sounds = default.node_sound_stone_defaults(), }) @@ -85,6 +93,7 @@ minetest.register_node("default:desert_stonebrick", { description = "Desert Stone Brick", tiles = {"default_desert_stone_brick.png"}, groups = {cracky=2, stone=1}, + worthiness = 10, sounds = default.node_sound_stone_defaults(), }) @@ -94,6 +103,7 @@ minetest.register_node("default:dirt_with_grass", { is_ground_content = true, groups = {crumbly=3,soil=1}, drop = 'default:dirt', + worthiness = 10, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, }), @@ -103,6 +113,7 @@ minetest.register_node("default:dirt_with_grass_footsteps", { description = "Dirt with Grass and Footsteps", tiles = {"default_grass_footsteps.png", "default_dirt.png", "default_dirt.png^default_grass_side.png"}, is_ground_content = true, + worthiness = 10, groups = {crumbly=3,soil=1,not_in_creative_inventory=1}, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ @@ -115,6 +126,7 @@ minetest.register_node("default:dirt_with_snow", { tiles = {"default_snow.png", "default_dirt.png", "default_dirt.png^default_snow_side.png"}, is_ground_content = true, groups = {crumbly=3}, + worthiness = 10, drop = 'default:dirt', sounds = default.node_sound_dirt_defaults({ footstep = {name="default_grass_footstep", gain=0.4}, @@ -125,6 +137,7 @@ minetest.register_alias("dirt_with_snow", "default:dirt_with_snow") minetest.register_node("default:dirt", { description = "Dirt", tiles = {"default_dirt.png"}, + worthiness = 10, is_ground_content = true, groups = {crumbly=3,soil=1}, sounds = default.node_sound_dirt_defaults(), @@ -133,6 +146,7 @@ minetest.register_node("default:dirt", { minetest.register_node("default:sand", { description = "Sand", tiles = {"default_sand.png"}, + worthiness = 10, is_ground_content = true, groups = {crumbly=3, falling_node=1, sand=1}, sounds = default.node_sound_sand_defaults(), @@ -140,6 +154,7 @@ minetest.register_node("default:sand", { minetest.register_node("default:desert_sand", { description = "Desert Sand", + worthiness = 10, tiles = {"default_desert_sand.png"}, is_ground_content = true, groups = {crumbly=3, falling_node=1, sand=1}, @@ -150,6 +165,7 @@ minetest.register_node("default:gravel", { description = "Gravel", tiles = {"default_gravel.png"}, is_ground_content = true, + worthiness = 10, groups = {crumbly=2, falling_node=1}, sounds = default.node_sound_dirt_defaults({ footstep = {name="default_gravel_footstep", gain=0.45}, @@ -161,6 +177,7 @@ minetest.register_node("default:sandstone", { tiles = {"default_sandstone.png"}, is_ground_content = true, groups = {crumbly=2,cracky=3}, + worthiness = 10, sounds = default.node_sound_stone_defaults(), }) @@ -169,6 +186,7 @@ minetest.register_node("default:sandstonebrick", { tiles = {"default_sandstone_brick.png"}, is_ground_content = true, groups = {cracky=2}, + worthiness = 10, sounds = default.node_sound_stone_defaults(), }) @@ -178,6 +196,7 @@ minetest.register_node("default:clay", { is_ground_content = true, groups = {crumbly=3}, drop = 'default:clay_lump 4', + worthiness = 10, sounds = default.node_sound_dirt_defaults({ footstep = "", }), @@ -186,6 +205,7 @@ minetest.register_node("default:clay", { minetest.register_node("default:brick", { description = "Brick Block", tiles = {"default_brick.png"}, + worthiness = 10, groups = {cracky=3}, sounds = default.node_sound_stone_defaults(), }) @@ -195,6 +215,7 @@ minetest.register_node("default:tree", { tiles = {"default_tree_top.png", "default_tree_top.png", "default_tree.png"}, groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), + worthiness = 10, }) minetest.register_node("default:jungletree", { @@ -202,6 +223,7 @@ minetest.register_node("default:jungletree", { tiles = {"default_jungletree_top.png", "default_jungletree_top.png", "default_jungletree.png"}, groups = {tree=1,choppy=2,oddly_breakable_by_hand=1,flammable=2}, sounds = default.node_sound_wood_defaults(), + worthiness = 10, }) minetest.register_node("default:junglewood", { @@ -209,6 +231,7 @@ minetest.register_node("default:junglewood", { tiles = {"default_junglewood.png"}, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, sounds = default.node_sound_wood_defaults(), + worthiness = 10, }) minetest.register_node("default:jungleleaves", { @@ -234,6 +257,7 @@ minetest.register_node("default:jungleleaves", { } }, sounds = default.node_sound_leaves_defaults(), + worthiness = 10, }) minetest.register_node("default:junglesapling", { @@ -251,6 +275,7 @@ minetest.register_node("default:junglesapling", { }, groups = {snappy=2,dig_immediate=3,flammable=2,attached_node=1}, sounds = default.node_sound_defaults(), + worthiness = 10, }) -- aliases for tree growing abm in content_abm.cpp minetest.register_alias("sapling", "default:sapling") @@ -269,6 +294,7 @@ minetest.register_node("default:junglegrass", { is_ground_content = true, groups = {snappy=3,flammable=2,flora=1,attached_node=1}, sounds = default.node_sound_leaves_defaults(), + worthiness = 10, selection_box = { type = "fixed", fixed = {-0.5, -0.5, -0.5, 0.5, -5/16, 0.5}, @@ -282,6 +308,7 @@ minetest.register_node("default:leaves", { tiles = {"default_leaves.png"}, paramtype = "light", groups = {snappy=3, leafdecay=3, flammable=2, leaves=1}, + worthiness = 10, drop = { max_items = 1, items = { @@ -305,6 +332,7 @@ minetest.register_node("default:cactus", { tiles = {"default_cactus_top.png", "default_cactus_top.png", "default_cactus_side.png"}, is_ground_content = true, groups = {snappy=1,choppy=3,flammable=2}, + worthiness = 10, sounds = default.node_sound_wood_defaults(), }) @@ -315,6 +343,7 @@ minetest.register_node("default:papyrus", { inventory_image = "default_papyrus.png", wield_image = "default_papyrus.png", paramtype = "light", + worthiness = 10, walkable = false, is_ground_content = true, selection_box = { @@ -327,6 +356,7 @@ minetest.register_node("default:papyrus", { minetest.register_node("default:bookshelf", { description = "Bookshelf", + worthiness = 10, tiles = {"default_wood.png", "default_wood.png", "default_bookshelf.png"}, groups = {choppy=3,oddly_breakable_by_hand=2,flammable=3}, sounds = default.node_sound_wood_defaults(), @@ -336,6 +366,7 @@ minetest.register_node("default:glass", { description = "Glass", drawtype = "glasslike", tiles = {"default_glass.png"}, + worthiness = 10, inventory_image = minetest.inventorycube("default_glass.png"), paramtype = "light", sunlight_propagates = true, @@ -350,6 +381,7 @@ minetest.register_node("default:fence_wood", { inventory_image = "default_fence.png", wield_image = "default_fence.png", paramtype = "light", + worthiness = 10, selection_box = { type = "fixed", fixed = {-1/7, -1/2, -1/7, 1/7, 1/2, 1/7}, @@ -366,6 +398,7 @@ minetest.register_node("default:rail", { wield_image = "default_rail.png", paramtype = "light", walkable = false, + worthiness = 10, selection_box = { type = "fixed", -- but how to specify the dimensions for curved and sideways rails? @@ -382,6 +415,7 @@ minetest.register_node("default:ladder", { wield_image = "default_ladder.png", paramtype = "light", paramtype2 = "wallmounted", + worthiness = 10, walkable = false, climbable = true, selection_box = { @@ -397,6 +431,7 @@ minetest.register_node("default:ladder", { minetest.register_node("default:wood", { description = "Wooden Planks", + worthiness = 10, tiles = {"default_wood.png"}, groups = {choppy=2,oddly_breakable_by_hand=2,flammable=3,wood=1}, sounds = default.node_sound_wood_defaults(), @@ -407,6 +442,7 @@ minetest.register_node("default:cloud", { tiles = {"default_cloud.png"}, sounds = default.node_sound_defaults(), groups = {not_in_creative_inventory=1}, + worthiness = 10, }) minetest.register_node("default:water_flowing", { @@ -429,6 +465,7 @@ minetest.register_node("default:water_flowing", { alpha = WATER_ALPHA, paramtype = "light", walkable = false, + worthiness = 10, pointable = false, diggable = false, buildable_to = true, @@ -445,6 +482,7 @@ minetest.register_node("default:water_source", { description = "Water Source", inventory_image = minetest.inventorycube("default_water.png"), drawtype = "liquid", + worthiness = 10, tiles = { {name="default_water_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=2.0}} }, @@ -462,6 +500,7 @@ minetest.register_node("default:water_source", { pointable = false, diggable = false, buildable_to = true, + worthiness = 10, drop = "", liquidtype = "source", liquid_alternative_flowing = "default:water_flowing", @@ -476,6 +515,7 @@ minetest.register_node("default:lava_flowing", { inventory_image = minetest.inventorycube("default_lava.png"), drawtype = "flowingliquid", tiles = {"default_lava.png"}, + worthiness = 10, special_tiles = { { image="default_lava_flowing_animated.png", @@ -495,6 +535,7 @@ minetest.register_node("default:lava_flowing", { diggable = false, buildable_to = true, drop = "", + worthiness = 10, liquidtype = "flowing", liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", @@ -512,6 +553,7 @@ minetest.register_node("default:lava_source", { tiles = { {name="default_lava_source_animated.png", animation={type="vertical_frames", aspect_w=16, aspect_h=16, length=3.0}} }, + worthiness = 10, special_tiles = { -- New-style lava source material (mostly unused) { @@ -528,6 +570,7 @@ minetest.register_node("default:lava_source", { buildable_to = true, drop = "", liquidtype = "source", + worthiness = 10, liquid_alternative_flowing = "default:lava_flowing", liquid_alternative_source = "default:lava_source", liquid_viscosity = LAVA_VISC, @@ -550,6 +593,7 @@ minetest.register_node("default:torch", { wield_image = "default_torch_on_floor.png", paramtype = "light", paramtype2 = "wallmounted", + worthiness = 10, sunlight_propagates = true, walkable = false, light_source = LIGHT_MAX-1, @@ -570,6 +614,7 @@ minetest.register_node("default:sign_wall", { tiles = {"default_sign_wall.png"}, inventory_image = "default_sign_wall.png", wield_image = "default_sign_wall.png", + worthiness = 10, paramtype = "light", paramtype2 = "wallmounted", sunlight_propagates = true, @@ -607,6 +652,7 @@ minetest.register_node("default:chest", { paramtype2 = "facedir", groups = {choppy=2,oddly_breakable_by_hand=2}, legacy_facedir_simple = true, + worthiness = 10, sounds = default.node_sound_wood_defaults(), on_construct = function(pos) local meta = minetest.get_meta(pos) @@ -650,6 +696,7 @@ minetest.register_node("default:chest_locked", { "default_chest_side.png", "default_chest_side.png", "default_chest_lock.png"}, paramtype2 = "facedir", groups = {choppy=2,oddly_breakable_by_hand=2}, + worthiness = 10, legacy_facedir_simple = true, sounds = default.node_sound_wood_defaults(), after_place_node = function(pos, placer) diff --git a/mods/economy/init.lua b/mods/economy/init.lua index a354843..c731fd1 100644 --- a/mods/economy/init.lua +++ b/mods/economy/init.lua @@ -1,5 +1,5 @@ -money = nil +local money = nil function save_money() local file = io.open(minetest.get_worldpath().."/money", "w") @@ -9,6 +9,17 @@ function save_money() end end +function update_money() + for _,player in ipairs(minetest.env:get_connected_players()) do + player:set_inventory_formspec( + "size[8,5;]".. + "list[current_player;main;0,0.5;8,4;]".. + "label[0,-0.4;Cash: "..money[player:get_player_name()].."]" + ) + end + save_money() +end + local file = io.open(minetest.get_worldpath().."/money", "r") if file then money = minetest.deserialize(file:read("*all")) @@ -22,13 +33,8 @@ save_money() minetest.register_on_joinplayer(function(player) if not money[player:get_player_name()] then money[player:get_player_name()] = 0 - save_money() end - player:set_inventory_formspec( - "size[8,5;]".. - "list[current_player;main;0,0.5;8,4;]".. - "label[0,-0.4;Cash: "..money[player:get_player_name()].."]" - ) + update_money() end) minetest.register_chatcommand("set_money", { @@ -37,15 +43,167 @@ minetest.register_chatcommand("set_money", { privs = {server=true}, func = function(name, param) local name, cash = string.match(param, "^([a-zA-Z0-9_]*) ([%d.-]+)$") - money[name] = cash - save_money() - local player = minetest.get_player_by_name(name) - if player then - player:set_inventory_formspec( - "size[8,5;]".. - "list[current_player;main;0,0.5;8,4;]".. - "label[0,-0.4;Cash: "..money[name].."]" - ) - end + money[name] = tonumber(cash) + update_money() end, }) + +shop = {} +shop.size = 0 +local players_start_i = {} + +local function get_formspec(pos, start_i, pagenum, name) + local pagemax = math.floor((shop.size-1) / (6*4) + 1) + local inv = minetest.env:get_meta(pos):get_inventory() + local def = inv:get_stack("buy", 1):get_definition() + local price = 0 + if def and def.worthiness then + price = def.worthiness+def.worthiness*0.1 + end + local price2 = 0 + def = inv:get_stack("sell", 1):get_definition() + if def and def.worthiness then + price2 = def.worthiness-def.worthiness*0.1 + end + local f= + "size[8,10]".. + "list[current_player;main;0,6;8,4;]".. + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";main;0,0;8,4;"..tostring(start_i).."]".. + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";buy;4.5,4;1,1;]".. + "button[5.5,4;2,1;shop_buy;Buy ("..price..")]".. + "list[nodemeta:"..pos.x..","..pos.y..","..pos.z..";sell;4.5,5;1,1;]".. + "button[5.5,5;2,1;shop_sell;Sell ("..price2..")]".. + "label[1.7,4.1;"..tostring(pagenum).."/"..tostring(pagemax).."]".. + "button[0,4;1.6,1;shop_prev;<<]".. + "button[2.4,4;1.6,1;shop_next;>>]".. + "label[0,5;Cash: "..money[name].."]" + return f +end + +minetest.after(0, function() + local inv = minetest.create_detached_inventory("shop", { + allow_move = function(inv, from_list, from_index, to_list, to_index, count, player) + return 0 + end, + allow_put = function(inv, listname, index, stack, player) + return 0 + end, + allow_take = function(inv, listname, index, stack, player) + return 0 + end, + on_move = function(inv, from_list, from_index, to_list, to_index, count, player) + end, + on_put = function(inv, listname, index, stack, player) + end, + on_take = function(inv, listname, index, stack, player) + end, + }) + local shop_list = {} + for name,def in pairs(minetest.registered_items) do + if def.worthiness then + table.insert(shop_list, name) + end + end + table.sort(shop_list) + inv:set_size("main", #shop_list) + for _,itemstring in ipairs(shop_list) do + inv:add_item("main", ItemStack(itemstring)) + end + shop.size = #shop_list +end) + +minetest.register_node("economy:shop", { + description = "Shop", + on_construct = function(pos) + local m = minetest.env:get_meta(pos) + m:set_string("infotext", "Shop") + m:get_inventory():set_size("buy", 1) + m:get_inventory():set_size("sell", 1) + m:get_inventory():set_size("main", shop.size) + m:get_inventory():set_list("main", minetest.get_inventory({type="detached",name="shop"}):get_list("main")) + end, + on_rightclick = function(pos, node, clicker, itemstack) + minetest.show_formspec(clicker:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, 0, 1, clicker:get_player_name())) + end, + allow_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + if (from_list == "main" and to_list == "buy") or (from_list == "buy" and to_list == "main") then + return count + end + return 0 + end, + allow_metadata_inventory_put = function(pos, listname, index, stack, player) + if listname == "sell" then + return stack:get_count() + end + return 0 + end, + allow_metadata_inventory_take = function(pos, listname, index, stack, player) + if listname == "sell" then + return stack:get_count() + end + return 0 + end, + on_metadata_inventory_move = function(pos, from_list, from_index, to_list, to_index, count, player) + minetest.show_formspec(player:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, players_start_i[player:get_player_name()] or 0, (players_start_i[player:get_player_name()] or 0) / (8*4) + 1, player:get_player_name())) + end, + on_metadata_inventory_put = function(pos, listname, index, stack, player) + minetest.show_formspec(player:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, players_start_i[player:get_player_name()] or 0, (players_start_i[player:get_player_name()] or 0) / (8*4) + 1, player:get_player_name())) + end, + on_metadata_inventory_take = function(pos, listname, index, stack, player) + minetest.show_formspec(player:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, players_start_i[player:get_player_name()] or 0, (players_start_i[player:get_player_name()] or 0) / (8*4) + 1, player:get_player_name())) + end, +}) + +minetest.register_on_player_receive_fields(function(player, formname, fields) + if fields.shop_prev or fields.shop_next then + local pos = minetest.string_to_pos(formname) + local start_i = players_start_i[player:get_player_name()] or 0 + + if fields.shop_prev then + start_i = start_i - 8*4 + end + if fields.shop_next then + start_i = start_i + 8*4 + end + + if start_i < 0 then + start_i = start_i + 8*4 + end + if start_i >= shop.size then + start_i = start_i - 8*4 + end + + if start_i < 0 or start_i >= shop.size then + start_i = 0 + end + + players_start_i[player:get_player_name()] = start_i + minetest.show_formspec(player:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, start_i, start_i / (8*4) + 1, player:get_player_name())) + elseif fields.shop_buy then + local pos = minetest.string_to_pos(formname) + local inv = minetest.env:get_meta(pos):get_inventory() + local def = inv:get_stack("buy", 1):get_definition() + local price = 0 + if def and def.worthiness then + price = def.worthiness+def.worthiness*0.1 + end + if money[player:get_player_name()] >= price then + money[player:get_player_name()] = money[player:get_player_name()]-price + update_money() + player:get_inventory():add_item("main", inv:get_stack("buy", 1)) + minetest.show_formspec(player:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, players_start_i[player:get_player_name()] or 0, (players_start_i[player:get_player_name()] or 0) / (8*4) + 1, player:get_player_name())) + end + elseif fields.shop_sell then + local pos = minetest.string_to_pos(formname) + local inv = minetest.env:get_meta(pos):get_inventory() + local def = inv:get_stack("sell", 1):get_definition() + local price = 0 + if def and def.worthiness then + price = def.worthiness-def.worthiness*0.1 + end + money[player:get_player_name()] = money[player:get_player_name()]+price + update_money() + inv:set_stack("sell", 1, ItemStack("")) + minetest.show_formspec(player:get_player_name(), minetest.pos_to_string(pos), get_formspec(pos, players_start_i[player:get_player_name()] or 0, (players_start_i[player:get_player_name()] or 0) / (8*4) + 1, player:get_player_name())) + end +end)