wires_common.lua 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. minetest.register_on_placenode(function(pos, node)
  2. if minetest.registered_nodes[node.name].digiline then
  3. digilines.update_autoconnect(pos)
  4. end
  5. end)
  6. minetest.register_on_dignode(function(pos, node)
  7. if minetest.registered_nodes[node.name] and minetest.registered_nodes[node.name].digiline then
  8. -- need to make sure that node exists (unknown nodes!)
  9. digilines.update_autoconnect(pos)
  10. end
  11. end)
  12. function digilines.update_autoconnect(pos, secondcall)
  13. local xppos = {x=pos.x+1, y=pos.y, z=pos.z}
  14. local zppos = {x=pos.x, y=pos.y, z=pos.z+1}
  15. local xmpos = {x=pos.x-1, y=pos.y, z=pos.z}
  16. local zmpos = {x=pos.x, y=pos.y, z=pos.z-1}
  17. local xpympos = {x=pos.x+1, y=pos.y-1, z=pos.z}
  18. local zpympos = {x=pos.x, y=pos.y-1, z=pos.z+1}
  19. local xmympos = {x=pos.x-1, y=pos.y-1, z=pos.z}
  20. local zmympos = {x=pos.x, y=pos.y-1, z=pos.z-1}
  21. local xpypos = {x=pos.x+1, y=pos.y+1, z=pos.z}
  22. local zpypos = {x=pos.x, y=pos.y+1, z=pos.z+1}
  23. local xmypos = {x=pos.x-1, y=pos.y+1, z=pos.z}
  24. local zmypos = {x=pos.x, y=pos.y+1, z=pos.z-1}
  25. if secondcall == nil then
  26. digilines.update_autoconnect(xppos, true)
  27. digilines.update_autoconnect(zppos, true)
  28. digilines.update_autoconnect(xmpos, true)
  29. digilines.update_autoconnect(zmpos, true)
  30. digilines.update_autoconnect(xpypos, true)
  31. digilines.update_autoconnect(zpypos, true)
  32. digilines.update_autoconnect(xmypos, true)
  33. digilines.update_autoconnect(zmypos, true)
  34. digilines.update_autoconnect(xpympos, true)
  35. digilines.update_autoconnect(zpympos, true)
  36. digilines.update_autoconnect(xmympos, true)
  37. digilines.update_autoconnect(zmympos, true)
  38. end
  39. local def = minetest.registered_nodes[minetest.get_node(pos).name]
  40. local digilinespec = def and def.digiline
  41. if not (digilinespec and digilinespec.wire and
  42. digilinespec.wire.use_autoconnect) then
  43. return nil
  44. end
  45. local zmg = digilines.rules_link_anydir(pos, zmpos)
  46. local zmymg = digilines.rules_link_anydir(pos, zmympos)
  47. local xmg = digilines.rules_link_anydir(pos, xmpos)
  48. local xmymg = digilines.rules_link_anydir(pos, xmympos)
  49. local zpg = digilines.rules_link_anydir(pos, zppos)
  50. local zpymg = digilines.rules_link_anydir(pos, zpympos)
  51. local xpg = digilines.rules_link_anydir(pos, xppos)
  52. local xpymg = digilines.rules_link_anydir(pos, xpympos)
  53. local xpyg = digilines.rules_link_anydir(pos, xpypos)
  54. local zpyg = digilines.rules_link_anydir(pos, zpypos)
  55. local xmyg = digilines.rules_link_anydir(pos, xmypos)
  56. local zmyg = digilines.rules_link_anydir(pos, zmypos)
  57. local zm, xm, zp, xp, xpy, zpy, xmy, zmy
  58. if zmg or zmymg then zm = 1 else zm = 0 end
  59. if xmg or xmymg then xm = 1 else xm = 0 end
  60. if zpg or zpymg then zp = 1 else zp = 0 end
  61. if xpg or xpymg then xp = 1 else xp = 0 end
  62. if xpyg then xpy = 1 else xpy = 0 end
  63. if zpyg then zpy = 1 else zpy = 0 end
  64. if xmyg then xmy = 1 else xmy = 0 end
  65. if zmyg then zmy = 1 else zmy = 0 end
  66. if xpy == 1 then xp = 1 end
  67. if zpy == 1 then zp = 1 end
  68. if xmy == 1 then xm = 1 end
  69. if zmy == 1 then zm = 1 end
  70. local nodeid = tostring(xp )..tostring(zp )..tostring(xm )..tostring(zm )..
  71. tostring(xpy)..tostring(zpy)..tostring(xmy)..tostring(zmy)
  72. minetest.set_node(pos, {name = digilinespec.wire.basename..nodeid})
  73. end