Sensor Extender added, farming nodes added

master
Joachim Stolberg 2019-04-03 23:33:52 +02:00
parent 7fbf97d09f
commit 71936c773f
13 changed files with 365 additions and 98 deletions

View File

@ -85,6 +85,7 @@ minetest.register_node("signs_bot:bot_sensor_on", {
after_place_node = function(pos)
minetest.get_node_timer(pos):start(1)
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos, true)
end,
on_timer = function(pos)

View File

@ -32,18 +32,21 @@ end
local function swap_node(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
return
return false
end
node.name = name
minetest.swap_node(pos, node)
return true
end
local function node_timer(pos)
local pos1 = lib.next_pos(pos, M(pos):get_int("param2"))
local node = minetest.get_node_or_nil(pos1)
if node and signs_bot.FarmingNodes[node.name] then
signs_bot.send_signal(pos)
swap_node(pos, "signs_bot:crop_sensor_on")
if node and signs_bot.FarmingCrop[node.name] then
if swap_node(pos, "signs_bot:crop_sensor_on") then
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos, true)
end
else
swap_node(pos, "signs_bot:crop_sensor")
end

127
extender.lua Normal file
View File

@ -0,0 +1,127 @@
--[[
Signs Bot
=========
Copyright (C) 2019 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
Sensor Extender
(passive node, the Sensor detects the extender)
]]--
-- for lazy programmers
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local P = minetest.string_to_pos
local M = minetest.get_meta
-- Load support for intllib.
local MP = minetest.get_modpath("signs_bot")
local I,_ = dofile(MP.."/intllib.lua")
local lib = signs_bot.lib
local function update_infotext(pos, dest_pos, cmnd)
M(pos):set_string("infotext", I("Sensor Extender: Connected with ")..S(dest_pos).." / "..cmnd)
end
minetest.register_node("signs_bot:sensor_extender", {
description = I("Sensor Extender"),
inventory_image = "signs_bot_extender_inv.png",
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {
{-6/32, -1/2, -6/32, 6/32, -5/16, 6/32},
},
connect_front = {{-1/16, -1/2, -12/16, 1/16, -6/16, 1/16}},
connect_left = {{-12/16, -1/2, -1/16, 1/16, -6/16, 1/16}},
connect_back = {{-1/16, -1/2, -1/16, 1/16, -6/16, 12/16}},
connect_right = {{-1/16, -1/2, -1/16, 12/16, -6/16, 1/16}},
},
connects_to = {"group:sign_bot_sensor"},
tiles = {
-- up, down, right, left, back, front
"signs_bot_extender.png",
"signs_bot_extender.png",
"signs_bot_extender_side.png",
"signs_bot_extender_side.png",
"signs_bot_extender_side.png",
"signs_bot_extender_side.png",
},
after_place_node = function(pos, placer)
local meta = M(pos)
meta:set_string("infotext", I("Sensor Extender: Not connected"))
end,
update_infotext = update_infotext,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
groups = {sign_bot_sensor = 1, cracky = 1},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_node("signs_bot:sensor_extender_on", {
description = I("Sensor Extender"),
drawtype = "nodebox",
node_box = {
type = "connected",
fixed = {
{-6/32, -1/2, -6/32, 6/32, -5/16, 6/32},
},
connect_front = {{-1/16, -1/2, -12/16, 1/16, -6/16, 1/16}},
connect_left = {{-12/16, -1/2, -1/16, 1/16, -6/16, 1/16}},
connect_back = {{-1/16, -1/2, -1/16, 1/16, -6/16, 12/16}},
connect_right = {{-1/16, -1/2, -1/16, 12/16, -6/16, 1/16}},
},
connects_to = {"group:sign_bot_sensor"},
tiles = {
-- up, down, right, left, back, front
"signs_bot_extender_on.png",
"signs_bot_extender.png",
"signs_bot_extender_side.png",
"signs_bot_extender_side.png",
"signs_bot_extender_side.png",
"signs_bot_extender_side.png",
},
-- Called from the Sensor beside
after_place_node = function(pos)
minetest.get_node_timer(pos):start(1)
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos)
end,
on_timer = function(pos)
local node = lib.get_node_lvm(pos)
node.name = "signs_bot:sensor_extender"
minetest.swap_node(pos, node)
return false
end,
update_infotext = update_infotext,
on_rotate = screwdriver.disallow,
paramtype = "light",
sunlight_propagates = true,
paramtype2 = "facedir",
is_ground_content = false,
diggable = false,
groups = {sign_bot_sensor = 1, not_in_creative_inventory = 1},
sounds = default.node_sound_metal_defaults(),
})
minetest.register_craft({
output = "signs_bot:sensor_extender",
recipe = {
{"group:wood", "dye:yellow"},
{"default:mese_crystal_fragment", "default:steel_ingot"}
}
})

95
farming.lua Normal file
View File

@ -0,0 +1,95 @@
--[[
Signs Bot
=========
Copyright (C) 2019 Joachim Stolberg
LGPLv2.1+
See LICENSE.txt for more information
Farming
]]--
-- for lazy programmers
local S = function(pos) if pos then return minetest.pos_to_string(pos) end end
local P = minetest.string_to_pos
local M = minetest.get_meta
-- Load support for intllib.
local MP = minetest.get_modpath("signs_bot")
local I,_ = dofile(MP.."/intllib.lua")
local lib = signs_bot.lib
local function planting(base_pos, pos, stack)
if lib.not_protected(base_pos, pos) and lib.is_air_like(pos) then
local item = signs_bot.FarmingSeed[stack:get_name()]
print("planting", stack:get_name(), dump(signs_bot.FarmingSeed[stack:get_name()]))
if item and item.seed then
minetest.set_node(pos, {name = item.seed, paramtype2 = "wallmounted", param2 = 1})
if item.t1 ~= nil then
-- We have to simulate "on_place" and start the timer by hand
-- because the after_place_node function checks player rights and can't therefore
-- be used.
minetest.get_node_timer(pos):start(math.random(item.t1, item.t2))
end
return true
end
end
return false
end
local function harvesting(base_pos, pos, inv, slot)
if lib.not_protected(base_pos, pos) then
local node = minetest.get_node_or_nil(pos)
local item = signs_bot.FarmingCrop[node.name]
if item and item.inv_crop then
minetest.remove_node(pos)
lib.put_inv_items(inv, "main", slot, ItemStack(item.inv_crop))
if item.inv_seed then
lib.put_inv_items(inv, "main", slot, ItemStack(item.inv_seed))
end
end
end
end
signs_bot.register_botcommand("plant_seed", {
mod = "core",
params = "<slot>",
description = I("Plant farming seeds\nin front of the robot"),
check = function(slot)
slot = tonumber(slot)
return slot and slot > 0 and slot < 9
end,
cmnd = function(base_pos, mem, slot)
slot = tonumber(slot)
local pos = lib.dest_pos(mem.robot_pos, mem.robot_param2, {0})
local inv = minetest.get_inventory({type="node", pos=base_pos})
local item = lib.get_inv_items(inv, "main", slot, 1)
if item then
if not planting(base_pos, pos, item) then
lib.put_inv_items(inv, "main", slot, item)
end
end
return true
end,
})
signs_bot.register_botcommand("harvest", {
mod = "core",
params = "<slot>",
description = I("Harvest farming products\nin front of the robot"),
check = function(slot)
slot = tonumber(slot)
return slot and slot > 0 and slot < 9
end,
cmnd = function(base_pos, mem, slot)
slot = tonumber(slot)
local pos = lib.dest_pos(mem.robot_pos, mem.robot_param2, {0})
local inv = minetest.get_inventory({type="node", pos=base_pos})
harvesting(base_pos, pos, inv, slot)
return true
end,
})

View File

@ -30,7 +30,9 @@ dofile(MP.."/changer.lua")
dofile(MP.."/tool.lua")
dofile(MP.."/bot_flap.lua")
dofile(MP.."/more_cmnds.lua")
dofile(MP.."/farming.lua")
dofile(MP.."/nodes.lua")
dofile(MP.."/extender.lua")
dofile(MP.."/bot_sensor.lua")
dofile(MP.."/node_sensor.lua")
dofile(MP.."/crop_sensor.lua")

25
lib.lua
View File

@ -179,3 +179,28 @@ function signs_bot.lib.dig_sign(pos, node)
return sign
end
end
local function activate_extender_node(pos)
local node = get_node_lvm(pos)
if node.name == "signs_bot:sensor_extender" then
node.name = "signs_bot:sensor_extender_on"
minetest.swap_node(pos, node)
minetest.registered_nodes["signs_bot:sensor_extender_on"].after_place_node(pos)
end
end
local NestedCounter = 0
function signs_bot.lib.activate_extender_nodes(pos, is_sensor)
if is_sensor then
NestedCounter = 0
else
NestedCounter = NestedCounter + 1
if NestedCounter >= 5 then
return
end
end
activate_extender_node({x=pos.x-1, y=pos.y, z=pos.z})
activate_extender_node({x=pos.x+1, y=pos.y, z=pos.z})
activate_extender_node({x=pos.x, y=pos.y, z=pos.z-1})
activate_extender_node({x=pos.x, y=pos.y, z=pos.z+1})
end

View File

@ -68,7 +68,8 @@ signs_bot.register_botcommand("drop_items", {
num = tonumber(num or 1)
slot = tonumber(slot)
local pos = lib.dest_pos(mem.robot_pos, mem.robot_param2, {0})
local items = lib.get_inv_items("", "main", slot, num)
local inv = minetest.get_inventory({type="node", pos=base_pos})
local items = lib.get_inv_items(inv, "main", slot, num)
minetest.add_item(pos, items)
return true
end,

View File

@ -32,18 +32,21 @@ end
local function swap_node(pos, name)
local node = minetest.get_node(pos)
if node.name == name then
return
return false
end
node.name = name
minetest.swap_node(pos, node)
return true
end
local function node_timer(pos)
local pos1 = lib.next_pos(pos, M(pos):get_int("param2"))
local node = minetest.get_node_or_nil(pos1)
if node and node.name ~= "air" then
signs_bot.send_signal(pos)
swap_node(pos, "signs_bot:node_sensor_on")
if swap_node(pos, "signs_bot:node_sensor_on") then
signs_bot.send_signal(pos)
signs_bot.lib.activate_extender_nodes(pos, true)
end
else
swap_node(pos, "signs_bot:node_sensor")
end

190
nodes.lua
View File

@ -12,120 +12,130 @@
]]--
signs_bot.FarmingNodes = {}
signs_bot.FarmingSeed = {}
signs_bot.FarmingCrop = {}
--signs_bot.FarmingTrees = {}
-- default trees which require the node timer
function signs_bot.register_tree_node(name, drop, plant)
signs_bot.FarmingNodes[name] = {drop = drop or name, plant = plant, t1= 166, t2 = 288}
---- default trees which require the node timer
--function signs_bot.register_tree_node(name, drop, plant)
-- signs_bot.FarmingTrees[name] = {drop = drop or name, plant = plant, t1= 166, t2 = 288}
--end
--function signs_bot.register_ground_node(name, drop)
-- signs_bot.GroundNodes[name] = {drop = drop or name}
--end
--local tn = signs_bot.register_tree_node
--local dn = signs_bot.register_default_farming_node
--local gn = signs_bot.register_ground_node
-- inv_seed is the seed inventory name
-- seed is what has to be placed on the ground
-- t1/t2 is needed for farming nodes which require the node timer
function signs_bot.register_farming_seed(inv_seed, seed, t1, t2)
signs_bot.FarmingSeed[inv_seed] = {seed = seed or inv_seed, t1 = 2400, t2 = 4800}
end
-- default farming nodes which require the node timer
function signs_bot.register_default_farming_node(name, drop, plant)
signs_bot.FarmingNodes[name] = {drop = drop or name, plant = plant, t1 = 2400, t2 = 4800}
-- crop is the farming crop in the final stage
-- inv_crop is the the inventory item name of the crop result
-- inv_seed is the the inventory item name of the seed result
function signs_bot.register_farming_crop(crop, inv_crop, inv_seed)
signs_bot.FarmingCrop[crop] = {inv_crop = inv_crop or crop, inv_seed = inv_seed or crop}
end
-- farming nodes with ABM
function signs_bot.register_farming_node(name, drop, plant)
signs_bot.FarmingNodes[name] = {drop = drop or name, plant = plant}
signs_bot.FarmingNodes[name].leaves = string.find(name, "leaves") ~= nil
end
function signs_bot.register_ground_node(name, drop)
signs_bot.GroundNodes[name] = {drop = drop or name}
end
local tn = signs_bot.register_tree_node
local dn = signs_bot.register_default_farming_node
local fn = signs_bot.register_farming_node
local gn = signs_bot.register_ground_node
local fs = signs_bot.register_farming_seed
local fc = signs_bot.register_farming_crop
-------------------------------------------------------------------------------
-- Default Farming
-------------------------------------------------------------------------------
tn("default:tree", "default:tree", "default:sapling")
tn("default:aspen_tree", "default:aspen_tree", "default:aspen_sapling")
tn("default:pine_tree", "default:pine_tree", "default:pine_sapling")
tn("default:acacia_tree", "default:acacia_tree", "default:acacia_sapling")
tn("default:jungletree", "default:jungletree", "default:junglesapling")
--tn("default:tree", "default:tree", "default:sapling")
--tn("default:aspen_tree", "default:aspen_tree", "default:aspen_sapling")
--tn("default:pine_tree", "default:pine_tree", "default:pine_sapling")
--tn("default:acacia_tree", "default:acacia_tree", "default:acacia_sapling")
--tn("default:jungletree", "default:jungletree", "default:junglesapling")
fn("default:leaves")
fn("default:aspen_leaves")
fn("default:pine_needles")
signs_bot.FarmingNodes["default:pine_needles"].leaves = true -- accepted as leaves
fn("default:acacia_leaves")
fn("default:jungleleaves")
--fn("default:leaves")
--fn("default:aspen_leaves")
--fn("default:pine_needles")
--signs_bot.["default:pine_needles"].leaves = true -- accepted as leaves
--fn("default:acacia_leaves")
--fn("default:jungleleaves")
fn("default:bush_leaves")
fn("default:acacia_bush_leaves")
--fn("default:bush_leaves")
--fn("default:acacia_bush_leaves")
fn("default:cactus", "default:cactus", "default:cactus")
fn("default:papyrus", "default:papyrus", "default:papyrus")
--fn("default:cactus", "default:cactus", "default:cactus")
--fn("default:papyrus", "default:papyrus", "default:papyrus")
fn("default:apple")
--fn("default:apple")
if farming.mod ~= "redo" then
dn("farming:wheat_8", "farming:wheat", "farming:wheat_1")
dn("farming:cotton_8", "farming:cotton", "farming:cotton_1")
fs("farming:seed_wheat", "farming:wheat_1")
fc("farming:wheat_8", "farming:wheat", "farming:seed_wheat")
fs("farming:seed_cotton", "farming:cotton_1")
fc("farming:cotton_8", "farming:cotton", "farming:seed_cotton")
end
-------------------------------------------------------------------------------
-- Farming Redo
----------------------------------------------- --------------------------------
if farming.mod == "redo" then
fn("farming:wheat_8", "farming:wheat", "farming:wheat_1")
fn("farming:cotton_8", "farming:cotton", "farming:cotton_1")
fn("farming:carrot_8", "farming:carrot 2", "farming:carrot_1")
fn("farming:potato_4", "farming:potato 3", "farming:potato_1")
fn("farming:tomato_8", "farming:tomato 3", "farming:tomato_1")
fn("farming:cucumber_4", "farming:cucumber 2", "farming:cucumber_1")
fn("farming:corn_8", "farming:corn 2", "farming:corn_1")
fn("farming:coffee_5", "farming:coffee_beans 2", "farming:coffee_1")
fn("farming:melon_8", "farming:melon_slice 9", "farming:melon_1")
fn("farming:pumpkin_8", "farming:pumpkin_slice 9","farming:pumpkin_1")
fn("farming:raspberry_4", "farming:raspberries", "farming:raspberry_1")
fn("farming:blueberry_4", "farming:blueberries", "farming:blueberry_1")
fn("farming:rhubarb_3", "farming:rhubarb 2", "farming:rhubarb_1")
fn("farming:beanpole_5", "farming:beans 3", "farming:beanpole_1")
fn("farming:grapes_8", "farming:grapes 3", "farming:grapes_1")
fn("farming:barley_7", "farming:barley", "farming:barley_1")
fn("farming:chili_8", "farming:chili_pepper 2", "farming:chili_1")
fn("farming:hemp_8", "farming:hemp_leaf", "farming:hemp_1")
fn("farming:oat_8", "farming:oat", "farming:oat_1")
fn("farming:rye_8", "farming:rye", "farming:rye_1")
fn("farming:rice_8", "farming:rice", "farming:rice_1")
end
-------------------------------------------------------------------------------
--if farming.mod == "redo" then
-- fn("farming:wheat_8", "farming:wheat", "farming:wheat_1")
-- fn("farming:cotton_8", "farming:cotton", "farming:cotton_1")
-- fn("farming:carrot_8", "farming:carrot 2", "farming:carrot_1")
-- fn("farming:potato_4", "farming:potato 3", "farming:potato_1")
-- fn("farming:tomato_8", "farming:tomato 3", "farming:tomato_1")
-- fn("farming:cucumber_4", "farming:cucumber 2", "farming:cucumber_1")
-- fn("farming:corn_8", "farming:corn 2", "farming:corn_1")
-- fn("farming:coffee_5", "farming:coffee_beans 2", "farming:coffee_1")
-- fn("farming:melon_8", "farming:melon_slice 9", "farming:melon_1")
-- fn("farming:pumpkin_8", "farming:pumpkin_slice 9","farming:pumpkin_1")
-- fn("farming:raspberry_4", "farming:raspberries", "farming:raspberry_1")
-- fn("farming:blueberry_4", "farming:blueberries", "farming:blueberry_1")
-- fn("farming:rhubarb_3", "farming:rhubarb 2", "farming:rhubarb_1")
-- fn("farming:beanpole_5", "farming:beans 3", "farming:beanpole_1")
-- fn("farming:grapes_8", "farming:grapes 3", "farming:grapes_1")
-- fn("farming:barley_7", "farming:barley", "farming:barley_1")
-- fn("farming:chili_8", "farming:chili_pepper 2", "farming:chili_1")
-- fn("farming:hemp_8", "farming:hemp_leaf", "farming:hemp_1")
-- fn("farming:oat_8", "farming:oat", "farming:oat_1")
-- fn("farming:rye_8", "farming:rye", "farming:rye_1")
-- fn("farming:rice_8", "farming:rice", "farming:rice_1")
--end
-------------------------------------------------------------------------------
-- Ethereal Farming
-------------------------------------------------------------------------------
fn("ethereal:strawberry_8", "ethereal:strawberry 2", "ethereal:strawberry 1")
fn("ethereal:onion_5", "ethereal:wild_onion_plant 2", "ethereal:onion_1")
--fn("ethereal:strawberry_8", "ethereal:strawberry 2", "ethereal:strawberry 1")
--fn("ethereal:onion_5", "ethereal:wild_onion_plant 2", "ethereal:onion_1")
fn("ethereal:willow_trunk", "ethereal:willow_trunk", "ethereal:willow_sapling")
fn("ethereal:redwood_trunk", "ethereal:redwood_trunk", "ethereal:redwood_sapling")
fn("ethereal:frost_tree", "ethereal:frost_tree", "ethereal:frost_tree_sapling")
fn("ethereal:yellow_trunk", "ethereal:yellow_trunk", "ethereal:yellow_tree_sapling")
fn("ethereal:palm_trunk", "ethereal:palm_trunk", "ethereal:palm_sapling")
fn("ethereal:banana_trunk", "ethereal:banana_trunk", "ethereal:banana_tree_sapling")
fn("ethereal:mushroom_trunk", "ethereal:mushroom_trunk", "ethereal:mushroom_sapling")
fn("ethereal:birch_trunk", "ethereal:birch_trunk", "ethereal:birch_sapling")
fn("ethereal:bamboo", "ethereal:bamboo", "ethereal:bamboo_sprout")
--fn("ethereal:willow_trunk", "ethereal:willow_trunk", "ethereal:willow_sapling")
--fn("ethereal:redwood_trunk", "ethereal:redwood_trunk", "ethereal:redwood_sapling")
--fn("ethereal:frost_tree", "ethereal:frost_tree", "ethereal:frost_tree_sapling")
--fn("ethereal:yellow_trunk", "ethereal:yellow_trunk", "ethereal:yellow_tree_sapling")
--fn("ethereal:palm_trunk", "ethereal:palm_trunk", "ethereal:palm_sapling")
--fn("ethereal:banana_trunk", "ethereal:banana_trunk", "ethereal:banana_tree_sapling")
--fn("ethereal:mushroom_trunk", "ethereal:mushroom_trunk", "ethereal:mushroom_sapling")
--fn("ethereal:birch_trunk", "ethereal:birch_trunk", "ethereal:birch_sapling")
--fn("ethereal:bamboo", "ethereal:bamboo", "ethereal:bamboo_sprout")
fn("ethereal:willow_twig")
fn("ethereal:redwood_leaves")
fn("ethereal:orange_leaves")
fn("ethereal:bananaleaves")
fn("ethereal:yellowleaves")
fn("ethereal:palmleaves")
fn("ethereal:birch_leaves")
fn("ethereal:frost_leaves")
fn("ethereal:bamboo_leaves")
fn("ethereal:mushroom")
fn("ethereal:mushroom_pore")
fn("ethereal:bamboo_leaves")
fn("ethereal:bamboo_leaves")
fn("ethereal:banana")
fn("ethereal:orange")
fn("ethereal:coconut")
--fn("ethereal:willow_twig")
--fn("ethereal:redwood_leaves")
--fn("ethereal:orange_leaves")
--fn("ethereal:bananaleaves")
--fn("ethereal:yellowleaves")
--fn("ethereal:palmleaves")
--fn("ethereal:birch_leaves")
--fn("ethereal:frost_leaves")
--fn("ethereal:bamboo_leaves")
--fn("ethereal:mushroom")
--fn("ethereal:mushroom_pore")
--fn("ethereal:bamboo_leaves")
--fn("ethereal:bamboo_leaves")
--fn("ethereal:banana")
--fn("ethereal:orange")
--fn("ethereal:coconut")

Binary file not shown.

After

Width:  |  Height:  |  Size: 200 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 227 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 209 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 187 B