123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- local repairable_hashtable
- local repairing_goal = minetest.get_content_id("degradable_walls:wall")
- local floor = math.floor
- local ceil = math.ceil
- local sound_play = minetest.sound_play
- local S = minetest.get_translator("degradable_walls")
- local radius = 3
- local voxel_buffer = {}
- minetest.register_craftitem("degradable_walls:mortar",
- {
- description = S("Mortar"),
- inventory_image = "degradable_walls_mortar.png",
- max_stack = 128,
- on_use = function(itemstack, user, pointed_thing)
- if pointed_thing.type == "node"
- then
- local pos = pointed_thing.under
- local vm = minetest.get_voxel_manip()
- local minpos = {
- x = floor(pos.x - radius),
- y = floor(pos.y - radius),
- z = floor(pos.z - radius)
- }
- local maxpos = {
- x = ceil(pos.x + radius),
- y = ceil(pos.y + radius),
- z = ceil(pos.z + radius)
- }
- local emin, emax = vm:read_from_map(minpos, maxpos)
- local area = VoxelArea:new{MinEdge = emin, MaxEdge = emax}
- local data = vm:get_data(voxel_buffer)
- for iz = minpos.z, maxpos.z
- do
- for iy = minpos.y, maxpos.y
- do
- for ix = minpos.x, maxpos.x
- do
- local position_vector = {x = ix, y = iy, z = iz}
- local dist = vector.distance(pos, position_vector)
- if dist < radius and
- repairable_hashtable[data[area:index(ix, iy, iz)]]
- then
- data[area:index(ix, iy, iz)] = repairing_goal
- end
- end
- end
- end
- vm:set_data(data)
- vm:write_to_map(true)
- sound_play("degradable_walls_mortar_application",
- {
- gain = 0.5,
- pitch = 1 + (math.random() - 0.5) / 8
- })
- itemstack:take_item()
- return itemstack
- end
- end
- })
- minetest.register_alias("mortar", "degradable_walls:mortar")
- local cobble_name = minetest.registered_aliases["cobble"]
- assert(type(cobble_name) == "string", "There is no node with alias " ..
- "'cobble' registered.")
- minetest.register_node("degradable_walls:mortar_and_pestle",
- {
- description = S("Mortar And Pestle\n@1",
- minetest.colorize("#90FFFF", S("Right click with cobble to make mortar for repairing walls"))),
- inventory_image = "degradable_walls_mortar_and_pestle_inv.png",
- drawtype = "mesh",
- mesh = "degradable_walls_mortar_and_pestle.obj",
- tiles =
- {
- "degradable_walls_mortar_and_pestle_m.png",
- "degradable_walls_mortar_and_pestle_p.png"
- },
- collision_box =
- {
- type = "fixed",
- fixed = {
- {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
- },
- },
- selection_box =
- {
- type = "fixed",
- fixed = {
- {-0.5, -0.5, -0.5, 0.5, 0, 0.5},
- },
- },
- is_ground_content = false,
- groups = {cracky = 2, stone = 1},
- sounds = generic_media.node_sound_stone_defaults(),
- stack_max = 1,
- on_rightclick = function(pos, node, clicker, itemstack)
- local itemname = itemstack:get_name()
- if itemname == cobble_name and clicker
- then
- --TODO: play sound
- local inv = clicker:get_inventory()
- local leftover = inv:add_item("main", "degradable_walls:mortar")
- if leftover:is_empty()
- then
- itemstack:take_item()
- sound_play("degradable_walls_mortar_use",
- {
- gain = 0.2,
- pitch = 1 + (math.random() - 0.5) / 16
- })
- return itemstack
- end
- end
- end,
- })
- minetest.register_alias("mortar_and_pestle", "degradable_walls:mortar_and_pestle")
- crafting.register_recipe(
- {
- output = "mortar_and_pestle",
- type = "inv",
- items = {"cobble 8", "stick 1"},
- always_known = true,
- })
- return function(h)
- repairable_hashtable = h
- end
|