From ebc114df71cc20868afbd3c6dea4039dc14c1a0e Mon Sep 17 00:00:00 2001 From: Carter Kolwey <fhrfuyduduf@gmail.com> Date: Sat, 11 Jan 2014 18:30:10 +0100 Subject: [PATCH] Fixed music player --- technic/tools/chainsaw.lua | 186 +++++++++++++++++++++++++--------------------- 1 files changed, 101 insertions(+), 85 deletions(-) diff --git a/technic/tools/chainsaw.lua b/technic/tools/chainsaw.lua index 891f4e4..4124265 100644 --- a/technic/tools/chainsaw.lua +++ b/technic/tools/chainsaw.lua @@ -3,41 +3,6 @@ local chainsaw_charge_per_node = 12 -- 12 - Gives 2500 nodes on a single charge (about 50 complete normal trees) local chainsaw_leaves = true -- true - Cut down entire trees, leaves and all -technic.register_power_tool ("technic:chainsaw",chainsaw_max_charge) - -minetest.register_tool("technic:chainsaw", { - description = "Chainsaw", - inventory_image = "technic_chainsaw.png", - stack_max = 1, - on_use = function(itemstack, user, pointed_thing) - if pointed_thing.type=="node" then - item=itemstack:to_table() - local meta=get_item_meta(item["metadata"]) - if meta==nil then return end --tool not charged - if meta["charge"]==nil then return end - -- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes. - local charge=meta["charge"] - if charge < chainsaw_charge_per_node then return end -- only cut if charged - - charge=chainsaw_dig_it(minetest.get_pointed_thing_position(pointed_thing, above),user,charge) - technic.set_RE_wear(item,charge,chainsaw_max_charge) - meta["charge"]=charge - item["metadata"]=set_item_meta(meta) - itemstack:replace(item) - return itemstack - end - end, -}) - -minetest.register_craft({ - output = 'technic:chainsaw', - recipe = { - {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'}, - {'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'}, - {'', '', 'default:copper_ingot'}, - } -}) - -- The default stuff local timber_nodenames={["default:jungletree"] = true, ["default:papyrus"] = true, @@ -48,6 +13,16 @@ if chainsaw_leaves == true then timber_nodenames["default:leaves"] = true +end + +-- technic_worldgen defines rubber trees if moretrees isn't installed +if minetest.get_modpath("technic_worldgen") or + minetest.get_modpath("moretrees") then + timber_nodenames["moretrees:rubber_tree_trunk_empty"] = true + timber_nodenames["moretrees:rubber_tree_trunk"] = true + if chainsaw_leaves then + timber_nodenames["moretrees:rubber_tree_leaves"] = true + end end -- Support moretrees if it is there @@ -66,9 +41,7 @@ timber_nodenames["moretrees:palm_trunk_sideways"] = true timber_nodenames["moretrees:pine_trunk"] = true timber_nodenames["moretrees:pine_trunk_sideways"] = true - timber_nodenames["moretrees:rubber_tree_trunk"] = true timber_nodenames["moretrees:rubber_tree_trunk_sideways"] = true - timber_nodenames["moretrees:rubber_tree_trunk_empty"] = true timber_nodenames["moretrees:rubber_tree_trunk_sideways_empty"] = true timber_nodenames["moretrees:sequoia_trunk"] = true timber_nodenames["moretrees:sequoia_trunk_sideways"] = true @@ -79,7 +52,7 @@ timber_nodenames["moretrees:jungletree_trunk"] = true timber_nodenames["moretrees:jungletree_trunk_sideways"] = true - if chainsaw_leaves == true then + if chainsaw_leaves then timber_nodenames["moretrees:apple_tree_leaves"] = true timber_nodenames["moretrees:oak_leaves"] = true timber_nodenames["moretrees:sequoia_leaves"] = true @@ -90,7 +63,6 @@ timber_nodenames["moretrees:spruce_leaves"] = true timber_nodenames["moretrees:pine_leaves"] = true timber_nodenames["moretrees:willow_leaves"] = true - timber_nodenames["moretrees:rubber_tree_leaves"] = true timber_nodenames["moretrees:jungletree_leaves_green"] = true timber_nodenames["moretrees:jungletree_leaves_yellow"] = true timber_nodenames["moretrees:jungletree_leaves_red"] = true @@ -145,55 +117,17 @@ end end + +local S = technic.getter + +technic.register_power_tool("technic:chainsaw", chainsaw_max_charge) + -- Table for saving what was sawed down -local produced - --- Saw down trees entry point -chainsaw_dig_it = function(pos, player,current_charge) - local remaining_charge=current_charge - - -- Save the currently installed dropping mechanism so we can restore it. - local original_handle_node_drops = minetest.handle_node_drops - - -- A bit of trickery here: use a different node drop callback - -- and restore the original afterwards. - minetest.handle_node_drops = chainsaw_handle_node_drops - - -- clear result and start sawing things down - produced = {} - remaining_charge = recursive_dig(pos, remaining_charge, player) - minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,}) - - -- Restore the original noder drop handler - minetest.handle_node_drops = original_handle_node_drops - - -- Now drop items for the player - local number, produced_item, p - for produced_item,number in pairs(produced) do - --print("ADDING ITEM: " .. produced_item .. " " .. number) - -- Drop stacks of 99 or less - p = { - x = pos.x + math.random()*4, - y = pos.y, - z = pos.z + math.random()*4 - } - while number > 99 do - minetest.env:add_item(p, produced_item .. " 99") - p = { - x = pos.x + math.random()*4, - y = pos.y, - z = pos.z + math.random()*4 - } - number = number - 99 - end - minetest.env:add_item(p, produced_item .. " " .. number) - end - return remaining_charge -end +local produced = nil -- Override the default handling routine to be able to count up the -- items sawed down so that we can drop them i an nice single stack -chainsaw_handle_node_drops = function(pos, drops, digger) +local function chainsaw_handle_node_drops(pos, drops, digger) -- Add dropped items to list of collected nodes local _, dropped_item for _, dropped_item in ipairs(drops) do @@ -207,7 +141,7 @@ -- This function does all the hard work. Recursively we dig the node at hand -- if it is in the table and then search the surroundings for more stuff to dig. -recursive_dig = function(pos, remaining_charge, player) +local function recursive_dig(pos, remaining_charge, player) local node=minetest.env:get_node(pos) local i=1 -- Lookup node name in timber table: @@ -267,3 +201,85 @@ return remaining_charge end +-- Saw down trees entry point +local function chainsaw_dig_it(pos, player,current_charge) + if minetest.is_protected(pos, player:get_player_name()) then + minetest.record_protection_violation(pos, player:get_player_name()) + return current_charge + end + local remaining_charge=current_charge + + -- Save the currently installed dropping mechanism so we can restore it. + local original_handle_node_drops = minetest.handle_node_drops + + -- A bit of trickery here: use a different node drop callback + -- and restore the original afterwards. + minetest.handle_node_drops = chainsaw_handle_node_drops + + -- clear result and start sawing things down + produced = {} + remaining_charge = recursive_dig(pos, remaining_charge, player) + minetest.sound_play("chainsaw", {pos = pos, gain = 1.0, max_hear_distance = 10,}) + + -- Restore the original noder drop handler + minetest.handle_node_drops = original_handle_node_drops + + -- Now drop items for the player + local number, produced_item, p + for produced_item,number in pairs(produced) do + --print("ADDING ITEM: " .. produced_item .. " " .. number) + -- Drop stacks of 99 or less + p = { + x = pos.x + math.random()*4, + y = pos.y, + z = pos.z + math.random()*4 + } + while number > 99 do + minetest.env:add_item(p, produced_item .. " 99") + p = { + x = pos.x + math.random()*4, + y = pos.y, + z = pos.z + math.random()*4 + } + number = number - 99 + end + minetest.env:add_item(p, produced_item .. " " .. number) + end + return remaining_charge +end + + +minetest.register_tool("technic:chainsaw", { + description = S("Chainsaw"), + inventory_image = "technic_chainsaw.png", + stack_max = 1, + on_use = function(itemstack, user, pointed_thing) + if pointed_thing.type ~= "node" then + return itemstack + end + local meta = minetest.deserialize(itemstack:get_metadata()) + if not meta or not meta.charge then + return + end + -- Send current charge to digging function so that the chainsaw will stop after digging a number of nodes. + if meta.charge < chainsaw_charge_per_node then + return + end + + local pos = minetest.get_pointed_thing_position(pointed_thing, above) + meta.charge = chainsaw_dig_it(pos, user, meta.charge) + technic.set_RE_wear(itemstack, meta.charge, chainsaw_max_charge) + itemstack:set_metadata(minetest.serialize(meta)) + return itemstack + end, +}) + +minetest.register_craft({ + output = 'technic:chainsaw', + recipe = { + {'technic:stainless_steel_ingot', 'technic:stainless_steel_ingot', 'technic:battery'}, + {'technic:stainless_steel_ingot', 'technic:motor', 'technic:battery'}, + {'', '', 'default:copper_ingot'}, + } +}) + -- Gitblit v1.8.0