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_min = 0,
damage_tick_max = 1, damage_tick_max = 1,
damage_max = 25, damage_max = 25,
hydration = false,
} }
settings.normal = { settings.normal = {
chance = 8, chance = 8,
@ -40,6 +41,7 @@ settings.normal = {
damage_tick_min = 0, damage_tick_min = 0,
damage_tick_max = 5, damage_tick_max = 5,
damage_max = 50, damage_max = 50,
hydration = true,
} }
settings.difficult = { settings.difficult = {
chance = 16, chance = 16,
@ -53,6 +55,7 @@ settings.difficult = {
damage_tick_min = 3, damage_tick_min = 3,
damage_tick_max = 7, damage_tick_max = 7,
damage_max = 100, damage_max = 100,
hydration = true,
} }
local worldpath = minetest.get_worldpath() local worldpath = minetest.get_worldpath()
@ -86,6 +89,9 @@ if not crops.settings then
minetest.log("error", "Defaulting to \"normal\" difficulty settings") minetest.log("error", "Defaulting to \"normal\" difficulty settings")
crops.settings = settings.normal crops.settings = settings.normal
end end
if crops.settings.hydration then
minetest.log("action", "[crops] Hydration and dehydration mechanics are enabled.")
end
local find_plant = function(node) local find_plant = function(node)
for i = 1,table.getn(crops.plants) do for i = 1,table.getn(crops.plants) do
@ -119,20 +125,24 @@ crops.can_grow = function(pos)
return false return false
end end
local meta = minetest.get_meta(pos) local meta = minetest.get_meta(pos)
local water = meta:get_int("crops_water") if crops.settings.hydration then
if water < plant.properties.wither or water > plant.properties.soak then local water = meta:get_int("crops_water")
if math.random(0,1) == 0 then if water < plant.properties.wither or water > plant.properties.soak then
return false if math.random(0,1) == 0 then
return false
end
end end
-- growing costs water!
meta:set_int("crops_water", math.max(1, water - 10))
end end
-- damaged plants are less likely to grow
local damage = meta:get_int("crops_damage") local damage = meta:get_int("crops_damage")
if not damage == 0 then if not damage == 0 then
if math.random(math.min(50, damage), 100) > 75 then if math.random(math.min(50, damage), 100) > 75 then
return false return false
end end
end end
-- growing costs water!
meta:set_int("crops_water", math.max(1, water - 10))
-- allow the plant to grow -- allow the plant to grow
return true return true
@ -278,115 +288,9 @@ crops.die = function(pos)
minetest.sound_play("crops_flies", {pos=pos, gain=0.8}) minetest.sound_play("crops_flies", {pos=pos, gain=0.8})
end end
minetest.register_tool("crops:watering_can", { if crops.settings.hydration then
description = "Watering Can", dofile(modpath .. "/tools.lua")
inventory_image = "crops_watering_can.png", end
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" },
},
})
-- crop nodes, crafts, craftitems -- crop nodes, crafts, craftitems
dofile(modpath .. "/melon.lua") dofile(modpath .. "/melon.lua")
@ -402,70 +306,72 @@ for i = 1,table.getn(crops.plants) do
end end
-- water handling code -- water handling code
minetest.register_abm({ if crops.settings.hydration then
nodenames = nodenames, minetest.register_abm({
interval = crops.settings.damage_interval, nodenames = nodenames,
chance = crops.settings.damage_chance, interval = crops.settings.damage_interval,
action = function(pos, node, active_object_count, active_object_count_wider) chance = crops.settings.damage_chance,
local meta = minetest.get_meta(pos) action = function(pos, node, active_object_count, active_object_count_wider)
local water = meta:get_int("crops_water") local meta = minetest.get_meta(pos)
local damage = meta:get_int("crops_damage") local water = meta:get_int("crops_water")
local damage = meta:get_int("crops_damage")
-- get plant specific data -- get plant specific data
local plant = find_plant(node) local plant = find_plant(node)
if plant == nil then if plant == nil then
return return
end end
-- increase water for nearby water sources -- increase water for nearby water sources
local f = minetest.find_node_near(pos, 1, {"default:water_source", "default:water_flowing"}) 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 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) 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 end
})
if minetest.get_node_light(pos, nil) < plant.properties.night then end
-- 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
})
-- cooking recipes that mix craftitems -- cooking recipes that mix craftitems
dofile(modpath .. "/cooking.lua") 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" },
},
})