Zefram
2014-06-20 c394984ae5a33a24730fb5e05081b80490f0694e
Handle lag better in drill

If a mining drill is apparently applied to a non-pointable node, do
nothing rather than drilling as normal. This situation usually arises
from lag, where the news of a node having been drilled didn't reach the
user quickly enough and the user thereby applied the drill twice to the
same node. The second drill attempt would formerly consume charge and
then find that all the nodes it wanted to dig had already been removed.
1 files modified
12 ■■■■ changed files
technic/tools/mining_drill.lua 12 ●●●● patch | view | raw | blame | history
technic/tools/mining_drill.lua
@@ -229,6 +229,12 @@
    minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
end
local function pos_is_pointable(pos)
    local node = minetest.env:get_node(pos)
    local nodedef = minetest.registered_nodes[node.name]
    return nodedef and nodedef.pointable
end
local function mining_drill_mk2_setmode(user,itemstack)
    local player_name=user:get_player_name()
    local item=itemstack:to_table()
@@ -285,7 +291,7 @@
    if not meta or not meta.mode or keys.sneak then
        return mining_drill_mk2_setmode(user, itemstack)
    end
    if pointed_thing.type ~= "node" or not meta.charge then
    if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then
        return
    end
    local charge_to_take = cost_to_use(2, meta.mode)
@@ -306,7 +312,7 @@
    if not meta or not meta.mode or keys.sneak then
        return mining_drill_mk3_setmode(user, itemstack)
    end
    if pointed_thing.type ~= "node" or not meta.charge then
    if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) or not meta.charge then
        return
    end
    local charge_to_take = cost_to_use(3, meta.mode)
@@ -329,7 +335,7 @@
    wear_represents = "technic_RE_charge",
    on_refill = technic.refill_RE_charge,
    on_use = function(itemstack, user, pointed_thing)
        if pointed_thing.type ~= "node" then
        if pointed_thing.type ~= "node" or not pos_is_pointable(pointed_thing.under) then
            return itemstack
        end
        local meta = minetest.deserialize(itemstack:get_metadata())