mods that hopefully work for a TechAge-based pack
This commit is contained in:
@@ -0,0 +1,208 @@
|
||||
--[[
|
||||
|
||||
Signs Bot
|
||||
=========
|
||||
|
||||
Copyright (C) 2019-2021 Joachim Stolberg
|
||||
|
||||
GPL v3
|
||||
See LICENSE.txt for more information
|
||||
|
||||
Signs Changer/Control Unit for Bot Control
|
||||
|
||||
]]--
|
||||
|
||||
-- for lazy programmers
|
||||
local M = minetest.get_meta
|
||||
|
||||
-- Load support for I18n.
|
||||
local S = signs_bot.S
|
||||
|
||||
local lib = signs_bot.lib
|
||||
local INFO = [[Set the node state: command = 'set', payload = 1..4]]
|
||||
|
||||
local NodeIdx = {
|
||||
["signs_bot:changer1"] = "1",
|
||||
["signs_bot:changer2"] = "2",
|
||||
["signs_bot:changer3"] = "3",
|
||||
["signs_bot:changer4"] = "4",
|
||||
}
|
||||
|
||||
local formspec = "size[8,7]"..
|
||||
default.gui_bg..
|
||||
default.gui_bg_img..
|
||||
default.gui_slots..
|
||||
"label[1,1.3;"..S("Signs:").."]"..
|
||||
"label[2.6,0.7;1]label[5.1,0.7;2]"..
|
||||
"list[context;sign;3,0.5;2,2;]"..
|
||||
"label[2.6,1.7;3]label[5.1,1.7;4]"..
|
||||
"list[current_player;main;0,3;8,4;]"..
|
||||
"listring[context;main]"..
|
||||
"listring[current_player;main]"
|
||||
|
||||
|
||||
-- Get one sign from the robot signs inventory
|
||||
local function get_inv_sign(pos, slot)
|
||||
local inv = minetest.get_inventory({type="node", pos=pos})
|
||||
if inv then
|
||||
local stack = inv:get_stack("sign", slot)
|
||||
local taken = stack:take_item(1)
|
||||
inv:set_stack("sign", slot, stack)
|
||||
return taken
|
||||
end
|
||||
end
|
||||
|
||||
local function put_inv_sign(pos, slot, sign)
|
||||
local inv = minetest.get_inventory({type="node", pos=pos})
|
||||
if inv then
|
||||
inv:set_stack("sign", slot, sign)
|
||||
end
|
||||
end
|
||||
|
||||
local function signs_bot_get_signal(pos, node)
|
||||
return NodeIdx[node.name]
|
||||
end
|
||||
|
||||
-- To be called from sensors
|
||||
local function signs_bot_on_signal(pos, node, signal)
|
||||
-- swap changer
|
||||
local old_idx = NodeIdx[node.name]
|
||||
local new_idx = tonumber(signal)
|
||||
node.name = "signs_bot:changer"..signal
|
||||
if old_idx and NodeIdx[node.name] then
|
||||
local pos1 = lib.next_pos(pos, M(pos):get_int("param2"))
|
||||
minetest.swap_node(pos, node)
|
||||
-- swap sign
|
||||
local param2 = minetest.get_node(pos1).param2
|
||||
local sign = lib.dig_sign(pos1)
|
||||
if sign then
|
||||
M(pos):set_int("sign_param2_"..old_idx, param2)
|
||||
put_inv_sign(pos, old_idx, sign)
|
||||
end
|
||||
sign = get_inv_sign(pos, new_idx)
|
||||
if sign:get_count() == 1 then
|
||||
lib.place_sign(pos1, sign, M(pos):get_int("sign_param2_"..signal))
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
local function swap_node(pos, node)
|
||||
local slot = NodeIdx[node.name]
|
||||
if slot then
|
||||
local new_idx = (tonumber(slot) % 4) + 1
|
||||
signs_bot_on_signal(pos, node, new_idx)
|
||||
end
|
||||
end
|
||||
|
||||
local function allow_metadata_inventory()
|
||||
return 0
|
||||
end
|
||||
|
||||
local function can_dig(pos)
|
||||
local inv = minetest.get_inventory({type="node", pos=pos})
|
||||
return inv:is_empty("sign")
|
||||
end
|
||||
|
||||
for idx = 1,4 do
|
||||
local not_in_inv = idx == 1 and 0 or 1
|
||||
minetest.register_node("signs_bot:changer"..idx, {
|
||||
description = S("Bot Control Unit"),
|
||||
inventory_image = "signs_bot_ctrl_unit_inv.png",
|
||||
drawtype = "nodebox",
|
||||
node_box = {
|
||||
type = "fixed",
|
||||
fixed = {
|
||||
{ -11/32, -1/2, -11/32, 11/32, -5/16, 11/32},
|
||||
},
|
||||
},
|
||||
tiles = {
|
||||
-- up, down, right, left, back, front
|
||||
"signs_bot_sensor3.png^signs_bot_changer"..idx..".png",
|
||||
"signs_bot_sensor3.png",
|
||||
"signs_bot_sensor3.png^[transformFXR90",
|
||||
"signs_bot_sensor3.png^[transformFXR90",
|
||||
"signs_bot_sensor3.png^[transformFXR90",
|
||||
"signs_bot_sensor3.png^[transformFXR180",
|
||||
},
|
||||
on_construct = function(pos)
|
||||
local meta = minetest.get_meta(pos)
|
||||
local inv = meta:get_inventory()
|
||||
inv:set_size('sign', 4)
|
||||
end,
|
||||
|
||||
after_place_node = function(pos, placer)
|
||||
local meta = minetest.get_meta(pos)
|
||||
meta:set_string("formspec", formspec)
|
||||
local node = minetest.get_node(pos)
|
||||
meta:set_int("param2", (node.param2 + 2) % 4)
|
||||
if minetest.get_modpath("techage") then
|
||||
techage.logic.after_place_node(pos, placer, node.name, S("Bot Control Unit"))
|
||||
techage.logic.infotext(meta, S("Bot Control Unit"))
|
||||
end
|
||||
end,
|
||||
|
||||
signs_bot_get_signal = signs_bot_get_signal,
|
||||
signs_bot_on_signal = signs_bot_on_signal,
|
||||
allow_metadata_inventory_put = allow_metadata_inventory,
|
||||
allow_metadata_inventory_take = allow_metadata_inventory,
|
||||
on_punch = swap_node,
|
||||
can_dig = can_dig,
|
||||
|
||||
on_rotate = screwdriver.disallow,
|
||||
paramtype = "light",
|
||||
use_texture_alpha = signs_bot.CLIP,
|
||||
sunlight_propagates = true,
|
||||
paramtype2 = "facedir",
|
||||
is_ground_content = false,
|
||||
groups = {cracky = 1, not_in_creative_inventory = not_in_inv},
|
||||
drop = "signs_bot:changer1",
|
||||
sounds = default.node_sound_metal_defaults(),
|
||||
})
|
||||
end
|
||||
|
||||
minetest.register_craft({
|
||||
output = "signs_bot:changer1",
|
||||
recipe = {
|
||||
{"", "", ""},
|
||||
{"dye:yellow", "group:wood", "dye:black"},
|
||||
{"default:steel_ingot", "default:mese_crystal_fragment", "default:steel_ingot"}
|
||||
}
|
||||
})
|
||||
|
||||
if minetest.get_modpath("doc") then
|
||||
doc.add_entry("signs_bot", "changer", {
|
||||
name = S("Bot Control Unit"),
|
||||
data = {
|
||||
item = "signs_bot:changer1",
|
||||
text = table.concat({
|
||||
S("The Bot Control Unit is used to lead the bot by means of signs."),
|
||||
S("The unit can be loaded with up to 4 different signs and can be programmed by means of sensors."),
|
||||
"",
|
||||
S("To load the unit, place a sign on the red side of the unit and click on the unit."),
|
||||
S("The sign disappears / is moved to the inventory of the unit."),
|
||||
S("This can be repeated 3 times."),
|
||||
"",
|
||||
S("Use the connection tool to connect up to 4 sensors with the Bot Control Unit."),
|
||||
}, "\n")
|
||||
},
|
||||
})
|
||||
end
|
||||
|
||||
if minetest.get_modpath("techage") then
|
||||
techage.register_node({"signs_bot:changer1", "signs_bot:changer2", "signs_bot:changer3", "signs_bot:changer4"}, {
|
||||
on_recv_message = function(pos, src, topic, payload)
|
||||
if topic == "set" then
|
||||
local idx = tonumber(payload) or 1
|
||||
if idx >= 1 and idx <= 4 then
|
||||
local node = techage.get_node_lvm(pos)
|
||||
signs_bot_on_signal(pos, node, idx)
|
||||
return true
|
||||
end
|
||||
elseif topic == "info" then
|
||||
return INFO
|
||||
else
|
||||
return "unsupported"
|
||||
end
|
||||
end,
|
||||
})
|
||||
end
|
||||
Reference in New Issue
Block a user