MineClone2/mods/ITEMS/REDSTONE/mesecons/wires.lua

270 lines
10 KiB
Lua
Raw Normal View History

2015-06-29 19:55:56 +02:00
-- naming scheme: wire:(xp)(zp)(xm)(zm)_on/off
-- The conditions in brackets define whether there is a mesecon at that place or not
-- 1 = there is one; 0 = there is none
-- y always means y+
box_center = {-1/16, -.5, -1/16, 1/16, -.5+1/64, 1/16} -- filler for curves and straight lines
box_bump1 = { -3/16, -.5, -3/16, 3/16, -.5+1/64, 3/16 } -- filler for redstone dust “dot”
2015-06-29 19:55:56 +02:00
box_xp = {1/16, -.5, -1/16, 8/16, -.5+1/64, 1/16}
box_zp = {-1/16, -.5, 1/16, 1/16, -.5+1/64, 8/16}
box_xm = {-8/16, -.5, -1/16, -1/16, -.5+1/64, 1/16}
box_zm = {-1/16, -.5, -8/16, 1/16, -.5+1/64, -1/16}
box_xpy = {.5-1/16, -.5+1/64, -1/16, .5, .4999+1/64, 1/16}
box_zpy = {-1/16, -.5+1/64, .5-1/16, 1/16, .4999+1/64, .5}
box_xmy = {-.5, -.5+1/64, -1/16, -.5+1/16, .4999+1/64, 1/16}
box_zmy = {-1/16, -.5+1/64, -.5, 1/16, .4999+1/64, -.5+1/16}
-- Registering the wires
for xp=0, 1 do
for zp=0, 1 do
for xm=0, 1 do
for zm=0, 1 do
for xpy=0, 1 do
for zpy=0, 1 do
for xmy=0, 1 do
for zmy=0, 1 do
if (xpy == 1 and xp == 0) or (zpy == 1 and zp == 0)
or (xmy == 1 and xm == 0) or (zmy == 1 and zm == 0) then break end
local groups
local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
2017-03-11 22:37:53 +01:00
local wirehelp
local longdesc
local usagehelp
2015-06-29 19:55:56 +02:00
if nodeid == "00000000" then
2017-05-20 04:11:14 +02:00
groups = {dig_immediate = 3, mesecon_conductor_craftable = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1}
2017-01-17 17:29:14 +01:00
wiredesc = "Redstone"
2017-03-11 22:37:53 +01:00
wirehelp = nodeid == "00000000"
if wirehelp then
longdesc = [[Redstone is a versatile conductive mineral which transmits redstone power. It can be placed on trail the ground as a trail.
A redstone trail can be in two states: Powered or not powered. A powered redstone trail will power (and thus activate) adjacent redstone components.
Redstone power can be received from various redstone components, such as a block of redstone or a button. Redstone power is used to activate numerous mechanisms, such as redstone lamps or pistons.]]
usagehelp = [[Place redstone on the ground to build a redstone trail. The trails will connect to each other automatically and it can also go over hills. An easy way to power a redstone trail is by placing a redstone torch.
Read the help entries on the other redstone components to learn how redstone components interact.]]
end
2015-06-29 19:55:56 +02:00
else
2017-05-20 04:11:14 +02:00
groups = {dig_immediate = 3, not_in_creative_inventory = 1, attached_node = 1, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1}
2017-01-17 17:29:14 +01:00
wiredesc = "Redstone Trail (ID: "..nodeid..")"
2017-03-11 22:37:53 +01:00
wirehelp = false
2015-06-29 19:55:56 +02:00
end
local nodebox = {}
local adjx = false
local adjz = false
if xp == 1 then table.insert(nodebox, box_xp) adjx = true end
if zp == 1 then table.insert(nodebox, box_zp) adjz = true end
if xm == 1 then table.insert(nodebox, box_xm) adjx = true end
if zm == 1 then table.insert(nodebox, box_zm) adjz = true end
if xpy == 1 then table.insert(nodebox, box_xpy) end
if zpy == 1 then table.insert(nodebox, box_zpy) end
if xmy == 1 then table.insert(nodebox, box_xmy) end
if zmy == 1 then table.insert(nodebox, box_zmy) end
2017-07-21 17:37:59 +02:00
local ratio_off = 128
local ratio_on = 192
local crossing_off = "(redstone_redstone_dust_dot.png^redstone_redstone_dust_line0.png^(redstone_redstone_dust_line1.png^[transformR90))^[colorize:#FF0000:"..ratio_off
local crossing_on = "(redstone_redstone_dust_dot.png^redstone_redstone_dust_line0.png^(redstone_redstone_dust_line1.png^[transformR90))^[colorize:#FF0000:"..ratio_on
local straight0_off = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_off
local straight0_on = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_on
local straight1_off = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_off
local straight1_on = "redstone_redstone_dust_line0.png^[colorize:#FF0000:"..ratio_on
local dot_off = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_off
local dot_on = "redstone_redstone_dust_dot.png^[colorize:#FF0000:"..ratio_on
2017-07-21 17:37:59 +02:00
if nodeid == "00000000" then
-- Non-connected redstone wire
nodebox = {-8/16, -.5, -8/16, 8/16, -.5+1/16, 8/16}
-- “Dot” texture
tiles_off = { dot_off, dot_off, "blank.png", "blank.png", "blank.png", "blank.png" }
tiles_on = { dot_on, dot_on, "blank.png", "blank.png", "blank.png", "blank.png" }
elseif adjx and adjz and (xp + zp + xm + zm > 2) then
-- Connected redstone wire (crossing or t-junction)
2015-06-29 19:55:56 +02:00
table.insert(nodebox, box_bump1)
tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, }
tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, }
2015-06-29 19:55:56 +02:00
else
-- Connected redstone wire (straight line or curve)
2015-06-29 19:55:56 +02:00
table.insert(nodebox, box_center)
2017-07-21 17:37:59 +02:00
tiles_off = { crossing_off, crossing_off, straight0_off, straight1_off, straight0_off, straight1_off, }
tiles_on = { crossing_on, crossing_on, straight0_on, straight1_on, straight0_on, straight1_on, }
2015-06-29 19:55:56 +02:00
end
minetest.register_node("mesecons:wire_"..nodeid.."_off", {
2017-01-17 17:29:14 +01:00
description = "Redstone",
2017-03-11 22:37:53 +01:00
_doc_items_create_entry = wirehelp,
_doc_items_longdesc = longdesc,
_doc_items_usagehelp = usagehelp,
2015-06-29 19:55:56 +02:00
drawtype = "nodebox",
tiles = tiles_off,
is_ground_content = false,
2015-06-29 19:55:56 +02:00
-- inventory_image = "wires_inv.png",
-- wield_image = "wires_inv.png",
inventory_image = "redstone_redstone_dust.png",
wield_image = "redstone_redstone_dust.png",
2015-06-29 19:55:56 +02:00
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5}
},
node_box = {
type = "fixed",
fixed = nodebox
},
groups = groups,
walkable = false,
stack_max = 64,
drop = "mesecons:wire_00000000_off",
mesecons = {conductor={
state = mesecon.state.off,
onstate = "mesecons:wire_"..nodeid.."_on"
}},
sounds = mcl_sounds.node_sound_defaults(),
2015-06-29 19:55:56 +02:00
})
minetest.register_node("mesecons:wire_"..nodeid.."_on", {
2017-03-11 22:37:53 +01:00
description = "Redstone (Powered)",
_doc_items_create_entry = false,
2015-06-29 19:55:56 +02:00
drawtype = "nodebox",
tiles = tiles_on,
is_ground_content = false,
2015-06-29 19:55:56 +02:00
-- inventory_image = "wires_inv.png",
-- wield_image = "wires_inv.png",
inventory_image = "redstone_redstone_dust.png",
wield_image = "redstone_redstone_dust.png",
2015-06-29 19:55:56 +02:00
paramtype = "light",
paramtype2 = "facedir",
sunlight_propagates = true,
selection_box = {
type = "fixed",
fixed = {-.5, -.5, -.5, .5, -.5+1/16, .5}
},
node_box = {
type = "fixed",
fixed = nodebox
},
2017-05-20 04:11:14 +02:00
groups = {dig_immediate = 3, mesecon = 2, dig_by_water = 1,destroy_by_lava_flow=1, dig_by_piston = 1, attached_node = 1, not_in_creative_inventory = 1},
2015-06-29 19:55:56 +02:00
walkable = false,
stack_max = 64,
drop = "mesecons:wire_00000000_off",
mesecons = {conductor={
state = mesecon.state.on,
offstate = "mesecons:wire_"..nodeid.."_off"
}},
sounds = mcl_sounds.node_sound_defaults(),
2015-06-29 19:55:56 +02:00
})
2017-03-21 04:34:30 +01:00
-- Add Help entry aliases for e.g. making it identifiable by the lookup tool [doc_identifier]
if minetest.get_modpath("doc") then
if nodeid ~= "00000000" then
doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_off")
end
doc.add_entry_alias("nodes", "mesecons:wire_00000000_off", "nodes", "mesecons:wire_"..nodeid.."_on")
end
2015-06-29 19:55:56 +02:00
end
end
end
end
end
end
end
end
-- Updating the wires:
-- Place the right connection wire
local update_on_place_dig = function (pos, node)
if minetest.registered_nodes[node.name]
and minetest.registered_nodes[node.name].mesecons then
mesecon:update_autoconnect(pos)
end
end
minetest.register_on_placenode(update_on_place_dig)
minetest.register_on_dignode(update_on_place_dig)
function mesecon:update_autoconnect(pos, secondcall, replace_old)
local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
local zppos = {x=pos.x, y=pos.y, z=pos.z+1}
local xmpos = {x=pos.x-1, y=pos.y, z=pos.z}
local zmpos = {x=pos.x, y=pos.y, z=pos.z-1}
local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z}
local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1}
local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z}
local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1}
local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z}
local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1}
local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z}
local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1}
if secondcall == nil then
mesecon:update_autoconnect(xppos, true)
mesecon:update_autoconnect(zppos, true)
mesecon:update_autoconnect(xmpos, true)
mesecon:update_autoconnect(zmpos, true)
mesecon:update_autoconnect(xpypos, true)
mesecon:update_autoconnect(zpypos, true)
mesecon:update_autoconnect(xmypos, true)
mesecon:update_autoconnect(zmypos, true)
mesecon:update_autoconnect(xpympos, true)
mesecon:update_autoconnect(zpympos, true)
mesecon:update_autoconnect(xmympos, true)
mesecon:update_autoconnect(zmympos, true)
end
2017-01-20 02:03:01 +01:00
local nodename = minetest.get_node(pos).name
2015-06-29 19:55:56 +02:00
if string.find(nodename, "mesecons:wire_") == nil and not replace_old then return nil end
if mesecon:rules_link_anydir(pos, xppos) then xp = 1 else xp = 0 end
if mesecon:rules_link_anydir(pos, xmpos) then xm = 1 else xm = 0 end
if mesecon:rules_link_anydir(pos, zppos) then zp = 1 else zp = 0 end
if mesecon:rules_link_anydir(pos, zmpos) then zm = 1 else zm = 0 end
if mesecon:rules_link_anydir(pos, xpympos) then xp = 1 end
if mesecon:rules_link_anydir(pos, xmympos) then xm = 1 end
if mesecon:rules_link_anydir(pos, zpympos) then zp = 1 end
if mesecon:rules_link_anydir(pos, zmympos) then zm = 1 end
if mesecon:rules_link_anydir(pos, xpypos) then xpy = 1 else xpy = 0 end
if mesecon:rules_link_anydir(pos, zpypos) then zpy = 1 else zpy = 0 end
if mesecon:rules_link_anydir(pos, xmypos) then xmy = 1 else xmy = 0 end
if mesecon:rules_link_anydir(pos, zmypos) then zmy = 1 else zmy = 0 end
if xpy == 1 then xp = 1 end
if zpy == 1 then zp = 1 end
if xmy == 1 then xm = 1 end
if zmy == 1 then zm = 1 end
local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
if string.find(nodename, "_off") ~= nil then
minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_off"})
2015-06-29 19:55:56 +02:00
else
minetest.set_node(pos, {name = "mesecons:wire_"..nodeid.."_on" })
2015-06-29 19:55:56 +02:00
end
end
2017-01-04 05:04:13 +01:00
2017-01-09 18:45:34 +01:00
minetest.register_alias("mesecons:redstone", "mesecons:wire_00000000_off")
2017-01-05 01:21:10 +01:00
minetest.register_craft({
type = "cooking",
2017-01-09 18:45:34 +01:00
output = "mesecons:redstone",
2017-01-31 23:32:56 +01:00
recipe = "mcl_core:stone_with_redstone",
2017-01-05 01:21:10 +01:00
cooktime = 10,
})