Allow Disabling of Hydration mechanics

Disables the hydration mechanics when the user sets the game difficulty
to easy in the crops_settings.txt file. This makes the mod much easier
to play on easy mode. This was acheived by only executing the parts
of the code that pertain to hydration when the hydration variable in
settings is set to true. Otherwise the code that does hydration is
never executed.
This commit is contained in:
bashterm 2016-03-06 21:34:58 -05:00 committed by Auke Kok
parent 25ebe3ecfa
commit 77d00903ad
2 changed files with 198 additions and 173 deletions

252
init.lua
View File

@ -27,6 +27,7 @@ settings.easy = {
damage_tick_min = 0,
damage_tick_max = 1,
damage_max = 25,
hydration = false,
}
settings.normal = {
chance = 8,
@ -40,6 +41,7 @@ settings.normal = {
damage_tick_min = 0,
damage_tick_max = 5,
damage_max = 50,
hydration = true,
}
settings.difficult = {
chance = 16,
@ -53,6 +55,7 @@ settings.difficult = {
damage_tick_min = 3,
damage_tick_max = 7,
damage_max = 100,
hydration = true,
}
local worldpath = minetest.get_worldpath()
@ -86,6 +89,9 @@ if not crops.settings then
minetest.log("error", "Defaulting to \"normal\" difficulty settings")
crops.settings = settings.normal
end
if crops.settings.hydration then
minetest.log("action", "[crops] Hydration and dehydration mechanics are enabled.")
end
local find_plant = function(node)
for i = 1,table.getn(crops.plants) do
@ -119,20 +125,24 @@ crops.can_grow = function(pos)
return false
end
local meta = minetest.get_meta(pos)
local water = meta:get_int("crops_water")
if water < plant.properties.wither or water > plant.properties.soak then
if math.random(0,1) == 0 then
return false
if crops.settings.hydration then
local water = meta:get_int("crops_water")
if water < plant.properties.wither or water > plant.properties.soak then
if math.random(0,1) == 0 then
return false
end
end
-- growing costs water!
meta:set_int("crops_water", math.max(1, water - 10))
end
-- damaged plants are less likely to grow
local damage = meta:get_int("crops_damage")
if not damage == 0 then
if math.random(math.min(50, damage), 100) > 75 then
return false
end
end
-- growing costs water!
meta:set_int("crops_water", math.max(1, water - 10))
-- allow the plant to grow
return true
@ -278,115 +288,9 @@ crops.die = function(pos)
minetest.sound_play("crops_flies", {pos=pos, gain=0.8})
end
minetest.register_tool("crops:watering_can", {
description = "Watering Can",
inventory_image = "crops_watering_can.png",
liquids_pointable = true,
range = 2.5,
stack_max = 1,
wear = 65535,
tool_capabilities = {},
on_use = function(itemstack, user, pointed_thing)
local pos = pointed_thing.under
local ppos = pos
if not pos then
return itemstack
end
-- filling it up?
local wear = itemstack:get_wear()
if minetest.get_item_group(minetest.get_node(pos).name, "water") >= 3 then
if wear ~= 1 then
minetest.sound_play("crops_watercan_entering", {pos=pos, gain=0.8})
minetest.after(math.random()/2, function(pos)
if math.random(2) == 1 then
minetest.sound_play("crops_watercan_splash_quiet", {pos=pos, gain=0.1})
end
if math.random(3) == 1 then
minetest.after(math.random()/2, function(pos)
minetest.sound_play("crops_watercan_splash_small", {pos=pos, gain=0.7})
end, pos)
end
if math.random(3) == 1 then
minetest.after(math.random()/2, function(pos)
minetest.sound_play("crops_watercan_splash_big", {pos=pos, gain=0.7})
end, pos)
end
end, pos)
itemstack:set_wear(1)
end
return itemstack
end
-- using it on a top-half part of a plant?
local meta = minetest.get_meta(pos)
if meta:get_int("crops_top_half") == 1 then
meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
end
-- using it on a plant?
local water = meta:get_int("crops_water")
if water < 1 then
return itemstack
end
-- empty?
if wear == 65534 then
return itemstack
end
crops.particles(ppos, 2)
minetest.sound_play("crops_watercan_watering", {pos=pos, gain=0.8})
water = math.min(water + crops.settings.watercan, crops.settings.watercan_max)
meta:set_int("crops_water", water)
itemstack:set_wear(math.min(65534, wear + (65535 / crops.settings.watercan_uses)))
return itemstack
end,
})
minetest.register_tool("crops:hydrometer", {
description = "Hydrometer",
inventory_image = "crops_hydrometer.png",
liquids_pointable = false,
range = 2.5,
stack_max = 1,
tool_capabilities = {
},
on_use = function(itemstack, user, pointed_thing)
local pos = pointed_thing.under
if not pos then
return itemstack
end
-- doublesize plant?
local meta = minetest.get_meta(pos)
if meta:get_int("crops_top_half") == 1 then
meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
end
-- using it on a plant?
local water = meta:get_int("crops_water")
if water == nil then
itemstack:set_wear(65534)
return itemstack
end
itemstack:set_wear(65535 - ((65534 / 100) * water))
return itemstack
end,
})
minetest.register_craft({
output = "crops:watering_can",
recipe = {
{ "default:steel_ingot", "", "" },
{ "default:steel_ingot", "", "default:steel_ingot" },
{ "", "default:steel_ingot", "" },
},
})
minetest.register_craft({
output = "crops:hydrometer",
recipe = {
{ "default:mese_crystal_fragment", "", "" },
{ "", "default:steel_ingot", "" },
{ "", "", "default:steel_ingot" },
},
})
if crops.settings.hydration then
dofile(modpath .. "/tools.lua")
end
-- crop nodes, crafts, craftitems
dofile(modpath .. "/melon.lua")
@ -402,70 +306,72 @@ for i = 1,table.getn(crops.plants) do
end
-- water handling code
minetest.register_abm({
nodenames = nodenames,
interval = crops.settings.damage_interval,
chance = crops.settings.damage_chance,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local water = meta:get_int("crops_water")
local damage = meta:get_int("crops_damage")
if crops.settings.hydration then
minetest.register_abm({
nodenames = nodenames,
interval = crops.settings.damage_interval,
chance = crops.settings.damage_chance,
action = function(pos, node, active_object_count, active_object_count_wider)
local meta = minetest.get_meta(pos)
local water = meta:get_int("crops_water")
local damage = meta:get_int("crops_damage")
-- get plant specific data
local plant = find_plant(node)
if plant == nil then
return
end
-- get plant specific data
local plant = find_plant(node)
if plant == nil then
return
end
-- increase water for nearby water sources
local f = minetest.find_node_near(pos, 1, {"default:water_source", "default:water_flowing"})
if not f == nil then
water = math.min(100, water + 2)
else
local f = minetest.find_node_near(pos, 2, {"default:water_source", "default:water_flowing"})
-- increase water for nearby water sources
local f = minetest.find_node_near(pos, 1, {"default:water_source", "default:water_flowing"})
if not f == nil then
water = math.min(100, water + 2)
else
local f = minetest.find_node_near(pos, 2, {"default:water_source", "default:water_flowing"})
if not f == nil then
water = math.min(100, water + 1)
end
end
if minetest.get_node_light(pos, nil) < plant.properties.night then
-- compensate for light: at night give some water back to the plant
water = math.min(100, water + 1)
else
-- dry out the plant
water = math.max(1, water - plant.properties.wateruse)
end
meta:set_int("crops_water", water)
-- for convenience, copy water attribute to top half
if not plant.properties.doublesize == nil and plant.properties.doublesize then
local above = { x = pos.x, y = pos.y + 1, z = pos.z}
local meta = minetest.get_meta(above)
meta:set_int("crops_water", water)
end
if water <= plant.properties.wither_damage then
crops.particles(pos, 0)
damage = damage + math.random(crops.settings.damage_tick_min, crops.settings.damage_tick_max)
elseif water <= plant.properties.wither then
crops.particles(pos, 0)
return
elseif water >= plant.properties.soak_damage then
crops.particles(pos, 1)
damage = damage + math.random(crops.settings.damage_tick_min, crops.settings.damage_tick_max)
elseif water >= plant.properties.soak then
crops.particles(pos, 1)
return
end
meta:set_int("crops_damage", math.min(crops.settings.damage_max, damage))
-- is it dead?
if damage >= 100 then
crops.die(pos)
end
end
if minetest.get_node_light(pos, nil) < plant.properties.night then
-- compensate for light: at night give some water back to the plant
water = math.min(100, water + 1)
else
-- dry out the plant
water = math.max(1, water - plant.properties.wateruse)
end
meta:set_int("crops_water", water)
-- for convenience, copy water attribute to top half
if not plant.properties.doublesize == nil and plant.properties.doublesize then
local above = { x = pos.x, y = pos.y + 1, z = pos.z}
local meta = minetest.get_meta(above)
meta:set_int("crops_water", water)
end
if water <= plant.properties.wither_damage then
crops.particles(pos, 0)
damage = damage + math.random(crops.settings.damage_tick_min, crops.settings.damage_tick_max)
elseif water <= plant.properties.wither then
crops.particles(pos, 0)
return
elseif water >= plant.properties.soak_damage then
crops.particles(pos, 1)
damage = damage + math.random(crops.settings.damage_tick_min, crops.settings.damage_tick_max)
elseif water >= plant.properties.soak then
crops.particles(pos, 1)
return
end
meta:set_int("crops_damage", math.min(crops.settings.damage_max, damage))
-- is it dead?
if damage >= 100 then
crops.die(pos)
end
end
})
})
end
-- cooking recipes that mix craftitems
dofile(modpath .. "/cooking.lua")

119
tools.lua Normal file
View File

@ -0,0 +1,119 @@
--[[
Copyright (C) 2015 - Auke Kok <sofar@foo-projects.org>
"crops" is free software; you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation; either version 2.1
of the license, or (at your option) any later version.
--]]
minetest.register_tool("crops:watering_can", {
description = "Watering Can",
inventory_image = "crops_watering_can.png",
liquids_pointable = true,
range = 2.5,
stack_max = 1,
wear = 65535,
tool_capabilities = {},
on_use = function(itemstack, user, pointed_thing)
local pos = pointed_thing.under
local ppos = pos
if not pos then
return itemstack
end
-- filling it up?
local wear = itemstack:get_wear()
if minetest.get_item_group(minetest.get_node(pos).name, "water") >= 3 then
if wear ~= 1 then
minetest.sound_play("crops_watercan_entering", {pos=pos, gain=0.8})
minetest.after(math.random()/2, function(pos)
if math.random(2) == 1 then
minetest.sound_play("crops_watercan_splash_quiet", {pos=pos, gain=0.1})
end
if math.random(3) == 1 then
minetest.after(math.random()/2, function(pos)
minetest.sound_play("crops_watercan_splash_small", {pos=pos, gain=0.7})
end, pos)
end
if math.random(3) == 1 then
minetest.after(math.random()/2, function(pos)
minetest.sound_play("crops_watercan_splash_big", {pos=pos, gain=0.7})
end, pos)
end
end, pos)
itemstack:set_wear(1)
end
return itemstack
end
-- using it on a top-half part of a plant?
local meta = minetest.get_meta(pos)
if meta:get_int("crops_top_half") == 1 then
meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
end
-- using it on a plant?
local water = meta:get_int("crops_water")
if water < 1 then
return itemstack
end
-- empty?
if wear == 65534 then
return itemstack
end
crops.particles(ppos, 2)
minetest.sound_play("crops_watercan_watering", {pos=pos, gain=0.8})
water = math.min(water + crops.settings.watercan, crops.settings.watercan_max)
meta:set_int("crops_water", water)
itemstack:set_wear(math.min(65534, wear + (65535 / crops.settings.watercan_uses)))
return itemstack
end,
})
minetest.register_tool("crops:hydrometer", {
description = "Hydrometer",
inventory_image = "crops_hydrometer.png",
liquids_pointable = false,
range = 2.5,
stack_max = 1,
tool_capabilities = {
},
on_use = function(itemstack, user, pointed_thing)
local pos = pointed_thing.under
if not pos then
return itemstack
end
-- doublesize plant?
local meta = minetest.get_meta(pos)
if meta:get_int("crops_top_half") == 1 then
meta = minetest.get_meta({x=pos.x, y=pos.y-1, z=pos.z})
end
-- using it on a plant?
local water = meta:get_int("crops_water")
if water == nil then
itemstack:set_wear(65534)
return itemstack
end
itemstack:set_wear(65535 - ((65534 / 100) * water))
return itemstack
end,
})
minetest.register_craft({
output = "crops:watering_can",
recipe = {
{ "default:steel_ingot", "", "" },
{ "default:steel_ingot", "", "default:steel_ingot" },
{ "", "default:steel_ingot", "" },
},
})
minetest.register_craft({
output = "crops:hydrometer",
recipe = {
{ "default:mese_crystal_fragment", "", "" },
{ "", "default:steel_ingot", "" },
{ "", "", "default:steel_ingot" },
},
})