@@ -1,5 +1,11 @@ local log = sorcery.logger('tap') +local sap_interval = 20; + +local function tapdrip(liq, pos) + return sorcery.vfx.drip(liq, vector.offset(pos, 0, -0.3, 0), math.random(5,12), sap_interval, 2) +end + minetest.register_node('sorcery:tap',{ description = 'Tree Tap'; drawtype = 'mesh'; mesh = 'sorcery-tap.obj'; @@ -19,24 +25,29 @@ node_placement_prediction = ''; on_place = function(stack,who,where) if where.type ~= 'node' then return end local bl = minetest.get_node(where.under) - -- FIXME prevent tapping 'dead' non-tree wood blocks local tree = sorcery.tree.get(where.under) - if not tree or tree.sap == false then return end; + if not tree or tree.def.sap == false then return end; - -- disallow vertical attachment + -- disallow vertical attachment, bc that makes no sense if vector.subtract(where.under,where.above).y ~= 0 then return end minetest.set_node(where.above, { name = 'sorcery:tap'; param2 = minetest.dir_to_wallmounted(vector.subtract(where.under,where.above)) }) + + if sorcery.lib.node.tree_is_live(where.under) then + -- start dripping immediately to indicate the tree is alive + tapdrip(tree.def.sapliq, where.above) + end stack:take_item(1) return stack end; + on_screwdriver = function() return false end; _sorcery = { recipe = { note = 'Extract syrups and oils from trees'; }; @@ -51,17 +62,16 @@ {'','sorcery:pipe',''}; }; } -local sap_interval = 60; local abm_cache local abm_cache_time minetest.register_abm { label = 'Sap drip'; nodenames = {'sorcery:tap'}; neighbors = {'group:tree'}; interval = sap_interval; - chance = 7; + chance = 4; catch_up = true; action = function(pos, node) local now = os.time() if abm_cache_time == nil or now > abm_cache_time + (sap_interval-1) then @@ -104,8 +114,10 @@ if (not live) or tree.sap == false or not tree.sapliq then return end if mass_trunk < 12*3 then return end -- too small + + tapdrip(tree.sapliq,pos) local mass = mass_leaves + mass_trunk local max_mass = 400 local ltratio = mass_leaves / mass_trunk