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.
This commit is contained in:
Zefram 2014-06-20 22:35:56 +01:00 committed by RealBadAngel
parent 7c4b7046cc
commit c394984ae5

View File

@ -229,6 +229,12 @@ local function drill_dig_it(pos, player, mode)
minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,}) minetest.sound_play("mining_drill", {pos = pos, gain = 1.0, max_hear_distance = 10,})
end 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 function mining_drill_mk2_setmode(user,itemstack)
local player_name=user:get_player_name() local player_name=user:get_player_name()
local item=itemstack:to_table() local item=itemstack:to_table()
@ -285,7 +291,7 @@ local function mining_drill_mk2_handler(itemstack, user, pointed_thing)
if not meta or not meta.mode or keys.sneak then if not meta or not meta.mode or keys.sneak then
return mining_drill_mk2_setmode(user, itemstack) return mining_drill_mk2_setmode(user, itemstack)
end 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 return
end end
local charge_to_take = cost_to_use(2, meta.mode) local charge_to_take = cost_to_use(2, meta.mode)
@ -306,7 +312,7 @@ local function mining_drill_mk3_handler(itemstack, user, pointed_thing)
if not meta or not meta.mode or keys.sneak then if not meta or not meta.mode or keys.sneak then
return mining_drill_mk3_setmode(user, itemstack) return mining_drill_mk3_setmode(user, itemstack)
end 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 return
end end
local charge_to_take = cost_to_use(3, meta.mode) local charge_to_take = cost_to_use(3, meta.mode)
@ -329,7 +335,7 @@ minetest.register_tool("technic:mining_drill", {
wear_represents = "technic_RE_charge", wear_represents = "technic_RE_charge",
on_refill = technic.refill_RE_charge, on_refill = technic.refill_RE_charge,
on_use = function(itemstack, user, pointed_thing) 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 return itemstack
end end
local meta = minetest.deserialize(itemstack:get_metadata()) local meta = minetest.deserialize(itemstack:get_metadata())