From 2c8f51f8ba3cb2d15245e87d2868da0cd812b7bf Mon Sep 17 00:00:00 2001 From: MysaaJava Date: Mon, 20 May 2024 19:06:14 +0200 Subject: [PATCH] Upgraded the linker --- blocks/cable.lua | 67 +++++++++++++++++++++++++++++++++++++-------- init.lua | 1 - items.lua | 70 ++++++++++++++++++++++++------------------------ 3 files changed, 91 insertions(+), 47 deletions(-) diff --git a/blocks/cable.lua b/blocks/cable.lua index 886f0b0..f3bbb6d 100644 --- a/blocks/cable.lua +++ b/blocks/cable.lua @@ -63,7 +63,7 @@ function logikraft.rotateCable(name,r) local newconn = {} for i,v in ipairs(conn) do - newconn[i] = rotate4dir(v,r) + newconn[i] = logikraft.rotate4dir(v,r) end table.sort(newconn) return logikraft.cableFromConns(newconn) @@ -101,8 +101,11 @@ end --[[ Returns {newcablea,newcableb} if the two cables are contiguous Returns nil otherwise + If namea or nameb is nil, no cable is present, and we create a single pin, or we connect to the conn in the direction + If a or b is nil, we consider that --]] function logikraft.connectContiguousCable(namea,posa,a,nameb,posb,b) + print("Connecting "..tostring(namea).." with "..tostring(nameb)) local dira = (posa.y == posb.y) and ( (posa.z + 1 == posb.z and posa.x == posb.x and 3) or (posa.x + 1 == posb.x and posa.z == posb.z and 2) or @@ -112,21 +115,63 @@ function logikraft.connectContiguousCable(namea,posa,a,nameb,posb,b) if dira == nil then return nil end + + print(dira) + print(logikraft.rotate4dir(4,math.fmod(dira,4))) + if not namea + then + namea = logikraft.cableFromConns({logikraft.rotate4dir(4,6-dira)}) + a = 1 -- There is only one nodebox + end + if not nameb + then + nameb = logikraft.cableFromConns({logikraft.rotate4dir(4,4-dira)}) + b = 1 -- There is only one nodebox + end + + local cia + if not a + then + cia = logikraft.connFromDir(namea,dira) + if not cia + then + -- We need to add a tip to a + local connsa = table.copy(logikraft.cables[namea].conns) + table.insert(connsa,logikraft.rotate4dir(4,6-dira)) + table.sort(connsa) + namea = logikraft.cableFromConns(connsa) + cia = logikraft.connFromDir(namea,dira) + end + else + cia = logikraft.cables[namea].nbToConn[a] + end + + local cib + if not b + then + cib = logikraft.connFromDir(nameb,math.fmod(dira+2,4)) + if not cib + then + -- We need to add a tip to b + local connsb = table.copy(logikraft.cables[nameb].conns) + table.insert(connsb,logikraft.rotate4dir(4,4-dira)) + table.sort(connsb) + nameb = logikraft.cableFromConns(connsb) + cib = logikraft.connFromDir(nameb,math.fmod(dira+2,4)) + end + else + cib = logikraft.cables[nameb].nbToConn[b] + end + + print(namea) + print(nameb) local connsa = table.copy(logikraft.cables[namea].conns) local connsb = table.copy(logikraft.cables[nameb].conns) - print(dump(connsa)) - print(dump(connsb)) - local cia = logikraft.cables[namea].nbToConn[a] - local cib = logikraft.cables[nameb].nbToConn[b] + --print(dump(connsa)) + --print(dump(connsb)) local cia2 = logikraft.connFromDir(namea,dira) local cib2 = logikraft.connFromDir(nameb,math.fmod(dira+2,4)) - print(dira) - print(cia) - print(cia2) - print(cib) - print(cib2) - -- (nba == nil) -> Need to add dira to the a -- (a == nba) -> Already connected diff --git a/init.lua b/init.lua index 466a269..02e26b7 100644 --- a/init.lua +++ b/init.lua @@ -9,7 +9,6 @@ dofile(minetest.get_modpath("logikraft") .. "/blocks/component.lua") dofile(minetest.get_modpath("logikraft") .. "/blocks/components_register.lua") dofile(minetest.get_modpath("logikraft") .. "/blocks/cable.lua") dofile(minetest.get_modpath("logikraft") .. "/blocks/cables_register.lua") -dofile(minetest.get_modpath("logikraft") .. "/blocks/iocomponent.lua") dofile(minetest.get_modpath("logikraft") .. "/items.lua") minetest.register_on_joinplayer(function(player) diff --git a/items.lua b/items.lua index 7a537ce..e6a3823 100644 --- a/items.lua +++ b/items.lua @@ -17,7 +17,6 @@ minetest.register_craftitem("logikraft:linker", { inventory_image = "linker.png", on_place = function(itemstack, user, pointed_thing) local meta = itemstack:get_meta() - local node = minetest.get_node(pointed_thing.under) if meta:get_int("logikraft:selected_nb") ~= 0 then local selectednb = meta:get_int("logikraft:selected_nb") @@ -25,44 +24,39 @@ minetest.register_craftitem("logikraft:linker", { local selectedy = meta:get_int("logikraft:selected_y") local selectedz = meta:get_int("logikraft:selected_z") local selectedpos = {x = selectedx, y = selectedy, z = selectedz} - if logikraft.cablenodes[node.name] + 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 selectedx == pos.x and selectedy == pos.y and selectedz == pos.z then - if selectedx == pointed_thing.under.x and selectedy == pointed_thing.under.y and selectedz == pointed_thing.under.z + if(selectednb ~= thisnb) then - local thisnb = logikraft.lookingAtNbIndex(user,pointed_thing.under) - if(selectednb ~= thisnb) - then - local new = logikraft.connectInCable(logikraft.cablenodes[node.name],selectednb,thisnb) - minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new}) - end + local thisnb = logikraft.cablenodes[minetest.get_node(pointed_thing.under).name] and logikraft.lookingAtNbIndex(user,pointed_thing.under) or nil + 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 thisnb = logikraft.cablenodes[minetest.get_node(pointed_thing.under).name] and logikraft.lookingAtNbIndex(user,pointed_thing.under) or nil + local new = logikraft.connectContiguousCable( + logikraft.cablenodes[minetest.get_node(selectedpos).name],selectedpos,selectednb, + logikraft.cablenodes[node.name],pos,thisnb) + 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 - local thisnb = logikraft.lookingAtNbIndex(user,pointed_thing.under) - local new = logikraft.connectContiguousCable( - logikraft.cablenodes[minetest.get_node(selectedpos).name],selectedpos,selectednb, - logikraft.cablenodes[node.name],pointed_thing.under,thisnb) - if new - then - minetest.swap_node(selectedpos, {name = "logikraft:cable_" .. new[1]}) - minetest.swap_node(pointed_thing.under, {name = "logikraft:cable_" .. new[2]}) - meta:set_int("logikraft:selected_nb",0) - meta:set_string("inventory_image","linker.png") - else - minetest.chat_send_all("Les cables sont trop loins l'un de l'autre :/") - end + minetest.chat_send_all("Les cables sont trop loins l'un de l'autre :/") end - else - local node_def = minetest.registered_nodes[minetest.get_node(pointed_thing.above).name] - if not node_def or not node_def.buildable_to then - -- Then we cannot build here - return itemstack - end - minetest.add_node(pointed_thing.above, {name = "logikraft:cable_NSEW1"}) - meta:set_int("logikraft:selected_nb",0) - meta:set_string("inventory_image","linker.png") + return itemstack end else + local node = minetest.get_node(pointed_thing.under) + if logikraft.cablenodes[node.name] then -- If we are looking at a cable we activate and store data @@ -73,12 +67,18 @@ minetest.register_craftitem("logikraft:linker", { meta:set_string("inventory_image","linker_activated.png") else -- Else we place a cable - local node_def = minetest.registered_nodes[minetest.get_node(pointed_thing.above).name] - if not node_def or not node_def.buildable_to then - -- Then we cannot build here + local anode = minetest.get_node(pointed_thing.above) + local anode_def = minetest.registered_nodes[anode.name] + if logikraft.cablenodes[anode.name] + then + -- We add single pin to target direction, and we connect source + minetest.add_node(pointed_thing.above, {name = "logikraft:cable_NSEW1"}) + elseif node_def and node_def.buildable_to then + -- We create a single pin to target direction, and we connect source + minetest.add_node(pointed_thing.above, {name = "logikraft:cable_NSEW1"}) + else return itemstack end - minetest.add_node(pointed_thing.above, {name = "logikraft:cable_NSEW1"}) end end