From bb7f5f806f3c56a9376a5fc1639bd0b47978c4ab Mon Sep 17 00:00:00 2001 From: Juraj Vajda Date: Mon, 10 Dec 2018 18:39:36 -0500 Subject: [PATCH] fixed: upgrade level max 10, prevent faking upgrade by replacing item in the upgrade slot, fix upgrade increment logic, reset upgrade when switching item in upgrade node - prevents faking in another way, reset elevator mod when not in object mode - fixes bug when mover had to be digged up and placed again to reset elevator meta --- mover.lua | 79 +++++++++++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 29 deletions(-) diff --git a/mover.lua b/mover.lua index e17a4d1..3d98262 100644 --- a/mover.lua +++ b/mover.lua @@ -240,9 +240,9 @@ local get_mover_form = function(pos,player) upgrade = upgrade - 1 end - if upgrade > 99 then - upgrade = 99 - meta:set_float("upgrade", 99) + if upgrade > 10 then + upgrade = 10 + meta:set_float("upgrade", 10) end local seltab = meta:get_int("seltab") @@ -366,14 +366,18 @@ minetest.register_node("basic_machines:mover", { meta:set_int("public", 0) meta:set_int("x0", 0) meta:set_int("y0", -1) - meta:set_int("z0", 0) -- source1 + -- source1 + meta:set_int("z0", 0) meta:set_int("x1", 0) meta:set_int("y1", -1) - meta:set_int("z1", 0) -- source2: defines cube + -- source2: defines cube + meta:set_int("z1", 0) meta:set_int("pc", 0) - meta:set_int("dim", 1)-- current cube position and dimensions + -- current cube position and dimensions + meta:set_int("dim", 1) meta:set_int("pc", 0) - meta:set_int("dim", 1)-- current cube position and dimensions + -- current cube position and dimensions + meta:set_int("dim", 1) meta:set_int("x2", 0) meta:set_int("y2", 1) meta:set_int("z2", 0) @@ -385,9 +389,10 @@ minetest.register_node("basic_machines:mover", { local privs = minetest.get_player_privs(placer:get_player_name()) + -- means operation will be for free if privs.privs then meta:set_float("upgrade", -1) - end -- means operation will be for free + end local inv = meta:get_inventory() inv:set_size("upgrade", 1 * 1) @@ -405,7 +410,8 @@ minetest.register_node("basic_machines:mover", { -- minetest.show_formspec(name, "basic_machines:intro_mover", form) end, - can_dig = function(pos, player) -- dont dig if upgrades inside, cause they will be destroyed + -- dont dig if upgrades inside, cause they will be destroyed + can_dig = function(pos, player) local meta = minetest.get_meta(pos) local inv = meta:get_inventory() return inv:is_empty("upgrade") @@ -431,33 +437,45 @@ minetest.register_node("basic_machines:mover", { return 0 end + local stack_name = stack:get_name() + if listname == "filter" then local meta = minetest.get_meta(pos) - local itemname = stack:get_name() or "" - meta:set_string("prefer", itemname) - -- minetest.chat_send_player(player:get_player_name(),"#mover: filter set as " .. itemname) - local form = get_mover_form(pos,player) + local form = get_mover_form(pos, player) + + meta:set_string("prefer", stack_name) minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) return 1 end + if listname == "upgrade" then + if not (stack_name == "default:diamondblock" or stack_name == "default:mese") then + return 0 + end + end + + return stack:get_count() + end, + + on_metadata_inventory_put = function(pos, listname, index, stack, player) + if listname == "upgrade" then -- update upgrades local meta = minetest.get_meta(pos) local upgrade = 0 local inv = meta:get_inventory() - + local stack_name = stack:get_name() local upgrade_name = "default:mese" + -- check if upgrade should be for elevator if meta:get_int("elevator") == 1 then upgrade_name = "default:diamondblock" end - if stack:get_name() == upgrade_name then - --inv:contains_item("upgrade", ItemStack({name="default:mese"})) then - upgrade = (inv:get_stack("upgrade", 1):get_count()) or 0 - upgrade = upgrade + stack:get_count() + -- add upgrades + if stack_name == upgrade_name then + upgrade = inv:get_stack(listname, index):get_count() or 0 -- not more than 10 if upgrade > 10 then @@ -468,10 +486,15 @@ minetest.register_node("basic_machines:mover", { local form = get_mover_form(pos, player) minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) - end - end + -- reset upgrade level when switching the item + else + meta:set_float("upgrade", 1) - return stack:get_count() + local form = get_mover_form(pos, player) + minetest.show_formspec(player:get_player_name(), "basic_machines:mover_"..minetest.pos_to_string(pos), form) + end + + end end, allow_metadata_inventory_take = function(pos, listname, index, stack, player) @@ -619,7 +642,7 @@ minetest.register_node("basic_machines:mover", { end -- upgrade decreases fuel cost - fuel_cost = fuel_cost/upgrade + fuel_cost = fuel_cost / upgrade -- free operation for admin if upgrade == -1 then @@ -2512,7 +2535,6 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) return end - if punchset[name].state == 3 then if punchset[name].node ~= "basic_machines:mover" then punchset[name].state = 0 @@ -2521,6 +2543,8 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) local privs = minetest.get_player_privs(puncher:get_player_name()); local elevator_mode = false + local meta = minetest.get_meta(punchset[name].pos) + meta:set_int("elevator", 0) -- check if elevator mode if punchset[name].pos.x == pos.x and @@ -2538,13 +2562,10 @@ minetest.register_on_punchnode(function(pos, node, puncher, pointed_thing) if inv:get_stack("upgrade", 1):get_name() == "default:diamondblock" then local inv_stack = inv:get_stack("upgrade", 1) + upgrade = inv_stack:get_count() - if not inv_stack then - upgrade = 0 - elseif inv_stack:get_count() > inv_stack:get_stack_max() then - upgrade = inv_stack:get_stack_max() - else - upgrade = inv_stack:get_count() + if upgrade > 10 then + upgrade = 10 end end