diff --git a/amenities.lua b/amenities.lua new file mode 100644 index 0000000..e8f13a0 --- /dev/null +++ b/amenities.lua @@ -0,0 +1,35 @@ +maggems_landmark.amenity_names = {} +maggems_landmark.amenity_add = {} +maggems_landmark.amenity_remove = {} + +function maggems_landmark.register_amenity(name, func_add, func_remove) + maggems_landmark.amenity_names[#maggems_landmark.amenity_names + 1] = name + maggems_landmark.amenity_add[name] = func_add + maggems_landmark.amenity_remove[name] = func_remove +end + +function maggems_landmark.find_amenities(area) + local _, amenities = minetest.find_nodes_in_area(area.min, area.max, maggems_landmark.amenity_names) + for amen, count in pairs(amenities) do + if (count == 0) then + amenities[amen] = nil + end + end + return amenities +end + +function maggems_landmark.update_amenities(area) + local pos = minetest.deserialize(area.data) + if (minetest.get_node(pos).name ~= "maggems_landmark:home") then return false end + local meta = minetest.get_meta(pos) + local had_amenities = minetest.deserialize(meta:get("maggems_landmark:amenities")) + had_amenities = had_amenities or {} + local found_amenities = maggems_landmark.find_amenities(area) + for amen in pairs(found_amenities) do + if (had_amenities[amen] == nil) then maggems_landmark.amenity_add[amen](meta) end + end + for amen in pairs(had_amenities) do + if (found_amenities[amen] == nil) then maggems_landmark.amenity_remove[amen](meta) end + end + meta:set_string("maggems_landmark:amenities", minetest.serialize(found_amenities)) +end diff --git a/init.lua b/init.lua index bd65840..3d90a5c 100644 --- a/init.lua +++ b/init.lua @@ -56,4 +56,5 @@ function maggems_landmark.update_formspec(pos) meta:set_string("formspec", formspec) end +dofile(minetest.get_modpath("maggems_landmark").."/amenities.lua") dofile(minetest.get_modpath("maggems_landmark").."/nodes.lua") diff --git a/nodes.lua b/nodes.lua index aed2f3f..42d102b 100644 --- a/nodes.lua +++ b/nodes.lua @@ -59,7 +59,9 @@ minetest.register_node("maggems_landmark:home", { minetest.chat_send_player(sender:get_player_name(), "Invalid corners!") return false end - if ((1+pos2.x-pos1.x) * (1+pos2.y-pos1.y) * (1+pos2.z-pos1.z) > 343) then + local maxvol = meta:get_int("maggems_landmark:maxvol") + if (maxvol == 0) then maxvol = 7*7*7 end + if ((1+pos2.x-pos1.x) * (1+pos2.y-pos1.y) * (1+pos2.z-pos1.z) > maxvol) then minetest.chat_send_player(sender:get_player_name(), "Space too big!") return false end @@ -101,3 +103,155 @@ minetest.register_craft({ } }) +minetest.register_node("maggems_landmark:statsym_iron", { + description = "Iron Status Symbol", + tiles = {"maggems_landmark_statsym.png^maggems_landmark_border_iron.png"}, + is_ground_content = false, + paramtype = "light", + light_source = 3, + groups = {cracky = 1, level = 1}, + sounds = default.node_sound_stone_defaults(), + after_place_node = function(pos, player) + for id, area in pairs(maggems_landmark.homes:get_areas_for_pos(pos, true, true)) do + maggems_landmark.update_amenities(area) + end + end, + after_dig_node = function(pos, oldnode, oldmetadata, player) + for id, area in pairs(maggems_landmark.homes:get_areas_for_pos(pos, true, true)) do + maggems_landmark.update_amenities(area) + end + end, + on_blast = function() end, +}) + +local function get_maxvol(rank) + if (rank >= 4) then -- 0100 + return 21*21*21 + elseif (rank >= 2) then -- 0010 + return 15*15*15 + elseif (rank >= 1) then + return 11*11*11 + else + return 7*7*7 + end +end + +maggems_landmark.register_amenity("maggems_landmark:statsym_iron", + function(meta) + -- add amenity + local rank = meta:get_int("maggems_landmark:statsym_rank") + rank = rank + 1 + meta:set_int("maggems_landmark:maxvol", get_maxvol(rank)) + meta:set_int("maggems_landmark:statsym_rank", rank) + end, + function(meta) + -- remove amenity + local rank = meta:get_int("maggems_landmark:statsym_rank") + rank = rank - 1 + meta:set_int("maggems_landmark:maxvol", get_maxvol(rank)) + meta:set_int("maggems_landmark:statsym_rank", rank) + end +) + +minetest.register_craft({ + output = "maggems_landmark:statsym_iron", + recipe = { + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"}, + {"default:steel_ingot", "default:mese", "default:steel_ingot"}, + {"default:steel_ingot", "default:steel_ingot", "default:steel_ingot"} + } +}) + +minetest.register_node("maggems_landmark:statsym_gold", { + description = "Gold Status Symbol", + tiles = {"maggems_landmark_statsym.png^maggems_landmark_border_gold.png"}, + is_ground_content = false, + paramtype = "light", + light_source = 3, + groups = {cracky = 1, level = 1}, + sounds = default.node_sound_stone_defaults(), + after_place_node = function(pos, player) + for id, area in pairs(maggems_landmark.homes:get_areas_for_pos(pos, true, true)) do + maggems_landmark.update_amenities(area) + end + end, + after_dig_node = function(pos, oldnode, oldmetadata, player) + for id, area in pairs(maggems_landmark.homes:get_areas_for_pos(pos, true, true)) do + maggems_landmark.update_amenities(area) + end + end, + on_blast = function() end, +}) + +maggems_landmark.register_amenity("maggems_landmark:statsym_gold", + function(meta) + -- add amenity + local rank = meta:get_int("maggems_landmark:statsym_rank") + rank = rank + 2 + meta:set_int("maggems_landmark:maxvol", get_maxvol(rank)) + meta:set_int("maggems_landmark:statsym_rank", rank) + end, + function(meta) + -- remove amenity + local rank = meta:get_int("maggems_landmark:statsym_rank") + rank = rank - 2 + meta:set_int("maggems_landmark:maxvol", get_maxvol(rank)) + meta:set_int("maggems_landmark:statsym_rank", rank) + end +) + +minetest.register_craft({ + output = "maggems_landmark:statsym_gold", + recipe = { + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"}, + {"default:gold_ingot", "default:mese", "default:gold_ingot"}, + {"default:gold_ingot", "default:gold_ingot", "default:gold_ingot"} + } +}) + +minetest.register_node("maggems_landmark:statsym_diamond", { + description = "Diamond Status Symbol", + tiles = {"maggems_landmark_statsym.png^maggems_landmark_border_diamond.png"}, + is_ground_content = false, + paramtype = "light", + light_source = 3, + groups = {cracky = 1, level = 1}, + sounds = default.node_sound_stone_defaults(), + after_place_node = function(pos, player) + for id, area in pairs(maggems_landmark.homes:get_areas_for_pos(pos, true, true)) do + maggems_landmark.update_amenities(area) + end + end, + after_dig_node = function(pos, oldnode, oldmetadata, player) + for id, area in pairs(maggems_landmark.homes:get_areas_for_pos(pos, true, true)) do + maggems_landmark.update_amenities(area) + end + end, + on_blast = function() end, +}) + +maggems_landmark.register_amenity("maggems_landmark:statsym_diamond", + function(meta) + -- add amenity + local rank = meta:get_int("maggems_landmark:statsym_rank") + rank = rank + 4 + meta:set_int("maggems_landmark:maxvol", get_maxvol(rank)) + meta:set_int("maggems_landmark:statsym_rank", rank) + end, + function(meta) + -- remove amenity + local rank = meta:get_int("maggems_landmark:statsym_rank") + rank = rank - 4 + meta:set_int("maggems_landmark:maxvol", get_maxvol(rank)) + meta:set_int("maggems_landmark:statsym_rank", rank) + end +) + +minetest.register_craft({ + output = "maggems_landmark:statsym_diamond", + recipe = { + {"default:diamond", "default:diamond", "default:diamond"}, + {"default:diamond", "default:mese", "default:diamond"}, + {"default:diamond", "default:diamond", "default:diamond"} + } +})