Logikraft/items.lua
2024-05-20 19:56:30 +02:00

171 lines
7.7 KiB
Lua
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

minetest.register_craftitem("logikraft:rotator", {
description = "The rotator",
inventory_image = "rotator.png",
on_place = function(itemstack, user, pointed_thing)
local node = minetest.get_node(pointed_thing.under)
if not logikraft.cablenodes[node.name]
then return itemstack
end
local new = logikraft.rotateCable(logikraft.cablenodes[node.name],1)
minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new})
return itemstack
end
})
minetest.register_craftitem("logikraft:linker", {
description = "The linker",
inventory_image = "linker.png",
on_place = function(itemstack, user, pointed_thing)
local meta = itemstack:get_meta()
if meta:get_int("logikraft:selected_nb") ~= 0
then
local selectednb = meta:get_int("logikraft:selected_nb")
local selectedx = meta:get_int("logikraft:selected_x")
local selectedy = meta:get_int("logikraft:selected_y")
local selectedz = meta:get_int("logikraft:selected_z")
local selectedpos = {x = selectedx, y = selectedy, z = selectedz}
local pos = logikraft.cablenodes[minetest.get_node(pointed_thing.under).name] and pointed_thing.under or pointed_thing.above
local node = minetest.get_node(pos)
local thisnb = logikraft.cablenodes[minetest.get_node(pointed_thing.under).name] and logikraft.lookingAtNbIndex(user,pointed_thing.under) or -1
if selectedx == pos.x and selectedy == pos.y and selectedz == pos.z
then
if(selectednb ~= thisnb and thisnb ~= -1 and selectednb ~= -1)
then
local new = logikraft.connectInCable(logikraft.cablenodes[node.name],selectednb,thisnb)
minetest.swap_node(pos, {name = "logikraft:cable_" .. new})
end
meta:set_int("logikraft:selected_nb",0)
meta:set_string("inventory_image","linker.png")
return itemstack
else
local new = logikraft.connectContiguousCable(
logikraft.cablenodes[minetest.get_node(selectedpos).name],selectedpos,(selectednb ~= -1 and selectednb) or nil,
logikraft.cablenodes[node.name],pos,(thisnb ~= -1 and thisnb) or nil)
if new
then
minetest.swap_node(selectedpos, {name = "logikraft:cable_" .. new[1]})
minetest.swap_node(pos, {name = "logikraft:cable_" .. new[2]})
meta:set_int("logikraft:selected_nb",0)
meta:set_string("inventory_image","linker.png")
else
minetest.chat_send_player(user:get_player_name(),"Les cables sont trop loins l'un de l'autre :/")
end
return itemstack
end
else
local pos = logikraft.cablenodes[minetest.get_node(pointed_thing.under).name] and pointed_thing.under or pointed_thing.above
local node = minetest.get_node(pos)
if logikraft.cablenodes[node.name]
then
-- If we are looking at a cable we activate and store data
local thisnb = logikraft.cablenodes[minetest.get_node(pointed_thing.under).name] and logikraft.lookingAtNbIndex(user,pointed_thing.under) or -1
meta:set_int("logikraft:selected_nb",thisnb)
meta:set_int("logikraft:selected_x",pos.x)
meta:set_int("logikraft:selected_y",pos.y)
meta:set_int("logikraft:selected_z",pos.z)
meta:set_string("inventory_image","linker_activated.png")
else
-- Else we place a cable
local node_def = minetest.registered_nodes[node.name]
if not (node_def and node_def.buildable_to)
then return itemstack end
local new = nil
local poz = {
{x = pos.x+1, y = pos.y, z = pos.z},
{x = pos.x, y = pos.y, z = pos.z+1},
{x = pos.x-1, y = pos.y, z = pos.z},
{x = pos.x, y = pos.y, z = pos.z-1}
}
for k,pos2 in pairs(poz)
do
local cable2 = minetest.get_node(pos2)
if logikraft.cablenodes[cable2.name]
then
local contiguous = logikraft.connectContiguousCable(new, pos, 1, logikraft.cablenodes[cable2.name], pos2, nil)
new = contiguous[1]
minetest.swap_node(pos2, {name = "logikraft:cable_" .. contiguous[2]})
end
end
minetest.add_node(pos, {name = "logikraft:cable_" .. (new or "NSEW1")})
end
end
return itemstack
end,
on_secondary_use = function(itemstack, user, pointed_thing)
-- Looking at nothing -> we dispose of the data
local meta = itemstack:get_meta()
meta:set_int("logikraft:selected_nb",0)
meta:set_string("inventory_image","linker.png")
return itemstack
end
})
minetest.register_craftitem("logikraft:unlinker", {
description = "The unlinker",
inventory_image = "unlinker.png",
on_place = function(itemstack, user, pointed_thing)
local node = minetest.get_node(pointed_thing.under)
if not logikraft.cablenodes[node.name]
then return itemstack
end
local index = logikraft.lookingAtNbIndex(user,pointed_thing.under)
print(logikraft.cablenodes[node.name])
print(dump(logikraft.cables[logikraft.cablenodes[node.name]]))
local new = logikraft.disconnectInCable(logikraft.cablenodes[node.name],index)
if new
then minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new})
else minetest.remove_node(pointed_thing.under)
end
return itemstack
end
})
minetest.register_craftitem("logikraft:resizer", {
description = "The Resizer",
inventory_image = "resizer.png",
on_place = function(itemstack, user, pointed_thing)
local node = minetest.get_node(pointed_thing.under)
if not logikraft.cablenodes[node.name]
then return itemstack
end
local index = logikraft.lookingAtNbIndex(user,pointed_thing.under)
local new = logikraft.resizeInCable(logikraft.cablenodes[node.name],index)
minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new})
return itemstack
end
})
minetest.register_craftitem("logikraft:editor", {
description = "The Editor",
inventory_image = "editor.png",
on_place = function(itemstack, user, pointed_thing)
local node = minetest.get_node(pointed_thing.under)
if logikraft.cablenodes[node.name]
then
local index = logikraft.lookingAtNbIndex(user,pointed_thing.under)
minetest.chat_send_all("Looking at nodeblock "..tostring(index))
elseif node.name == "logikraft:component_input_1_1"
then
logikraft.showNameFormspec(user:get_player_name(), pointed_thing.under)
elseif node.name == "logikraft:component_output_1_1"
then
logikraft.showNameFormspec(user:get_player_name(), pointed_thing.under)
elseif logikraft.componentnodes[node.name]
then
minetest.chat_send_all("Looking at component "..logikraft.componentnodes[node.name].name)
elseif node.name == "logikraft:circuitBlock"
then
logikraft.showCircuitFormspec(user:get_player_name(), pointed_thing.under)
end
return itemstack
end
})