Reviewed to comply with lua guidelines

This commit is contained in:
h-v-smacker 2017-10-27 22:03:43 +03:00
parent be5bb54bc7
commit 6190b6cafa

View File

@ -1,27 +1,33 @@
--[[ --[[
The Lawn Trimmer, also known as Weed Whacker, is a common gardening power tool. The Lawn Trimmer, also known as Weed Whacker, is a common gardening power
In minetest, it has several uses. While it removes all members of 'flora' group tool. In minetest, it has several uses. While it removes all members of
and can be used for literally mowing grass or trimming it around vegetable beds, 'flora' group and can be used for literally mowing grass or trimming it
it's not its most important application. around vegetable beds, it's not its most important application.
1. The tool can be used when searching for plants that can be cultivated in the wilderness. 1. The tool can be used when searching for plants that can be cultivated
Some of them are hard to see through grass; some of them are hard to tell from the grass; in the wilderness. Some of them are hard to see through grass; some of
some of them are actually obtained by removing the grass (e.g. barley seeds). them are hard to tell from the grass; some of them are actually obtained
by removing the grass (e.g. barley seeds).
2. Producing organic dye pigments. While growing flowers is a matter of fertilizing the soil 2. Producing organic dye pigments. While growing flowers is a matter of
with bone meal, harvesting them by hand is a chore. fertilizing the soil with bone meal, harvesting them by hand is a chore.
In both scenarios, the tool will be very handy for the player. In both scenarios, the tool will be very handy for the player.
It comes with 4 modes of operation, defined by how wide its sweep is: from 0 (at one's feet) It comes with 4 modes of operation, defined by how wide its sweep is:
to 3 nodes in radius (square radius, as most things in minetest are). from 0 (at one's feet) to 3 nodes in radius (square radius, as most
things in minetest are).
The sound is an edited fragment from https://www.cutestockfootage.com/sound-effect/9251/grass-trimmer-01 The sound is an edited fragment from
used in accordance with its licensing terms (free use for any purpose in an altered form) https://www.cutestockfootage.com/sound-effect/9251/grass-trimmer-01
used in accordance with its licensing terms (free use for any purpose in
an altered form)
]] ]]
-- Configuration -- Configuration
local lawn_trimmer_max_charge = 10000 -- default: 10000 - Same as the chainsaw -- Intended to hold as much as the chainsaw, 10000 units
local lawn_trimmer_charge_per_object = 25 -- default: 25 - Can mow 400 'group:flora' blocks local lawn_trimmer_max_charge = 10000
-- With 25 units per object can mow 400 'group:flora' blocks
local lawn_trimmer_charge_per_object = 25
local S = technic.getter local S = technic.getter
@ -38,20 +44,21 @@ local function lawn_trimmer_setmode(user,itemstack)
local player_name = user:get_player_name() local player_name = user:get_player_name()
local meta = minetest.deserialize(itemstack:get_metadata()) local meta = minetest.deserialize(itemstack:get_metadata())
if meta == nil then if not meta then
meta = {mode = 0} meta = {mode = 0}
end end
if meta.mode == nil then if not meta.mode then
minetest.chat_send_player(player_name, S("Use while sneaking to change Lawn Trimmer modes.")) minetest.chat_send_player(player_name,
S("Use while sneaking to change Lawn Trimmer modes."))
meta.mode = 0 meta.mode = 0
end end
meta.mode = meta.mode + 1 meta.mode = meta.mode + 1
if meta.mode > 4 then meta.mode = 1 end
if meta.mode > 4 then minetest.chat_send_player(player_name,
meta.mode = 1 S("Lawn Trimmer Mode %d"):format(meta.mode) .. ": "
end .. lawn_trimmer_mode_text[meta.mode])
minetest.chat_send_player(player_name, S("Lawn Trimmer Mode %d"):format(meta.mode) .. ": " .. lawn_trimmer_mode_text[meta.mode])
itemstack:set_name("technic:lawn_trimmer_" .. meta.mode); itemstack:set_name("technic:lawn_trimmer_" .. meta.mode);
itemstack:set_metadata(minetest.serialize(meta)) itemstack:set_metadata(minetest.serialize(meta))
return itemstack return itemstack
@ -66,10 +73,10 @@ local function trim_the_lawn(itemstack, user)
if not meta or not meta.mode or keys.sneak then if not meta or not meta.mode or keys.sneak then
return lawn_trimmer_setmode(user, itemstack) return lawn_trimmer_setmode(user, itemstack)
end end
if not meta or not meta.charge then if not meta or not meta.charge then
return return
end end
if meta.charge > lawn_trimmer_charge_per_object then if meta.charge > lawn_trimmer_charge_per_object then
minetest.sound_play("technic_lawn_trimmer", { minetest.sound_play("technic_lawn_trimmer", {
to_player = user:get_player_name(), to_player = user:get_player_name(),
@ -80,28 +87,34 @@ local function trim_the_lawn(itemstack, user)
local pos = user:getpos() local pos = user:getpos()
local inv = user:get_inventory() local inv = user:get_inventory()
-- Defining the area for the search needs two positions -- Defining the area for the search needs two positions
-- The tool has a limited range in the vertical axis, which is capped at +/- 1 node
local start_pos = { local start_pos = {
x = pos.x - meta.mode + 1, x = pos.x - meta.mode + 1,
z = pos.z - meta.mode + 1, z = pos.z - meta.mode + 1,
y = pos.y - 1 y = pos.y - 1
} -- the tool can hardly be lowered a lot while standing, but we'll allow 1 node }
local end_pos = { local end_pos = {
x = pos.x + meta.mode - 1, x = pos.x + meta.mode - 1,
z = pos.z + meta.mode - 1, z = pos.z + meta.mode - 1,
y = pos.y + 1 y = pos.y + 1
} -- cannot be raised too high either, though mostly for safety reasons }
-- Since nodes sometimes cannot be removed, we cannot rely on repeating find_node_near() and removing found nodes -- Since nodes sometimes cannot be removed, we cannot rely on repeating
-- find_node_near() and removing found nodes
local found_flora = minetest.find_nodes_in_area(start_pos, end_pos, {"group:flora"}) local found_flora = minetest.find_nodes_in_area(start_pos, end_pos, {"group:flora"})
for _,f in ipairs(found_flora) do for _,f in ipairs(found_flora) do
if meta.charge < lawn_trimmer_charge_per_object then break end -- no charge left for this node -- Abort if no charge left for a node
if minetest.is_protected(f, user:get_player_name()) then break end -- may not dig this node if meta.charge < lawn_trimmer_charge_per_object then break end
-- Skip to the next one if this node cannot be dug
if not minetest.is_protected(f, user:get_player_name()) then
meta.charge = meta.charge - lawn_trimmer_charge_per_object meta.charge = meta.charge - lawn_trimmer_charge_per_object
local node = minetest.get_node_or_nil(f) local node = minetest.get_node_or_nil(f)
minetest.node_dig(f, node, user) minetest.node_dig(f, node, user)
end end
end
-- the charge won't expire in creative mode, but the tool still has to be charged prior to use -- The charge won't expire in creative mode, but the tool still
-- has to be charged prior to use
if not technic.creative_mode then if not technic.creative_mode then
technic.set_RE_wear(itemstack, meta.charge, lawn_trimmer_max_charge) technic.set_RE_wear(itemstack, meta.charge, lawn_trimmer_max_charge)
itemstack:set_metadata(minetest.serialize(meta)) itemstack:set_metadata(minetest.serialize(meta))
@ -121,7 +134,7 @@ minetest.register_tool("technic:lawn_trimmer", {
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
trim_the_lawn(itemstack, user) trim_the_lawn(itemstack, user)
return itemstack return itemstack
end, end
}) })
for i = 1,4,1 do for i = 1,4,1 do
@ -136,14 +149,15 @@ for i=1,4,1 do
on_use = function(itemstack, user, pointed_thing) on_use = function(itemstack, user, pointed_thing)
trim_the_lawn(itemstack, user) trim_the_lawn(itemstack, user)
return itemstack return itemstack
end, end
}) })
end end
-- Provide a crafting recipe -- Provide a crafting recipe
local mesecons_button = minetest.get_modpath("mesecons_button") local mesecons_button = minetest.get_modpath("mesecons_button")
local trigger = mesecons_button and "mesecons_button:button_off" or "default:mese_crystal_fragment" local trigger = mesecons_button and "mesecons_button:button_off"
or "default:mese_crystal_fragment"
minetest.register_craft({ minetest.register_craft({
output = 'technic:lawn_trimmer', output = 'technic:lawn_trimmer',